autosnippet 3.3.6 → 3.3.7

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 (107) hide show
  1. package/dashboard/dist/assets/icons-FHns2ypa.js +1 -0
  2. package/dashboard/dist/assets/index-BRJv5Y3r.js +135 -0
  3. package/dashboard/dist/assets/index-DzoB7kxK.css +1 -0
  4. package/dashboard/dist/index.html +3 -3
  5. package/dist/bin/cli.js +1 -0
  6. package/dist/lib/agent/AgentRuntime.d.ts +2 -2
  7. package/dist/lib/agent/AgentRuntime.js +26 -18
  8. package/dist/lib/agent/domain/ChatAgentTasks.js +4 -0
  9. package/dist/lib/agent/forced-summary.js +7 -2
  10. package/dist/lib/cli/AiScanService.js +4 -4
  11. package/dist/lib/core/discovery/ConfigWatcher.d.ts +64 -0
  12. package/dist/lib/core/discovery/ConfigWatcher.js +336 -0
  13. package/dist/lib/core/discovery/CustomConfigDiscoverer.d.ts +30 -0
  14. package/dist/lib/core/discovery/CustomConfigDiscoverer.js +1305 -0
  15. package/dist/lib/core/discovery/DiscovererPreference.d.ts +44 -0
  16. package/dist/lib/core/discovery/DiscovererPreference.js +141 -0
  17. package/dist/lib/core/discovery/DiscovererRegistry.d.ts +10 -1
  18. package/dist/lib/core/discovery/DiscovererRegistry.js +42 -2
  19. package/dist/lib/core/discovery/ProjectDiscoverer.d.ts +19 -0
  20. package/dist/lib/core/discovery/index.d.ts +2 -0
  21. package/dist/lib/core/discovery/index.js +4 -0
  22. package/dist/lib/core/discovery/parsers/CMakeParser.d.ts +32 -0
  23. package/dist/lib/core/discovery/parsers/CMakeParser.js +148 -0
  24. package/dist/lib/core/discovery/parsers/GradleDslParser.d.ts +43 -0
  25. package/dist/lib/core/discovery/parsers/GradleDslParser.js +171 -0
  26. package/dist/lib/core/discovery/parsers/JsonConfigParser.d.ts +45 -0
  27. package/dist/lib/core/discovery/parsers/JsonConfigParser.js +122 -0
  28. package/dist/lib/core/discovery/parsers/RubyDslParser.d.ts +49 -0
  29. package/dist/lib/core/discovery/parsers/RubyDslParser.js +282 -0
  30. package/dist/lib/core/discovery/parsers/StarlarkParser.d.ts +33 -0
  31. package/dist/lib/core/discovery/parsers/StarlarkParser.js +229 -0
  32. package/dist/lib/core/discovery/parsers/YamlConfigParser.d.ts +37 -0
  33. package/dist/lib/core/discovery/parsers/YamlConfigParser.js +212 -0
  34. package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +7 -1
  35. package/dist/lib/domain/knowledge/KnowledgeEntry.js +17 -3
  36. package/dist/lib/external/ai/AiProvider.d.ts +12 -0
  37. package/dist/lib/external/ai/AiProvider.js +24 -0
  38. package/dist/lib/external/ai/AiProviderManager.d.ts +101 -0
  39. package/dist/lib/external/ai/AiProviderManager.js +193 -0
  40. package/dist/lib/external/ai/providers/ClaudeProvider.js +11 -0
  41. package/dist/lib/external/ai/providers/GoogleGeminiProvider.js +18 -0
  42. package/dist/lib/external/ai/providers/MockProvider.d.ts +21 -3
  43. package/dist/lib/external/ai/providers/MockProvider.js +290 -14
  44. package/dist/lib/external/ai/providers/OpenAiProvider.js +16 -0
  45. package/dist/lib/external/lark/LarkTransport.d.ts +5 -1
  46. package/dist/lib/external/lark/LarkTransport.js +10 -2
  47. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/mock-pipeline.d.ts +20 -0
  48. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/mock-pipeline.js +432 -0
  49. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +16 -8
  50. package/dist/lib/external/mcp/handlers/bootstrap/refine.js +8 -0
  51. package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +9 -0
  52. package/dist/lib/external/mcp/handlers/bootstrap-external.js +2 -0
  53. package/dist/lib/external/mcp/handlers/bootstrap-internal.js +2 -0
  54. package/dist/lib/external/mcp/handlers/consolidated.js +2 -1
  55. package/dist/lib/external/mcp/handlers/dimension-complete-external.js +2 -1
  56. package/dist/lib/external/mcp/handlers/evolve-external.js +5 -2
  57. package/dist/lib/external/mcp/handlers/knowledge.js +5 -4
  58. package/dist/lib/http/routes/ai.js +111 -30
  59. package/dist/lib/http/routes/candidates.js +11 -4
  60. package/dist/lib/http/routes/commands.js +10 -1
  61. package/dist/lib/http/routes/health.js +11 -0
  62. package/dist/lib/http/routes/modules.js +27 -0
  63. package/dist/lib/http/routes/recipes.js +7 -0
  64. package/dist/lib/http/utils/routeHelpers.js +2 -1
  65. package/dist/lib/injection/ServiceContainer.d.ts +6 -5
  66. package/dist/lib/injection/ServiceContainer.js +11 -27
  67. package/dist/lib/injection/ServiceMap.d.ts +2 -0
  68. package/dist/lib/injection/modules/AiModule.d.ts +6 -9
  69. package/dist/lib/injection/modules/AiModule.js +82 -39
  70. package/dist/lib/injection/modules/PanoramaModule.js +1 -1
  71. package/dist/lib/service/cleanup/CleanupService.d.ts +54 -7
  72. package/dist/lib/service/cleanup/CleanupService.js +284 -37
  73. package/dist/lib/service/knowledge/CodeEntityGraph.d.ts +6 -0
  74. package/dist/lib/service/knowledge/CodeEntityGraph.js +16 -0
  75. package/dist/lib/service/knowledge/KnowledgeService.js +23 -10
  76. package/dist/lib/service/module/ModuleService.js +10 -19
  77. package/dist/lib/service/panorama/CouplingAnalyzer.d.ts +10 -1
  78. package/dist/lib/service/panorama/CouplingAnalyzer.js +44 -2
  79. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +1 -1
  80. package/dist/lib/service/panorama/DimensionAnalyzer.js +31 -17
  81. package/dist/lib/service/panorama/LayerInferrer.d.ts +16 -1
  82. package/dist/lib/service/panorama/LayerInferrer.js +118 -1
  83. package/dist/lib/service/panorama/ModuleDiscoverer.d.ts +9 -0
  84. package/dist/lib/service/panorama/ModuleDiscoverer.js +58 -2
  85. package/dist/lib/service/panorama/PanoramaAggregator.d.ts +6 -2
  86. package/dist/lib/service/panorama/PanoramaAggregator.js +84 -6
  87. package/dist/lib/service/panorama/PanoramaScanner.js +28 -0
  88. package/dist/lib/service/panorama/PanoramaService.js +10 -5
  89. package/dist/lib/service/panorama/PanoramaTypes.d.ts +38 -0
  90. package/dist/lib/service/panorama/RoleRefiner.d.ts +2 -0
  91. package/dist/lib/service/panorama/RoleRefiner.js +41 -0
  92. package/dist/lib/service/panorama/TechStackProfiler.d.ts +13 -0
  93. package/dist/lib/service/panorama/TechStackProfiler.js +191 -0
  94. package/dist/lib/service/skills/SignalCollector.d.ts +1 -0
  95. package/dist/lib/service/skills/SignalCollector.js +6 -5
  96. package/dist/lib/service/vector/ContextualEnricher.d.ts +1 -0
  97. package/dist/lib/service/vector/ContextualEnricher.js +4 -0
  98. package/dist/lib/shared/LanguageService.js +3 -0
  99. package/dist/lib/shared/developer-identity.d.ts +18 -0
  100. package/dist/lib/shared/developer-identity.js +62 -0
  101. package/dist/lib/shared/schemas/http-requests.d.ts +8 -17
  102. package/dist/lib/shared/schemas/http-requests.js +9 -6
  103. package/dist/lib/types/knowledge-wire.d.ts +1 -0
  104. package/package.json +1 -1
  105. package/dashboard/dist/assets/icons-D1aVZYFW.js +0 -1
  106. package/dashboard/dist/assets/index-CxHOu8Hd.css +0 -1
  107. package/dashboard/dist/assets/index-DDdAOpYT.js +0 -128
@@ -0,0 +1,101 @@
1
+ /**
2
+ * AiProviderManager — 统一 AI 提供商管理器(切面层)
3
+ *
4
+ * 设计目标:
5
+ * 1. 唯一权威: 当前 AI Provider 的唯一管理入口,所有读取/切换集中在此
6
+ * 2. AOP 切面: Token 追踪回调随 Provider 切换自动重新挂载,无需外部干预
7
+ * 3. 热切换: switchProvider() 一次调用 → Token AOP + Embedding fallback + DI 级联清理 + 事件通知
8
+ * 4. 模式查询: isMock / isReady 集中管理,消除散落的 name === 'mock' 判断
9
+ * 5. 事件驱动: 注册监听器,切换时自动回调(Realtime 广播、SearchEngine 重建等)
10
+ *
11
+ * 集成方式:
12
+ * - 由 AiModule.initialize() 创建并注入 DI 容器
13
+ * - ServiceContainer.reloadAiProvider() 委托 manager.switchProvider()
14
+ * - 消费者通过 container.get('aiProviderManager') 获取
15
+ * - DI 数据管道: switchProvider() 通过回调同步 singletons 中的 provider 引用
16
+ */
17
+ /** AI Provider 最小接口(避免引入 AiProvider 具体类的循环依赖) */
18
+ export interface ManagedAiProvider {
19
+ name: string;
20
+ model: string;
21
+ apiKey?: string;
22
+ _onTokenUsage?: ((usage: TokenUsagePayload) => void) | null;
23
+ supportsEmbedding?: () => boolean;
24
+ _fallbackFrom?: string;
25
+ }
26
+ export interface TokenUsagePayload {
27
+ inputTokens: number;
28
+ outputTokens: number;
29
+ totalTokens: number;
30
+ source?: string;
31
+ }
32
+ /** Token 记录器最小接口(对应 TokenUsageStore.record) */
33
+ export interface TokenRecorder {
34
+ record(r: {
35
+ source: string;
36
+ provider?: string;
37
+ model?: string;
38
+ inputTokens: number;
39
+ outputTokens: number;
40
+ }): void;
41
+ }
42
+ /** Provider 信息快照 */
43
+ export interface ProviderInfo {
44
+ name: string;
45
+ model: string;
46
+ isMock: boolean;
47
+ supportsEmbedding: boolean;
48
+ }
49
+ /** 切换结果 */
50
+ export interface SwitchResult {
51
+ previous: ProviderInfo;
52
+ current: ProviderInfo;
53
+ clearedSingletons: string[];
54
+ }
55
+ /** 切换监听器 */
56
+ export type SwitchListener = (result: SwitchResult) => void;
57
+ /** Embedding Fallback 初始化器(注入,避免循环依赖) */
58
+ export type EmbedFallbackInitializer = (currentProvider: ManagedAiProvider) => ManagedAiProvider | null;
59
+ export declare class AiProviderManager {
60
+ #private;
61
+ constructor(initialProvider: ManagedAiProvider);
62
+ /** 当前 AI Provider (只读) */
63
+ get provider(): ManagedAiProvider;
64
+ /** 当前 Embedding Provider (优先 fallback,回退到主 provider) */
65
+ get embedProvider(): ManagedAiProvider;
66
+ /** 原始 Embedding fallback (可能为 null) */
67
+ get rawEmbedProvider(): ManagedAiProvider | null;
68
+ /** 是否处于 Mock 模式 */
69
+ get isMock(): boolean;
70
+ /** provider 是否可用于 AI 操作(非 mock) */
71
+ get isReady(): boolean;
72
+ /** 当前 provider 名称 */
73
+ get name(): string;
74
+ /** 当前模型 */
75
+ get model(): string;
76
+ /** 结构化信息快照 */
77
+ get info(): ProviderInfo;
78
+ /**
79
+ * 切换 AI Provider — 原子操作
80
+ *
81
+ * 自动处理:
82
+ * 1. Token 追踪 AOP 重新挂载
83
+ * 2. Embedding fallback 重建
84
+ * 3. DI 数据管道同步(singletons.aiProvider)
85
+ * 4. DI 容器中的 AI 依赖 singleton 级联清除
86
+ * 5. 监听器回调通知
87
+ */
88
+ switchProvider(newProvider: ManagedAiProvider): SwitchResult;
89
+ /** 手动设置 Embedding fallback provider */
90
+ setEmbedProvider(ep: ManagedAiProvider | null): void;
91
+ /** 注入 TokenRecorder (延迟绑定,避免循环依赖) */
92
+ setTokenRecorder(recorder: TokenRecorder): void;
93
+ /** 注册切换监听器,返回取消注册函数 */
94
+ onSwitch(fn: SwitchListener): () => void;
95
+ /** 注入 DI 容器的级联清理回调 */
96
+ _bindDependentClearer(fn: () => string[]): void;
97
+ /** 注入 Embedding Fallback 初始化器 */
98
+ _bindEmbedFallbackInit(fn: EmbedFallbackInitializer): void;
99
+ /** 注入 DI 数据管道同步回调(切换时更新 singletons 中的 provider 引用) */
100
+ _bindDiSync(fn: (provider: ManagedAiProvider, embed: ManagedAiProvider | null) => void): void;
101
+ }
@@ -0,0 +1,193 @@
1
+ /**
2
+ * AiProviderManager — 统一 AI 提供商管理器(切面层)
3
+ *
4
+ * 设计目标:
5
+ * 1. 唯一权威: 当前 AI Provider 的唯一管理入口,所有读取/切换集中在此
6
+ * 2. AOP 切面: Token 追踪回调随 Provider 切换自动重新挂载,无需外部干预
7
+ * 3. 热切换: switchProvider() 一次调用 → Token AOP + Embedding fallback + DI 级联清理 + 事件通知
8
+ * 4. 模式查询: isMock / isReady 集中管理,消除散落的 name === 'mock' 判断
9
+ * 5. 事件驱动: 注册监听器,切换时自动回调(Realtime 广播、SearchEngine 重建等)
10
+ *
11
+ * 集成方式:
12
+ * - 由 AiModule.initialize() 创建并注入 DI 容器
13
+ * - ServiceContainer.reloadAiProvider() 委托 manager.switchProvider()
14
+ * - 消费者通过 container.get('aiProviderManager') 获取
15
+ * - DI 数据管道: switchProvider() 通过回调同步 singletons 中的 provider 引用
16
+ */
17
+ import Logger from '#infra/logging/Logger.js';
18
+ // ── Manager ────────────────────────────────────────────
19
+ export class AiProviderManager {
20
+ #provider;
21
+ #embedProvider = null;
22
+ #tokenRecorder = null;
23
+ #listeners = new Set();
24
+ #logger = Logger.getInstance();
25
+ /** DI 容器注入: 清除 AI 依赖 singleton 的回调 */
26
+ #clearDependents = null;
27
+ /** DI 容器注入: Embedding fallback 初始化器 */
28
+ #embedFallbackInit = null;
29
+ /** DI 数据管道: 切换时同步 singletons 中的 provider 引用(供 DI 工厂函数读取) */
30
+ #syncToDi = null;
31
+ constructor(initialProvider) {
32
+ this.#provider = initialProvider;
33
+ this.#wireTokenTracking();
34
+ }
35
+ // ═══════════════════════════════════════════════════════
36
+ // 读取接口
37
+ // ═══════════════════════════════════════════════════════
38
+ /** 当前 AI Provider (只读) */
39
+ get provider() {
40
+ return this.#provider;
41
+ }
42
+ /** 当前 Embedding Provider (优先 fallback,回退到主 provider) */
43
+ get embedProvider() {
44
+ return this.#embedProvider ?? this.#provider;
45
+ }
46
+ /** 原始 Embedding fallback (可能为 null) */
47
+ get rawEmbedProvider() {
48
+ return this.#embedProvider;
49
+ }
50
+ /** 是否处于 Mock 模式 */
51
+ get isMock() {
52
+ return this.#provider.name === 'mock';
53
+ }
54
+ /** provider 是否可用于 AI 操作(非 mock) */
55
+ get isReady() {
56
+ return !!this.#provider && !this.isMock;
57
+ }
58
+ /** 当前 provider 名称 */
59
+ get name() {
60
+ return this.#provider.name;
61
+ }
62
+ /** 当前模型 */
63
+ get model() {
64
+ return this.#provider.model;
65
+ }
66
+ /** 结构化信息快照 */
67
+ get info() {
68
+ return {
69
+ name: this.#provider.name,
70
+ model: this.#provider.model,
71
+ isMock: this.isMock,
72
+ supportsEmbedding: typeof this.#provider.supportsEmbedding === 'function' &&
73
+ this.#provider.supportsEmbedding(),
74
+ };
75
+ }
76
+ // ═══════════════════════════════════════════════════════
77
+ // 热切换 — 唯一的全局切换入口
78
+ // ═══════════════════════════════════════════════════════
79
+ /**
80
+ * 切换 AI Provider — 原子操作
81
+ *
82
+ * 自动处理:
83
+ * 1. Token 追踪 AOP 重新挂载
84
+ * 2. Embedding fallback 重建
85
+ * 3. DI 数据管道同步(singletons.aiProvider)
86
+ * 4. DI 容器中的 AI 依赖 singleton 级联清除
87
+ * 5. 监听器回调通知
88
+ */
89
+ switchProvider(newProvider) {
90
+ const prev = this.info;
91
+ // 1. 替换核心引用
92
+ this.#provider = newProvider;
93
+ // 2. AOP: 重新挂载 Token 追踪
94
+ this.#wireTokenTracking();
95
+ // 3. Embedding fallback 重建
96
+ this.#embedProvider = null;
97
+ if (this.#embedFallbackInit) {
98
+ this.#embedProvider = this.#embedFallbackInit(newProvider);
99
+ }
100
+ // 4. DI 数据管道同步
101
+ this.#syncToDi?.(this.#provider, this.#embedProvider);
102
+ // 5. 清除 DI 容器中的依赖 singleton
103
+ const clearedSingletons = this.#clearDependents?.() ?? [];
104
+ const result = {
105
+ previous: prev,
106
+ current: this.info,
107
+ clearedSingletons,
108
+ };
109
+ // 6. 通知监听器
110
+ for (const fn of this.#listeners) {
111
+ try {
112
+ fn(result);
113
+ }
114
+ catch {
115
+ /* listener should not break switching */
116
+ }
117
+ }
118
+ this.#logger.info('[AiProviderManager] Provider switched', {
119
+ from: `${prev.name}/${prev.model}`,
120
+ to: `${result.current.name}/${result.current.model}`,
121
+ mock: result.current.isMock,
122
+ cleared: clearedSingletons,
123
+ });
124
+ return result;
125
+ }
126
+ // ═══════════════════════════════════════════════════════
127
+ // Embedding 管理
128
+ // ═══════════════════════════════════════════════════════
129
+ /** 手动设置 Embedding fallback provider */
130
+ setEmbedProvider(ep) {
131
+ this.#embedProvider = ep;
132
+ }
133
+ // ═══════════════════════════════════════════════════════
134
+ // AOP: Token 追踪
135
+ // ═══════════════════════════════════════════════════════
136
+ /** 注入 TokenRecorder (延迟绑定,避免循环依赖) */
137
+ setTokenRecorder(recorder) {
138
+ this.#tokenRecorder = recorder;
139
+ this.#wireTokenTracking();
140
+ }
141
+ /**
142
+ * 在当前 provider 上安装 _onTokenUsage 回调
143
+ * 每次 provider.chat() / chatWithTools() 等调用后自动触发
144
+ */
145
+ #wireTokenTracking() {
146
+ const p = this.#provider;
147
+ if (!p || typeof p !== 'object') {
148
+ return;
149
+ }
150
+ p._onTokenUsage = (usage) => {
151
+ if (!this.#tokenRecorder) {
152
+ return;
153
+ }
154
+ try {
155
+ this.#tokenRecorder.record({
156
+ source: usage.source || 'provider',
157
+ provider: p.name ?? undefined,
158
+ model: p.model ?? undefined,
159
+ inputTokens: usage.inputTokens || 0,
160
+ outputTokens: usage.outputTokens || 0,
161
+ });
162
+ }
163
+ catch {
164
+ /* token tracking never breaks execution */
165
+ }
166
+ };
167
+ }
168
+ // ═══════════════════════════════════════════════════════
169
+ // 事件
170
+ // ═══════════════════════════════════════════════════════
171
+ /** 注册切换监听器,返回取消注册函数 */
172
+ onSwitch(fn) {
173
+ this.#listeners.add(fn);
174
+ return () => {
175
+ this.#listeners.delete(fn);
176
+ };
177
+ }
178
+ // ═══════════════════════════════════════════════════════
179
+ // DI 绑定 (仅 ServiceContainer / AiModule 调用)
180
+ // ═══════════════════════════════════════════════════════
181
+ /** 注入 DI 容器的级联清理回调 */
182
+ _bindDependentClearer(fn) {
183
+ this.#clearDependents = fn;
184
+ }
185
+ /** 注入 Embedding Fallback 初始化器 */
186
+ _bindEmbedFallbackInit(fn) {
187
+ this.#embedFallbackInit = fn;
188
+ }
189
+ /** 注入 DI 数据管道同步回调(切换时更新 singletons 中的 provider 引用) */
190
+ _bindDiSync(fn) {
191
+ this.#syncToDi = fn;
192
+ }
193
+ }
@@ -36,7 +36,18 @@ export class ClaudeProvider extends AiProvider {
36
36
  max_tokens: maxTokens,
37
37
  temperature,
38
38
  };
39
+ if (context.systemPrompt) {
40
+ body.system = context.systemPrompt;
41
+ }
39
42
  const data = await this._post(`${CLAUDE_BASE}/messages`, body);
43
+ // 提取 token 用量
44
+ if (data?.usage) {
45
+ this._emitTokenUsage({
46
+ inputTokens: data.usage.input_tokens || 0,
47
+ outputTokens: data.usage.output_tokens || 0,
48
+ totalTokens: (data.usage.input_tokens || 0) + (data.usage.output_tokens || 0),
49
+ });
50
+ }
40
51
  const textBlock = (data?.content || []).find((c) => c.type === 'text');
41
52
  return textBlock?.text || '';
42
53
  }
@@ -50,6 +50,15 @@ export class GoogleGeminiProvider extends AiProvider {
50
50
  }
51
51
  const url = `${GEMINI_BASE}/models/${this.model}:generateContent?key=${this.apiKey}`;
52
52
  const data = await this._post(url, body);
53
+ // 提取 token 用量
54
+ if (data?.usageMetadata) {
55
+ this._emitTokenUsage({
56
+ inputTokens: data.usageMetadata.promptTokenCount || 0,
57
+ outputTokens: data.usageMetadata.candidatesTokenCount || 0,
58
+ totalTokens: (data.usageMetadata.promptTokenCount || 0) +
59
+ (data.usageMetadata.candidatesTokenCount || 0),
60
+ });
61
+ }
53
62
  return data?.candidates?.[0]?.content?.parts?.[0]?.text || '';
54
63
  });
55
64
  }
@@ -306,6 +315,15 @@ export class GoogleGeminiProvider extends AiProvider {
306
315
  }
307
316
  const url = `${GEMINI_BASE}/models/${this.model}:generateContent?key=${this.apiKey}`;
308
317
  const data = await this._post(url, body);
318
+ // 提取 token 用量
319
+ if (data?.usageMetadata) {
320
+ this._emitTokenUsage({
321
+ inputTokens: data.usageMetadata.promptTokenCount || 0,
322
+ outputTokens: data.usageMetadata.candidatesTokenCount || 0,
323
+ totalTokens: (data.usageMetadata.promptTokenCount || 0) +
324
+ (data.usageMetadata.candidatesTokenCount || 0),
325
+ });
326
+ }
309
327
  const text = data?.candidates?.[0]?.content?.parts?.[0]?.text || '';
310
328
  if (!text) {
311
329
  return null;
@@ -1,8 +1,23 @@
1
1
  /**
2
- * MockProvider - 测试用 AI 提供商
3
- * 返回固定/随机数据,不发网络请求
2
+ * MockProvider Smart Mock AI 提供商
3
+ *
4
+ * 不发网络请求,但根据 prompt 内容智能匹配场景,返回符合格式的仿真响应。
5
+ * 用于让用户在没有 API Key 的情况下体验 AutoSnippet 完整工作流。
6
+ *
7
+ * 智能匹配场景:
8
+ * 1. probe / ping → "pong"
9
+ * 2. 重复度检测 (DUPLICATE/SIMILAR/UNIQUE) → "UNIQUE"
10
+ * 3. 对话压缩总结 → 从消息中提取关键词
11
+ * 4. 代码上下文化 (<chunk>) → 从代码提取函数/类名
12
+ * 5. 候选润色 (JSON 9字段) → 原样回传输入字段
13
+ * 6. 维度摘要 (dimensionDigest) → 模板化 JSON
14
+ * 7. 风格检查建议 → 空数组
15
+ * 8. Agent 路由分类 → functionCall classify_intent
16
+ * 9. 通用 fallback → 语义化占位文本
17
+ *
18
+ * 模拟延迟: 50-200ms 随机延迟,营造 "AI 思考" 体验
4
19
  */
5
- import { AiProvider, type AiProviderConfig, type ChatContext } from '../AiProvider.js';
20
+ import { AiProvider, type AiProviderConfig, type ChatContext, type ChatWithToolsOptions, type ChatWithToolsResult, type StructuredOutputOptions } from '../AiProvider.js';
6
21
  interface MockResponses {
7
22
  chat?: string;
8
23
  summarize?: Record<string, unknown>;
@@ -19,8 +34,11 @@ export declare class MockProvider extends AiProvider {
19
34
  responses?: MockResponses;
20
35
  });
21
36
  chat(prompt: string, context?: ChatContext): Promise<string>;
37
+ chatWithTools(prompt: string, opts?: ChatWithToolsOptions): Promise<ChatWithToolsResult>;
38
+ chatWithStructuredOutput(prompt: string, opts?: StructuredOutputOptions): Promise<unknown>;
22
39
  summarize(code: string): Promise<Record<string, unknown>>;
23
40
  embed(text: string | string[]): Promise<number[] | number[][]>;
41
+ probe(): Promise<boolean>;
24
42
  /** 获取调用日志(测试断言用) */
25
43
  getCalls(): CallLogEntry[];
26
44
  /** 重置调用记录 */