@martin_yeung/knowledge-base-sdk 1.0.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/CHANGELOG.md ADDED
@@ -0,0 +1,30 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.0.0] - 2024-01-01
9
+
10
+ ### Added
11
+ - Initial release of Knowledge Base SDK
12
+ - Core KnowledgeBase class with full CRUD operations
13
+ - Intelligent search with multiple strategies
14
+ - Advanced search options and filtering
15
+ - Statistics and analytics
16
+ - Import/export functionality (JSON, CSV, Markdown, HTML)
17
+ - Event system for monitoring
18
+ - Comprehensive TypeScript types
19
+ - Browser-compatible client version
20
+ - Complete test suite with 90%+ coverage
21
+ - Documentation and examples
22
+
23
+ ### Features
24
+ - Smart keyword extraction and indexing
25
+ - Relevance scoring and ranking
26
+ - Caching system for improved performance
27
+ - Multi-language support (Chinese, English)
28
+ - Flexible configuration options
29
+ - Error handling and validation
30
+ - Logging system with multiple levels
package/README.md ADDED
@@ -0,0 +1,40 @@
1
+ ## 20260210
2
+ knowledge-base-sdk/
3
+
4
+ ├── src/
5
+ │ ├── index.ts # 主入口
6
+ │ ├── knowledge-base.ts # 主類
7
+ │ ├── types.ts # 類型定義
8
+ │ ├── config.ts # 配置
9
+ │ ├── cache.ts # 緩存模塊
10
+ │ ├── search-strategies.ts # 搜索策略
11
+ │ └── utils.ts # 工具函數
12
+ ├── tests/
13
+ │ ├── knowledge-base.test.ts
14
+ │ └── search-strategies.test.ts
15
+ ├── dist/ # 編譯輸出
16
+ ├── examples/ # 使用示例
17
+ ├── package.json
18
+ ├── tsconfig.json
19
+ ├── tsconfig.build.json
20
+ ├── README.md
21
+ ├── .npmignore
22
+ └── .gitignore
23
+
24
+ # UP知識庫 SDK
25
+ 用於合同分析和法律知識檢索的智能知識庫系統。
26
+
27
+ ## 功能特性
28
+ - 🔍 **智能搜索**:基於關鍵詞和語義的智能搜索
29
+ - 📁 **多分類管理**:支持按類別組織知識條目
30
+ - ⚡ **高效緩存**:內置緩存系統,提升搜索性能
31
+ - 🔄 **實時更新**:支持知識條目的增刪改查
32
+ - 📊 **統計分析**:提供詳細的統計信息和狀態監控
33
+ - 📤 **多格式導出**:支持 JSON、CSV、Markdown、HTML 導出
34
+ - 🎯 **事件系統**:完整的事件監聽和觸發機制
35
+ - 🛡️ **數據驗證**:嚴格的數據驗證和標準化
36
+
37
+ ## 安裝
38
+
39
+ ```bash
40
+ npm install @uppengarden/knowledge-base-sdk
@@ -0,0 +1,62 @@
1
+ /**
2
+ * 緩存管理器
3
+ */
4
+ export declare class CacheManager {
5
+ private cache;
6
+ private hits;
7
+ private misses;
8
+ constructor(ttlSeconds?: number, checkPeriod?: number);
9
+ /**
10
+ * 設置緩存
11
+ */
12
+ set<T>(key: string, data: T, ttl?: number): boolean;
13
+ /**
14
+ * 獲取緩存
15
+ */
16
+ get<T>(key: string): T | null;
17
+ /**
18
+ * 刪除緩存
19
+ */
20
+ del(key: string): void;
21
+ /**
22
+ * 清空緩存
23
+ */
24
+ clear(): void;
25
+ /**
26
+ * 獲取緩存狀態
27
+ */
28
+ getStats(): {
29
+ hits: number;
30
+ misses: number;
31
+ hitRate: number;
32
+ size: number;
33
+ keys: number;
34
+ ksize: number;
35
+ vsize: number;
36
+ };
37
+ /**
38
+ * 獲取所有緩存鍵
39
+ */
40
+ keys(): string[];
41
+ /**
42
+ * 檢查緩存是否存在
43
+ */
44
+ has(key: string): boolean;
45
+ /**
46
+ * 批量獲取緩存
47
+ */
48
+ mget<T>(keys: string[]): Record<string, T | null>;
49
+ /**
50
+ * 批量設置緩存
51
+ */
52
+ mset(items: Array<{
53
+ key: string;
54
+ val: any;
55
+ ttl?: number;
56
+ }>): boolean[];
57
+ /**
58
+ * 日志
59
+ */
60
+ private log;
61
+ }
62
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAa;gBAEf,UAAU,GAAE,MAAY,EAAE,WAAW,GAAE,MAAW;IAa9D;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO;IAqBnD;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAc7B;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKtB;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,QAAQ;;;;;;;;;IAWR;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAajD;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,EAAE;IAsBtE;;OAEG;IACH,OAAO,CAAC,GAAG;CAOZ"}
package/dist/cache.js ADDED
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CacheManager = void 0;
7
+ const node_cache_1 = __importDefault(require("node-cache"));
8
+ /**
9
+ * 緩存管理器
10
+ */
11
+ class CacheManager {
12
+ constructor(ttlSeconds = 300, checkPeriod = 60) {
13
+ this.hits = 0;
14
+ this.misses = 0;
15
+ this.cache = new node_cache_1.default({
16
+ stdTTL: ttlSeconds,
17
+ checkperiod: checkPeriod,
18
+ useClones: false,
19
+ });
20
+ // 監聽緩存事件
21
+ this.cache.on('expired', (key, _value) => {
22
+ this.log(`緩存過期: ${key}`);
23
+ });
24
+ }
25
+ /**
26
+ * 設置緩存
27
+ */
28
+ set(key, data, ttl) {
29
+ const finalTtl = ttl || this.cache.options.stdTTL || 300;
30
+ const success = this.cache.set(key, {
31
+ data,
32
+ timestamp: Date.now(),
33
+ expiresAt: Date.now() + finalTtl * 1000,
34
+ }, finalTtl);
35
+ if (success) {
36
+ this.log(`緩存設置: ${key}`);
37
+ }
38
+ else {
39
+ this.log(`緩存設置失敗: ${key}`, 'warn');
40
+ }
41
+ return success;
42
+ }
43
+ /**
44
+ * 獲取緩存
45
+ */
46
+ get(key) {
47
+ const cached = this.cache.get(key);
48
+ if (cached) {
49
+ this.hits++;
50
+ this.log(`緩存命中: ${key}`);
51
+ return cached.data;
52
+ }
53
+ this.misses++;
54
+ this.log(`緩存未命中: ${key}`);
55
+ return null;
56
+ }
57
+ /**
58
+ * 刪除緩存
59
+ */
60
+ del(key) {
61
+ this.cache.del(key);
62
+ this.log(`緩存刪除: ${key}`);
63
+ }
64
+ /**
65
+ * 清空緩存
66
+ */
67
+ clear() {
68
+ this.cache.flushAll();
69
+ this.hits = 0;
70
+ this.misses = 0;
71
+ this.log('緩存已清空');
72
+ }
73
+ /**
74
+ * 獲取緩存狀態
75
+ */
76
+ getStats() {
77
+ const stats = this.cache.getStats();
78
+ return {
79
+ ...stats,
80
+ hits: this.hits,
81
+ misses: this.misses,
82
+ hitRate: this.hits + this.misses > 0 ? this.hits / (this.hits + this.misses) : 0,
83
+ size: this.cache.keys().length,
84
+ };
85
+ }
86
+ /**
87
+ * 獲取所有緩存鍵
88
+ */
89
+ keys() {
90
+ return this.cache.keys();
91
+ }
92
+ /**
93
+ * 檢查緩存是否存在
94
+ */
95
+ has(key) {
96
+ return this.cache.has(key);
97
+ }
98
+ /**
99
+ * 批量獲取緩存
100
+ */
101
+ mget(keys) {
102
+ const values = this.cache.mget(keys);
103
+ const result = {};
104
+ keys.forEach(key => {
105
+ result[key] = values[key]?.data || null;
106
+ if (values[key])
107
+ this.hits++;
108
+ else
109
+ this.misses++;
110
+ });
111
+ return result;
112
+ }
113
+ /**
114
+ * 批量設置緩存
115
+ */
116
+ mset(items) {
117
+ const results = [];
118
+ items.forEach(item => {
119
+ const finalTtl = item.ttl || this.cache.options.stdTTL || 300;
120
+ const cacheItem = {
121
+ data: item.val,
122
+ timestamp: Date.now(),
123
+ expiresAt: Date.now() + finalTtl * 1000,
124
+ };
125
+ const success = this.cache.set(item.key, cacheItem, finalTtl);
126
+ results.push(success);
127
+ if (success) {
128
+ this.log(`批量緩存設置: ${item.key}`);
129
+ }
130
+ });
131
+ return results;
132
+ }
133
+ /**
134
+ * 日志
135
+ */
136
+ log(message, level = 'info') {
137
+ if (level === 'info') {
138
+ console.log(`[緩存] ${message}`);
139
+ }
140
+ else {
141
+ console.warn(`[緩存] ${message}`);
142
+ }
143
+ }
144
+ }
145
+ exports.CacheManager = CacheManager;
146
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * 瀏覽器客戶端版本
3
+ * 注意:這個版本移除了文件系統依賴,適用於瀏覽器環境
4
+ */
5
+ export interface KnowledgeItem {
6
+ id?: string;
7
+ category: 'legal' | 'case' | 'industry' | 'regulation' | 'guide';
8
+ title: string;
9
+ content: string;
10
+ source: string;
11
+ relevance: 'high' | 'medium' | 'low';
12
+ lastUpdated?: string;
13
+ createdAt?: string;
14
+ tags?: string[];
15
+ keywords?: string[];
16
+ metadata?: Record<string, any>;
17
+ version?: number;
18
+ }
19
+ export interface SearchOptions {
20
+ limit?: number;
21
+ minRelevance?: 'high' | 'medium' | 'low';
22
+ categories?: string[];
23
+ keywordMatch?: 'exact' | 'fuzzy' | 'all';
24
+ sortBy?: 'relevance' | 'date' | 'title' | 'category';
25
+ sortOrder?: 'asc' | 'desc';
26
+ includeMetadata?: boolean;
27
+ filters?: Record<string, any>;
28
+ advancedSearch?: boolean;
29
+ }
30
+ export interface SearchResult {
31
+ items: KnowledgeItem[];
32
+ total: number;
33
+ queryTime: number;
34
+ suggestions: string[];
35
+ pagination?: {
36
+ page: number;
37
+ pageSize: number;
38
+ totalPages: number;
39
+ hasNext: boolean;
40
+ hasPrevious: boolean;
41
+ };
42
+ query?: string;
43
+ options?: SearchOptions;
44
+ }
45
+ export declare class BrowserKnowledgeBase {
46
+ private knowledgeBase;
47
+ private keywordIndex;
48
+ constructor(data?: Record<string, KnowledgeItem[]>);
49
+ /**
50
+ * 加載數據
51
+ */
52
+ loadData(data: Record<string, KnowledgeItem[]>): void;
53
+ /**
54
+ * 搜索相關知識
55
+ */
56
+ search(query: string, options?: SearchOptions): Promise<SearchResult>;
57
+ /**
58
+ * 構建關鍵詞索引
59
+ */
60
+ private buildKeywordIndex;
61
+ /**
62
+ * 從文本提取關鍵詞
63
+ */
64
+ private extractKeywords;
65
+ /**
66
+ * 根據關鍵詞獲取相關分類
67
+ */
68
+ private getCategoriesByKeywords;
69
+ /**
70
+ * 計算相關度分數
71
+ */
72
+ private calculateRelevanceScore;
73
+ /**
74
+ * 應用過濾器
75
+ */
76
+ private applyFilters;
77
+ /**
78
+ * 生成搜索建議
79
+ */
80
+ private generateSuggestions;
81
+ /**
82
+ * 獲取分類數據
83
+ */
84
+ getByCategory(category: string, limit?: number): KnowledgeItem[];
85
+ /**
86
+ * 獲取所有分類
87
+ */
88
+ getCategories(): string[];
89
+ /**
90
+ * 獲取總條目數
91
+ */
92
+ getTotalItems(): number;
93
+ }
94
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;IACzC,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IACrD,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,aAAa,CAA2C;IAChE,OAAO,CAAC,YAAY,CAAoC;gBAE5C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAMlD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,GAAG,IAAI;IAUrD;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IA+E/E;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsEzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAkFvB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;OAEG;IACH,OAAO,CAAC,YAAY;IAwBpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+B3B;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAKhE;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;OAEG;IACH,aAAa,IAAI,MAAM;CAOxB"}