workerclaw 0.3.7 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/agent/agent-engine.d.ts +28 -2
  2. package/dist/agent/agent-engine.d.ts.map +1 -1
  3. package/dist/agent/agent-engine.js +123 -6
  4. package/dist/agent/agent-engine.js.map +1 -1
  5. package/dist/cli/index.js +24 -1
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/cli/sections/experience.d.ts +10 -0
  8. package/dist/cli/sections/experience.d.ts.map +1 -0
  9. package/dist/cli/sections/experience.js +148 -0
  10. package/dist/cli/sections/experience.js.map +1 -0
  11. package/dist/core/config.d.ts +2 -0
  12. package/dist/core/config.d.ts.map +1 -1
  13. package/dist/core/config.js.map +1 -1
  14. package/dist/core/events.d.ts +19 -1
  15. package/dist/core/events.d.ts.map +1 -1
  16. package/dist/core/events.js +4 -0
  17. package/dist/core/events.js.map +1 -1
  18. package/dist/core/workerclaw.d.ts +7 -0
  19. package/dist/core/workerclaw.d.ts.map +1 -1
  20. package/dist/core/workerclaw.js +30 -0
  21. package/dist/core/workerclaw.js.map +1 -1
  22. package/dist/experience/encapsulator.d.ts +95 -0
  23. package/dist/experience/encapsulator.d.ts.map +1 -0
  24. package/dist/experience/encapsulator.js +239 -0
  25. package/dist/experience/encapsulator.js.map +1 -0
  26. package/dist/experience/hub-client.d.ts +32 -0
  27. package/dist/experience/hub-client.d.ts.map +1 -0
  28. package/dist/experience/hub-client.js +126 -0
  29. package/dist/experience/hub-client.js.map +1 -0
  30. package/dist/experience/index.d.ts +13 -0
  31. package/dist/experience/index.d.ts.map +1 -0
  32. package/dist/experience/index.js +30 -0
  33. package/dist/experience/index.js.map +1 -0
  34. package/dist/experience/local-store.d.ts +102 -0
  35. package/dist/experience/local-store.d.ts.map +1 -0
  36. package/dist/experience/local-store.js +321 -0
  37. package/dist/experience/local-store.js.map +1 -0
  38. package/dist/experience/manager.d.ts +71 -0
  39. package/dist/experience/manager.d.ts.map +1 -0
  40. package/dist/experience/manager.js +184 -0
  41. package/dist/experience/manager.js.map +1 -0
  42. package/dist/experience/search-engine.d.ts +80 -0
  43. package/dist/experience/search-engine.d.ts.map +1 -0
  44. package/dist/experience/search-engine.js +258 -0
  45. package/dist/experience/search-engine.js.map +1 -0
  46. package/dist/experience/signal-detector.d.ts +33 -0
  47. package/dist/experience/signal-detector.d.ts.map +1 -0
  48. package/dist/experience/signal-detector.js +182 -0
  49. package/dist/experience/signal-detector.js.map +1 -0
  50. package/dist/experience/types.d.ts +189 -0
  51. package/dist/experience/types.d.ts.map +1 -0
  52. package/dist/experience/types.js +7 -0
  53. package/dist/experience/types.js.map +1 -0
  54. package/dist/index.d.ts +3 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +3 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/task/task-manager.d.ts +7 -0
  59. package/dist/task/task-manager.d.ts.map +1 -1
  60. package/dist/task/task-manager.js +50 -1
  61. package/dist/task/task-manager.js.map +1 -1
  62. package/dist/types/task.d.ts +2 -0
  63. package/dist/types/task.d.ts.map +1 -1
  64. package/package.json +1 -1
@@ -0,0 +1,71 @@
1
+ /**
2
+ * 经验管理器
3
+ *
4
+ * 统一管理经验基因系统的所有模块
5
+ * 对外提供简洁 API,集成到 WorkerClaw 主流程
6
+ */
7
+ import type { ExperienceConfig, ExperienceSearchResult, ShrimpGene, ShrimpCapsule, ShrimpEvolution, StrategyStep } from './types.js';
8
+ export declare class ExperienceManager {
9
+ private logger;
10
+ private config;
11
+ private store;
12
+ private signalDetector;
13
+ private searchEngine;
14
+ private encapsulator;
15
+ private hubClient;
16
+ private initialized;
17
+ private currentEvolution;
18
+ constructor(config: ExperienceConfig, botId: string, token: string);
19
+ /**
20
+ * 初始化经验系统
21
+ */
22
+ init(): Promise<void>;
23
+ /**
24
+ * 错误发生时自动搜索经验
25
+ */
26
+ searchOnError(errorMessage: string): Promise<ExperienceSearchResult | null>;
27
+ /**
28
+ * 手动搜索经验
29
+ */
30
+ search(keywords: string[]): Promise<ExperienceSearchResult[]>;
31
+ /**
32
+ * 从错误消息检测信号
33
+ */
34
+ detectSignals(errorMessage: string): import("./signal-detector.js").DetectedSignal;
35
+ /**
36
+ * 开始追踪任务进化过程
37
+ */
38
+ startEvolution(taskId?: string, taskType?: string): void;
39
+ /**
40
+ * 记录一次尝试(方案 + 结果)
41
+ */
42
+ recordMutation(approach: string, result: 'success' | 'failed', error?: string): void;
43
+ /**
44
+ * 完成进化追踪并封装经验
45
+ */
46
+ completeEvolution(status: 'success' | 'failed', fixSummary: string, fixSteps: StrategyStep[], errorMessage: string, options?: {
47
+ diff?: string;
48
+ filesAffected?: number;
49
+ linesChanged?: number;
50
+ components?: string[];
51
+ }): Promise<{
52
+ gene: ShrimpGene;
53
+ capsule: ShrimpCapsule;
54
+ event: ShrimpEvolution;
55
+ } | null>;
56
+ /**
57
+ * 同步 Hub(发布本地新基因 + 上报验证报告)
58
+ */
59
+ syncHub(): Promise<{
60
+ published: number;
61
+ reported: number;
62
+ }>;
63
+ getStats(): import("./local-store.js").LocalStoreStats;
64
+ getAllGenes(): ShrimpGene[];
65
+ getRecentEvents(limit?: number): ShrimpEvolution[];
66
+ /**
67
+ * 清理资源
68
+ */
69
+ dispose(): void;
70
+ }
71
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/experience/manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EACV,gBAAgB,EAAE,sBAAsB,EACxC,UAAU,EAAE,aAAa,EAAE,eAAe,EAC1C,YAAY,EACb,MAAM,YAAY,CAAC;AAIpB,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,gBAAgB,CAMR;gBAEJ,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAoBlE;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B;;OAEG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAKjF;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAKnE;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM;IAMlC;;OAEG;IACH,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IASxD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAWpF;;OAEG;IACG,iBAAiB,CACrB,MAAM,EAAE,SAAS,GAAG,QAAQ,EAC5B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,YAAY,EAAE,EACxB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,GACA,OAAO,CAAC;QACT,IAAI,EAAE,UAAU,CAAC;QACjB,OAAO,EAAE,aAAa,CAAC;QACvB,KAAK,EAAE,eAAe,CAAC;KACxB,GAAG,IAAI,CAAC;IA8CT;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBjE,QAAQ;IAIR,WAAW,IAAI,UAAU,EAAE;IAI3B,eAAe,CAAC,KAAK,SAAK,GAAG,eAAe,EAAE;IAI9C;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * 经验管理器
3
+ *
4
+ * 统一管理经验基因系统的所有模块
5
+ * 对外提供简洁 API,集成到 WorkerClaw 主流程
6
+ */
7
+ import { createLogger } from '../core/logger.js';
8
+ import { LocalExperienceStore } from './local-store.js';
9
+ import { SignalDetector } from './signal-detector.js';
10
+ import { ExperienceSearchEngine } from './search-engine.js';
11
+ import { ExperienceEncapsulator } from './encapsulator.js';
12
+ import { ShrimpHubClient } from './hub-client.js';
13
+ // ==================== 经验管理器 ====================
14
+ export class ExperienceManager {
15
+ logger;
16
+ config;
17
+ store;
18
+ signalDetector;
19
+ searchEngine;
20
+ encapsulator;
21
+ hubClient = null;
22
+ initialized = false;
23
+ // 进化追踪(当前任务)
24
+ currentEvolution = null;
25
+ constructor(config, botId, token) {
26
+ this.logger = createLogger('Experience');
27
+ this.config = config;
28
+ // 初始化子模块
29
+ this.store = new LocalExperienceStore(config.storagePath);
30
+ this.signalDetector = new SignalDetector();
31
+ this.searchEngine = new ExperienceSearchEngine(this.store, config);
32
+ this.encapsulator = new ExperienceEncapsulator(this.store, botId);
33
+ // Hub 客户端
34
+ if (config.hub.enabled) {
35
+ this.hubClient = new ShrimpHubClient(config.hub.endpoint, botId, token);
36
+ // 将 Hub 客户端传递给搜索引擎
37
+ this.searchEngine.setHubClient(this.hubClient);
38
+ }
39
+ }
40
+ // ==================== 生命周期 ====================
41
+ /**
42
+ * 初始化经验系统
43
+ */
44
+ async init() {
45
+ if (this.initialized)
46
+ return;
47
+ await this.store.init();
48
+ this.initialized = true;
49
+ const stats = this.store.getStats();
50
+ this.logger.info(`🧬 经验系统已初始化`, {
51
+ genes: stats.genes,
52
+ capsules: stats.capsules,
53
+ events: stats.events,
54
+ hubEnabled: this.config.hub.enabled,
55
+ });
56
+ }
57
+ // ==================== 搜索 API ====================
58
+ /**
59
+ * 错误发生时自动搜索经验
60
+ */
61
+ async searchOnError(errorMessage) {
62
+ if (!this.initialized)
63
+ return null;
64
+ return this.searchEngine.searchByError(errorMessage);
65
+ }
66
+ /**
67
+ * 手动搜索经验
68
+ */
69
+ async search(keywords) {
70
+ if (!this.initialized)
71
+ return [];
72
+ return this.searchEngine.searchBySignals(keywords);
73
+ }
74
+ /**
75
+ * 从错误消息检测信号
76
+ */
77
+ detectSignals(errorMessage) {
78
+ return this.signalDetector.detect(errorMessage);
79
+ }
80
+ // ==================== 进化追踪 ====================
81
+ /**
82
+ * 开始追踪任务进化过程
83
+ */
84
+ startEvolution(taskId, taskType) {
85
+ this.currentEvolution = {
86
+ taskId,
87
+ taskType,
88
+ startTime: Date.now(),
89
+ mutations: [],
90
+ };
91
+ }
92
+ /**
93
+ * 记录一次尝试(方案 + 结果)
94
+ */
95
+ recordMutation(approach, result, error) {
96
+ if (!this.currentEvolution)
97
+ return;
98
+ this.currentEvolution.mutations.push({
99
+ approach,
100
+ result,
101
+ error,
102
+ duration_ms: Date.now() - this.currentEvolution.startTime,
103
+ });
104
+ }
105
+ /**
106
+ * 完成进化追踪并封装经验
107
+ */
108
+ async completeEvolution(status, fixSummary, fixSteps, errorMessage, options) {
109
+ if (!this.config.autoEncapsulate.enabled || !this.currentEvolution) {
110
+ this.currentEvolution = null;
111
+ return null;
112
+ }
113
+ // 检测信号
114
+ const detected = this.signalDetector.detect(errorMessage);
115
+ if (!detected.shouldSearch) {
116
+ this.currentEvolution = null;
117
+ return null;
118
+ }
119
+ const process = {
120
+ signalDetected: detected.signals[0] || detected.patternName,
121
+ errorMessage,
122
+ taskId: this.currentEvolution.taskId,
123
+ taskType: this.currentEvolution.taskType,
124
+ initialApproach: this.currentEvolution.initialApproach || fixSummary,
125
+ mutations: this.currentEvolution.mutations,
126
+ finalStatus: status,
127
+ totalDurationMs: Date.now() - this.currentEvolution.startTime,
128
+ fixSummary,
129
+ fixSteps,
130
+ diff: options?.diff,
131
+ filesAffected: options?.filesAffected,
132
+ linesChanged: options?.linesChanged,
133
+ components: options?.components,
134
+ };
135
+ this.currentEvolution = null;
136
+ // 封装并保存
137
+ const result = await this.encapsulator.encapsulate(process);
138
+ if (!result)
139
+ return null;
140
+ // 如果 Hub 启用,自动发布
141
+ if (this.hubClient && this.config.hub.enabled) {
142
+ this.hubClient.publishGene(result.gene, result.capsule).catch(() => { });
143
+ }
144
+ return result;
145
+ }
146
+ // ==================== Hub 操作 ====================
147
+ /**
148
+ * 同步 Hub(发布本地新基因 + 上报验证报告)
149
+ */
150
+ async syncHub() {
151
+ if (!this.hubClient)
152
+ return { published: 0, reported: 0 };
153
+ let published = 0;
154
+ let reported = 0;
155
+ // 上报验证报告
156
+ const pendingReports = this.store.getPendingReports();
157
+ for (const report of pendingReports) {
158
+ const ok = await this.hubClient.submitReport(report);
159
+ if (ok)
160
+ reported++;
161
+ }
162
+ if (reported > 0)
163
+ await this.store.clearReports();
164
+ this.logger.info(`Hub 同步完成`, { published, reported });
165
+ return { published, reported };
166
+ }
167
+ // ==================== 统计 ====================
168
+ getStats() {
169
+ return this.store.getStats();
170
+ }
171
+ getAllGenes() {
172
+ return this.store.getAllGenes();
173
+ }
174
+ getRecentEvents(limit = 10) {
175
+ return this.store.getRecentEvents(limit);
176
+ }
177
+ /**
178
+ * 清理资源
179
+ */
180
+ dispose() {
181
+ // JSON 存储,无需特殊清理
182
+ }
183
+ }
184
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/experience/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * 经验搜索引擎 (v2 - 本地+Hub联合 + TF-IDF语义搜索)
3
+ *
4
+ * 搜索策略:
5
+ * 1. 本地经验池:TF-IDF 关键词匹配
6
+ * 2. Hub 远程:如果有本地结果不足,补充搜索 Hub
7
+ * 3. 结果合并去重,按综合评分排序
8
+ */
9
+ import { LocalExperienceStore } from './local-store.js';
10
+ import { SignalDetector } from './signal-detector.js';
11
+ import { ShrimpHubClient } from './hub-client.js';
12
+ import type { ExperienceSearchResult, ExperienceConfig } from './types.js';
13
+ export declare class ExperienceSearchEngine {
14
+ private logger;
15
+ private store;
16
+ private signalDetector;
17
+ private config;
18
+ private hubClient;
19
+ constructor(store: LocalExperienceStore, config: ExperienceConfig, hubClient?: ShrimpHubClient);
20
+ /**
21
+ * 设置 Hub 客户端
22
+ */
23
+ setHubClient(client: ShrimpHubClient): void;
24
+ /**
25
+ * 错误发生时自动搜索匹配经验
26
+ */
27
+ searchByError(errorMessage: string): Promise<ExperienceSearchResult | null>;
28
+ /**
29
+ * 按信号手动搜索
30
+ */
31
+ searchBySignals(signals: string[]): Promise<ExperienceSearchResult[]>;
32
+ /**
33
+ * 语义搜索:基于 TF-IDF 的问题匹配
34
+ * 输入自然语言问题,提取关键词后搜索
35
+ */
36
+ semanticSearch(query: string, limit?: number): Promise<ExperienceSearchResult[]>;
37
+ /**
38
+ * 联合搜索:本地 + Hub
39
+ */
40
+ private unifiedSearch;
41
+ /**
42
+ * 本地搜索(增强版 TF-IDF 匹配)
43
+ */
44
+ private searchLocal;
45
+ /**
46
+ * 增强 TF-IDF 匹配分数计算
47
+ * 除了信号匹配外,还考虑 summary、description、tags 的关键词密度
48
+ */
49
+ private computeEnhancedScore;
50
+ /**
51
+ * Hub 搜索
52
+ */
53
+ private searchHub;
54
+ /**
55
+ * 将 Hub 返回的 GDI + matchScore 转为统一评分
56
+ */
57
+ private hubMatchToScore;
58
+ /**
59
+ * 合并本地和 Hub 结果(去重,本地优先)
60
+ */
61
+ private mergeResults;
62
+ /**
63
+ * 缓存 Hub 基因到本地(异步,不阻塞)
64
+ */
65
+ private cacheHubGene;
66
+ /**
67
+ * 从自然语言查询中提取关键词
68
+ * 简单实现:分词 + 过滤停用词 + 取长度>=2的词
69
+ */
70
+ private extractKeywords;
71
+ /**
72
+ * 获取信号检测器(供封装器使用)
73
+ */
74
+ getSignalDetector(): SignalDetector;
75
+ /**
76
+ * 获取存储实例
77
+ */
78
+ getStore(): LocalExperienceStore;
79
+ }
80
+ //# sourceMappingURL=search-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-engine.d.ts","sourceRoot":"","sources":["../../src/experience/search-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAAgC;gBAErC,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,eAAe;IAW9F;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAI3C;;OAEG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IA8BjF;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAY3E;;;OAGG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAUjF;;OAEG;YACW,aAAa;IAwB3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAyBnB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAqC5B;;OAEG;YACW,SAAS;IAcvB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;YACW,YAAY;IAiB1B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAavB;;OAEG;IACH,iBAAiB,IAAI,cAAc;IAInC;;OAEG;IACH,QAAQ,IAAI,oBAAoB;CAGjC"}
@@ -0,0 +1,258 @@
1
+ /**
2
+ * 经验搜索引擎 (v2 - 本地+Hub联合 + TF-IDF语义搜索)
3
+ *
4
+ * 搜索策略:
5
+ * 1. 本地经验池:TF-IDF 关键词匹配
6
+ * 2. Hub 远程:如果有本地结果不足,补充搜索 Hub
7
+ * 3. 结果合并去重,按综合评分排序
8
+ */
9
+ import { createLogger } from '../core/logger.js';
10
+ import { SignalDetector } from './signal-detector.js';
11
+ export class ExperienceSearchEngine {
12
+ logger;
13
+ store;
14
+ signalDetector;
15
+ config;
16
+ hubClient = null;
17
+ constructor(store, config, hubClient) {
18
+ this.logger = createLogger('ExperienceEngine');
19
+ this.store = store;
20
+ this.signalDetector = new SignalDetector();
21
+ this.config = config;
22
+ if (hubClient) {
23
+ this.hubClient = hubClient;
24
+ }
25
+ }
26
+ /**
27
+ * 设置 Hub 客户端
28
+ */
29
+ setHubClient(client) {
30
+ this.hubClient = client;
31
+ }
32
+ /**
33
+ * 错误发生时自动搜索匹配经验
34
+ */
35
+ async searchByError(errorMessage) {
36
+ if (!this.config.autoSearch.enabled)
37
+ return null;
38
+ // 1. 检测信号
39
+ const detected = this.signalDetector.detect(errorMessage);
40
+ if (!detected.shouldSearch)
41
+ return null;
42
+ // 2. 联合搜索(本地 + Hub)
43
+ const allResults = await this.unifiedSearch(detected.signals, 3);
44
+ if (allResults.length > 0) {
45
+ const best = allResults[0];
46
+ if (best.matchScore >= this.config.autoSearch.minConfidence) {
47
+ this.logger.info(`经验命中 [${best.gene.gene_id.slice(0, 12)}...]`, {
48
+ matchScore: best.matchScore,
49
+ summary: best.gene.summary,
50
+ source: best.source,
51
+ });
52
+ return best;
53
+ }
54
+ }
55
+ this.logger.debug(`无匹配经验`, {
56
+ signals: detected.signals.slice(0, 3),
57
+ patternName: detected.patternName,
58
+ });
59
+ return null;
60
+ }
61
+ /**
62
+ * 按信号手动搜索
63
+ */
64
+ async searchBySignals(signals) {
65
+ const results = await this.unifiedSearch(signals, 10);
66
+ this.logger.info(`经验搜索完成`, {
67
+ signals: signals.slice(0, 3),
68
+ localHits: results.filter(r => r.source === 'local').length,
69
+ hubHits: results.filter(r => r.source === 'hub').length,
70
+ });
71
+ return results;
72
+ }
73
+ /**
74
+ * 语义搜索:基于 TF-IDF 的问题匹配
75
+ * 输入自然语言问题,提取关键词后搜索
76
+ */
77
+ async semanticSearch(query, limit = 5) {
78
+ const keywords = this.extractKeywords(query);
79
+ if (keywords.length === 0)
80
+ return [];
81
+ this.logger.debug(`语义搜索`, { query: query.slice(0, 50), keywords });
82
+ return this.unifiedSearch(keywords, limit);
83
+ }
84
+ // ==================== 内部方法 ====================
85
+ /**
86
+ * 联合搜索:本地 + Hub
87
+ */
88
+ async unifiedSearch(signals, limit) {
89
+ // 1. 搜索本地经验池(TF-IDF)
90
+ const localResults = this.searchLocal(signals);
91
+ // 2. 如果本地结果不足且 Hub 启用,补充搜索 Hub
92
+ let hubResults = [];
93
+ if (this.hubClient && this.config.hub.enabled && localResults.length < limit) {
94
+ try {
95
+ hubResults = await this.searchHub(signals, limit);
96
+ }
97
+ catch {
98
+ // Hub 搜索失败不影响本地结果
99
+ }
100
+ }
101
+ // 3. 合并去重(以 gene_id 去重,本地优先)
102
+ const merged = this.mergeResults(localResults, hubResults);
103
+ // 4. 按综合评分排序
104
+ return merged.slice(0, limit);
105
+ }
106
+ /**
107
+ * 本地搜索(增强版 TF-IDF 匹配)
108
+ */
109
+ searchLocal(signals) {
110
+ const rawResults = this.store.searchBySignals(signals);
111
+ // 增强:对 summary 和 description 进行额外匹配
112
+ for (const gene of this.store.getAllGenes()) {
113
+ // 跳过已有的
114
+ if (rawResults.some(r => r.gene.gene_id === gene.gene_id))
115
+ continue;
116
+ const score = this.computeEnhancedScore(gene, signals);
117
+ if (score >= 0.3) {
118
+ const capsule = this.store.getBestCapsule(gene.gene_id);
119
+ if (capsule) {
120
+ rawResults.push({
121
+ gene,
122
+ capsule,
123
+ matchScore: score,
124
+ source: 'local',
125
+ });
126
+ }
127
+ }
128
+ }
129
+ return rawResults.sort((a, b) => b.matchScore - a.matchScore);
130
+ }
131
+ /**
132
+ * 增强 TF-IDF 匹配分数计算
133
+ * 除了信号匹配外,还考虑 summary、description、tags 的关键词密度
134
+ */
135
+ computeEnhancedScore(gene, querySignals) {
136
+ // 基础信号匹配分
137
+ let baseScore = 0;
138
+ const geneSignalsLower = gene.signals.map(s => s.toLowerCase());
139
+ const queryLower = querySignals.map(s => s.toLowerCase());
140
+ let matchedSignals = 0;
141
+ for (const qs of queryLower) {
142
+ for (const gs of geneSignalsLower) {
143
+ if (gs.includes(qs) || qs.includes(gs)) {
144
+ matchedSignals++;
145
+ break;
146
+ }
147
+ }
148
+ }
149
+ if (geneSignalsLower.length > 0) {
150
+ baseScore = matchedSignals / geneSignalsLower.length;
151
+ }
152
+ // TF(词频): 关键词在 summary/description 中的密度
153
+ const textBlob = [
154
+ gene.summary,
155
+ gene.description || '',
156
+ ...gene.tags,
157
+ ...gene.strategy.map(s => s.action),
158
+ ].join(' ').toLowerCase();
159
+ let tfHits = 0;
160
+ for (const qs of queryLower) {
161
+ if (textBlob.includes(qs))
162
+ tfHits++;
163
+ }
164
+ const tfScore = queryLower.length > 0 ? tfHits / queryLower.length : 0;
165
+ // 综合分:信号 60% + 文本密度 40%
166
+ return baseScore * 0.6 + tfScore * 0.4;
167
+ }
168
+ /**
169
+ * Hub 搜索
170
+ */
171
+ async searchHub(signals, limit) {
172
+ if (!this.hubClient)
173
+ return [];
174
+ const response = await this.hubClient.searchGenes(signals, limit);
175
+ if (!response || !response.results)
176
+ return [];
177
+ return response.results.map(item => ({
178
+ gene: item.gene,
179
+ capsule: item.capsule,
180
+ matchScore: this.hubMatchToScore(item.gdi, item.matchScore),
181
+ source: 'hub',
182
+ }));
183
+ }
184
+ /**
185
+ * 将 Hub 返回的 GDI + matchScore 转为统一评分
186
+ */
187
+ hubMatchToScore(gdi, matchScore) {
188
+ // Hub 的 matchScore 如果有就用,否则基于 GDI 估算
189
+ if (matchScore !== undefined) {
190
+ return matchScore;
191
+ }
192
+ // GDI 综合分作为匹配度参考(打折,因为不是精确匹配)
193
+ return (gdi?.overall || 0.5) * 0.8;
194
+ }
195
+ /**
196
+ * 合并本地和 Hub 结果(去重,本地优先)
197
+ */
198
+ mergeResults(local, hub) {
199
+ const localGeneIds = new Set(local.map(r => r.gene.gene_id));
200
+ const merged = [...local];
201
+ for (const hubResult of hub) {
202
+ // 去重:如果本地已有同 gene_id,跳过 Hub 版本
203
+ if (localGeneIds.has(hubResult.gene.gene_id))
204
+ continue;
205
+ // 同时保存 Hub 基因到本地缓存(供后续离线使用)
206
+ this.cacheHubGene(hubResult).catch(() => { });
207
+ merged.push(hubResult);
208
+ }
209
+ return merged.sort((a, b) => b.matchScore - a.matchScore);
210
+ }
211
+ /**
212
+ * 缓存 Hub 基因到本地(异步,不阻塞)
213
+ */
214
+ async cacheHubGene(result) {
215
+ try {
216
+ // 检查本地是否已有
217
+ if (this.store.getGene(result.gene.gene_id))
218
+ return;
219
+ // 保存基因和胶囊到本地
220
+ await this.store.saveGene(result.gene);
221
+ if (result.capsule) {
222
+ await this.store.saveCapsule(result.capsule);
223
+ }
224
+ this.logger.debug(`Hub 基因已缓存 [${result.gene.gene_id.slice(0, 12)}...]`);
225
+ }
226
+ catch {
227
+ // 缓存失败不影响搜索结果
228
+ }
229
+ }
230
+ /**
231
+ * 从自然语言查询中提取关键词
232
+ * 简单实现:分词 + 过滤停用词 + 取长度>=2的词
233
+ */
234
+ extractKeywords(query) {
235
+ // 按常见分隔符分词
236
+ const words = query
237
+ .toLowerCase()
238
+ .split(/[\s,,。.!!??;;::、\-\(\)()\[\]【】\/\\|]+/)
239
+ .filter(w => w.length >= 2)
240
+ // 过滤常见停用词
241
+ .filter(w => !['the', 'is', 'at', 'of', 'on', 'in', 'to', 'for', 'and', 'or', 'not', 'but', 'with', 'this', 'that', 'from', 'are', 'was', 'were', 'been', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could', 'should', 'may', 'might', 'can', 'what', 'how', 'why', 'when', 'where', 'which', 'who', '的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一', '一个', '上', '也', '很', '到', '说', '要', '去', '你', '会', '着', '没有', '看', '好', '自己', '这'].includes(w));
242
+ // 去重
243
+ return [...new Set(words)].slice(0, 8);
244
+ }
245
+ /**
246
+ * 获取信号检测器(供封装器使用)
247
+ */
248
+ getSignalDetector() {
249
+ return this.signalDetector;
250
+ }
251
+ /**
252
+ * 获取存储实例
253
+ */
254
+ getStore() {
255
+ return this.store;
256
+ }
257
+ }
258
+ //# sourceMappingURL=search-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-engine.js","sourceRoot":"","sources":["../../src/experience/search-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAOtD,MAAM,OAAO,sBAAsB;IACzB,MAAM,CAAS;IACf,KAAK,CAAuB;IAC5B,cAAc,CAAiB;IAC/B,MAAM,CAAmB;IACzB,SAAS,GAA2B,IAAI,CAAC;IAEjD,YAAY,KAA2B,EAAE,MAAwB,EAAE,SAA2B;QAC5F,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAuB;QAClC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,YAAoB;QACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAEjD,UAAU;QACV,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAExC,oBAAoB;QACpB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEjE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;gBAC5D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE;oBAC9D,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;oBAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;YACzB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACrC,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,OAAiB;QACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEtD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;YACzB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5B,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM;YAC3D,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,MAAM;SACxD,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,KAAK,GAAG,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,iDAAiD;IAEjD;;OAEG;IACK,KAAK,CAAC,aAAa,CACzB,OAAiB,EACjB,KAAa;QAEb,qBAAqB;QACrB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAE/C,+BAA+B;QAC/B,IAAI,UAAU,GAA6B,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,YAAY,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YAC7E,IAAI,CAAC;gBACH,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB;YACpB,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAE3D,aAAa;QACb,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,OAAiB;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEvD,oCAAoC;QACpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5C,QAAQ;YACR,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC;gBAAE,SAAS;YAEpE,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxD,IAAI,OAAO,EAAE,CAAC;oBACZ,UAAU,CAAC,IAAI,CAAC;wBACd,IAAI;wBACJ,OAAO;wBACP,UAAU,EAAE,KAAK;wBACjB,MAAM,EAAE,OAAO;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAAC,IAAgB,EAAE,YAAsB;QACnE,UAAU;QACV,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAE1D,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;gBAClC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;oBACvC,cAAc,EAAE,CAAC;oBACjB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,SAAS,GAAG,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC;QACvD,CAAC;QAED,wCAAwC;QACxC,MAAM,QAAQ,GAAG;YACf,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,WAAW,IAAI,EAAE;YACtB,GAAG,IAAI,CAAC,IAAI;YACZ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;SACpC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAE1B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAE,MAAM,EAAE,CAAC;QACtC,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvE,wBAAwB;QACxB,OAAO,SAAS,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS,CAAC,OAAiB,EAAE,KAAa;QACtD,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAE/B,MAAM,QAAQ,GAA6B,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5F,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAE9C,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC;YAC3D,MAAM,EAAE,KAAc;SACvB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,GAAiB,EAAE,UAAmB;QAC5D,qCAAqC;QACrC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,8BAA8B;QAC9B,OAAO,CAAC,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,YAAY,CAClB,KAA+B,EAC/B,GAA6B;QAE7B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QAE1B,KAAK,MAAM,SAAS,IAAI,GAAG,EAAE,CAAC;YAC5B,+BAA+B;YAC/B,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,SAAS;YAEvD,4BAA4B;YAC5B,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAE7C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,MAA8B;QACvD,IAAI,CAAC;YACH,WAAW;YACX,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO;YAEpD,aAAa;YACb,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,KAAa;QACnC,WAAW;QACX,MAAM,KAAK,GAAG,KAAK;aAChB,WAAW,EAAE;aACb,KAAK,CAAC,uCAAuC,CAAC;aAC9C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;YAC3B,UAAU;aACT,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAErd,KAAK;QACL,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * 错误信号检测器
3
+ *
4
+ * 自动检测错误信息中的可搜索信号
5
+ * 在 AgentEngine 遇到错误时触发经验搜索
6
+ */
7
+ export interface DetectedSignal {
8
+ /** 检测到的信号模式名称 */
9
+ patternName: string;
10
+ /** 提取的信号关键词列表 */
11
+ signals: string[];
12
+ /** 原始错误信息 */
13
+ originalError: string;
14
+ /** 是否应该触发经验搜索 */
15
+ shouldSearch: boolean;
16
+ }
17
+ export declare class SignalDetector {
18
+ private logger;
19
+ constructor();
20
+ /**
21
+ * 从错误信息中检测信号
22
+ */
23
+ detect(errorMessage: string): DetectedSignal;
24
+ /**
25
+ * 提取通用信号(无精确匹配时的兜底)
26
+ */
27
+ private extractGenericSignals;
28
+ /**
29
+ * 获取所有已注册的信号模式名称
30
+ */
31
+ getRegisteredPatterns(): string[];
32
+ }
33
+ //# sourceMappingURL=signal-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-detector.d.ts","sourceRoot":"","sources":["../../src/experience/signal-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuHH,MAAM,WAAW,cAAc;IAC7B,iBAAiB;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;;IAMvB;;OAEG;IACH,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc;IAgD5C;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACH,qBAAqB,IAAI,MAAM,EAAE;CAGlC"}