sonamu 0.7.8 → 0.7.9
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/dist/database/base-model.d.ts +47 -2
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +87 -5
- package/dist/entity/entity-manager.d.ts +5 -5
- package/dist/entity/entity.d.ts +9 -0
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +16 -1
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +12 -9
- package/dist/migration/migration-set.js +3 -1
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +3 -2
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +3 -2
- package/dist/types/types.d.ts +30 -25
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +10 -7
- package/dist/vector/config.d.ts.map +1 -1
- package/dist/vector/config.js +2 -2
- package/dist/vector/embedding.d.ts +12 -8
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +59 -74
- package/dist/vector/vector-search.js +2 -2
- package/package.json +12 -5
- package/src/database/base-model.ts +132 -7
- package/src/entity/entity.ts +19 -0
- package/src/migration/code-generation.ts +15 -8
- package/src/migration/migration-set.ts +2 -0
- package/src/migration/postgresql-schema-reader.ts +1 -0
- package/src/template/implementations/generated.template.ts +3 -4
- package/src/types/types.ts +12 -6
- package/src/vector/config.ts +2 -4
- package/src/vector/embedding.ts +73 -104
- package/src/vector/vector-search.ts +1 -1
package/dist/vector/embedding.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { createOpenAI } from "@ai-sdk/openai";
|
|
2
|
+
import { embedMany } from "ai";
|
|
3
|
+
import { VoyageAIClient } from "voyageai";
|
|
1
4
|
import { Sonamu } from "../api/sonamu.js";
|
|
2
5
|
import { DEFAULT_VECTOR_CONFIG } from "./config.js";
|
|
3
6
|
/**
|
|
4
7
|
* 임베딩 클라이언트
|
|
5
|
-
* Voyage AI와 OpenAI 임베딩을 통합 지원
|
|
8
|
+
* Voyage AI와 OpenAI 임베딩을 SDK 방식으로 통합 지원
|
|
6
9
|
*/ export class Embedding {
|
|
7
10
|
config;
|
|
8
11
|
constructor(config = {}){
|
|
@@ -30,16 +33,46 @@ import { DEFAULT_VECTOR_CONFIG } from "./config.js";
|
|
|
30
33
|
};
|
|
31
34
|
}
|
|
32
35
|
/**
|
|
36
|
+
* Voyage AI 클라이언트 초기화
|
|
37
|
+
*/ getVoyageClient() {
|
|
38
|
+
const apiKey = Sonamu.secrets?.voyage_api_key ?? process.env.VOYAGE_API_KEY;
|
|
39
|
+
if (!apiKey) {
|
|
40
|
+
throw new Error("VOYAGE_API_KEY가 설정되지 않았습니다. 환경변수를 확인하세요.");
|
|
41
|
+
}
|
|
42
|
+
return new VoyageAIClient({
|
|
43
|
+
apiKey
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* OpenAI provider 생성
|
|
48
|
+
*/ getOpenAIProvider() {
|
|
49
|
+
const apiKey = Sonamu.secrets?.openai_api_key ?? process.env.OPENAI_API_KEY;
|
|
50
|
+
if (!apiKey) {
|
|
51
|
+
throw new Error("OPENAI_API_KEY가 설정되지 않았습니다. 환경변수를 확인하세요.");
|
|
52
|
+
}
|
|
53
|
+
return createOpenAI({
|
|
54
|
+
apiKey
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
33
58
|
* 텍스트 임베딩 생성
|
|
34
|
-
* @param texts - 임베딩할 텍스트 배열
|
|
59
|
+
* @param texts - 임베딩할 텍스트 배열 (batchSize이상 시 자동 분할)
|
|
35
60
|
* @param provider - 'voyage' | 'openai'
|
|
36
61
|
* @param inputType - 'document' | 'query' (Voyage AI만 해당)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
62
|
+
* @param onProgress - 진행률 콜백
|
|
63
|
+
*/ async embed(texts, provider, inputType = "document", onProgress) {
|
|
64
|
+
const maxBatchSize = provider === "voyage" ? this.config.voyage.batchSize : this.config.openai.batchSize;
|
|
65
|
+
// batchSize이하면 바로 호출
|
|
66
|
+
if (texts.length <= maxBatchSize) {
|
|
67
|
+
return provider === "voyage" ? await this.embedVoyage(texts, inputType) : await this.embedOpenAI(texts);
|
|
42
68
|
}
|
|
69
|
+
// batchSize이상이면 자동으로 나눠서 처리
|
|
70
|
+
const batches = Array.from({
|
|
71
|
+
length: Math.ceil(texts.length / maxBatchSize)
|
|
72
|
+
}, (_, i)=>texts.slice(i * maxBatchSize, (i + 1) * maxBatchSize));
|
|
73
|
+
const results = await Promise.all(batches.map((batch)=>provider === "voyage" ? this.embedVoyage(batch, inputType) : this.embedOpenAI(batch)));
|
|
74
|
+
onProgress?.(texts.length, texts.length);
|
|
75
|
+
return results.flat();
|
|
43
76
|
}
|
|
44
77
|
/**
|
|
45
78
|
* 단일 텍스트 임베딩 (편의 메서드)
|
|
@@ -52,84 +85,39 @@ import { DEFAULT_VECTOR_CONFIG } from "./config.js";
|
|
|
52
85
|
/**
|
|
53
86
|
* Voyage AI 임베딩
|
|
54
87
|
*/ async embedVoyage(texts, inputType) {
|
|
88
|
+
const client = this.getVoyageClient();
|
|
55
89
|
const voyageConfig = this.config.voyage;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
const response = await fetch(voyageConfig.baseUrl, {
|
|
62
|
-
method: "POST",
|
|
63
|
-
headers: {
|
|
64
|
-
"Content-Type": "application/json",
|
|
65
|
-
Authorization: `Bearer ${apiKey}`
|
|
66
|
-
},
|
|
67
|
-
body: JSON.stringify({
|
|
68
|
-
input: texts,
|
|
69
|
-
model: voyageConfig.model,
|
|
70
|
-
input_type: inputType
|
|
71
|
-
})
|
|
90
|
+
const response = await client.embed({
|
|
91
|
+
input: texts,
|
|
92
|
+
model: voyageConfig.model,
|
|
93
|
+
inputType: inputType
|
|
72
94
|
});
|
|
73
|
-
if (!response.
|
|
74
|
-
|
|
75
|
-
throw new Error(`Voyage API error: ${response.status} - ${error}`);
|
|
95
|
+
if (!response.data) {
|
|
96
|
+
throw new Error("Voyage API: 응답 데이터가 없습니다.");
|
|
76
97
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
embedding: item.embedding,
|
|
98
|
+
return response.data.map((item)=>({
|
|
99
|
+
embedding: item.embedding ?? [],
|
|
80
100
|
model: voyageConfig.model,
|
|
81
|
-
tokenCount:
|
|
101
|
+
tokenCount: response.usage?.totalTokens ?? 0
|
|
82
102
|
}));
|
|
83
103
|
}
|
|
84
104
|
/**
|
|
85
105
|
* OpenAI 임베딩
|
|
86
106
|
*/ async embedOpenAI(texts) {
|
|
107
|
+
const openai = this.getOpenAIProvider();
|
|
87
108
|
const openaiConfig = this.config.openai;
|
|
88
|
-
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
const response = await fetch(openaiConfig.baseUrl, {
|
|
94
|
-
method: "POST",
|
|
95
|
-
headers: {
|
|
96
|
-
"Content-Type": "application/json",
|
|
97
|
-
Authorization: `Bearer ${apiKey}`
|
|
98
|
-
},
|
|
99
|
-
body: JSON.stringify({
|
|
100
|
-
input: texts,
|
|
101
|
-
model: openaiConfig.model
|
|
102
|
-
})
|
|
109
|
+
const model = openai.embeddingModel(openaiConfig.model);
|
|
110
|
+
const { embeddings, usage } = await embedMany({
|
|
111
|
+
model: model,
|
|
112
|
+
values: texts
|
|
103
113
|
});
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
throw new Error(`OpenAI API error: ${response.status} - ${error}`);
|
|
107
|
-
}
|
|
108
|
-
const data = await response.json();
|
|
109
|
-
return data.data.map((item)=>({
|
|
110
|
-
embedding: item.embedding,
|
|
114
|
+
return embeddings.map((embedding)=>({
|
|
115
|
+
embedding,
|
|
111
116
|
model: openaiConfig.model,
|
|
112
|
-
tokenCount:
|
|
117
|
+
tokenCount: usage?.tokens ?? 0
|
|
113
118
|
}));
|
|
114
119
|
}
|
|
115
120
|
/**
|
|
116
|
-
* 배치 임베딩 (대량 처리)
|
|
117
|
-
*/ async embedBatch(texts, provider, inputType = "document", onProgress) {
|
|
118
|
-
const batchSize = provider === "voyage" ? this.config.voyage.batchSize : this.config.openai.batchSize;
|
|
119
|
-
const results = [];
|
|
120
|
-
for(let i = 0; i < texts.length; i += batchSize){
|
|
121
|
-
const batch = texts.slice(i, i + batchSize);
|
|
122
|
-
const batchResults = await this.embed(batch, provider, inputType);
|
|
123
|
-
results.push(...batchResults);
|
|
124
|
-
onProgress?.(Math.min(i + batchSize, texts.length), texts.length);
|
|
125
|
-
// Rate limiting (100ms between batches)
|
|
126
|
-
if (i + batchSize < texts.length) {
|
|
127
|
-
await this.delay(100);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
return results;
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
121
|
* 벡터를 PostgreSQL vector 타입 문자열로 변환
|
|
134
122
|
*/ static toVectorString(embedding) {
|
|
135
123
|
return `[${embedding.join(",")}]`;
|
|
@@ -139,9 +127,6 @@ import { DEFAULT_VECTOR_CONFIG } from "./config.js";
|
|
|
139
127
|
*/ getDimensions(provider) {
|
|
140
128
|
return provider === "voyage" ? this.config.voyage.dimensions : this.config.openai.dimensions;
|
|
141
129
|
}
|
|
142
|
-
delay(ms) {
|
|
143
|
-
return new Promise((resolve)=>setTimeout(resolve, ms));
|
|
144
|
-
}
|
|
145
130
|
}
|
|
146
131
|
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZWN0b3IvZW1iZWRkaW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBERUZBVUxUX1ZFQ1RPUl9DT05GSUcgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB0eXBlIHtcbiAgRW1iZWRkaW5nUHJvdmlkZXIsXG4gIEVtYmVkZGluZ1Jlc3VsdCxcbiAgUHJvZ3Jlc3NDYWxsYmFjayxcbiAgVmVjdG9yQ29uZmlnLFxuICBWZWN0b3JJbnB1dFR5cGUsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICog7J6E67Kg65SpIO2BtOudvOydtOyWuO2KuFxuICogVm95YWdlIEFJ7JmAIE9wZW5BSSDsnoTrsqDrlKnsnYQg7Ya17ZWpIOyngOybkFxuICovXG5leHBvcnQgY2xhc3MgRW1iZWRkaW5nIHtcbiAgcHJpdmF0ZSBjb25maWc6IFZlY3RvckNvbmZpZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFBhcnRpYWw8VmVjdG9yQ29uZmlnPiA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICB2b3lhZ2U6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnZveWFnZSwgLi4uY29uZmlnLnZveWFnZSB9LFxuICAgICAgb3BlbmFpOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5vcGVuYWksIC4uLmNvbmZpZy5vcGVuYWkgfSxcbiAgICAgIGNodW5raW5nOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5jaHVua2luZywgLi4uY29uZmlnLmNodW5raW5nIH0sXG4gICAgICBzZWFyY2g6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnNlYXJjaCwgLi4uY29uZmlnLnNlYXJjaCB9LFxuICAgICAgcGd2ZWN0b3I6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnBndmVjdG9yLCAuLi5jb25maWcucGd2ZWN0b3IgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIO2FjeyKpO2KuCDsnoTrsqDrlKkg7IOd7ISxXG4gICAqIEBwYXJhbSB0ZXh0cyAtIOyehOuyoOuUqe2VoCDthY3siqTtirgg67Cw7Je0XG4gICAqIEBwYXJhbSBwcm92aWRlciAtICd2b3lhZ2UnIHwgJ29wZW5haSdcbiAgICogQHBhcmFtIGlucHV0VHlwZSAtICdkb2N1bWVudCcgfCAncXVlcnknIChWb3lhZ2UgQUnrp4wg7ZW064u5KVxuICAgKi9cbiAgYXN5bmMgZW1iZWQoXG4gICAgdGV4dHM6IHN0cmluZ1tdLFxuICAgIHByb3ZpZGVyOiBFbWJlZGRpbmdQcm92aWRlcixcbiAgICBpbnB1dFR5cGU6IFZlY3RvcklucHV0VHlwZSA9IFwiZG9jdW1lbnRcIlxuICApOiBQcm9taXNlPEVtYmVkZGluZ1Jlc3VsdFtdPiB7XG4gICAgaWYgKHByb3ZpZGVyID09PSBcInZveWFnZVwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWJlZFZveWFnZSh0ZXh0cywgaW5wdXRUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZW1iZWRPcGVuQUkodGV4dHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDri6jsnbwg7YWN7Iqk7Yq4IOyehOuyoOuUqSAo7Y647J2YIOuplOyEnOuTnClcbiAgICovXG4gIGFzeW5jIGVtYmVkT25lKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIsXG4gICAgaW5wdXRUeXBlOiBWZWN0b3JJbnB1dFR5cGUgPSBcImRvY3VtZW50XCJcbiAgKTogUHJvbWlzZTxFbWJlZGRpbmdSZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5lbWJlZChbdGV4dF0sIHByb3ZpZGVyLCBpbnB1dFR5cGUpO1xuICAgIHJldHVybiByZXN1bHRzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFZveWFnZSBBSSDsnoTrsqDrlKlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW1iZWRWb3lhZ2UoXG4gICAgdGV4dHM6IHN0cmluZ1tdLFxuICAgIGlucHV0VHlwZTogVmVjdG9ySW5wdXRUeXBlXG4gICk6IFByb21pc2U8RW1iZWRkaW5nUmVzdWx0W10+IHtcbiAgICBjb25zdCB2b3lhZ2VDb25maWcgPSB0aGlzLmNvbmZpZy52b3lhZ2U7XG5cbiAgICAvLyBjb25maWfsl5DshJwg7ISk7KCV65CcIGFwaUtleSDsmrDshKAsIOyXhuycvOuptCBTb25hbXUuc2VjcmV0c+yXkOyEnCDroZzrk5xcbiAgICBjb25zdCBhcGlLZXkgPSB2b3lhZ2VDb25maWcuYXBpS2V5IHx8IFNvbmFtdS5zZWNyZXRzPy52b3lhZ2VfYXBpX2tleTtcbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlZPWUFHRV9BUElfS0VZ6rCAIOyEpOygleuQmOyngCDslYrslZjsirXri4jri6QuIO2ZmOqyveuzgOyImOulvCDtmZXsnbjtlZjshLjsmpQuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh2b3lhZ2VDb25maWcuYmFzZVVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthcGlLZXl9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGlucHV0OiB0ZXh0cyxcbiAgICAgICAgbW9kZWw6IHZveWFnZUNvbmZpZy5tb2RlbCxcbiAgICAgICAgaW5wdXRfdHlwZTogaW5wdXRUeXBlLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVm95YWdlIEFQSSBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtlcnJvcn1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgcmV0dXJuIGRhdGEuZGF0YS5tYXAoKGl0ZW06IHsgZW1iZWRkaW5nOiBudW1iZXJbXSB9KSA9PiAoe1xuICAgICAgZW1iZWRkaW5nOiBpdGVtLmVtYmVkZGluZyxcbiAgICAgIG1vZGVsOiB2b3lhZ2VDb25maWcubW9kZWwsXG4gICAgICB0b2tlbkNvdW50OiBkYXRhLnVzYWdlPy50b3RhbF90b2tlbnMgfHwgMCxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbkFJIOyehOuyoOuUqVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbWJlZE9wZW5BSSh0ZXh0czogc3RyaW5nW10pOiBQcm9taXNlPEVtYmVkZGluZ1Jlc3VsdFtdPiB7XG4gICAgY29uc3Qgb3BlbmFpQ29uZmlnID0gdGhpcy5jb25maWcub3BlbmFpO1xuXG4gICAgLy8gY29uZmln7JeQ7IScIOyEpOygleuQnCBhcGlLZXkg7Jqw7ISgLCDsl4bsnLzrqbQgU29uYW11LnNlY3JldHPsl5DshJwg66Gc65OcXG4gICAgY29uc3QgYXBpS2V5ID0gb3BlbmFpQ29uZmlnLmFwaUtleSB8fCBTb25hbXUuc2VjcmV0cz8ub3BlbmFpX2FwaV9rZXk7XG4gICAgaWYgKCFhcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJPUEVOQUlfQVBJX0tFWeqwgCDshKTsoJXrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiDtmZjqsr3rs4DsiJjrpbwg7ZmV7J247ZWY7IS47JqULlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gob3BlbmFpQ29uZmlnLmJhc2VVcmwsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXBpS2V5fWAsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBpbnB1dDogdGV4dHMsXG4gICAgICAgIG1vZGVsOiBvcGVuYWlDb25maWcubW9kZWwsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcGVuQUkgQVBJIGVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke2Vycm9yfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICByZXR1cm4gZGF0YS5kYXRhLm1hcCgoaXRlbTogeyBlbWJlZGRpbmc6IG51bWJlcltdIH0pID0+ICh7XG4gICAgICBlbWJlZGRpbmc6IGl0ZW0uZW1iZWRkaW5nLFxuICAgICAgbW9kZWw6IG9wZW5haUNvbmZpZy5tb2RlbCxcbiAgICAgIHRva2VuQ291bnQ6IGRhdGEudXNhZ2U/LnRvdGFsX3Rva2VucyB8fCAwLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsLDsuZgg7J6E67Kg65SpICjrjIDrn4kg7LKY66asKVxuICAgKi9cbiAgYXN5bmMgZW1iZWRCYXRjaChcbiAgICB0ZXh0czogc3RyaW5nW10sXG4gICAgcHJvdmlkZXI6IEVtYmVkZGluZ1Byb3ZpZGVyLFxuICAgIGlucHV0VHlwZTogVmVjdG9ySW5wdXRUeXBlID0gXCJkb2N1bWVudFwiLFxuICAgIG9uUHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrXG4gICk6IFByb21pc2U8RW1iZWRkaW5nUmVzdWx0W10+IHtcbiAgICBjb25zdCBiYXRjaFNpemUgPVxuICAgICAgcHJvdmlkZXIgPT09IFwidm95YWdlXCJcbiAgICAgICAgPyB0aGlzLmNvbmZpZy52b3lhZ2UuYmF0Y2hTaXplXG4gICAgICAgIDogdGhpcy5jb25maWcub3BlbmFpLmJhdGNoU2l6ZTtcblxuICAgIGNvbnN0IHJlc3VsdHM6IEVtYmVkZGluZ1Jlc3VsdFtdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gdGV4dHMuc2xpY2UoaSwgaSArIGJhdGNoU2l6ZSk7XG4gICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBhd2FpdCB0aGlzLmVtYmVkKGJhdGNoLCBwcm92aWRlciwgaW5wdXRUeXBlKTtcbiAgICAgIHJlc3VsdHMucHVzaCguLi5iYXRjaFJlc3VsdHMpO1xuXG4gICAgICBvblByb2dyZXNzPy4oTWF0aC5taW4oaSArIGJhdGNoU2l6ZSwgdGV4dHMubGVuZ3RoKSwgdGV4dHMubGVuZ3RoKTtcblxuICAgICAgLy8gUmF0ZSBsaW1pdGluZyAoMTAwbXMgYmV0d2VlbiBiYXRjaGVzKVxuICAgICAgaWYgKGkgKyBiYXRjaFNpemUgPCB0ZXh0cy5sZW5ndGgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxheSgxMDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIOuyoe2EsOulvCBQb3N0Z3JlU1FMIHZlY3RvciDtg4DsnoUg66y47J6Q7Je066GcIOuzgO2ZmFxuICAgKi9cbiAgc3RhdGljIHRvVmVjdG9yU3RyaW5nKGVtYmVkZGluZzogbnVtYmVyW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7ZW1iZWRkaW5nLmpvaW4oXCIsXCIpfV1gO1xuICB9XG5cbiAgLyoqXG4gICAqIOyehOuyoOuUqSBwcm92aWRlcuydmCDssKjsm5Ag7IiYIOuwmO2ZmFxuICAgKi9cbiAgZ2V0RGltZW5zaW9ucyhwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBwcm92aWRlciA9PT0gXCJ2b3lhZ2VcIlxuICAgICAgPyB0aGlzLmNvbmZpZy52b3lhZ2UuZGltZW5zaW9uc1xuICAgICAgOiB0aGlzLmNvbmZpZy5vcGVuYWkuZGltZW5zaW9ucztcbiAgfVxuXG4gIHByaXZhdGUgZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiU29uYW11IiwiREVGQVVMVF9WRUNUT1JfQ09ORklHIiwiRW1iZWRkaW5nIiwiY29uZmlnIiwidm95YWdlIiwib3BlbmFpIiwiY2h1bmtpbmciLCJzZWFyY2giLCJwZ3ZlY3RvciIsImVtYmVkIiwidGV4dHMiLCJwcm92aWRlciIsImlucHV0VHlwZSIsImVtYmVkVm95YWdlIiwiZW1iZWRPcGVuQUkiLCJlbWJlZE9uZSIsInRleHQiLCJyZXN1bHRzIiwidm95YWdlQ29uZmlnIiwiYXBpS2V5Iiwic2VjcmV0cyIsInZveWFnZV9hcGlfa2V5IiwiRXJyb3IiLCJyZXNwb25zZSIsImZldGNoIiwiYmFzZVVybCIsIm1ldGhvZCIsImhlYWRlcnMiLCJBdXRob3JpemF0aW9uIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJpbnB1dCIsIm1vZGVsIiwiaW5wdXRfdHlwZSIsIm9rIiwiZXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm1hcCIsIml0ZW0iLCJlbWJlZGRpbmciLCJ0b2tlbkNvdW50IiwidXNhZ2UiLCJ0b3RhbF90b2tlbnMiLCJvcGVuYWlDb25maWciLCJvcGVuYWlfYXBpX2tleSIsImVtYmVkQmF0Y2giLCJvblByb2dyZXNzIiwiYmF0Y2hTaXplIiwiaSIsImxlbmd0aCIsImJhdGNoIiwic2xpY2UiLCJiYXRjaFJlc3VsdHMiLCJwdXNoIiwiTWF0aCIsIm1pbiIsImRlbGF5IiwidG9WZWN0b3JTdHJpbmciLCJqb2luIiwiZ2V0RGltZW5zaW9ucyIs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
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZWN0b3IvZW1iZWRkaW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZU9wZW5BSSwgdHlwZSBPcGVuQUlQcm92aWRlciB9IGZyb20gXCJAYWktc2RrL29wZW5haVwiO1xuaW1wb3J0IHsgdHlwZSBFbWJlZGRpbmdNb2RlbCwgZW1iZWRNYW55IH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBWb3lhZ2VBSUNsaWVudCB9IGZyb20gXCJ2b3lhZ2VhaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERFRkFVTFRfVkVDVE9SX0NPTkZJRyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUge1xuICBFbWJlZGRpbmdQcm92aWRlcixcbiAgRW1iZWRkaW5nUmVzdWx0LFxuICBQcm9ncmVzc0NhbGxiYWNrLFxuICBWZWN0b3JDb25maWcsXG4gIFZlY3RvcklucHV0VHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiDsnoTrsqDrlKkg7YG065287J207Ja47Yq4XG4gKiBWb3lhZ2UgQUnsmYAgT3BlbkFJIOyehOuyoOuUqeydhCBTREsg67Cp7Iud7Jy866GcIO2Gte2VqSDsp4Dsm5BcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGluZyB7XG4gIHByaXZhdGUgY29uZmlnOiBWZWN0b3JDb25maWc7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQYXJ0aWFsPFZlY3RvckNvbmZpZz4gPSB7fSkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgdm95YWdlOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy52b3lhZ2UsIC4uLmNvbmZpZy52b3lhZ2UgfSxcbiAgICAgIG9wZW5haTogeyAuLi5ERUZBVUxUX1ZFQ1RPUl9DT05GSUcub3BlbmFpLCAuLi5jb25maWcub3BlbmFpIH0sXG4gICAgICBjaHVua2luZzogeyAuLi5ERUZBVUxUX1ZFQ1RPUl9DT05GSUcuY2h1bmtpbmcsIC4uLmNvbmZpZy5jaHVua2luZyB9LFxuICAgICAgc2VhcmNoOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5zZWFyY2gsIC4uLmNvbmZpZy5zZWFyY2ggfSxcbiAgICAgIHBndmVjdG9yOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5wZ3ZlY3RvciwgLi4uY29uZmlnLnBndmVjdG9yIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWb3lhZ2UgQUkg7YG065287J207Ja47Yq4IOy0iOq4sO2ZlFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWb3lhZ2VDbGllbnQoKTogVm95YWdlQUlDbGllbnQge1xuICAgIGNvbnN0IGFwaUtleSA9IFNvbmFtdS5zZWNyZXRzPy52b3lhZ2VfYXBpX2tleSA/PyBwcm9jZXNzLmVudi5WT1lBR0VfQVBJX0tFWTtcbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVk9ZQUdFX0FQSV9LRVnqsIAg7ISk7KCV65CY7KeAIOyViuyVmOyKteuLiOuLpC4g7ZmY6rK967OA7IiY66W8IO2ZleyduO2VmOyEuOyalC5cIik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVm95YWdlQUlDbGllbnQoeyBhcGlLZXkgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbkFJIHByb3ZpZGVyIOyDneyEsVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRPcGVuQUlQcm92aWRlcigpOiBPcGVuQUlQcm92aWRlciB7XG4gICAgY29uc3QgYXBpS2V5ID0gU29uYW11LnNlY3JldHM/Lm9wZW5haV9hcGlfa2V5ID8/IHByb2Nlc3MuZW52Lk9QRU5BSV9BUElfS0VZO1xuICAgIGlmICghYXBpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPUEVOQUlfQVBJX0tFWeqwgCDshKTsoJXrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiDtmZjqsr3rs4DsiJjrpbwg7ZmV7J247ZWY7IS47JqULlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZU9wZW5BSSh7IGFwaUtleSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthY3siqTtirgg7J6E67Kg65SpIOyDneyEsVxuICAgKiBAcGFyYW0gdGV4dHMgLSDsnoTrsqDrlKntlaAg7YWN7Iqk7Yq4IOuwsOyXtCAoYmF0Y2hTaXpl7J207IOBIOyLnCDsnpDrj5kg67aE7ZWgKVxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSAndm95YWdlJyB8ICdvcGVuYWknXG4gICAqIEBwYXJhbSBpbnB1dFR5cGUgLSAnZG9jdW1lbnQnIHwgJ3F1ZXJ5JyAoVm95YWdlIEFJ66eMIO2VtOuLuSlcbiAgICogQHBhcmFtIG9uUHJvZ3Jlc3MgLSDsp4TtlonrpaAg7L2c67CxXG4gICAqL1xuICBhc3luYyBlbWJlZChcbiAgICB0ZXh0czogc3RyaW5nW10sXG4gICAgcHJvdmlkZXI6IEVtYmVkZGluZ1Byb3ZpZGVyLFxuICAgIGlucHV0VHlwZTogVmVjdG9ySW5wdXRUeXBlID0gXCJkb2N1bWVudFwiLFxuICAgIG9uUHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrLFxuICApOiBQcm9taXNlPEVtYmVkZGluZ1Jlc3VsdFtdPiB7XG4gICAgY29uc3QgbWF4QmF0Y2hTaXplID1cbiAgICAgIHByb3ZpZGVyID09PSBcInZveWFnZVwiID8gdGhpcy5jb25maWcudm95YWdlLmJhdGNoU2l6ZSA6IHRoaXMuY29uZmlnLm9wZW5haS5iYXRjaFNpemU7XG5cbiAgICAvLyBiYXRjaFNpemXsnbTtlZjrqbQg67CU66GcIO2YuOy2nFxuICAgIGlmICh0ZXh0cy5sZW5ndGggPD0gbWF4QmF0Y2hTaXplKSB7XG4gICAgICByZXR1cm4gcHJvdmlkZXIgPT09IFwidm95YWdlXCJcbiAgICAgICAgPyBhd2FpdCB0aGlzLmVtYmVkVm95YWdlKHRleHRzLCBpbnB1dFR5cGUpXG4gICAgICAgIDogYXdhaXQgdGhpcy5lbWJlZE9wZW5BSSh0ZXh0cyk7XG4gICAgfVxuXG4gICAgLy8gYmF0Y2hTaXpl7J207IOB7J2066m0IOyekOuPmeycvOuhnCDrgpjriKDshJwg7LKY66asXG4gICAgY29uc3QgYmF0Y2hlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGguY2VpbCh0ZXh0cy5sZW5ndGggLyBtYXhCYXRjaFNpemUpIH0sIChfLCBpKSA9PlxuICAgICAgdGV4dHMuc2xpY2UoaSAqIG1heEJhdGNoU2l6ZSwgKGkgKyAxKSAqIG1heEJhdGNoU2l6ZSksXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGJhdGNoZXMubWFwKChiYXRjaCkgPT5cbiAgICAgICAgcHJvdmlkZXIgPT09IFwidm95YWdlXCIgPyB0aGlzLmVtYmVkVm95YWdlKGJhdGNoLCBpbnB1dFR5cGUpIDogdGhpcy5lbWJlZE9wZW5BSShiYXRjaCksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBvblByb2dyZXNzPy4odGV4dHMubGVuZ3RoLCB0ZXh0cy5sZW5ndGgpO1xuICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDri6jsnbwg7YWN7Iqk7Yq4IOyehOuyoOuUqSAo7Y647J2YIOuplOyEnOuTnClcbiAgICovXG4gIGFzeW5jIGVtYmVkT25lKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIsXG4gICAgaW5wdXRUeXBlOiBWZWN0b3JJbnB1dFR5cGUgPSBcImRvY3VtZW50XCIsXG4gICk6IFByb21pc2U8RW1iZWRkaW5nUmVzdWx0PiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZW1iZWQoW3RleHRdLCBwcm92aWRlciwgaW5wdXRUeXBlKTtcbiAgICByZXR1cm4gcmVzdWx0c1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWb3lhZ2UgQUkg7J6E67Kg65SpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVtYmVkVm95YWdlKFxuICAgIHRleHRzOiBzdHJpbmdbXSxcbiAgICBpbnB1dFR5cGU6IFZlY3RvcklucHV0VHlwZSxcbiAgKTogUHJvbWlzZTxFbWJlZGRpbmdSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuZ2V0Vm95YWdlQ2xpZW50KCk7XG4gICAgY29uc3Qgdm95YWdlQ29uZmlnID0gdGhpcy5jb25maWcudm95YWdlO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZW1iZWQoe1xuICAgICAgaW5wdXQ6IHRleHRzLFxuICAgICAgbW9kZWw6IHZveWFnZUNvbmZpZy5tb2RlbCxcbiAgICAgIGlucHV0VHlwZTogaW5wdXRUeXBlLFxuICAgIH0pO1xuICAgIGlmICghcmVzcG9uc2UuZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVm95YWdlIEFQSTog7J2R64u1IOuNsOydtO2EsOqwgCDsl4bsirXri4jri6QuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZS5kYXRhLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIGVtYmVkZGluZzogaXRlbS5lbWJlZGRpbmcgPz8gW10sXG4gICAgICBtb2RlbDogdm95YWdlQ29uZmlnLm1vZGVsLFxuICAgICAgdG9rZW5Db3VudDogcmVzcG9uc2UudXNhZ2U/LnRvdGFsVG9rZW5zID8/IDAsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5BSSDsnoTrsqDrlKlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW1iZWRPcGVuQUkodGV4dHM6IHN0cmluZ1tdKTogUHJvbWlzZTxFbWJlZGRpbmdSZXN1bHRbXT4ge1xuICAgIGNvbnN0IG9wZW5haSA9IHRoaXMuZ2V0T3BlbkFJUHJvdmlkZXIoKTtcbiAgICBjb25zdCBvcGVuYWlDb25maWcgPSB0aGlzLmNvbmZpZy5vcGVuYWk7XG4gICAgY29uc3QgbW9kZWwgPSBvcGVuYWkuZW1iZWRkaW5nTW9kZWwob3BlbmFpQ29uZmlnLm1vZGVsKTtcblxuICAgIGNvbnN0IHsgZW1iZWRkaW5ncywgdXNhZ2UgfSA9IGF3YWl0IGVtYmVkTWFueSh7XG4gICAgICBtb2RlbDogbW9kZWwgYXMgRW1iZWRkaW5nTW9kZWwsXG4gICAgICB2YWx1ZXM6IHRleHRzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVtYmVkZGluZ3MubWFwKChlbWJlZGRpbmcpID0+ICh7XG4gICAgICBlbWJlZGRpbmcsXG4gICAgICBtb2RlbDogb3BlbmFpQ29uZmlnLm1vZGVsLFxuICAgICAgdG9rZW5Db3VudDogdXNhZ2U/LnRva2VucyA/PyAwLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsqHthLDrpbwgUG9zdGdyZVNRTCB2ZWN0b3Ig7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICovXG4gIHN0YXRpYyB0b1ZlY3RvclN0cmluZyhlbWJlZGRpbmc6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske2VtYmVkZGluZy5qb2luKFwiLFwiKX1dYDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsnoTrsqDrlKkgcHJvdmlkZXLsnZgg7LCo7JuQIOyImCDrsJjtmZhcbiAgICovXG4gIGdldERpbWVuc2lvbnMocHJvdmlkZXI6IEVtYmVkZGluZ1Byb3ZpZGVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcHJvdmlkZXIgPT09IFwidm95YWdlXCIgPyB0aGlzLmNvbmZpZy52b3lhZ2UuZGltZW5zaW9ucyA6IHRoaXMuY29uZmlnLm9wZW5haS5kaW1lbnNpb25zO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlT3BlbkFJIiwiZW1iZWRNYW55IiwiVm95YWdlQUlDbGllbnQiLCJTb25hbXUiLCJERUZBVUxUX1ZFQ1RPUl9DT05GSUciLCJFbWJlZGRpbmciLCJjb25maWciLCJ2b3lhZ2UiLCJvcGVuYWkiLCJjaHVua2luZyIsInNlYXJjaCIsInBndmVjdG9yIiwiZ2V0Vm95YWdlQ2xpZW50IiwiYXBpS2V5Iiwic2VjcmV0cyIsInZveWFnZV9hcGlfa2V5IiwicHJvY2VzcyIsImVudiIsIlZPWUFHRV9BUElfS0VZIiwiRXJyb3IiLCJnZXRPcGVuQUlQcm92aWRlciIsIm9wZW5haV9hcGlfa2V5IiwiT1BFTkFJX0FQSV9LRVkiLCJlbWJlZCIsInRleHRzIiwicHJvdmlkZXIiLCJpbnB1dFR5cGUiLCJvblByb2dyZXNzIiwibWF4QmF0Y2hTaXplIiwiYmF0Y2hTaXplIiwibGVuZ3RoIiwiZW1iZWRWb3lhZ2UiLCJlbWJlZE9wZW5BSSIsImJhdGNoZXMiLCJBcnJheSIsImZyb20iLCJNYXRoIiwiY2VpbCIsIl8iLCJpIiwic2xpY2UiLCJyZXN1bHRzIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsImJhdGNoIiwiZmxhdCIsImVtYmVkT25lIiwidGV4dCIsImNsaWVudCIsInZveWFnZUNvbmZpZyIsInJlc3BvbnNlIiwiaW5wdXQiLCJtb2RlbCIsImRhdGEiLCJpdGVtIiwiZW1iZWRkaW5nIiwidG9rZW5Db3VudCIsInVzYWdlIiwidG90YWxUb2tlbnMiLCJvcGVuYWlDb25maWciLCJlbWJlZGRpbmdNb2RlbCIsImVtYmVkZGluZ3MiLCJ2YWx1ZXMiLCJ0b2tlbnMiLCJ0b1ZlY3RvclN0cmluZyIsImpvaW4iLCJnZXREaW1lbnNpb25zIiwiZGltZW5zaW9ucyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsWUFBWSxRQUE2QixpQkFBaUI7QUFDbkUsU0FBOEJDLFNBQVMsUUFBUSxLQUFLO0FBQ3BELFNBQVNDLGNBQWMsUUFBUSxXQUFXO0FBQzFDLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MscUJBQXFCLFFBQVEsY0FBVztBQVNqRDs7O0NBR0MsR0FDRCxPQUFPLE1BQU1DO0lBQ0hDLE9BQXFCO0lBRTdCLFlBQVlBLFNBQWdDLENBQUMsQ0FBQyxDQUFFO1FBQzlDLElBQUksQ0FBQ0EsTUFBTSxHQUFHO1lBQ1pDLFFBQVE7Z0JBQUUsR0FBR0gsc0JBQXNCRyxNQUFNO2dCQUFFLEdBQUdELE9BQU9DLE1BQU07WUFBQztZQUM1REMsUUFBUTtnQkFBRSxHQUFHSixzQkFBc0JJLE1BQU07Z0JBQUUsR0FBR0YsT0FBT0UsTUFBTTtZQUFDO1lBQzVEQyxVQUFVO2dCQUFFLEdBQUdMLHNCQUFzQkssUUFB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
|
|
@@ -48,7 +48,7 @@ import { Embedding } from "./embedding.js";
|
|
|
48
48
|
* 여러 항목에 임베딩 일괄 저장
|
|
49
49
|
*/ async saveEmbeddingsBatch(items, provider, embeddingColumn = "content_embedding", onProgress) {
|
|
50
50
|
const texts = items.map((item)=>item.text);
|
|
51
|
-
const embeddings = await this.embedding.
|
|
51
|
+
const embeddings = await this.embedding.embed(texts, provider, "document", onProgress);
|
|
52
52
|
await this.db.transaction(async (trx)=>{
|
|
53
53
|
for(let i = 0; i < items.length; i++){
|
|
54
54
|
await trx(this.tableName).where("id", items[i].id).update({
|
|
@@ -173,4 +173,4 @@ import { Embedding } from "./embedding.js";
|
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZWN0b3IvdmVjdG9yLXNlYXJjaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHBndmVjdG9yIGZyb20gXCJwZ3ZlY3Rvci9rbmV4XCI7XG5pbXBvcnQgeyBERUZBVUxUX1ZFQ1RPUl9DT05GSUcgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IEVtYmVkZGluZyB9IGZyb20gXCIuL2VtYmVkZGluZ1wiO1xuaW1wb3J0IHR5cGUge1xuICBFbWJlZGRpbmdJdGVtLFxuICBFbWJlZGRpbmdQcm92aWRlcixcbiAgSHlicmlkU2VhcmNoT3B0aW9ucyxcbiAgSHlicmlkU2VhcmNoUmVzdWx0LFxuICBQcm9ncmVzc0NhbGxiYWNrLFxuICBWZWN0b3JDb25maWcsXG4gIFZlY3RvclNlYXJjaE9wdGlvbnMsXG4gIFZlY3RvclNlYXJjaFJlc3VsdCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiDrsqHthLAg6rKA7IOJXG4gKiBwZ3ZlY3RvcuulvCDtmZzsmqntlZwg67Kh7YSwIOqygOyDiSDrsI8g7ZWY7J2067iM66as65OcIOqygOyDiSDsp4Dsm5BcbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvclNlYXJjaDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgcHJpdmF0ZSBkYjogS25leDtcbiAgcHJpdmF0ZSBjb25maWc6IFZlY3RvckNvbmZpZztcbiAgcHJpdmF0ZSBlbWJlZGRpbmc6IEVtYmVkZGluZztcbiAgcHJpdmF0ZSB0YWJsZU5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYjogS25leCwgdGFibGVOYW1lOiBzdHJpbmcsIGNvbmZpZzogUGFydGlhbDxWZWN0b3JDb25maWc+ID0ge30pIHtcbiAgICB0aGlzLmRiID0gZGI7XG4gICAgdGhpcy50YWJsZU5hbWUgPSB0YWJsZU5hbWU7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICB2b3lhZ2U6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnZveWFnZSwgLi4uY29uZmlnLnZveWFnZSB9LFxuICAgICAgb3BlbmFpOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5vcGVuYWksIC4uLmNvbmZpZy5vcGVuYWkgfSxcbiAgICAgIGNodW5raW5nOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5jaHVua2luZywgLi4uY29uZmlnLmNodW5raW5nIH0sXG4gICAgICBzZWFyY2g6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnNlYXJjaCwgLi4uY29uZmlnLnNlYXJjaCB9LFxuICAgICAgcGd2ZWN0b3I6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnBndmVjdG9yLCAuLi5jb25maWcucGd2ZWN0b3IgfSxcbiAgICB9O1xuICAgIHRoaXMuZW1iZWRkaW5nID0gbmV3IEVtYmVkZGluZyhjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuLqOydvCDtla3rqqnsl5Ag7J6E67Kg65SpIOyggOyepVxuICAgKi9cbiAgYXN5bmMgc2F2ZUVtYmVkZGluZyhcbiAgICBpZDogbnVtYmVyLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIsXG4gICAgZW1iZWRkaW5nQ29sdW1uOiBzdHJpbmcgPSBcImNvbnRlbnRfZW1iZWRkaW5nXCIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZW1iZWRkaW5nIH0gPSBhd2FpdCB0aGlzLmVtYmVkZGluZy5lbWJlZE9uZSh0ZXh0LCBwcm92aWRlciwgXCJkb2N1bWVudFwiKTtcblxuICAgIGF3YWl0IHRoaXMuZGIodGhpcy50YWJsZU5hbWUpXG4gICAgICAud2hlcmUoXCJpZFwiLCBpZClcbiAgICAgIC51cGRhdGUoe1xuICAgICAgICBbZW1iZWRkaW5nQ29sdW1uXTogcGd2ZWN0b3IudG9TcWwoZW1iZWRkaW5nKSxcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXrOufrCDtla3rqqnsl5Ag7J6E67Kg65SpIOydvOq0hCDsoIDsnqVcbiAgICovXG4gIGFzeW5jIHNhdmVFbWJlZGRpbmdzQmF0Y2goXG4gICAgaXRlbXM6IEVtYmVkZGluZ0l0ZW1bXSxcbiAgICBwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIsXG4gICAgZW1iZWRkaW5nQ29sdW1uOiBzdHJpbmcgPSBcImNvbnRlbnRfZW1iZWRkaW5nXCIsXG4gICAgb25Qcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2ssXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRleHRzID0gaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnRleHQpO1xuICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBhd2FpdCB0aGlzLmVtYmVkZGluZy5lbWJlZEJhdGNoKHRleHRzLCBwcm92aWRlciwgXCJkb2N1bWVudFwiLCBvblByb2dyZXNzKTtcblxuICAgIGF3YWl0IHRoaXMuZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhd2FpdCB0cngodGhpcy50YWJsZU5hbWUpXG4gICAgICAgICAgLndoZXJlKFwiaWRcIiwgaXRlbXNbaV0uaWQpXG4gICAgICAgICAgLnVwZGF0ZSh7XG4gICAgICAgICAgICBbZW1iZWRkaW5nQ29sdW1uXTogcGd2ZWN0b3IudG9TcWwoZW1iZWRkaW5nc1tpXS5lbWJlZGRpbmcpLFxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOuyoe2EsCDqsoDsg4kgKOy9lOyCrOyduCDsnKDsgqzrj4QpXG4gICAqL1xuICBhc3luYyBzZWFyY2goXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIsXG4gICAgb3B0aW9uczogVmVjdG9yU2VhcmNoT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPFZlY3RvclNlYXJjaFJlc3VsdDxUPltdPiB7XG4gICAgY29uc3Qge1xuICAgICAgZW1iZWRkaW5nQ29sdW1uID0gXCJjb250ZW50X2VtYmVkZGluZ1wiLFxuICAgICAgbGltaXQgPSB0aGlzLmNvbmZpZy5zZWFyY2guZGVmYXVsdExpbWl0LFxuICAgICAgdGhyZXNob2xkID0gdGhpcy5jb25maWcuc2VhcmNoLnNpbWlsYXJpdHlUaHJlc2hvbGQsXG4gICAgICB3aGVyZSxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIC8vIOy/vOumrCDsnoTrsqDrlKkgKGlucHV0X3R5cGU6ICdxdWVyeScg7KSR7JqUISlcbiAgICBjb25zdCB7IGVtYmVkZGluZyB9ID0gYXdhaXQgdGhpcy5lbWJlZGRpbmcuZW1iZWRPbmUocXVlcnksIHByb3ZpZGVyLCBcInF1ZXJ5XCIpO1xuXG4gICAgLy8gcGd2ZWN0b3Ig7IS47IWYIOyEpOyglVxuICAgIGlmICh0aGlzLmNvbmZpZy5wZ3ZlY3Rvci5pdGVyYXRpdmVTY2FuKSB7XG4gICAgICBhd2FpdCB0aGlzLmRiLnJhdyhcIlNFVCBobnN3Lml0ZXJhdGl2ZV9zY2FuID0gcmVsYXhlZF9vcmRlclwiKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5kYi5yYXcoYFNFVCBobnN3LmVmX3NlYXJjaCA9ICR7dGhpcy5jb25maWcucGd2ZWN0b3IuZWZTZWFyY2h9YCk7XG5cbiAgICAvLyDsvZTsgqzsnbgg7Jyg7IKs64+EID0gMSAtIOy9lOyCrOyduCDqsbDrpqxcbiAgICBjb25zdCB2ZWN0b3JTdHIgPSBwZ3ZlY3Rvci50b1NxbChlbWJlZGRpbmcpO1xuICAgIGxldCBxdWVyeUJ1aWxkZXIgPSB0aGlzLmRiKHRoaXMudGFibGVOYW1lKVxuICAgICAgLnNlbGVjdChcIipcIilcbiAgICAgIC5zZWxlY3QodGhpcy5kYi5yYXcoYDEgLSAoJHtlbWJlZGRpbmdDb2x1bW59IDw9PiA/Ojp2ZWN0b3IpIEFTIHNpbWlsYXJpdHlgLCBbdmVjdG9yU3RyXSkpXG4gICAgICAud2hlcmVOb3ROdWxsKGVtYmVkZGluZ0NvbHVtbilcbiAgICAgIC5vcmRlckJ5UmF3KGAke2VtYmVkZGluZ0NvbHVtbn0gPD0+ID86OnZlY3RvcmAsIFt2ZWN0b3JTdHJdKVxuICAgICAgLmxpbWl0KGxpbWl0KTtcblxuICAgIGlmICh3aGVyZSkge1xuICAgICAgcXVlcnlCdWlsZGVyID0gcXVlcnlCdWlsZGVyLndoZXJlUmF3KHdoZXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gYXdhaXQgcXVlcnlCdWlsZGVyO1xuXG4gICAgcmV0dXJuIHJvd3NcbiAgICAgIC5maWx0ZXIoKHJvdzogeyBzaW1pbGFyaXR5OiBudW1iZXIgfSkgPT4gcm93LnNpbWlsYXJpdHkgPj0gdGhyZXNob2xkKVxuICAgICAgLm1hcCgocm93OiBUICYgeyBzaW1pbGFyaXR5OiBudW1iZXIgfSkgPT4gKHtcbiAgICAgICAgaWQ6IChyb3cgYXMgdW5rbm93biBhcyB7IGlkOiBudW1iZXIgfSkuaWQsXG4gICAgICAgIHNpbWlsYXJpdHk6IHBhcnNlRmxvYXQoU3RyaW5nKHJvdy5zaW1pbGFyaXR5KSksXG4gICAgICAgIGRhdGE6IHJvdyBhcyBULFxuICAgICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOydtOu4jOumrOuTnCDqsoDsg4kgKFZlY3RvciArIEZUUylcbiAgICovXG4gIGFzeW5jIGh5YnJpZFNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIHByb3ZpZGVyOiBFbWJlZGRpbmdQcm92aWRlcixcbiAgICBvcHRpb25zOiBIeWJyaWRTZWFyY2hPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8SHlicmlkU2VhcmNoUmVzdWx0PFQ+W10+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbWJlZGRpbmdDb2x1bW4gPSBcImNvbnRlbnRfZW1iZWRkaW5nXCIsXG4gICAgICBmdHNDb2x1bW4gPSBcImNvbnRlbnRfdHN2XCIsXG4gICAgICBsaW1pdCA9IHRoaXMuY29uZmlnLnNlYXJjaC5kZWZhdWx0TGltaXQsXG4gICAgICB2ZWN0b3JXZWlnaHQgPSB0aGlzLmNvbmZpZy5zZWFyY2gudmVjdG9yV2VpZ2h0LFxuICAgICAgZnRzV2VpZ2h0ID0gdGhpcy5jb25maWcuc2VhcmNoLmZ0c1dlaWdodCxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IHsgZW1iZWRkaW5nIH0gPSBhd2FpdCB0aGlzLmVtYmVkZGluZy5lbWJlZE9uZShxdWVyeSwgcHJvdmlkZXIsIFwicXVlcnlcIik7XG4gICAgY29uc3QgdmVjdG9yU3RyID0gcGd2ZWN0b3IudG9TcWwoZW1iZWRkaW5nKTtcblxuICAgIC8vIHBndmVjdG9yIOyEuOyFmCDshKTsoJVcbiAgICBpZiAodGhpcy5jb25maWcucGd2ZWN0b3IuaXRlcmF0aXZlU2Nhbikge1xuICAgICAgYXdhaXQgdGhpcy5kYi5yYXcoXCJTRVQgaG5zdy5pdGVyYXRpdmVfc2NhbiA9IHJlbGF4ZWRfb3JkZXJcIik7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZGIucmF3KGBTRVQgaG5zdy5lZl9zZWFyY2ggPSAke3RoaXMuY29uZmlnLnBndmVjdG9yLmVmU2VhcmNofWApO1xuXG4gICAgY29uc3Qgc3FsID0gYFxuICAgICAgV0lUSCB2ZWN0b3Jfc2VhcmNoIEFTIChcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgUk9XX05VTUJFUigpIE9WRVIgKE9SREVSIEJZICR7ZW1iZWRkaW5nQ29sdW1ufSA8PT4gPzo6dmVjdG9yKSBBUyByYW5rXG4gICAgICAgIEZST00gJHt0aGlzLnRhYmxlTmFtZX1cbiAgICAgICAgV0hFUkUgJHtlbWJlZGRpbmdDb2x1bW59IElTIE5PVCBOVUxMXG4gICAgICAgIE9SREVSIEJZICR7ZW1iZWRkaW5nQ29sdW1ufSA8PT4gPzo6dmVjdG9yXG4gICAgICAgIExJTUlUIDUwXG4gICAgICApLFxuICAgICAgZnRzX3NlYXJjaCBBUyAoXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIFJPV19OVU1CRVIoKSBPVkVSIChPUkRFUiBCWSB0c19yYW5rKCR7ZnRzQ29sdW1ufSwgcXVlcnkpIERFU0MpIEFTIHJhbmtcbiAgICAgICAgRlJPTSAke3RoaXMudGFibGVOYW1lfSwgcGxhaW50b190c3F1ZXJ5KCdzaW1wbGUnLCA/KSBxdWVyeVxuICAgICAgICBXSEVSRSAke2Z0c0NvbHVtbn0gQEAgcXVlcnlcbiAgICAgICAgTElNSVQgNTBcbiAgICAgICksXG4gICAgICBjb21iaW5lZCBBUyAoXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIENPQUxFU0NFKHYuaWQsIGYuaWQpIEFTIGlkLFxuICAgICAgICAgIENPQUxFU0NFKDEuMCAvICg2MCArIHYucmFuayksIDApIEFTIHZlY3Rvcl9zY29yZSxcbiAgICAgICAgICBDT0FMRVNDRSgxLjAgLyAoNjAgKyBmLnJhbmspLCAwKSBBUyBmdHNfc2NvcmVcbiAgICAgICAgRlJPTSB2ZWN0b3Jfc2VhcmNoIHZcbiAgICAgICAgRlVMTCBPVVRFUiBKT0lOIGZ0c19zZWFyY2ggZiBPTiB2LmlkID0gZi5pZFxuICAgICAgKVxuICAgICAgU0VMRUNUXG4gICAgICAgIHQuKixcbiAgICAgICAgYy52ZWN0b3Jfc2NvcmUsXG4gICAgICAgIGMuZnRzX3Njb3JlLFxuICAgICAgICAoYy52ZWN0b3Jfc2NvcmUgKiA/ICsgYy5mdHNfc2NvcmUgKiA/KSBBUyBzaW1pbGFyaXR5XG4gICAgICBGUk9NIGNvbWJpbmVkIGNcbiAgICAgIEpPSU4gJHt0aGlzLnRhYmxlTmFtZX0gdCBPTiBjLmlkID0gdC5pZFxuICAgICAgT1JERVIgQlkgc2ltaWxhcml0eSBERVNDXG4gICAgICBMSU1JVCA/XG4gICAgYDtcblxuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5kYi5yYXcoc3FsLCBbXG4gICAgICB2ZWN0b3JTdHIsXG4gICAgICB2ZWN0b3JTdHIsXG4gICAgICBxdWVyeSxcbiAgICAgIHZlY3RvcldlaWdodCxcbiAgICAgIGZ0c1dlaWdodCxcbiAgICAgIGxpbWl0LFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHJvd3MubWFwKFxuICAgICAgKFxuICAgICAgICByb3c6IFQgJiB7XG4gICAgICAgICAgc2ltaWxhcml0eTogbnVtYmVyO1xuICAgICAgICAgIHZlY3Rvcl9zY29yZTogbnVtYmVyO1xuICAgICAgICAgIGZ0c19zY29yZTogbnVtYmVyO1xuICAgICAgICB9LFxuICAgICAgKSA9PiAoe1xuICAgICAgICBpZDogKHJvdyBhcyB1bmtub3duIGFzIHsgaWQ6IG51bWJlciB9KS5pZCxcbiAgICAgICAgc2ltaWxhcml0eTogcGFyc2VGbG9hdChTdHJpbmcocm93LnNpbWlsYXJpdHkpKSxcbiAgICAgICAgdmVjdG9yU2NvcmU6IHBhcnNlRmxvYXQoU3RyaW5nKHJvdy52ZWN0b3Jfc2NvcmUpKSxcbiAgICAgICAgZnRzU2NvcmU6IHBhcnNlRmxvYXQoU3RyaW5nKHJvdy5mdHNfc2NvcmUpKSxcbiAgICAgICAgZGF0YTogcm93IGFzIFQsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOyehOuyoOuUqSDtmITtmakg7KGw7ZqMXG4gICAqL1xuICBhc3luYyBnZXRFbWJlZGRpbmdTdGF0dXMoZW1iZWRkaW5nQ29sdW1uOiBzdHJpbmcgPSBcImNvbnRlbnRfZW1iZWRkaW5nXCIpOiBQcm9taXNlPHtcbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIHdpdGhFbWJlZGRpbmc6IG51bWJlcjtcbiAgICB3aXRob3V0RW1iZWRkaW5nOiBudW1iZXI7XG4gIH0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRiKHRoaXMudGFibGVOYW1lKVxuICAgICAgLmNvdW50KFwiKiBhcyB0b3RhbFwiKVxuICAgICAgLmNvdW50KGAke2VtYmVkZGluZ0NvbHVtbn0gYXMgd2l0aF9lbWJlZGRpbmdgKVxuICAgICAgLmZpcnN0KCk7XG5cbiAgICBjb25zdCB0b3RhbCA9IHBhcnNlSW50KFN0cmluZyhyZXN1bHQ/LnRvdGFsID8/IDApLCAxMCk7XG4gICAgY29uc3Qgd2l0aEVtYmVkZGluZyA9IHBhcnNlSW50KFN0cmluZyhyZXN1bHQ/LndpdGhfZW1iZWRkaW5nID8/IDApLCAxMCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWwsXG4gICAgICB3aXRoRW1iZWRkaW5nLFxuICAgICAgd2l0aG91dEVtYmVkZGluZzogdG90YWwgLSB3aXRoRW1iZWRkaW5nLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7J6E67Kg65Sp7J20IOyXhuuKlCDtla3rqqkgSUQg7KGw7ZqMXG4gICAqL1xuICBhc3luYyBnZXRJdGVtc1dpdGhvdXRFbWJlZGRpbmcoXG4gICAgZW1iZWRkaW5nQ29sdW1uOiBzdHJpbmcgPSBcImNvbnRlbnRfZW1iZWRkaW5nXCIsXG4gICAgbGltaXQ6IG51bWJlciA9IDEwMCxcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmRiKHRoaXMudGFibGVOYW1lKVxuICAgICAgLnNlbGVjdChcImlkXCIpXG4gICAgICAud2hlcmVOdWxsKGVtYmVkZGluZ0NvbHVtbilcbiAgICAgIC5vcmRlckJ5KFwiaWRcIilcbiAgICAgIC5saW1pdChsaW1pdCk7XG5cbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdzogeyBpZDogbnVtYmVyIH0pID0+IHJvdy5pZCk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWRkaW5nIOyduOyKpO2EtOyKpCDrsJjtmZggKOqzoOq4iSDsgqzsmqkpXG4gICAqL1xuICBnZXRFbWJlZGRpbmcoKTogRW1iZWRkaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lbWJlZGRpbmc7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJwZ3ZlY3RvciIsIkRFRkFVTFRfVkVDVE9SX0NPTkZJRyIsIkVtYmVkZGluZyIsIlZlY3RvclNlYXJjaCIsImRiIiwiY29uZmlnIiwiZW1iZWRkaW5nIiwidGFibGVOYW1lIiwidm95YWdlIiwib3BlbmFpIiwiY2h1bmtpbmciLCJzZWFyY2giLCJzYXZlRW1iZWRkaW5nIiwiaWQiLCJ0ZXh0IiwicHJvdmlkZXIiLCJlbWJlZGRpbmdDb2x1bW4iLCJlbWJlZE9uZSIsIndoZXJlIiwidXBkYXRlIiwidG9TcWwiLCJzYXZlRW1iZWRkaW5nc0JhdGNoIiwiaXRlbXMiLCJvblByb2dyZXNzIiwidGV4dHMiLCJtYXAiLCJpdGVtIiwiZW1iZWRkaW5ncyIsImVtYmVkQmF0Y2giLCJ0cmFuc2FjdGlvbiIsInRyeCIsImkiLCJsZW5ndGgiLCJxdWVyeSIsIm9wdGlvbnMiLCJsaW1pdCIsImRlZmF1bHRMaW1pdCIsInRocmVzaG9sZCIsInNpbWlsYXJpdHlUaHJlc2hvbGQiLCJpdGVyYXRpdmVTY2FuIiwicmF3IiwiZWZTZWFyY2giLCJ2ZWN0b3JTdHIiLCJxdWVyeUJ1aWxkZXIiLCJzZWxlY3QiLCJ3aGVyZU5vdE51bGwiLCJvcmRlckJ5UmF3Iiwid2hlcmVSYXciLCJyb3dzIiwiZmlsdGVyIiwicm93Iiwic2ltaWxhcml0eSIsInBhcnNlRmxvYXQiLCJTdHJpbmciLCJkYXRhIiwiaHlicmlkU2VhcmNoIiwiZnRzQ29sdW1uIiwidmVjdG9yV2VpZ2h0IiwiZnRzV2VpZ2h0Iiwic3FsIiwidmVjdG9yU2NvcmUiLCJ2ZWN0b3Jfc2NvcmUiLCJmdHNTY29yZSIsImZ0c19zY29yZSIsImdldEVtYmVkZGluZ1N0YXR1cyIsInJlc3VsdCIsImNvdW50IiwiZmlyc3QiLCJ0b3RhbCIsInBhcnNlSW50Iiwid2l0aEVtYmVkZGluZyIsIndpdGhfZW1iZWRkaW5nIiwid2l0aG91dEVtYmVkZGluZyIsImdldEl0ZW1zV2l0aG91dEVtYmVkZGluZyIsIndoZXJlTnVsbCIsIm9yZGVyQnkiLCJnZXRFbWJlZGRpbmciXSwibWFwcGluZ3MiOiJBQUNBLE9BQU9BLGNBQWMsZ0JBQWdCO0FBQ3JDLFNBQVNDLHFCQUFxQixRQUFRLGNBQVc7QUFDakQsU0FBU0MsU0FBUyxRQUFRLGlCQUFjO0FBWXhDOzs7Q0FHQyxHQUNELE9BQU8sTUFBTUM7SUFDSEMsR0FBUztJQUNUQyxPQUFxQjtJQUNyQkMsVUFBcUI7SUFDckJDLFVBQWtCO0lBRTFCLFlBQVlILEVBQVEsRUFBRUcsU0FB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
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZWN0b3IvdmVjdG9yLXNlYXJjaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHBndmVjdG9yIGZyb20gXCJwZ3ZlY3Rvci9rbmV4XCI7XG5pbXBvcnQgeyBERUZBVUxUX1ZFQ1RPUl9DT05GSUcgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IEVtYmVkZGluZyB9IGZyb20gXCIuL2VtYmVkZGluZ1wiO1xuaW1wb3J0IHR5cGUge1xuICBFbWJlZGRpbmdJdGVtLFxuICBFbWJlZGRpbmdQcm92aWRlcixcbiAgSHlicmlkU2VhcmNoT3B0aW9ucyxcbiAgSHlicmlkU2VhcmNoUmVzdWx0LFxuICBQcm9ncmVzc0NhbGxiYWNrLFxuICBWZWN0b3JDb25maWcsXG4gIFZlY3RvclNlYXJjaE9wdGlvbnMsXG4gIFZlY3RvclNlYXJjaFJlc3VsdCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiDrsqHthLAg6rKA7IOJXG4gKiBwZ3ZlY3RvcuulvCDtmZzsmqntlZwg67Kh7YSwIOqygOyDiSDrsI8g7ZWY7J2067iM66as65OcIOqygOyDiSDsp4Dsm5BcbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvclNlYXJjaDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgcHJpdmF0ZSBkYjogS25leDtcbiAgcHJpdmF0ZSBjb25maWc6IFZlY3RvckNvbmZpZztcbiAgcHJpdmF0ZSBlbWJlZGRpbmc6IEVtYmVkZGluZztcbiAgcHJpdmF0ZSB0YWJsZU5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYjogS25leCwgdGFibGVOYW1lOiBzdHJpbmcsIGNvbmZpZzogUGFydGlhbDxWZWN0b3JDb25maWc+ID0ge30pIHtcbiAgICB0aGlzLmRiID0gZGI7XG4gICAgdGhpcy50YWJsZU5hbWUgPSB0YWJsZU5hbWU7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICB2b3lhZ2U6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnZveWFnZSwgLi4uY29uZmlnLnZveWFnZSB9LFxuICAgICAgb3BlbmFpOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5vcGVuYWksIC4uLmNvbmZpZy5vcGVuYWkgfSxcbiAgICAgIGNodW5raW5nOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5jaHVua2luZywgLi4uY29uZmlnLmNodW5raW5nIH0sXG4gICAgICBzZWFyY2g6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnNlYXJjaCwgLi4uY29uZmlnLnNlYXJjaCB9LFxuICAgICAgcGd2ZWN0b3I6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnBndmVjdG9yLCAuLi5jb25maWcucGd2ZWN0b3IgfSxcbiAgICB9O1xuICAgIHRoaXMuZW1iZWRkaW5nID0gbmV3IEVtYmVkZGluZyhjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuLqOydvCDtla3rqqnsl5Ag7J6E67Kg65SpIOyggOyepVxuICAgKi9cbiAgYXN5bmMgc2F2ZUVtYmVkZGluZyhcbiAgICBpZDogbnVtYmVyLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIsXG4gICAgZW1iZWRkaW5nQ29sdW1uOiBzdHJpbmcgPSBcImNvbnRlbnRfZW1iZWRkaW5nXCIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZW1iZWRkaW5nIH0gPSBhd2FpdCB0aGlzLmVtYmVkZGluZy5lbWJlZE9uZSh0ZXh0LCBwcm92aWRlciwgXCJkb2N1bWVudFwiKTtcblxuICAgIGF3YWl0IHRoaXMuZGIodGhpcy50YWJsZU5hbWUpXG4gICAgICAud2hlcmUoXCJpZFwiLCBpZClcbiAgICAgIC51cGRhdGUoe1xuICAgICAgICBbZW1iZWRkaW5nQ29sdW1uXTogcGd2ZWN0b3IudG9TcWwoZW1iZWRkaW5nKSxcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXrOufrCDtla3rqqnsl5Ag7J6E67Kg65SpIOydvOq0hCDsoIDsnqVcbiAgICovXG4gIGFzeW5jIHNhdmVFbWJlZGRpbmdzQmF0Y2goXG4gICAgaXRlbXM6IEVtYmVkZGluZ0l0ZW1bXSxcbiAgICBwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIsXG4gICAgZW1iZWRkaW5nQ29sdW1uOiBzdHJpbmcgPSBcImNvbnRlbnRfZW1iZWRkaW5nXCIsXG4gICAgb25Qcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2ssXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRleHRzID0gaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnRleHQpO1xuICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBhd2FpdCB0aGlzLmVtYmVkZGluZy5lbWJlZCh0ZXh0cywgcHJvdmlkZXIsIFwiZG9jdW1lbnRcIiwgb25Qcm9ncmVzcyk7XG5cbiAgICBhd2FpdCB0aGlzLmRiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXdhaXQgdHJ4KHRoaXMudGFibGVOYW1lKVxuICAgICAgICAgIC53aGVyZShcImlkXCIsIGl0ZW1zW2ldLmlkKVxuICAgICAgICAgIC51cGRhdGUoe1xuICAgICAgICAgICAgW2VtYmVkZGluZ0NvbHVtbl06IHBndmVjdG9yLnRvU3FsKGVtYmVkZGluZ3NbaV0uZW1iZWRkaW5nKSxcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsqHthLAg6rKA7IOJICjsvZTsgqzsnbgg7Jyg7IKs64+EKVxuICAgKi9cbiAgYXN5bmMgc2VhcmNoKFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgcHJvdmlkZXI6IEVtYmVkZGluZ1Byb3ZpZGVyLFxuICAgIG9wdGlvbnM6IFZlY3RvclNlYXJjaE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxWZWN0b3JTZWFyY2hSZXN1bHQ8VD5bXT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGVtYmVkZGluZ0NvbHVtbiA9IFwiY29udGVudF9lbWJlZGRpbmdcIixcbiAgICAgIGxpbWl0ID0gdGhpcy5jb25maWcuc2VhcmNoLmRlZmF1bHRMaW1pdCxcbiAgICAgIHRocmVzaG9sZCA9IHRoaXMuY29uZmlnLnNlYXJjaC5zaW1pbGFyaXR5VGhyZXNob2xkLFxuICAgICAgd2hlcmUsXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyDsv7zrpqwg7J6E67Kg65SpIChpbnB1dF90eXBlOiAncXVlcnknIOykkeyalCEpXG4gICAgY29uc3QgeyBlbWJlZGRpbmcgfSA9IGF3YWl0IHRoaXMuZW1iZWRkaW5nLmVtYmVkT25lKHF1ZXJ5LCBwcm92aWRlciwgXCJxdWVyeVwiKTtcblxuICAgIC8vIHBndmVjdG9yIOyEuOyFmCDshKTsoJVcbiAgICBpZiAodGhpcy5jb25maWcucGd2ZWN0b3IuaXRlcmF0aXZlU2Nhbikge1xuICAgICAgYXdhaXQgdGhpcy5kYi5yYXcoXCJTRVQgaG5zdy5pdGVyYXRpdmVfc2NhbiA9IHJlbGF4ZWRfb3JkZXJcIik7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZGIucmF3KGBTRVQgaG5zdy5lZl9zZWFyY2ggPSAke3RoaXMuY29uZmlnLnBndmVjdG9yLmVmU2VhcmNofWApO1xuXG4gICAgLy8g7L2U7IKs7J24IOycoOyCrOuPhCA9IDEgLSDsvZTsgqzsnbgg6rGw66asXG4gICAgY29uc3QgdmVjdG9yU3RyID0gcGd2ZWN0b3IudG9TcWwoZW1iZWRkaW5nKTtcbiAgICBsZXQgcXVlcnlCdWlsZGVyID0gdGhpcy5kYih0aGlzLnRhYmxlTmFtZSlcbiAgICAgIC5zZWxlY3QoXCIqXCIpXG4gICAgICAuc2VsZWN0KHRoaXMuZGIucmF3KGAxIC0gKCR7ZW1iZWRkaW5nQ29sdW1ufSA8PT4gPzo6dmVjdG9yKSBBUyBzaW1pbGFyaXR5YCwgW3ZlY3RvclN0cl0pKVxuICAgICAgLndoZXJlTm90TnVsbChlbWJlZGRpbmdDb2x1bW4pXG4gICAgICAub3JkZXJCeVJhdyhgJHtlbWJlZGRpbmdDb2x1bW59IDw9PiA/Ojp2ZWN0b3JgLCBbdmVjdG9yU3RyXSlcbiAgICAgIC5saW1pdChsaW1pdCk7XG5cbiAgICBpZiAod2hlcmUpIHtcbiAgICAgIHF1ZXJ5QnVpbGRlciA9IHF1ZXJ5QnVpbGRlci53aGVyZVJhdyh3aGVyZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHF1ZXJ5QnVpbGRlcjtcblxuICAgIHJldHVybiByb3dzXG4gICAgICAuZmlsdGVyKChyb3c6IHsgc2ltaWxhcml0eTogbnVtYmVyIH0pID0+IHJvdy5zaW1pbGFyaXR5ID49IHRocmVzaG9sZClcbiAgICAgIC5tYXAoKHJvdzogVCAmIHsgc2ltaWxhcml0eTogbnVtYmVyIH0pID0+ICh7XG4gICAgICAgIGlkOiAocm93IGFzIHVua25vd24gYXMgeyBpZDogbnVtYmVyIH0pLmlkLFxuICAgICAgICBzaW1pbGFyaXR5OiBwYXJzZUZsb2F0KFN0cmluZyhyb3cuc2ltaWxhcml0eSkpLFxuICAgICAgICBkYXRhOiByb3cgYXMgVCxcbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnbTruIzrpqzrk5wg6rKA7IOJIChWZWN0b3IgKyBGVFMpXG4gICAqL1xuICBhc3luYyBoeWJyaWRTZWFyY2goXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIsXG4gICAgb3B0aW9uczogSHlicmlkU2VhcmNoT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPEh5YnJpZFNlYXJjaFJlc3VsdDxUPltdPiB7XG4gICAgY29uc3Qge1xuICAgICAgZW1iZWRkaW5nQ29sdW1uID0gXCJjb250ZW50X2VtYmVkZGluZ1wiLFxuICAgICAgZnRzQ29sdW1uID0gXCJjb250ZW50X3RzdlwiLFxuICAgICAgbGltaXQgPSB0aGlzLmNvbmZpZy5zZWFyY2guZGVmYXVsdExpbWl0LFxuICAgICAgdmVjdG9yV2VpZ2h0ID0gdGhpcy5jb25maWcuc2VhcmNoLnZlY3RvcldlaWdodCxcbiAgICAgIGZ0c1dlaWdodCA9IHRoaXMuY29uZmlnLnNlYXJjaC5mdHNXZWlnaHQsXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCB7IGVtYmVkZGluZyB9ID0gYXdhaXQgdGhpcy5lbWJlZGRpbmcuZW1iZWRPbmUocXVlcnksIHByb3ZpZGVyLCBcInF1ZXJ5XCIpO1xuICAgIGNvbnN0IHZlY3RvclN0ciA9IHBndmVjdG9yLnRvU3FsKGVtYmVkZGluZyk7XG5cbiAgICAvLyBwZ3ZlY3RvciDshLjshZgg7ISk7KCVXG4gICAgaWYgKHRoaXMuY29uZmlnLnBndmVjdG9yLml0ZXJhdGl2ZVNjYW4pIHtcbiAgICAgIGF3YWl0IHRoaXMuZGIucmF3KFwiU0VUIGhuc3cuaXRlcmF0aXZlX3NjYW4gPSByZWxheGVkX29yZGVyXCIpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmRiLnJhdyhgU0VUIGhuc3cuZWZfc2VhcmNoID0gJHt0aGlzLmNvbmZpZy5wZ3ZlY3Rvci5lZlNlYXJjaH1gKTtcblxuICAgIGNvbnN0IHNxbCA9IGBcbiAgICAgIFdJVEggdmVjdG9yX3NlYXJjaCBBUyAoXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIFJPV19OVU1CRVIoKSBPVkVSIChPUkRFUiBCWSAke2VtYmVkZGluZ0NvbHVtbn0gPD0+ID86OnZlY3RvcikgQVMgcmFua1xuICAgICAgICBGUk9NICR7dGhpcy50YWJsZU5hbWV9XG4gICAgICAgIFdIRVJFICR7ZW1iZWRkaW5nQ29sdW1ufSBJUyBOT1QgTlVMTFxuICAgICAgICBPUkRFUiBCWSAke2VtYmVkZGluZ0NvbHVtbn0gPD0+ID86OnZlY3RvclxuICAgICAgICBMSU1JVCA1MFxuICAgICAgKSxcbiAgICAgIGZ0c19zZWFyY2ggQVMgKFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBST1dfTlVNQkVSKCkgT1ZFUiAoT1JERVIgQlkgdHNfcmFuaygke2Z0c0NvbHVtbn0sIHF1ZXJ5KSBERVNDKSBBUyByYW5rXG4gICAgICAgIEZST00gJHt0aGlzLnRhYmxlTmFtZX0sIHBsYWludG9fdHNxdWVyeSgnc2ltcGxlJywgPykgcXVlcnlcbiAgICAgICAgV0hFUkUgJHtmdHNDb2x1bW59IEBAIHF1ZXJ5XG4gICAgICAgIExJTUlUIDUwXG4gICAgICApLFxuICAgICAgY29tYmluZWQgQVMgKFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBDT0FMRVNDRSh2LmlkLCBmLmlkKSBBUyBpZCxcbiAgICAgICAgICBDT0FMRVNDRSgxLjAgLyAoNjAgKyB2LnJhbmspLCAwKSBBUyB2ZWN0b3Jfc2NvcmUsXG4gICAgICAgICAgQ09BTEVTQ0UoMS4wIC8gKDYwICsgZi5yYW5rKSwgMCkgQVMgZnRzX3Njb3JlXG4gICAgICAgIEZST00gdmVjdG9yX3NlYXJjaCB2XG4gICAgICAgIEZVTEwgT1VURVIgSk9JTiBmdHNfc2VhcmNoIGYgT04gdi5pZCA9IGYuaWRcbiAgICAgIClcbiAgICAgIFNFTEVDVFxuICAgICAgICB0LiosXG4gICAgICAgIGMudmVjdG9yX3Njb3JlLFxuICAgICAgICBjLmZ0c19zY29yZSxcbiAgICAgICAgKGMudmVjdG9yX3Njb3JlICogPyArIGMuZnRzX3Njb3JlICogPykgQVMgc2ltaWxhcml0eVxuICAgICAgRlJPTSBjb21iaW5lZCBjXG4gICAgICBKT0lOICR7dGhpcy50YWJsZU5hbWV9IHQgT04gYy5pZCA9IHQuaWRcbiAgICAgIE9SREVSIEJZIHNpbWlsYXJpdHkgREVTQ1xuICAgICAgTElNSVQgP1xuICAgIGA7XG5cbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZGIucmF3KHNxbCwgW1xuICAgICAgdmVjdG9yU3RyLFxuICAgICAgdmVjdG9yU3RyLFxuICAgICAgcXVlcnksXG4gICAgICB2ZWN0b3JXZWlnaHQsXG4gICAgICBmdHNXZWlnaHQsXG4gICAgICBsaW1pdCxcbiAgICBdKTtcblxuICAgIHJldHVybiByb3dzLm1hcChcbiAgICAgIChcbiAgICAgICAgcm93OiBUICYge1xuICAgICAgICAgIHNpbWlsYXJpdHk6IG51bWJlcjtcbiAgICAgICAgICB2ZWN0b3Jfc2NvcmU6IG51bWJlcjtcbiAgICAgICAgICBmdHNfc2NvcmU6IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICkgPT4gKHtcbiAgICAgICAgaWQ6IChyb3cgYXMgdW5rbm93biBhcyB7IGlkOiBudW1iZXIgfSkuaWQsXG4gICAgICAgIHNpbWlsYXJpdHk6IHBhcnNlRmxvYXQoU3RyaW5nKHJvdy5zaW1pbGFyaXR5KSksXG4gICAgICAgIHZlY3RvclNjb3JlOiBwYXJzZUZsb2F0KFN0cmluZyhyb3cudmVjdG9yX3Njb3JlKSksXG4gICAgICAgIGZ0c1Njb3JlOiBwYXJzZUZsb2F0KFN0cmluZyhyb3cuZnRzX3Njb3JlKSksXG4gICAgICAgIGRhdGE6IHJvdyBhcyBULFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsnoTrsqDrlKkg7ZiE7ZmpIOyhsO2ajFxuICAgKi9cbiAgYXN5bmMgZ2V0RW1iZWRkaW5nU3RhdHVzKGVtYmVkZGluZ0NvbHVtbjogc3RyaW5nID0gXCJjb250ZW50X2VtYmVkZGluZ1wiKTogUHJvbWlzZTx7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICB3aXRoRW1iZWRkaW5nOiBudW1iZXI7XG4gICAgd2l0aG91dEVtYmVkZGluZzogbnVtYmVyO1xuICB9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kYih0aGlzLnRhYmxlTmFtZSlcbiAgICAgIC5jb3VudChcIiogYXMgdG90YWxcIilcbiAgICAgIC5jb3VudChgJHtlbWJlZGRpbmdDb2x1bW59IGFzIHdpdGhfZW1iZWRkaW5nYClcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgY29uc3QgdG90YWwgPSBwYXJzZUludChTdHJpbmcocmVzdWx0Py50b3RhbCA/PyAwKSwgMTApO1xuICAgIGNvbnN0IHdpdGhFbWJlZGRpbmcgPSBwYXJzZUludChTdHJpbmcocmVzdWx0Py53aXRoX2VtYmVkZGluZyA/PyAwKSwgMTApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsLFxuICAgICAgd2l0aEVtYmVkZGluZyxcbiAgICAgIHdpdGhvdXRFbWJlZGRpbmc6IHRvdGFsIC0gd2l0aEVtYmVkZGluZyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOyehOuyoOuUqeydtCDsl4bripQg7ZWt66qpIElEIOyhsO2ajFxuICAgKi9cbiAgYXN5bmMgZ2V0SXRlbXNXaXRob3V0RW1iZWRkaW5nKFxuICAgIGVtYmVkZGluZ0NvbHVtbjogc3RyaW5nID0gXCJjb250ZW50X2VtYmVkZGluZ1wiLFxuICAgIGxpbWl0OiBudW1iZXIgPSAxMDAsXG4gICk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5kYih0aGlzLnRhYmxlTmFtZSlcbiAgICAgIC5zZWxlY3QoXCJpZFwiKVxuICAgICAgLndoZXJlTnVsbChlbWJlZGRpbmdDb2x1bW4pXG4gICAgICAub3JkZXJCeShcImlkXCIpXG4gICAgICAubGltaXQobGltaXQpO1xuXG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3c6IHsgaWQ6IG51bWJlciB9KSA9PiByb3cuaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkZGluZyDsnbjsiqTthLTsiqQg67CY7ZmYICjqs6DquIkg7IKs7JqpKVxuICAgKi9cbiAgZ2V0RW1iZWRkaW5nKCk6IEVtYmVkZGluZyB7XG4gICAgcmV0dXJuIHRoaXMuZW1iZWRkaW5nO1xuICB9XG59XG4iXSwibmFtZXMiOlsicGd2ZWN0b3IiLCJERUZBVUxUX1ZFQ1RPUl9DT05GSUciLCJFbWJlZGRpbmciLCJWZWN0b3JTZWFyY2giLCJkYiIsImNvbmZpZyIsImVtYmVkZGluZyIsInRhYmxlTmFtZSIsInZveWFnZSIsIm9wZW5haSIsImNodW5raW5nIiwic2VhcmNoIiwic2F2ZUVtYmVkZGluZyIsImlkIiwidGV4dCIsInByb3ZpZGVyIiwiZW1iZWRkaW5nQ29sdW1uIiwiZW1iZWRPbmUiLCJ3aGVyZSIsInVwZGF0ZSIsInRvU3FsIiwic2F2ZUVtYmVkZGluZ3NCYXRjaCIsIml0ZW1zIiwib25Qcm9ncmVzcyIsInRleHRzIiwibWFwIiwiaXRlbSIsImVtYmVkZGluZ3MiLCJlbWJlZCIsInRyYW5zYWN0aW9uIiwidHJ4IiwiaSIsImxlbmd0aCIsInF1ZXJ5Iiwib3B0aW9ucyIsImxpbWl0IiwiZGVmYXVsdExpbWl0IiwidGhyZXNob2xkIiwic2ltaWxhcml0eVRocmVzaG9sZCIsIml0ZXJhdGl2ZVNjYW4iLCJyYXciLCJlZlNlYXJjaCIsInZlY3RvclN0ciIsInF1ZXJ5QnVpbGRlciIsInNlbGVjdCIsIndoZXJlTm90TnVsbCIsIm9yZGVyQnlSYXciLCJ3aGVyZVJhdyIsInJvd3MiLCJmaWx0ZXIiLCJyb3ciLCJzaW1pbGFyaXR5IiwicGFyc2VGbG9hdCIsIlN0cmluZyIsImRhdGEiLCJoeWJyaWRTZWFyY2giLCJmdHNDb2x1bW4iLCJ2ZWN0b3JXZWlnaHQiLCJmdHNXZWlnaHQiLCJzcWwiLCJ2ZWN0b3JTY29yZSIsInZlY3Rvcl9zY29yZSIsImZ0c1Njb3JlIiwiZnRzX3Njb3JlIiwiZ2V0RW1iZWRkaW5nU3RhdHVzIiwicmVzdWx0IiwiY291bnQiLCJmaXJzdCIsInRvdGFsIiwicGFyc2VJbnQiLCJ3aXRoRW1iZWRkaW5nIiwid2l0aF9lbWJlZGRpbmciLCJ3aXRob3V0RW1iZWRkaW5nIiwiZ2V0SXRlbXNXaXRob3V0RW1iZWRkaW5nIiwid2hlcmVOdWxsIiwib3JkZXJCeSIsImdldEVtYmVkZGluZyJdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBT0EsY0FBYyxnQkFBZ0I7QUFDckMsU0FBU0MscUJBQXFCLFFBQVEsY0FBVztBQUNqRCxTQUFTQyxTQUFTLFFBQVEsaUJBQWM7QUFZeEM7OztDQUdDLEdBQ0QsT0FBTyxNQUFNQztJQUNIQyxHQUFTO0lBQ1RDLE9BQXFCO0lBQ3JCQyxVQUFxQjtJQUNyQkMsVUFBa0I7SUFFMUIsWUFBWUgsRUFBUSxFQUFFRyxTQUFpQixFQUFFRixTQUFnQyxDQUFDLENBQUMsQ0FBRTtRQUMzRSxJQUFJLENBQUNELEVBQUUsR0FBR0E7UUFDVixJQUFJLENBQUNHLFNBQVMsR0FBR0E7UUFDakIsSUFBSSxDQUFDRixNQUFNLEdBQUc7WUFDWkcsUUFBUTtnQkFBRSxHQUFHUCxzQkFBc0JPLE1BQU07Z0JBQUUsR0FBR0gsT0FBT0csTUFBTTtZQUFDO1lBQzVEQyxRQUFRO2dCQUFFLEdBQUdSLHNCQUFzQlEsTUFBTTtnQkFBRSxHQUFHSixPQUFPSSxNQUFNO1lBQUM7WUFDNURDLFVBQVU7Z0JBQUUsR0FBR1Qsc0JBQXNCUyxRQUFRO2dCQUFFLEdBQUdMLE9BQU9LLFFBQVE7WUFBQztZQUNsRUMsUUFBUTtnQkFBRSxHQUFHVixzQkFBc0JVLE1BQU07Z0JBQUUsR0FBR04sT0FBT00sTUFBTTtZQUFDO1lBQzVEWCxVQUFVO2dCQUFFLEdBQUdDLHNCQUFzQkQsUUFBUTtnQkFBRSxHQUFHSyxPQUFPTCxRQUFRO1lBQUM7UUFDcEU7UUFDQSxJQUFJLENBQUNNLFNBQVMsR0FBRyxJQUFJSixVQUFVRztJQUNqQztJQUVBOztHQUVDLEdBQ0QsTUFBTU8sY0FDSkMsRUFBVSxFQUNWQyxJQUFZLEVBQ1pDLFFBQTJCLEVBQzNCQyxrQkFBMEIsbUJBQW1CLEVBQzlCO1FBQ2YsTUFBTSxFQUFFVixTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQ0EsU0FBUyxDQUFDVyxRQUFRLENBQUNILE1BQU1DLFVBQVU7UUFFcEUsTUFBTSxJQUFJLENBQUNYLEVBQUUsQ0FBQyxJQUFJLENBQUNHLFNBQVMsRUFDekJXLEtBQUssQ0FBQyxNQUFNTCxJQUNaTSxNQUFNLENBQUM7WUFDTixDQUFDSCxnQkFBZ0IsRUFBRWhCLFNBQVNvQixLQUFLLENBQUNkO1FBQ3BDO0lBQ0o7SUFFQTs7R0FFQyxHQUNELE1BQU1lLG9CQUNKQyxLQUFzQixFQUN0QlAsUUFBMkIsRUFDM0JDLGtCQUEwQixtQkFBbUIsRUFDN0NPLFVBQTZCLEVBQ2Q7UUFDZixNQUFNQyxRQUFRRixNQUFNRyxHQUFHLENBQUMsQ0FBQ0MsT0FBU0EsS0FBS1osSUFBSTtRQUMzQyxNQUFNYSxhQUFhLE1BQU0sSUFBSSxDQUFDckIsU0FBUyxDQUFDc0IsS0FBSyxDQUFDSixPQUFPVCxVQUFVLFlBQVlRO1FBRTNFLE1BQU0sSUFBSSxDQUFDbkIsRUFBRSxDQUFDeUIsV0FBVyxDQUFDLE9BQU9DO1lBQy9CLElBQUssSUFBSUMsSUFBSSxHQUFHQSxJQUFJVCxNQUFNVSxNQUFNLEVBQUVELElBQUs7Z0JBQ3JDLE1BQU1ELElBQUksSUFBSSxDQUFDdkIsU0FBUyxFQUNyQlcsS0FBSyxDQUFDLE1BQU1JLEtBQUssQ0FBQ1MsRUFBRSxDQUFDbEIsRUFBRSxFQUN2Qk0sTUFBTSxDQUFDO29CQUNOLENBQUNILGdCQUFnQixFQUFFaEIsU0FBU29CLEtBQUssQ0FBQ08sVUFBVSxDQUFDSSxFQUFFLENBQUN6QixTQUFTO2dCQUMzRDtZQUNKO1FBQ0Y7SUFDRjtJQUVBOztHQUVDLEdBQ0QsTUFBTUssT0FDSnNCLEtBQWEsRUFDYmxCLFFBQTJCLEVBQzNCbUIsVUFBK0IsQ0FBQyxDQUFDLEVBQ0M7UUFDbEMsTUFBTSxFQUNKbEIsa0JBQWtCLG1CQUFtQixFQUNyQ21CLFFBQVEsSUFBSSxDQUFDOUIsTUFBTSxDQUFDTSxNQUFNLENBQUN5QixZQUFZLEVBQ3ZDQyxZQUFZLElBQUksQ0FBQ2hDLE1BQU0sQ0FBQ00sTUFBTSxDQUFDMkIsbUJBQW1CLEVBQ2xEcEIsS0FBSyxFQUNOLEdBQUdnQjtRQUVKLG1DQUFtQztRQUNuQyxNQUFNLEVBQUU1QixTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQ0EsU0FBUyxDQUFDVyxRQUFRLENBQUNnQixPQUFPbEIsVUFBVTtRQUVyRSxpQkFBaUI7UUFDakIsSUFBSSxJQUFJLENBQUNWLE1BQU0sQ0FBQ0wsUUFBUSxDQUFDdUMsYUFBYSxFQUFFO1lBQ3RDLE1BQU0sSUFBSSxDQUFDbkMsRUFBRSxDQUFDb0MsR0FBRyxDQUFDO1FBQ3BCO1FBQ0EsTUFBTSxJQUFJLENBQUNwQyxFQUFFLENBQUNvQyxHQUFHLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUNuQyxNQUFNLENBQUNMLFFBQVEsQ0FBQ3lDLFFBQVEsRUFBRTtRQUV6RSx1QkFBdUI7UUFDdkIsTUFBTUMsWUFBWTFDLFNBQVNvQixLQUFLLENBQUNkO1FBQ2pDLElBQUlxQyxlQUFlLElBQUksQ0FBQ3ZDLEVBQUUsQ0FBQyxJQUFJLENBQUNHLFNBQVMsRUFDdENxQyxNQUFNLENBQUMsS0FDUEEsTUFBTSxDQUFDLElBQUksQ0FBQ3hDLEVBQUUsQ0FBQ29DLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRXhCLGdCQUFnQiw2QkFBNkIsQ0FBQyxFQUFFO1lBQUMwQjtTQUFVLEdBQ3RGRyxZQUFZLENBQUM3QixpQkFDYjhCLFVBQVUsQ0FBQyxHQUFHOUIsZ0JBQWdCLGNBQWMsQ0FBQyxFQUFFO1lBQUMwQjtTQUFVLEVBQzFEUCxLQUFLLENBQUNBO1FBRVQsSUFBSWpCLE9BQU87WUFDVHlCLGVBQWVBLGFBQWFJLFFBQVEsQ0FBQzdCO1FBQ3ZDO1FBRUEsTUFBTThCLE9BQU8sTUFBTUw7UUFFbkIsT0FBT0ssS0FDSkMsTUFBTSxDQUFDLENBQUNDLE1BQWdDQSxJQUFJQyxVQUFVLElBQUlkLFdBQzFEWixHQUFHLENBQUMsQ0FBQ3lCLE1BQXFDLENBQUE7Z0JBQ3pDckMsSUFBSSxBQUFDcUMsSUFBa0NyQyxFQUFFO2dCQUN6Q3NDLFlBQVlDLFdBQVdDLE9BQU9ILElBQUlDLFVBQVU7Z0JBQzVDRyxNQUFNSjtZQUNSLENBQUE7SUFDSjtJQUVBOztHQUVDLEdBQ0QsTUFBTUssYUFDSnRCLEtBQWEsRUFDYmxCLFFBQTJCLEVBQzNCbUIsVUFBK0IsQ0FBQyxDQUFDLEVBQ0M7UUFDbEMsTUFBTSxFQUNKbEIsa0JBQWtCLG1CQUFtQixFQUNyQ3dDLFlBQVksYUFBYSxFQUN6QnJCLFFBQVEsSUFBSSxDQUFDOUIsTUFBTSxDQUFDTSxNQUFNLENBQUN5QixZQUFZLEVBQ3ZDcUIsZUFBZSxJQUFJLENBQUNwRCxNQUFNLENBQUNNLE1BQU0sQ0FBQzhDLFlBQVksRUFDOUNDLFlBQVksSUFBSSxDQUFDckQsTUFBTSxDQUFDTSxNQUFNLENBQUMrQyxTQUFTLEVBQ3pDLEdBQUd4QjtRQUVKLE1BQU0sRUFBRTVCLFNBQVMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDQSxTQUFTLENBQUNXLFFBQVEsQ0FBQ2dCLE9BQU9sQixVQUFVO1FBQ3JFLE1BQU0yQixZQUFZMUMsU0FBU29CLEtBQUssQ0FBQ2Q7UUFFakMsaUJBQWlCO1FBQ2pCLElBQUksSUFBSSxDQUFDRCxNQUFNLENBQUNMLFFBQVEsQ0FBQ3VDLGFBQWEsRUFBRTtZQUN0QyxNQUFNLElBQUksQ0FBQ25DLEVBQUUsQ0FBQ29DLEdBQUcsQ0FBQztRQUNwQjtRQUNBLE1BQU0sSUFBSSxDQUFDcEMsRUFBRSxDQUFDb0MsR0FBRyxDQUFDLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDbkMsTUFBTSxDQUFDTCxRQUFRLENBQUN5QyxRQUFRLEVBQUU7UUFFekUsTUFBTWtCLE1BQU0sQ0FBQzs7OztzQ0FJcUIsRUFBRTNDLGdCQUFnQjthQUMzQyxFQUFFLElBQUksQ0FBQ1QsU0FBUyxDQUFDO2NBQ2hCLEVBQUVTLGdCQUFnQjtpQkFDZixFQUFFQSxnQkFBZ0I7Ozs7Ozs4Q0FNVyxFQUFFd0MsVUFBVTthQUM3QyxFQUFFLElBQUksQ0FBQ2pELFNBQVMsQ0FBQztjQUNoQixFQUFFaUQsVUFBVTs7Ozs7Ozs7Ozs7Ozs7Ozs7V0FpQmYsRUFBRSxJQUFJLENBQUNqRCxTQUFTLENBQUM7OztJQUd4QixDQUFDO1FBRUQsTUFBTSxFQUFFeUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUM1QyxFQUFFLENBQUNvQyxHQUFHLENBQUNtQixLQUFLO1lBQ3RDakI7WUFDQUE7WUFDQVQ7WUFDQXdCO1lBQ0FDO1lBQ0F2QjtTQUNEO1FBRUQsT0FBT2EsS0FBS3ZCLEdBQUcsQ0FDYixDQUNFeUIsTUFLSSxDQUFBO2dCQUNKckMsSUFBSSxBQUFDcUMsSUFBa0NyQyxFQUFFO2dCQUN6Q3NDLFlBQVlDLFdBQVdDLE9BQU9ILElBQUlDLFVBQVU7Z0JBQzVDUyxhQUFhUixXQUFXQyxPQUFPSCxJQUFJVyxZQUFZO2dCQUMvQ0MsVUFBVVYsV0FBV0MsT0FBT0gsSUFBSWEsU0FBUztnQkFDekNULE1BQU1KO1lBQ1IsQ0FBQTtJQUVKO0lBRUE7O0dBRUMsR0FDRCxNQUFNYyxtQkFBbUJoRCxrQkFBMEIsbUJBQW1CLEVBSW5FO1FBQ0QsTUFBTWlELFNBQVMsTUFBTSxJQUFJLENBQUM3RCxFQUFFLENBQUMsSUFBSSxDQUFDRyxTQUFTLEVBQ3hDMkQsS0FBSyxDQUFDLGNBQ05BLEtBQUssQ0FBQyxHQUFHbEQsZ0JBQWdCLGtCQUFrQixDQUFDLEVBQzVDbUQsS0FBSztRQUVSLE1BQU1DLFFBQVFDLFNBQVNoQixPQUFPWSxRQUFRRyxTQUFTLElBQUk7UUFDbkQsTUFBTUUsZ0JBQWdCRCxTQUFTaEIsT0FBT1ksUUFBUU0sa0JBQWtCLElBQUk7UUFFcEUsT0FBTztZQUNMSDtZQUNBRTtZQUNBRSxrQkFBa0JKLFFBQVFFO1FBQzVCO0lBQ0Y7SUFFQTs7R0FFQyxHQUNELE1BQU1HLHlCQUNKekQsa0JBQTBCLG1CQUFtQixFQUM3Q21CLFFBQWdCLEdBQUcsRUFDQTtRQUNuQixNQUFNYSxPQUFPLE1BQU0sSUFBSSxDQUFDNUMsRUFBRSxDQUFDLElBQUksQ0FBQ0csU0FBUyxFQUN0Q3FDLE1BQU0sQ0FBQyxNQUNQOEIsU0FBUyxDQUFDMUQsaUJBQ1YyRCxPQUFPLENBQUMsTUFDUnhDLEtBQUssQ0FBQ0E7UUFFVCxPQUFPYSxLQUFLdkIsR0FBRyxDQUFDLENBQUN5QixNQUF3QkEsSUFBSXJDLEVBQUU7SUFDakQ7SUFFQTs7R0FFQyxHQUNEK0QsZUFBMEI7UUFDeEIsT0FBTyxJQUFJLENBQUN0RSxTQUFTO0lBQ3ZCO0FBQ0YifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sonamu",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.9",
|
|
4
4
|
"description": "Sonamu — TypeScript Fullstack API Framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -70,16 +70,15 @@
|
|
|
70
70
|
"minimatch": "^10.0.3",
|
|
71
71
|
"node-sql-parser": "^5.2.0",
|
|
72
72
|
"pg": "^8.16.3",
|
|
73
|
-
"pgvector": "^0.2.1",
|
|
74
73
|
"prompts": "^2.4.2",
|
|
75
74
|
"qs": "^6.11.0",
|
|
76
75
|
"radashi": "^12.2.0",
|
|
77
76
|
"tsicli": "^1.0.5",
|
|
78
77
|
"vitest": "^4.0.10",
|
|
79
78
|
"zod": "^4.1.12",
|
|
80
|
-
"@sonamu-kit/hmr-hook": "^0.4.1",
|
|
81
79
|
"@sonamu-kit/hmr-runner": "^0.1.1",
|
|
82
|
-
"@sonamu-kit/ts-loader": "^2.1.3"
|
|
80
|
+
"@sonamu-kit/ts-loader": "^2.1.3",
|
|
81
|
+
"@sonamu-kit/hmr-hook": "^0.4.1"
|
|
83
82
|
},
|
|
84
83
|
"devDependencies": {
|
|
85
84
|
"@biomejs/biome": "^2.3.7",
|
|
@@ -103,7 +102,9 @@
|
|
|
103
102
|
"ai": "^6.0.0-beta.138",
|
|
104
103
|
"fastify": "^4.23.2",
|
|
105
104
|
"knex": "^3.1.0",
|
|
106
|
-
"typescript": "^5.9.3"
|
|
105
|
+
"typescript": "^5.9.3",
|
|
106
|
+
"pgvector": "^0.2.1",
|
|
107
|
+
"voyageai": "^0.0.8"
|
|
107
108
|
},
|
|
108
109
|
"peerDependenciesMeta": {
|
|
109
110
|
"@ai-sdk/openai": {
|
|
@@ -117,6 +118,12 @@
|
|
|
117
118
|
},
|
|
118
119
|
"ai": {
|
|
119
120
|
"optional": true
|
|
121
|
+
},
|
|
122
|
+
"pgvector": {
|
|
123
|
+
"optional": true
|
|
124
|
+
},
|
|
125
|
+
"voyageai": {
|
|
126
|
+
"optional": true
|
|
120
127
|
}
|
|
121
128
|
},
|
|
122
129
|
"scripts": {
|
|
@@ -3,9 +3,20 @@
|
|
|
3
3
|
import type { Knex } from "knex";
|
|
4
4
|
import { group, isObject, omit, set } from "radashi";
|
|
5
5
|
import { Sonamu } from "../api";
|
|
6
|
+
import { EntityManager } from "../entity/entity-manager";
|
|
6
7
|
import type { DatabaseSchemaExtend } from "../types/types";
|
|
7
8
|
import { getJoinTables, getTableNamesFromWhere } from "../utils/sql-parser";
|
|
8
9
|
import { chunk } from "../utils/utils";
|
|
10
|
+
import type {
|
|
11
|
+
EmbeddingItem,
|
|
12
|
+
EmbeddingProvider,
|
|
13
|
+
HybridSearchOptions,
|
|
14
|
+
HybridSearchResult,
|
|
15
|
+
ProgressCallback,
|
|
16
|
+
VectorSearchOptions,
|
|
17
|
+
VectorSearchResult,
|
|
18
|
+
} from "../vector/types";
|
|
19
|
+
import { VectorSearch } from "../vector/vector-search";
|
|
9
20
|
import type {
|
|
10
21
|
EnhancerMap,
|
|
11
22
|
ExecuteSubsetQueryResult,
|
|
@@ -58,7 +69,118 @@ export class BaseModelClass<
|
|
|
58
69
|
return new PuriWrapper(db, new UpsertBuilder());
|
|
59
70
|
}
|
|
60
71
|
|
|
72
|
+
// VectorSearch 인스턴스 캐시
|
|
73
|
+
private _vectorSearch: VectorSearch<any> | null = null;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* 벡터 검색 인스턴스 반환
|
|
77
|
+
* - 기본 provider: voyage
|
|
78
|
+
* - 기본 dimensions: 1024 (DEFAULT_VECTOR_CONFIG 사용)
|
|
79
|
+
*/
|
|
80
|
+
getVector<T = Record<string, unknown>>(): VectorSearch<T> {
|
|
81
|
+
if (this._vectorSearch) {
|
|
82
|
+
return this._vectorSearch as VectorSearch<T>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const entity = EntityManager.get(this.modelName);
|
|
86
|
+
|
|
87
|
+
this._vectorSearch = new VectorSearch<T>(this.getDB("w"), entity.table);
|
|
88
|
+
|
|
89
|
+
return this._vectorSearch as VectorSearch<T>;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* 벡터 검색 (코사인 유사도)
|
|
94
|
+
* @param query - 검색어
|
|
95
|
+
* @param options - 검색 옵션
|
|
96
|
+
*/
|
|
97
|
+
async vectorSearch<T = Record<string, unknown>>(
|
|
98
|
+
query: string,
|
|
99
|
+
options: VectorSearchOptions & { provider?: EmbeddingProvider } = {},
|
|
100
|
+
): Promise<VectorSearchResult<T>[]> {
|
|
101
|
+
const entity = EntityManager.get(this.modelName);
|
|
102
|
+
const vectorProp = entity.getVectorColumn();
|
|
103
|
+
if (!vectorProp) {
|
|
104
|
+
throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const vs = new VectorSearch<T>(this.getDB("w"), entity.table);
|
|
108
|
+
return vs.search(query, options.provider ?? "voyage", {
|
|
109
|
+
...options,
|
|
110
|
+
embeddingColumn: options.embeddingColumn ?? vectorProp.name,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* 하이브리드 검색 (Vector + FTS)
|
|
116
|
+
* @param query - 검색어
|
|
117
|
+
* @param options - 검색 옵션
|
|
118
|
+
*/
|
|
119
|
+
async hybridSearch<T = Record<string, unknown>>(
|
|
120
|
+
query: string,
|
|
121
|
+
options: HybridSearchOptions & { provider?: EmbeddingProvider } = {},
|
|
122
|
+
): Promise<HybridSearchResult<T>[]> {
|
|
123
|
+
const entity = EntityManager.get(this.modelName);
|
|
124
|
+
const vectorProp = entity.getVectorColumn();
|
|
125
|
+
if (!vectorProp) {
|
|
126
|
+
throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const vs = new VectorSearch<T>(this.getDB("w"), entity.table);
|
|
130
|
+
return vs.hybridSearch(query, options.provider ?? "voyage", {
|
|
131
|
+
...options,
|
|
132
|
+
embeddingColumn: options.embeddingColumn ?? vectorProp.name,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* 단일 레코드에 임베딩 저장
|
|
138
|
+
* @param id - 레코드 ID
|
|
139
|
+
* @param text - 임베딩할 텍스트
|
|
140
|
+
* @param options - provider, embeddingColumn 옵션
|
|
141
|
+
*/
|
|
142
|
+
async saveEmbedding(
|
|
143
|
+
id: number,
|
|
144
|
+
text: string,
|
|
145
|
+
options: { provider?: EmbeddingProvider; embeddingColumn?: string } = {},
|
|
146
|
+
): Promise<void> {
|
|
147
|
+
const entity = EntityManager.get(this.modelName);
|
|
148
|
+
const vectorProp = entity.getVectorColumn(options.embeddingColumn);
|
|
149
|
+
if (!vectorProp) {
|
|
150
|
+
throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const { provider = "voyage" } = options;
|
|
154
|
+
const vs = this.getVector();
|
|
155
|
+
return vs.saveEmbedding(id, text, provider, vectorProp.name);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* 여러 레코드에 임베딩 일괄 저장
|
|
160
|
+
* @param items - { id, text } 배열
|
|
161
|
+
* @param options - provider, embeddingColumn, onProgress 옵션
|
|
162
|
+
*/
|
|
163
|
+
async saveEmbeddingsBatch(
|
|
164
|
+
items: EmbeddingItem[],
|
|
165
|
+
options: {
|
|
166
|
+
provider?: EmbeddingProvider;
|
|
167
|
+
embeddingColumn?: string;
|
|
168
|
+
onProgress?: ProgressCallback;
|
|
169
|
+
} = {},
|
|
170
|
+
): Promise<void> {
|
|
171
|
+
const entity = EntityManager.get(this.modelName);
|
|
172
|
+
const vectorProp = entity.getVectorColumn(options.embeddingColumn);
|
|
173
|
+
if (!vectorProp) {
|
|
174
|
+
throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const { provider = "voyage", onProgress } = options;
|
|
178
|
+
const vs = this.getVector();
|
|
179
|
+
return vs.saveEmbeddingsBatch(items, provider, vectorProp.name, onProgress);
|
|
180
|
+
}
|
|
181
|
+
|
|
61
182
|
async destroy() {
|
|
183
|
+
this._vectorSearch = null;
|
|
62
184
|
return DB.destroy();
|
|
63
185
|
}
|
|
64
186
|
|
|
@@ -158,8 +280,8 @@ export class BaseModelClass<
|
|
|
158
280
|
subset: T;
|
|
159
281
|
qb: Puri<any, any, any>;
|
|
160
282
|
params: {
|
|
161
|
-
num
|
|
162
|
-
page
|
|
283
|
+
num: number;
|
|
284
|
+
page: number;
|
|
163
285
|
queryMode?: "list" | "count" | "both";
|
|
164
286
|
};
|
|
165
287
|
debug?: boolean;
|
|
@@ -172,10 +294,6 @@ export class BaseModelClass<
|
|
|
172
294
|
throw new Error("loaderQueries is not defined");
|
|
173
295
|
}
|
|
174
296
|
|
|
175
|
-
if (!queryParams.num || !queryParams.page) {
|
|
176
|
-
throw new Error("num and page are required");
|
|
177
|
-
}
|
|
178
|
-
|
|
179
297
|
const { num, page } = queryParams;
|
|
180
298
|
|
|
181
299
|
// COUNT 쿼리 실행
|
|
@@ -253,7 +371,14 @@ export class BaseModelClass<
|
|
|
253
371
|
return [];
|
|
254
372
|
}
|
|
255
373
|
|
|
256
|
-
|
|
374
|
+
const limitedQb = (() => {
|
|
375
|
+
if (num === 0) {
|
|
376
|
+
return qb;
|
|
377
|
+
} else {
|
|
378
|
+
return qb.limit(num).offset(num * (page - 1));
|
|
379
|
+
}
|
|
380
|
+
})();
|
|
381
|
+
let unloadedRows = (await limitedQb) as any[];
|
|
257
382
|
|
|
258
383
|
if (debug) {
|
|
259
384
|
qb.debug();
|
package/src/entity/entity.ts
CHANGED
|
@@ -720,6 +720,25 @@ export class Entity {
|
|
|
720
720
|
.filter(nonNullable);
|
|
721
721
|
}
|
|
722
722
|
|
|
723
|
+
/**
|
|
724
|
+
* Entity에 정의된 모든 vector 타입 컬럼 반환
|
|
725
|
+
*/
|
|
726
|
+
getVectorColumns(): EntityProp[] {
|
|
727
|
+
return this.props.filter((p) => p.type === "vector");
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
/**
|
|
731
|
+
* 특정 vector 컬럼 반환
|
|
732
|
+
* @param columnName - 컬럼명 (생략 시 첫 번째 vector 컬럼)
|
|
733
|
+
*/
|
|
734
|
+
getVectorColumn(columnName?: string): EntityProp | undefined {
|
|
735
|
+
const vectorProps = this.getVectorColumns();
|
|
736
|
+
if (columnName) {
|
|
737
|
+
return vectorProps.find((p) => p.name === columnName);
|
|
738
|
+
}
|
|
739
|
+
return vectorProps[0];
|
|
740
|
+
}
|
|
741
|
+
|
|
723
742
|
async registerModulePaths() {
|
|
724
743
|
const basePath = `${this.names.parentFs}`;
|
|
725
744
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import equal from "fast-deep-equal";
|
|
2
|
-
import { alphabetical, diff
|
|
2
|
+
import { alphabetical, diff } from "radashi";
|
|
3
3
|
import { Naite } from "..";
|
|
4
4
|
import type {
|
|
5
5
|
GenMigrationCode,
|
|
@@ -218,18 +218,24 @@ function genIndexDefinition(index: MigrationIndex, table: string): string {
|
|
|
218
218
|
|
|
219
219
|
const methodMap = {
|
|
220
220
|
index: "INDEX",
|
|
221
|
-
fulltext: "INDEX",
|
|
222
221
|
unique: "UNIQUE INDEX",
|
|
223
222
|
};
|
|
224
223
|
|
|
225
224
|
const nullsNotDistinctClause =
|
|
226
|
-
index.
|
|
227
|
-
? ""
|
|
228
|
-
:
|
|
225
|
+
index.type === "unique" && index.nullsNotDistinct !== undefined
|
|
226
|
+
? ` NULLS ${index.nullsNotDistinct ? "NOT DISTINCT" : "DISTINCT"}`
|
|
227
|
+
: "";
|
|
228
|
+
|
|
229
|
+
const usingClause = index.using === undefined ? "" : `USING ${index.using}`;
|
|
229
230
|
|
|
230
231
|
return `await knex.raw(
|
|
231
|
-
\`CREATE ${methodMap[index.type]} ${index.name} ON ${table} (${index.columns
|
|
232
|
+
\`CREATE ${methodMap[index.type]} ${index.name} ON ${table} ${usingClause}(${index.columns
|
|
232
233
|
.map((col) => {
|
|
234
|
+
// 정렬 옵션은 btree만 사용 가능
|
|
235
|
+
if (index.using !== "btree" && index.using !== undefined) {
|
|
236
|
+
return `${col.name}`;
|
|
237
|
+
}
|
|
238
|
+
|
|
233
239
|
const sortOrderClause = col.sortOrder === undefined ? "" : ` ${col.sortOrder}`;
|
|
234
240
|
const nullsFirstClause =
|
|
235
241
|
col.nullsFirst === undefined ? "" : ` NULLS ${col.nullsFirst ? "FIRST" : "LAST"}`;
|
|
@@ -741,6 +747,7 @@ function setMigrationIndexDefaults(index: MigrationIndex): MigrationIndex {
|
|
|
741
747
|
nullsFirst: col.nullsFirst ?? col.sortOrder === "DESC",
|
|
742
748
|
})),
|
|
743
749
|
nullsNotDistinct: index.nullsNotDistinct ?? false,
|
|
750
|
+
using: index.using ?? "btree",
|
|
744
751
|
};
|
|
745
752
|
}
|
|
746
753
|
|
|
@@ -959,8 +966,8 @@ export async function generateAlterCode(
|
|
|
959
966
|
dbColumns.map(normalizeColumnForComparison),
|
|
960
967
|
);
|
|
961
968
|
const isEqualIndexes = equal(
|
|
962
|
-
entityIndexes.map(
|
|
963
|
-
dbIndexes,
|
|
969
|
+
entityIndexes.map(setMigrationIndexDefaults),
|
|
970
|
+
dbIndexes.map(setMigrationIndexDefaults),
|
|
964
971
|
);
|
|
965
972
|
if (!isEqualColumns || !isEqualIndexes) {
|
|
966
973
|
alterCodes.push(
|
|
@@ -232,6 +232,8 @@ function resolveEntityPropTypeToMigrationColumnType(prop: EntityProp): Migration
|
|
|
232
232
|
return "vector";
|
|
233
233
|
case "vector[]":
|
|
234
234
|
return "vector[]";
|
|
235
|
+
case "tsvector":
|
|
236
|
+
return "tsvector";
|
|
235
237
|
default:
|
|
236
238
|
exhaustive(prop);
|
|
237
239
|
throw new Error(`Unknown entity prop type: ${(prop as { type: string }).type}`);
|