context-gatekeeper 0.3.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 +21 -0
- package/README.md +774 -0
- package/README.zh.md +765 -0
- package/bin/context-gatekeeper-cli.js +60 -0
- package/dist/api/gdpr.d.ts +104 -0
- package/dist/api/gdpr.d.ts.map +1 -0
- package/dist/api/gdpr.js +229 -0
- package/dist/api/gdpr.js.map +1 -0
- package/dist/api/health-check.d.ts +13 -0
- package/dist/api/health-check.d.ts.map +1 -0
- package/dist/api/health-check.js +2 -0
- package/dist/api/health-check.js.map +1 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/observability.d.ts +39 -0
- package/dist/api/observability.d.ts.map +1 -0
- package/dist/api/observability.js +132 -0
- package/dist/api/observability.js.map +1 -0
- package/dist/api/session-manager.d.ts +41 -0
- package/dist/api/session-manager.d.ts.map +1 -0
- package/dist/api/session-manager.js +129 -0
- package/dist/api/session-manager.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +613 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/configure-llm.d.ts +26 -0
- package/dist/mcp/tools/configure-llm.d.ts.map +1 -0
- package/dist/mcp/tools/configure-llm.js +32 -0
- package/dist/mcp/tools/configure-llm.js.map +1 -0
- package/dist/mcp/tools/context-compress.d.ts +15 -0
- package/dist/mcp/tools/context-compress.d.ts.map +1 -0
- package/dist/mcp/tools/context-compress.js +15 -0
- package/dist/mcp/tools/context-compress.js.map +1 -0
- package/dist/mcp/tools/dual-mode-execute.d.ts +78 -0
- package/dist/mcp/tools/dual-mode-execute.d.ts.map +1 -0
- package/dist/mcp/tools/dual-mode-execute.js +299 -0
- package/dist/mcp/tools/dual-mode-execute.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +19 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +20 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/intelligent-recall.d.ts +67 -0
- package/dist/mcp/tools/intelligent-recall.d.ts.map +1 -0
- package/dist/mcp/tools/intelligent-recall.js +208 -0
- package/dist/mcp/tools/intelligent-recall.js.map +1 -0
- package/dist/mcp/tools/memory-anchor.d.ts +13 -0
- package/dist/mcp/tools/memory-anchor.d.ts.map +1 -0
- package/dist/mcp/tools/memory-anchor.js +16 -0
- package/dist/mcp/tools/memory-anchor.js.map +1 -0
- package/dist/mcp/tools/memory-delete-batch.d.ts +16 -0
- package/dist/mcp/tools/memory-delete-batch.d.ts.map +1 -0
- package/dist/mcp/tools/memory-delete-batch.js +26 -0
- package/dist/mcp/tools/memory-delete-batch.js.map +1 -0
- package/dist/mcp/tools/memory-extract.d.ts +68 -0
- package/dist/mcp/tools/memory-extract.d.ts.map +1 -0
- package/dist/mcp/tools/memory-extract.js +280 -0
- package/dist/mcp/tools/memory-extract.js.map +1 -0
- package/dist/mcp/tools/memory-recall.d.ts +42 -0
- package/dist/mcp/tools/memory-recall.d.ts.map +1 -0
- package/dist/mcp/tools/memory-recall.js +37 -0
- package/dist/mcp/tools/memory-recall.js.map +1 -0
- package/dist/mcp/tools/memory-report-usage.d.ts +17 -0
- package/dist/mcp/tools/memory-report-usage.d.ts.map +1 -0
- package/dist/mcp/tools/memory-report-usage.js +15 -0
- package/dist/mcp/tools/memory-report-usage.js.map +1 -0
- package/dist/mcp/tools/memory-search.d.ts +43 -0
- package/dist/mcp/tools/memory-search.d.ts.map +1 -0
- package/dist/mcp/tools/memory-search.js +38 -0
- package/dist/mcp/tools/memory-search.js.map +1 -0
- package/dist/mcp/tools/memory-session.d.ts +118 -0
- package/dist/mcp/tools/memory-session.d.ts.map +1 -0
- package/dist/mcp/tools/memory-session.js +113 -0
- package/dist/mcp/tools/memory-session.js.map +1 -0
- package/dist/mcp/tools/memory-stats.d.ts +10 -0
- package/dist/mcp/tools/memory-stats.d.ts.map +1 -0
- package/dist/mcp/tools/memory-stats.js +35 -0
- package/dist/mcp/tools/memory-stats.js.map +1 -0
- package/dist/mcp/tools/memory-store-batch.d.ts +49 -0
- package/dist/mcp/tools/memory-store-batch.d.ts.map +1 -0
- package/dist/mcp/tools/memory-store-batch.js +48 -0
- package/dist/mcp/tools/memory-store-batch.js.map +1 -0
- package/dist/mcp/tools/memory-store.d.ts +37 -0
- package/dist/mcp/tools/memory-store.d.ts.map +1 -0
- package/dist/mcp/tools/memory-store.js +34 -0
- package/dist/mcp/tools/memory-store.js.map +1 -0
- package/dist/mcp/tools/project-create.d.ts +16 -0
- package/dist/mcp/tools/project-create.d.ts.map +1 -0
- package/dist/mcp/tools/project-create.js +14 -0
- package/dist/mcp/tools/project-create.js.map +1 -0
- package/dist/models/types.d.ts +88 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +19 -0
- package/dist/models/types.js.map +1 -0
- package/dist/schema/compression.d.ts +7 -0
- package/dist/schema/compression.d.ts.map +1 -0
- package/dist/schema/compression.js +66 -0
- package/dist/schema/compression.js.map +1 -0
- package/dist/schema/fulltext-search.d.ts +10 -0
- package/dist/schema/fulltext-search.d.ts.map +1 -0
- package/dist/schema/fulltext-search.js +73 -0
- package/dist/schema/fulltext-search.js.map +1 -0
- package/dist/schema/index.d.ts +9 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +9 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/knowledge-graph.d.ts +108 -0
- package/dist/schema/knowledge-graph.d.ts.map +1 -0
- package/dist/schema/knowledge-graph.js +372 -0
- package/dist/schema/knowledge-graph.js.map +1 -0
- package/dist/schema/memory-session.d.ts +62 -0
- package/dist/schema/memory-session.d.ts.map +1 -0
- package/dist/schema/memory-session.js +258 -0
- package/dist/schema/memory-session.js.map +1 -0
- package/dist/schema/memory.d.ts +84 -0
- package/dist/schema/memory.d.ts.map +1 -0
- package/dist/schema/memory.js +622 -0
- package/dist/schema/memory.js.map +1 -0
- package/dist/schema/project.d.ts +8 -0
- package/dist/schema/project.d.ts.map +1 -0
- package/dist/schema/project.js +68 -0
- package/dist/schema/project.js.map +1 -0
- package/dist/schema/schema-init.d.ts +2 -0
- package/dist/schema/schema-init.d.ts.map +1 -0
- package/dist/schema/schema-init.js +199 -0
- package/dist/schema/schema-init.js.map +1 -0
- package/dist/schema/vector-index.d.ts +28 -0
- package/dist/schema/vector-index.d.ts.map +1 -0
- package/dist/schema/vector-index.js +179 -0
- package/dist/schema/vector-index.js.map +1 -0
- package/dist/scripts/agents/base.d.ts +89 -0
- package/dist/scripts/agents/base.d.ts.map +1 -0
- package/dist/scripts/agents/base.js +148 -0
- package/dist/scripts/agents/base.js.map +1 -0
- package/dist/scripts/agents/base.ts +193 -0
- package/dist/scripts/agents/claude-code.d.ts +21 -0
- package/dist/scripts/agents/claude-code.d.ts.map +1 -0
- package/dist/scripts/agents/claude-code.js +33 -0
- package/dist/scripts/agents/claude-code.js.map +1 -0
- package/dist/scripts/agents/claude-code.ts +36 -0
- package/dist/scripts/agents/claude-desktop.d.ts +25 -0
- package/dist/scripts/agents/claude-desktop.d.ts.map +1 -0
- package/dist/scripts/agents/claude-desktop.js +36 -0
- package/dist/scripts/agents/claude-desktop.js.map +1 -0
- package/dist/scripts/agents/claude-desktop.ts +39 -0
- package/dist/scripts/agents/cline.d.ts +22 -0
- package/dist/scripts/agents/cline.d.ts.map +1 -0
- package/dist/scripts/agents/cline.js +35 -0
- package/dist/scripts/agents/cline.js.map +1 -0
- package/dist/scripts/agents/cline.ts +38 -0
- package/dist/scripts/agents/continue.d.ts +20 -0
- package/dist/scripts/agents/continue.d.ts.map +1 -0
- package/dist/scripts/agents/continue.js +35 -0
- package/dist/scripts/agents/continue.js.map +1 -0
- package/dist/scripts/agents/continue.ts +38 -0
- package/dist/scripts/agents/cursor.d.ts +27 -0
- package/dist/scripts/agents/cursor.d.ts.map +1 -0
- package/dist/scripts/agents/cursor.js +38 -0
- package/dist/scripts/agents/cursor.js.map +1 -0
- package/dist/scripts/agents/cursor.ts +41 -0
- package/dist/scripts/cli/config-gen.d.ts +59 -0
- package/dist/scripts/cli/config-gen.d.ts.map +1 -0
- package/dist/scripts/cli/config-gen.js +156 -0
- package/dist/scripts/cli/config-gen.js.map +1 -0
- package/dist/scripts/cli/config-gen.ts +164 -0
- package/dist/scripts/cli/detect.d.ts +42 -0
- package/dist/scripts/cli/detect.d.ts.map +1 -0
- package/dist/scripts/cli/detect.js +131 -0
- package/dist/scripts/cli/detect.js.map +1 -0
- package/dist/scripts/cli/detect.ts +162 -0
- package/dist/scripts/cli/install.d.ts +31 -0
- package/dist/scripts/cli/install.d.ts.map +1 -0
- package/dist/scripts/cli/install.js +125 -0
- package/dist/scripts/cli/install.js.map +1 -0
- package/dist/scripts/cli/install.ts +157 -0
- package/dist/scripts/cli/status.d.ts +8 -0
- package/dist/scripts/cli/status.d.ts.map +1 -0
- package/dist/scripts/cli/status.js +39 -0
- package/dist/scripts/cli/status.js.map +1 -0
- package/dist/scripts/cli/status.ts +48 -0
- package/dist/scripts/cli/uninstall.d.ts +22 -0
- package/dist/scripts/cli/uninstall.d.ts.map +1 -0
- package/dist/scripts/cli/uninstall.js +141 -0
- package/dist/scripts/cli/uninstall.js.map +1 -0
- package/dist/scripts/cli/uninstall.ts +157 -0
- package/dist/scripts/cli.d.ts +23 -0
- package/dist/scripts/cli.d.ts.map +1 -0
- package/dist/scripts/cli.js +166 -0
- package/dist/scripts/cli.js.map +1 -0
- package/dist/scripts/cli.ts +173 -0
- package/dist/services/classifier/index.d.ts +36 -0
- package/dist/services/classifier/index.d.ts.map +1 -0
- package/dist/services/classifier/index.js +104 -0
- package/dist/services/classifier/index.js.map +1 -0
- package/dist/services/classifier/llm.d.ts +37 -0
- package/dist/services/classifier/llm.d.ts.map +1 -0
- package/dist/services/classifier/llm.js +119 -0
- package/dist/services/classifier/llm.js.map +1 -0
- package/dist/services/classifier/rules.d.ts +22 -0
- package/dist/services/classifier/rules.d.ts.map +1 -0
- package/dist/services/classifier/rules.js +98 -0
- package/dist/services/classifier/rules.js.map +1 -0
- package/dist/services/compressor/index.d.ts +3 -0
- package/dist/services/compressor/index.d.ts.map +1 -0
- package/dist/services/compressor/index.js +3 -0
- package/dist/services/compressor/index.js.map +1 -0
- package/dist/services/compressor/threshold.d.ts +35 -0
- package/dist/services/compressor/threshold.d.ts.map +1 -0
- package/dist/services/compressor/threshold.js +60 -0
- package/dist/services/compressor/threshold.js.map +1 -0
- package/dist/services/compressor/trigger.d.ts +24 -0
- package/dist/services/compressor/trigger.d.ts.map +1 -0
- package/dist/services/compressor/trigger.js +91 -0
- package/dist/services/compressor/trigger.js.map +1 -0
- package/dist/services/constraint-extractor.d.ts +25 -0
- package/dist/services/constraint-extractor.d.ts.map +1 -0
- package/dist/services/constraint-extractor.js +97 -0
- package/dist/services/constraint-extractor.js.map +1 -0
- package/dist/services/database-health.d.ts +22 -0
- package/dist/services/database-health.d.ts.map +1 -0
- package/dist/services/database-health.js +122 -0
- package/dist/services/database-health.js.map +1 -0
- package/dist/services/embedding-fixed.d.ts +9 -0
- package/dist/services/embedding-fixed.d.ts.map +1 -0
- package/dist/services/embedding-fixed.js +70 -0
- package/dist/services/embedding-fixed.js.map +1 -0
- package/dist/services/embedding-provider.d.ts +79 -0
- package/dist/services/embedding-provider.d.ts.map +1 -0
- package/dist/services/embedding-provider.js +229 -0
- package/dist/services/embedding-provider.js.map +1 -0
- package/dist/services/embedding.d.ts +17 -0
- package/dist/services/embedding.d.ts.map +1 -0
- package/dist/services/embedding.js +99 -0
- package/dist/services/embedding.js.map +1 -0
- package/dist/services/hnsw-index.d.ts +76 -0
- package/dist/services/hnsw-index.d.ts.map +1 -0
- package/dist/services/hnsw-index.js +301 -0
- package/dist/services/hnsw-index.js.map +1 -0
- package/dist/services/llm.d.ts +39 -0
- package/dist/services/llm.d.ts.map +1 -0
- package/dist/services/llm.js +207 -0
- package/dist/services/llm.js.map +1 -0
- package/dist/services/memory-tiers.d.ts +75 -0
- package/dist/services/memory-tiers.d.ts.map +1 -0
- package/dist/services/memory-tiers.js +275 -0
- package/dist/services/memory-tiers.js.map +1 -0
- package/dist/services/memory.d.ts +33 -0
- package/dist/services/memory.d.ts.map +1 -0
- package/dist/services/memory.js +209 -0
- package/dist/services/memory.js.map +1 -0
- package/dist/services/multi-agent-sharing.d.ts +83 -0
- package/dist/services/multi-agent-sharing.d.ts.map +1 -0
- package/dist/services/multi-agent-sharing.js +278 -0
- package/dist/services/multi-agent-sharing.js.map +1 -0
- package/dist/services/reranker.d.ts +88 -0
- package/dist/services/reranker.d.ts.map +1 -0
- package/dist/services/reranker.js +234 -0
- package/dist/services/reranker.js.map +1 -0
- package/dist/services/triple-extractor.d.ts +35 -0
- package/dist/services/triple-extractor.d.ts.map +1 -0
- package/dist/services/triple-extractor.js +293 -0
- package/dist/services/triple-extractor.js.map +1 -0
- package/dist/services/vector-provider.d.ts +40 -0
- package/dist/services/vector-provider.d.ts.map +1 -0
- package/dist/services/vector-provider.js +225 -0
- package/dist/services/vector-provider.js.map +1 -0
- package/dist/utils/after-chain-executor.d.ts +26 -0
- package/dist/utils/after-chain-executor.d.ts.map +1 -0
- package/dist/utils/after-chain-executor.js +135 -0
- package/dist/utils/after-chain-executor.js.map +1 -0
- package/dist/utils/after-chain.d.ts +94 -0
- package/dist/utils/after-chain.d.ts.map +1 -0
- package/dist/utils/after-chain.js +155 -0
- package/dist/utils/after-chain.js.map +1 -0
- package/dist/utils/db.d.ts +29 -0
- package/dist/utils/db.d.ts.map +1 -0
- package/dist/utils/db.js +201 -0
- package/dist/utils/db.js.map +1 -0
- package/dist/utils/encryption.d.ts +87 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +175 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/errors.d.ts +35 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +56 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +27 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +177 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/priority.d.ts +26 -0
- package/dist/utils/priority.d.ts.map +1 -0
- package/dist/utils/priority.js +43 -0
- package/dist/utils/priority.js.map +1 -0
- package/dist/utils/watchdog.d.ts +57 -0
- package/dist/utils/watchdog.d.ts.map +1 -0
- package/dist/utils/watchdog.js +164 -0
- package/dist/utils/watchdog.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Provider 抽象接口
|
|
3
|
+
*
|
|
4
|
+
* 支持多种 embedding 后端:
|
|
5
|
+
* - tfidf: 零依赖 TF-IDF(默认降级)
|
|
6
|
+
* - openai: OpenAI text-embedding-3-small/ada-002
|
|
7
|
+
* - cohere: Cohere Embed v3/v4
|
|
8
|
+
* - ollama: 本地 Ollama embedding 模型
|
|
9
|
+
*/
|
|
10
|
+
export interface EmbeddingResult {
|
|
11
|
+
vector: number[];
|
|
12
|
+
dimension: number;
|
|
13
|
+
model: string;
|
|
14
|
+
provider: string;
|
|
15
|
+
}
|
|
16
|
+
export interface EmbeddingProvider {
|
|
17
|
+
/** Provider 名称 */
|
|
18
|
+
readonly name: string;
|
|
19
|
+
/** 生成文本的 embedding 向量 */
|
|
20
|
+
embed(content: string): Promise<EmbeddingResult>;
|
|
21
|
+
/** 批量生成 embedding */
|
|
22
|
+
embedBatch(contents: string[]): Promise<EmbeddingResult[]>;
|
|
23
|
+
/** 向量维度 */
|
|
24
|
+
readonly dimension: number;
|
|
25
|
+
/** 是否可用(已配置) */
|
|
26
|
+
isAvailable(): boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare class TfidfEmbeddingProvider implements EmbeddingProvider {
|
|
29
|
+
readonly name = "tfidf";
|
|
30
|
+
readonly dimension = 4096;
|
|
31
|
+
private corpus;
|
|
32
|
+
embed(content: string): Promise<EmbeddingResult>;
|
|
33
|
+
embedBatch(contents: string[]): Promise<EmbeddingResult[]>;
|
|
34
|
+
isAvailable(): boolean;
|
|
35
|
+
/** 更新语料库(用于增量索引) */
|
|
36
|
+
addToCorpus(content: string): void;
|
|
37
|
+
/** 清空语料库 */
|
|
38
|
+
clearCorpus(): void;
|
|
39
|
+
}
|
|
40
|
+
export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
|
|
41
|
+
readonly name = "openai";
|
|
42
|
+
readonly dimension: number;
|
|
43
|
+
readonly model: string;
|
|
44
|
+
private apiKey;
|
|
45
|
+
private baseUrl;
|
|
46
|
+
constructor(model?: string, dimension?: number);
|
|
47
|
+
isAvailable(): boolean;
|
|
48
|
+
setApiKey(key: string): void;
|
|
49
|
+
setBaseUrl(url: string): void;
|
|
50
|
+
embed(content: string): Promise<EmbeddingResult>;
|
|
51
|
+
embedBatch(contents: string[]): Promise<EmbeddingResult[]>;
|
|
52
|
+
}
|
|
53
|
+
export declare class CohereEmbeddingProvider implements EmbeddingProvider {
|
|
54
|
+
readonly name = "cohere";
|
|
55
|
+
readonly dimension = 1024;
|
|
56
|
+
readonly model = "embed-english-v3.0";
|
|
57
|
+
private apiKey;
|
|
58
|
+
constructor();
|
|
59
|
+
isAvailable(): boolean;
|
|
60
|
+
setApiKey(key: string): void;
|
|
61
|
+
embed(content: string): Promise<EmbeddingResult>;
|
|
62
|
+
embedBatch(contents: string[]): Promise<EmbeddingResult[]>;
|
|
63
|
+
}
|
|
64
|
+
export type EmbeddingProviderName = 'tfidf' | 'openai' | 'cohere' | 'ollama';
|
|
65
|
+
export interface EmbeddingConfig {
|
|
66
|
+
provider: EmbeddingProviderName;
|
|
67
|
+
openaiApiKey?: string;
|
|
68
|
+
cohereApiKey?: string;
|
|
69
|
+
openaiModel?: string;
|
|
70
|
+
openaiBaseUrl?: string;
|
|
71
|
+
}
|
|
72
|
+
export declare function configureEmbeddingProvider(config: EmbeddingConfig): void;
|
|
73
|
+
export declare function getCurrentProvider(): EmbeddingProvider;
|
|
74
|
+
export declare function getEmbeddingConfig(): EmbeddingConfig;
|
|
75
|
+
/** 获取当前 provider 的便捷函数 */
|
|
76
|
+
export declare function generateEmbedding(content: string): Promise<EmbeddingResult>;
|
|
77
|
+
/** 批量生成 embedding */
|
|
78
|
+
export declare function generateEmbeddingBatch(contents: string[]): Promise<EmbeddingResult[]>;
|
|
79
|
+
//# sourceMappingURL=embedding-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-provider.d.ts","sourceRoot":"","sources":["../../src/services/embedding-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Provider 抽象接口
|
|
3
|
+
*
|
|
4
|
+
* 支持多种 embedding 后端:
|
|
5
|
+
* - tfidf: 零依赖 TF-IDF(默认降级)
|
|
6
|
+
* - openai: OpenAI text-embedding-3-small/ada-002
|
|
7
|
+
* - cohere: Cohere Embed v3/v4
|
|
8
|
+
* - ollama: 本地 Ollama embedding 模型
|
|
9
|
+
*/
|
|
10
|
+
// ============================================================
|
|
11
|
+
// TF-IDF Provider(零依赖降级)
|
|
12
|
+
// ============================================================
|
|
13
|
+
import { generateFixedEmbedding, FIXED_EMBEDDING_DIMENSION } from './embedding-fixed.js';
|
|
14
|
+
export class TfidfEmbeddingProvider {
|
|
15
|
+
name = 'tfidf';
|
|
16
|
+
dimension = FIXED_EMBEDDING_DIMENSION;
|
|
17
|
+
corpus = [];
|
|
18
|
+
embed(content) {
|
|
19
|
+
const vector = generateFixedEmbedding(content, this.corpus);
|
|
20
|
+
this.corpus.push(content);
|
|
21
|
+
return Promise.resolve({ vector, dimension: this.dimension, model: 'fixed-tfidf', provider: 'tfidf' });
|
|
22
|
+
}
|
|
23
|
+
embedBatch(contents) {
|
|
24
|
+
const results = contents.map(content => {
|
|
25
|
+
const vector = generateFixedEmbedding(content, this.corpus);
|
|
26
|
+
this.corpus.push(content);
|
|
27
|
+
return { vector, dimension: this.dimension, model: 'fixed-tfidf', provider: 'tfidf' };
|
|
28
|
+
});
|
|
29
|
+
return Promise.resolve(results);
|
|
30
|
+
}
|
|
31
|
+
isAvailable() {
|
|
32
|
+
return true; // 始终可用
|
|
33
|
+
}
|
|
34
|
+
/** 更新语料库(用于增量索引) */
|
|
35
|
+
addToCorpus(content) {
|
|
36
|
+
this.corpus.push(content);
|
|
37
|
+
}
|
|
38
|
+
/** 清空语料库 */
|
|
39
|
+
clearCorpus() {
|
|
40
|
+
this.corpus = [];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// ============================================================
|
|
44
|
+
// OpenAI Provider
|
|
45
|
+
// ============================================================
|
|
46
|
+
export class OpenAIEmbeddingProvider {
|
|
47
|
+
name = 'openai';
|
|
48
|
+
dimension;
|
|
49
|
+
model;
|
|
50
|
+
apiKey;
|
|
51
|
+
baseUrl;
|
|
52
|
+
constructor(model = 'text-embedding-3-small', dimension = 1536) {
|
|
53
|
+
this.model = model;
|
|
54
|
+
this.dimension = dimension;
|
|
55
|
+
this.apiKey = process.env.OPENAI_API_KEY || '';
|
|
56
|
+
this.baseUrl = process.env.OPENAI_EMBEDDING_BASE_URL || 'https://api.openai.com/v1';
|
|
57
|
+
}
|
|
58
|
+
isAvailable() {
|
|
59
|
+
return !!this.apiKey;
|
|
60
|
+
}
|
|
61
|
+
setApiKey(key) {
|
|
62
|
+
this.apiKey = key;
|
|
63
|
+
}
|
|
64
|
+
setBaseUrl(url) {
|
|
65
|
+
this.baseUrl = url;
|
|
66
|
+
}
|
|
67
|
+
async embed(content) {
|
|
68
|
+
if (!this.isAvailable()) {
|
|
69
|
+
throw new Error('OpenAI API key not configured');
|
|
70
|
+
}
|
|
71
|
+
const response = await fetch(`${this.baseUrl}/embeddings`, {
|
|
72
|
+
method: 'POST',
|
|
73
|
+
headers: {
|
|
74
|
+
'Content-Type': 'application/json',
|
|
75
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
76
|
+
},
|
|
77
|
+
body: JSON.stringify({
|
|
78
|
+
model: this.model,
|
|
79
|
+
input: content,
|
|
80
|
+
}),
|
|
81
|
+
});
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
throw new Error(`OpenAI embedding error: ${response.status}`);
|
|
84
|
+
}
|
|
85
|
+
const data = await response.json();
|
|
86
|
+
const vector = data.data[0]?.embedding ?? new Array(this.dimension).fill(0);
|
|
87
|
+
return { vector, dimension: vector.length, model: this.model, provider: 'openai' };
|
|
88
|
+
}
|
|
89
|
+
async embedBatch(contents) {
|
|
90
|
+
if (!this.isAvailable()) {
|
|
91
|
+
throw new Error('OpenAI API key not configured');
|
|
92
|
+
}
|
|
93
|
+
const response = await fetch(`${this.baseUrl}/embeddings`, {
|
|
94
|
+
method: 'POST',
|
|
95
|
+
headers: {
|
|
96
|
+
'Content-Type': 'application/json',
|
|
97
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
98
|
+
},
|
|
99
|
+
body: JSON.stringify({
|
|
100
|
+
model: this.model,
|
|
101
|
+
input: contents,
|
|
102
|
+
}),
|
|
103
|
+
});
|
|
104
|
+
if (!response.ok) {
|
|
105
|
+
throw new Error(`OpenAI embedding error: ${response.status}`);
|
|
106
|
+
}
|
|
107
|
+
const data = await response.json();
|
|
108
|
+
return data.data.map(item => ({
|
|
109
|
+
vector: item.embedding,
|
|
110
|
+
dimension: item.embedding.length,
|
|
111
|
+
model: this.model,
|
|
112
|
+
provider: 'openai',
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// ============================================================
|
|
117
|
+
// Cohere Provider
|
|
118
|
+
// ============================================================
|
|
119
|
+
export class CohereEmbeddingProvider {
|
|
120
|
+
name = 'cohere';
|
|
121
|
+
dimension = 1024;
|
|
122
|
+
model = 'embed-english-v3.0';
|
|
123
|
+
apiKey;
|
|
124
|
+
constructor() {
|
|
125
|
+
this.apiKey = process.env.COHERE_API_KEY || '';
|
|
126
|
+
}
|
|
127
|
+
isAvailable() {
|
|
128
|
+
return !!this.apiKey;
|
|
129
|
+
}
|
|
130
|
+
setApiKey(key) {
|
|
131
|
+
this.apiKey = key;
|
|
132
|
+
}
|
|
133
|
+
async embed(content) {
|
|
134
|
+
if (!this.isAvailable()) {
|
|
135
|
+
throw new Error('Cohere API key not configured');
|
|
136
|
+
}
|
|
137
|
+
const response = await fetch('https://api.cohere.ai/v1/embed', {
|
|
138
|
+
method: 'POST',
|
|
139
|
+
headers: {
|
|
140
|
+
'Content-Type': 'application/json',
|
|
141
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
142
|
+
},
|
|
143
|
+
body: JSON.stringify({
|
|
144
|
+
texts: [content],
|
|
145
|
+
model: this.model,
|
|
146
|
+
input_type: 'search_document',
|
|
147
|
+
}),
|
|
148
|
+
});
|
|
149
|
+
if (!response.ok) {
|
|
150
|
+
throw new Error(`Cohere embedding error: ${response.status}`);
|
|
151
|
+
}
|
|
152
|
+
const data = await response.json();
|
|
153
|
+
return {
|
|
154
|
+
vector: data.embeddings[0] ?? new Array(this.dimension).fill(0),
|
|
155
|
+
dimension: this.dimension,
|
|
156
|
+
model: this.model,
|
|
157
|
+
provider: 'cohere',
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async embedBatch(contents) {
|
|
161
|
+
if (!this.isAvailable()) {
|
|
162
|
+
throw new Error('Cohere API key not configured');
|
|
163
|
+
}
|
|
164
|
+
const response = await fetch('https://api.cohere.ai/v1/embed', {
|
|
165
|
+
method: 'POST',
|
|
166
|
+
headers: {
|
|
167
|
+
'Content-Type': 'application/json',
|
|
168
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
169
|
+
},
|
|
170
|
+
body: JSON.stringify({
|
|
171
|
+
texts: contents,
|
|
172
|
+
model: this.model,
|
|
173
|
+
input_type: 'search_document',
|
|
174
|
+
}),
|
|
175
|
+
});
|
|
176
|
+
if (!response.ok) {
|
|
177
|
+
throw new Error(`Cohere embedding error: ${response.status}`);
|
|
178
|
+
}
|
|
179
|
+
const data = await response.json();
|
|
180
|
+
return data.embeddings.map(vector => ({
|
|
181
|
+
vector,
|
|
182
|
+
dimension: vector.length,
|
|
183
|
+
model: this.model,
|
|
184
|
+
provider: 'cohere',
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
let currentProvider = new TfidfEmbeddingProvider();
|
|
189
|
+
let currentConfig = { provider: 'tfidf' };
|
|
190
|
+
export function configureEmbeddingProvider(config) {
|
|
191
|
+
currentConfig = config;
|
|
192
|
+
switch (config.provider) {
|
|
193
|
+
case 'openai': {
|
|
194
|
+
const provider = new OpenAIEmbeddingProvider(config.openaiModel || 'text-embedding-3-small', config.openaiModel === 'text-embedding-3-large' ? 3072 : 1536);
|
|
195
|
+
if (config.openaiApiKey)
|
|
196
|
+
provider.setApiKey(config.openaiApiKey);
|
|
197
|
+
if (config.openaiBaseUrl)
|
|
198
|
+
provider.setBaseUrl(config.openaiBaseUrl);
|
|
199
|
+
currentProvider = provider;
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
case 'cohere': {
|
|
203
|
+
const provider = new CohereEmbeddingProvider();
|
|
204
|
+
if (config.cohereApiKey)
|
|
205
|
+
provider.setApiKey(config.cohereApiKey);
|
|
206
|
+
currentProvider = provider;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
case 'tfidf':
|
|
210
|
+
default:
|
|
211
|
+
currentProvider = new TfidfEmbeddingProvider();
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
export function getCurrentProvider() {
|
|
216
|
+
return currentProvider;
|
|
217
|
+
}
|
|
218
|
+
export function getEmbeddingConfig() {
|
|
219
|
+
return { ...currentConfig };
|
|
220
|
+
}
|
|
221
|
+
/** 获取当前 provider 的便捷函数 */
|
|
222
|
+
export async function generateEmbedding(content) {
|
|
223
|
+
return currentProvider.embed(content);
|
|
224
|
+
}
|
|
225
|
+
/** 批量生成 embedding */
|
|
226
|
+
export async function generateEmbeddingBatch(contents) {
|
|
227
|
+
return currentProvider.embedBatch(contents);
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=embedding-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-provider.js","sourceRoot":"","sources":["../../src/services/embedding-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple TF-IDF based embedding service
|
|
3
|
+
* Provides semantic embeddings without external API dependencies
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Generate TF-IDF vector for a document
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateEmbedding(content: string, existingContents?: string[]): number[];
|
|
9
|
+
/**
|
|
10
|
+
* Generate embedding for a query (same process)
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateQueryEmbedding(query: string): number[];
|
|
13
|
+
/**
|
|
14
|
+
* Vector dimension for embeddings
|
|
15
|
+
*/
|
|
16
|
+
export declare const VECTOR_DIM = 128;
|
|
17
|
+
//# sourceMappingURL=embedding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/services/embedding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8BH;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,gBAAgB,GAAE,MAAM,EAAO,GAC9B,MAAM,EAAE,CAuCV;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9D;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,MAAM,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple TF-IDF based embedding service
|
|
3
|
+
* Provides semantic embeddings without external API dependencies
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Tokenize text into words
|
|
7
|
+
*/
|
|
8
|
+
function tokenize(text) {
|
|
9
|
+
return text
|
|
10
|
+
.toLowerCase()
|
|
11
|
+
.replace(/[^\w\s]/g, ' ')
|
|
12
|
+
.split(/\s+/)
|
|
13
|
+
.filter(word => word.length > 1)
|
|
14
|
+
.filter(word => !STOP_WORDS.has(word));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Calculate term frequency
|
|
18
|
+
*/
|
|
19
|
+
function termFrequency(term, tokens) {
|
|
20
|
+
const count = tokens.filter(t => t === term).length;
|
|
21
|
+
return count / Math.max(tokens.length, 1);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Calculate inverse document frequency
|
|
25
|
+
*/
|
|
26
|
+
function inverseDocumentFrequency(term, allTokens) {
|
|
27
|
+
const docsWithTerm = allTokens.filter(tokens => tokens.includes(term)).length;
|
|
28
|
+
return Math.log((allTokens.length + 1) / (docsWithTerm + 1)) + 1;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate TF-IDF vector for a document
|
|
32
|
+
*/
|
|
33
|
+
export function generateEmbedding(content, existingContents = []) {
|
|
34
|
+
const tokens = tokenize(content);
|
|
35
|
+
if (tokens.length === 0) {
|
|
36
|
+
return new Array(VECTOR_DIM).fill(0);
|
|
37
|
+
}
|
|
38
|
+
// Build vocabulary from all documents
|
|
39
|
+
const allDocs = existingContents.concat([content]);
|
|
40
|
+
const allTokens = allDocs.map(tokenize);
|
|
41
|
+
const vocabulary = new Map();
|
|
42
|
+
let vocabIndex = 0;
|
|
43
|
+
for (const docTokens of allTokens) {
|
|
44
|
+
for (const token of docTokens) {
|
|
45
|
+
if (!vocabulary.has(token) && vocabIndex < VECTOR_DIM) {
|
|
46
|
+
vocabulary.set(token, vocabIndex++);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Create TF-IDF vector
|
|
51
|
+
const vector = new Array(VECTOR_DIM).fill(0);
|
|
52
|
+
for (const [token, index] of vocabulary.entries()) {
|
|
53
|
+
const tf = termFrequency(token, tokens);
|
|
54
|
+
const idf = inverseDocumentFrequency(token, allTokens);
|
|
55
|
+
vector[index] = tf * idf;
|
|
56
|
+
}
|
|
57
|
+
// Normalize vector
|
|
58
|
+
const magnitude = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));
|
|
59
|
+
if (magnitude > 0) {
|
|
60
|
+
for (let i = 0; i < vector.length; i++) {
|
|
61
|
+
vector[i] /= magnitude;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return vector;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Generate embedding for a query (same process)
|
|
68
|
+
*/
|
|
69
|
+
export function generateQueryEmbedding(query) {
|
|
70
|
+
return generateEmbedding(query, []);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Vector dimension for embeddings
|
|
74
|
+
*/
|
|
75
|
+
export const VECTOR_DIM = 128;
|
|
76
|
+
/**
|
|
77
|
+
* English stop words
|
|
78
|
+
*/
|
|
79
|
+
const STOP_WORDS = new Set([
|
|
80
|
+
'a', 'an', 'and', 'are', 'as', 'at', 'be', 'by', 'for', 'from',
|
|
81
|
+
'has', 'he', 'in', 'is', 'it', 'its', 'of', 'on', 'that', 'the',
|
|
82
|
+
'to', 'was', 'will', 'with', 'i', 'me', 'my', 'myself', 'we', 'our',
|
|
83
|
+
'ours', 'ourselves', 'you', 'your', 'yours', 'yourself', 'yourselves',
|
|
84
|
+
'he', 'him', 'his', 'himself', 'she', 'her', 'hers', 'herself', 'it',
|
|
85
|
+
'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves',
|
|
86
|
+
'what', 'which', 'who', 'whom', 'this', 'that', 'these', 'those',
|
|
87
|
+
'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has',
|
|
88
|
+
'had', 'having', 'do', 'does', 'did', 'doing', 'would', 'should', 'could',
|
|
89
|
+
'ought', 'can', 'cannot', 'could', 'may', 'might', 'must', 'need',
|
|
90
|
+
'shall', 'should', 'will', 'would', 'but', 'if', 'or', 'because', 'as',
|
|
91
|
+
'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against',
|
|
92
|
+
'between', 'into', 'through', 'during', 'before', 'after', 'above',
|
|
93
|
+
'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over',
|
|
94
|
+
'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when',
|
|
95
|
+
'where', 'why', 'how', 'all', 'each', 'few', 'more', 'most', 'other',
|
|
96
|
+
'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so',
|
|
97
|
+
'than', 'too', 'very', 'just', 'now', 'also', 'get', 'got', 'getting'
|
|
98
|
+
]);
|
|
99
|
+
//# sourceMappingURL=embedding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/services/embedding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HNSW (Hierarchical Navigable Small World) Index Simulation Layer
|
|
3
|
+
* Provides approximate nearest neighbor (ANN) search using a layered graph structure
|
|
4
|
+
*
|
|
5
|
+
* HNSW Parameters:
|
|
6
|
+
* - M: number of connections per layer (default 16)
|
|
7
|
+
* - efConstruction: search width during construction (default 200)
|
|
8
|
+
* - efSearch: search width during search (default 100)
|
|
9
|
+
* - levelMult: probability multiplier for level generation (default 1/log(2) ≈ 1.44)
|
|
10
|
+
*/
|
|
11
|
+
export interface HNSWConfig {
|
|
12
|
+
M: number;
|
|
13
|
+
efConstruction: number;
|
|
14
|
+
efSearch: number;
|
|
15
|
+
levelMult: number;
|
|
16
|
+
dimension: number;
|
|
17
|
+
metric: 'cosine' | 'l2' | 'ip';
|
|
18
|
+
}
|
|
19
|
+
export interface HNSWNode {
|
|
20
|
+
id: string;
|
|
21
|
+
memoryId: string;
|
|
22
|
+
vector: number[];
|
|
23
|
+
level: number;
|
|
24
|
+
labels: string[];
|
|
25
|
+
createdAt: string;
|
|
26
|
+
}
|
|
27
|
+
export interface HNSWSearchResult {
|
|
28
|
+
memoryId: string;
|
|
29
|
+
score: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Initialize HNSW index in database
|
|
33
|
+
*/
|
|
34
|
+
export declare function initHNSWIndex(_indexName: string, config?: Partial<HNSWConfig>): HNSWConfig;
|
|
35
|
+
/**
|
|
36
|
+
* Create a new HNSW index in memory
|
|
37
|
+
*/
|
|
38
|
+
export declare function createHNSWIndex(indexName: string, config?: Partial<HNSWConfig>): HNSWConfig;
|
|
39
|
+
/**
|
|
40
|
+
* Get or create an HNSW index
|
|
41
|
+
*/
|
|
42
|
+
export declare function getHNSWIndex(indexName: string): HNSWConfig | null;
|
|
43
|
+
/**
|
|
44
|
+
* Insert a node into the HNSW index
|
|
45
|
+
*/
|
|
46
|
+
export declare function insertHNSWNode(indexName: string, memoryId: string, vector: number[], labels?: string[]): HNSWNode | null;
|
|
47
|
+
/**
|
|
48
|
+
* Search for nearest neighbors
|
|
49
|
+
*/
|
|
50
|
+
export declare function searchHNSW(indexName: string, queryVector: number[], k?: number, efSearch?: number): HNSWSearchResult[];
|
|
51
|
+
/**
|
|
52
|
+
* Remove a node from HNSW index
|
|
53
|
+
*/
|
|
54
|
+
export declare function removeHNSWNode(indexName: string, memoryId: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Get statistics for an HNSW index
|
|
57
|
+
*/
|
|
58
|
+
export declare function getHNSWStats(indexName: string): {
|
|
59
|
+
nodeCount: number;
|
|
60
|
+
maxLevel: number;
|
|
61
|
+
memorySize: number;
|
|
62
|
+
config: HNSWConfig;
|
|
63
|
+
} | null;
|
|
64
|
+
/**
|
|
65
|
+
* Clear an HNSW index from memory
|
|
66
|
+
*/
|
|
67
|
+
export declare function clearHNSWIndex(indexName: string): void;
|
|
68
|
+
/**
|
|
69
|
+
* Sync HNSW index with database (load persisted nodes)
|
|
70
|
+
*/
|
|
71
|
+
export declare function syncHNSWFromDB(indexName: string, config?: Partial<HNSWConfig>): number;
|
|
72
|
+
/**
|
|
73
|
+
* Persist HNSW nodes to database
|
|
74
|
+
*/
|
|
75
|
+
export declare function persistHNSWToDB(indexName: string): number;
|
|
76
|
+
//# sourceMappingURL=hnsw-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hnsw-index.d.ts","sourceRoot":"","sources":["../../src/services/hnsw-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAmBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,UAAU,CAqB9F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,UAAU,CAa/F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAiBjE;AAwFD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,GAAE,MAAM,EAAO,GACpB,QAAQ,GAAG,IAAI,CAgCjB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EAAE,EACrB,CAAC,GAAE,MAAW,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,gBAAgB,EAAE,CAiCpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAwB3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;CACpB,GAAG,IAAI,CAkBP;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,MAAM,CAsC1F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAiBzD"}
|