@cicctencent/agent-server 0.2.13 → 0.2.15

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 (77) hide show
  1. package/dist/cjs/agent/agent-server.d.ts.map +1 -1
  2. package/dist/cjs/agent/agent-server.js +13 -2
  3. package/dist/cjs/agent/agent-server.js.map +1 -1
  4. package/dist/cjs/index.d.ts +5 -3
  5. package/dist/cjs/index.d.ts.map +1 -1
  6. package/dist/cjs/index.js +16 -3
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/prompt/prompt-builder.d.ts +6 -1
  9. package/dist/cjs/prompt/prompt-builder.d.ts.map +1 -1
  10. package/dist/cjs/prompt/prompt-builder.js +59 -2
  11. package/dist/cjs/prompt/prompt-builder.js.map +1 -1
  12. package/dist/cjs/service/artifact.service.d.ts +7 -0
  13. package/dist/cjs/service/artifact.service.d.ts.map +1 -1
  14. package/dist/cjs/service/artifact.service.js +17 -2
  15. package/dist/cjs/service/artifact.service.js.map +1 -1
  16. package/dist/cjs/service/env-collector.d.ts +57 -0
  17. package/dist/cjs/service/env-collector.d.ts.map +1 -0
  18. package/dist/cjs/service/env-collector.js +230 -0
  19. package/dist/cjs/service/env-collector.js.map +1 -0
  20. package/dist/cjs/service/memory.service.d.ts +8 -0
  21. package/dist/cjs/service/memory.service.d.ts.map +1 -1
  22. package/dist/cjs/service/memory.service.js +23 -4
  23. package/dist/cjs/service/memory.service.js.map +1 -1
  24. package/dist/cjs/service/model-config-resolver.d.ts +108 -0
  25. package/dist/cjs/service/model-config-resolver.d.ts.map +1 -0
  26. package/dist/cjs/service/model-config-resolver.js +231 -0
  27. package/dist/cjs/service/model-config-resolver.js.map +1 -0
  28. package/dist/cjs/tool/tools/automation.d.ts.map +1 -1
  29. package/dist/cjs/tool/tools/automation.js +16 -19
  30. package/dist/cjs/tool/tools/automation.js.map +1 -1
  31. package/dist/cjs/tool/tools/communication.d.ts.map +1 -1
  32. package/dist/cjs/tool/tools/communication.js +50 -50
  33. package/dist/cjs/tool/tools/communication.js.map +1 -1
  34. package/dist/cjs/tool/tools/sandbox.d.ts.map +1 -1
  35. package/dist/cjs/tool/tools/sandbox.js +2 -3
  36. package/dist/cjs/tool/tools/sandbox.js.map +1 -1
  37. package/dist/cjs/types.d.ts +51 -1
  38. package/dist/cjs/types.d.ts.map +1 -1
  39. package/dist/esm/agent/agent-server.d.ts.map +1 -1
  40. package/dist/esm/agent/agent-server.js +13 -2
  41. package/dist/esm/agent/agent-server.js.map +1 -1
  42. package/dist/esm/index.d.ts +5 -3
  43. package/dist/esm/index.d.ts.map +1 -1
  44. package/dist/esm/index.js +5 -2
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/prompt/prompt-builder.d.ts +6 -1
  47. package/dist/esm/prompt/prompt-builder.d.ts.map +1 -1
  48. package/dist/esm/prompt/prompt-builder.js +58 -1
  49. package/dist/esm/prompt/prompt-builder.js.map +1 -1
  50. package/dist/esm/service/artifact.service.d.ts +7 -0
  51. package/dist/esm/service/artifact.service.d.ts.map +1 -1
  52. package/dist/esm/service/artifact.service.js +15 -2
  53. package/dist/esm/service/artifact.service.js.map +1 -1
  54. package/dist/esm/service/env-collector.d.ts +57 -0
  55. package/dist/esm/service/env-collector.d.ts.map +1 -0
  56. package/dist/esm/service/env-collector.js +189 -0
  57. package/dist/esm/service/env-collector.js.map +1 -0
  58. package/dist/esm/service/memory.service.d.ts +8 -0
  59. package/dist/esm/service/memory.service.d.ts.map +1 -1
  60. package/dist/esm/service/memory.service.js +24 -5
  61. package/dist/esm/service/memory.service.js.map +1 -1
  62. package/dist/esm/service/model-config-resolver.d.ts +108 -0
  63. package/dist/esm/service/model-config-resolver.d.ts.map +1 -0
  64. package/dist/esm/service/model-config-resolver.js +227 -0
  65. package/dist/esm/service/model-config-resolver.js.map +1 -0
  66. package/dist/esm/tool/tools/automation.d.ts.map +1 -1
  67. package/dist/esm/tool/tools/automation.js +13 -16
  68. package/dist/esm/tool/tools/automation.js.map +1 -1
  69. package/dist/esm/tool/tools/communication.d.ts.map +1 -1
  70. package/dist/esm/tool/tools/communication.js +50 -50
  71. package/dist/esm/tool/tools/communication.js.map +1 -1
  72. package/dist/esm/tool/tools/sandbox.d.ts.map +1 -1
  73. package/dist/esm/tool/tools/sandbox.js +1 -2
  74. package/dist/esm/tool/tools/sandbox.js.map +1 -1
  75. package/dist/esm/types.d.ts +51 -1
  76. package/dist/esm/types.d.ts.map +1 -1
  77. package/package.json +2 -2
@@ -0,0 +1,108 @@
1
+ /**
2
+ * @file DefaultModelConfigResolver — 模型配置解析器默认实现
3
+ * @description 将 resolveModelConfig/createProviderFromModelConfig 模式下沉到 agent-server,
4
+ * 供 work_agent 和 omniinsight-bi 等上层应用复用。
5
+ */
6
+ import type { LLMProvider } from '@cicctencent/agent-core';
7
+ import type { SettingsProvider, ModelProviderConfig, TenantContext } from '../types.js';
8
+ /**
9
+ * 模型配置解析器默认实现
10
+ *
11
+ * 提供统一的模型配置解析和 LLMProvider 创建逻辑:
12
+ * - resolve(): 根据 modelConfigId 查找对应的 ModelProviderConfig
13
+ * - createProvider(): 根据 modelConfigId 创建 LLMProvider 实例
14
+ * - resolveForRole(): 角色分层调度(role_based 策略)
15
+ * - resolveForScene(): 场景分层调度(如 memory_extraction)
16
+ * - createFallbackProvider(): 创建降级 Provider
17
+ *
18
+ * 上层应用可直接使用此实现,或实现自定义 ModelConfigResolver SPI。
19
+ */
20
+ export declare class DefaultModelConfigResolver {
21
+ private settingsProvider;
22
+ private defaultTenant?;
23
+ constructor(settingsProvider: SettingsProvider, defaultTenant?: TenantContext);
24
+ /**
25
+ * 获取设置(带默认租户)
26
+ */
27
+ private getSettings;
28
+ /**
29
+ * 解析模型配置
30
+ *
31
+ * 解析顺序:
32
+ * 1. 指定了 modelConfigId → 精确查找
33
+ * 2. 使用 defaultModelId → 查找默认配置
34
+ * 3. 从 modelProviders 中找第一个可用的
35
+ * 4. 回退到全局 apiKeys 设置
36
+ *
37
+ * @param modelConfigId 模型配置 ID(可选)
38
+ * @param tenant 租户上下文(可选)
39
+ * @returns ModelProviderConfig
40
+ */
41
+ resolve(modelConfigId?: string, tenant?: TenantContext): ModelProviderConfig;
42
+ /**
43
+ * 根据 modelConfigId 创建 LLMProvider 实例
44
+ *
45
+ * 封装 resolve + createLLMProvider 的重复调用模式,
46
+ * 同时处理代理配置和模型覆盖。
47
+ *
48
+ * @param modelConfigId 模型配置 ID(可选)
49
+ * @param modelOverride 模型名称覆盖(可选,用于 profile.model 覆盖)
50
+ * @param tenant 租户上下文(可选)
51
+ * @returns LLMProvider 实例
52
+ */
53
+ createProvider(modelConfigId?: string, modelOverride?: string, tenant?: TenantContext): LLMProvider;
54
+ /**
55
+ * 根据工作流角色解析对应的 modelConfigId(模型分层调度)
56
+ *
57
+ * 当 modelTierStrategy === 'role_based' 时,按角色查找对应的 modelConfigId;
58
+ * 否则返回 undefined(走默认主流程)。
59
+ *
60
+ * @param role WorkflowRole 或场景 key
61
+ * @param tenant 租户上下文(可选)
62
+ * @returns modelConfigId,未配置则返回 undefined
63
+ */
64
+ resolveForRole(role?: string, tenant?: TenantContext): string | undefined;
65
+ /**
66
+ * 根据场景 key 解析对应的 modelConfigId(场景模型分层调度)
67
+ *
68
+ * 与 resolveForRole 不同,本方法不依赖 modelTierStrategy === 'role_based',
69
+ * 只要 modelTiers 中配置了对应场景 key 即生效。
70
+ *
71
+ * 用于记忆提取管道等非主对话场景的独立模型配置。
72
+ *
73
+ * @param scene 场景 key(如 'memory_extraction', 'scene_aggregation')
74
+ * @param tenant 租户上下文(可选)
75
+ * @returns modelConfigId,未配置则返回 undefined(走默认主流程)
76
+ */
77
+ resolveForScene(scene: string, tenant?: TenantContext): string | undefined;
78
+ /**
79
+ * 根据 modelConfigId 创建降级 LLM Provider
80
+ *
81
+ * @param modelConfigId 模型配置 ID
82
+ * @param tenant 租户上下文(可选)
83
+ * @returns LLMProvider 实例,无有效配置时返回 undefined
84
+ */
85
+ createFallbackProvider(modelConfigId: string, tenant?: TenantContext): LLMProvider | undefined;
86
+ /**
87
+ * 获取降级模型配置 ID(从 agentConfig.fallbackProvider)
88
+ *
89
+ * @param tenant 租户上下文(可选)
90
+ * @returns fallbackProvider modelConfigId,未配置则返回 undefined
91
+ */
92
+ getFallbackModelConfigId(tenant?: TenantContext): string | undefined;
93
+ /**
94
+ * 检查 Agent 系统是否可用(API Key 已配置)
95
+ *
96
+ * @param tenant 租户上下文(可选)
97
+ * @returns 是否可用
98
+ */
99
+ isAvailable(tenant?: TenantContext): boolean;
100
+ /**
101
+ * 获取 Agent 不可用的具体原因
102
+ *
103
+ * @param tenant 租户上下文(可选)
104
+ * @returns 不可用原因描述
105
+ */
106
+ getUnavailableReason(tenant?: TenantContext): string;
107
+ }
108
+ //# sourceMappingURL=model-config-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-config-resolver.d.ts","sourceRoot":"","sources":["../../../src/service/model-config-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,yBAAyB,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAkB,mBAAmB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExG;;;;;;;;;;;GAWG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAE1B,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAE,aAAa;IAK7E;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,mBAAmB;IAmC5E;;;;;;;;;;OAUG;IACH,cAAc,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,WAAW;IAoBnG;;;;;;;;;OASG;IACH,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS;IAmBzE;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS;IAO1E;;;;;;OAMG;IACH,sBAAsB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS;IAM9F;;;;;OAKG;IACH,wBAAwB,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS;IAKpE;;;;;OAKG;IACH,WAAW,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO;IAkB5C;;;;;OAKG;IACH,oBAAoB,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM;CA0BrD"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * @file DefaultModelConfigResolver — 模型配置解析器默认实现
3
+ * @description 将 resolveModelConfig/createProviderFromModelConfig 模式下沉到 agent-server,
4
+ * 供 work_agent 和 omniinsight-bi 等上层应用复用。
5
+ */
6
+ import { createLLMProvider, resolveProxyAgentForCategory } from '@cicctencent/agent-core';
7
+ /**
8
+ * 模型配置解析器默认实现
9
+ *
10
+ * 提供统一的模型配置解析和 LLMProvider 创建逻辑:
11
+ * - resolve(): 根据 modelConfigId 查找对应的 ModelProviderConfig
12
+ * - createProvider(): 根据 modelConfigId 创建 LLMProvider 实例
13
+ * - resolveForRole(): 角色分层调度(role_based 策略)
14
+ * - resolveForScene(): 场景分层调度(如 memory_extraction)
15
+ * - createFallbackProvider(): 创建降级 Provider
16
+ *
17
+ * 上层应用可直接使用此实现,或实现自定义 ModelConfigResolver SPI。
18
+ */
19
+ export class DefaultModelConfigResolver {
20
+ settingsProvider;
21
+ defaultTenant;
22
+ constructor(settingsProvider, defaultTenant) {
23
+ this.settingsProvider = settingsProvider;
24
+ this.defaultTenant = defaultTenant;
25
+ }
26
+ /**
27
+ * 获取设置(带默认租户)
28
+ */
29
+ getSettings(tenant) {
30
+ return this.settingsProvider.getSettings(tenant ?? this.defaultTenant);
31
+ }
32
+ /**
33
+ * 解析模型配置
34
+ *
35
+ * 解析顺序:
36
+ * 1. 指定了 modelConfigId → 精确查找
37
+ * 2. 使用 defaultModelId → 查找默认配置
38
+ * 3. 从 modelProviders 中找第一个可用的
39
+ * 4. 回退到全局 apiKeys 设置
40
+ *
41
+ * @param modelConfigId 模型配置 ID(可选)
42
+ * @param tenant 租户上下文(可选)
43
+ * @returns ModelProviderConfig
44
+ */
45
+ resolve(modelConfigId, tenant) {
46
+ const s = this.getSettings(tenant);
47
+ // 指定了具体 modelConfigId,精确查找
48
+ if (modelConfigId && s.modelProviders) {
49
+ const found = s.modelProviders.find(mp => mp.id === modelConfigId);
50
+ if (found)
51
+ return found;
52
+ }
53
+ // 使用 defaultModelId 查找
54
+ if (s.defaultModelId && s.modelProviders) {
55
+ const found = s.modelProviders.find(mp => mp.id === s.defaultModelId);
56
+ if (found)
57
+ return found;
58
+ }
59
+ // 默认模型:从 modelProviders 中找一个可用的
60
+ if (s.modelProviders && s.modelProviders.length > 0) {
61
+ const available = s.modelProviders.find(mp => mp.apiKey || mp.provider === 'ollama') || s.modelProviders[0];
62
+ return available;
63
+ }
64
+ // 回退到全局设置
65
+ const providerName = s.apiKeys?.provider || 'openai';
66
+ return {
67
+ id: '__global__',
68
+ name: '全局设置',
69
+ provider: providerName,
70
+ model: s.apiKeys?.customModel || process.env.LLM_MODEL || (providerName === 'anthropic' ? 'claude-sonnet-4-20250514' : 'gpt-4'),
71
+ apiKey: providerName === 'anthropic'
72
+ ? (s.apiKeys?.anthropic || process.env.ANTHROPIC_API_KEY || '')
73
+ : (s.apiKeys?.openai || process.env.OPENAI_API_KEY || ''),
74
+ baseUrl: s.apiKeys?.customEndpoint || process.env.OPENAI_BASE_URL || undefined,
75
+ };
76
+ }
77
+ /**
78
+ * 根据 modelConfigId 创建 LLMProvider 实例
79
+ *
80
+ * 封装 resolve + createLLMProvider 的重复调用模式,
81
+ * 同时处理代理配置和模型覆盖。
82
+ *
83
+ * @param modelConfigId 模型配置 ID(可选)
84
+ * @param modelOverride 模型名称覆盖(可选,用于 profile.model 覆盖)
85
+ * @param tenant 租户上下文(可选)
86
+ * @returns LLMProvider 实例
87
+ */
88
+ createProvider(modelConfigId, modelOverride, tenant) {
89
+ const s = this.getSettings(tenant);
90
+ const modelConfig = this.resolve(modelConfigId, tenant);
91
+ // 解析 LLM 代理配置
92
+ const llmProxy = resolveProxyAgentForCategory(s.proxySettings?.llm, 'LLM');
93
+ return createLLMProvider({
94
+ provider: modelConfig.provider,
95
+ model: modelOverride || modelConfig.model,
96
+ name: modelConfig.name || `${modelConfig.provider} / ${modelConfig.model}`,
97
+ apiKey: modelConfig.apiKey,
98
+ baseUrl: modelConfig.baseUrl,
99
+ temperature: modelConfig.temperature,
100
+ maxTokens: modelConfig.maxTokens,
101
+ timeout: modelConfig.timeout,
102
+ proxy: llmProxy,
103
+ });
104
+ }
105
+ /**
106
+ * 根据工作流角色解析对应的 modelConfigId(模型分层调度)
107
+ *
108
+ * 当 modelTierStrategy === 'role_based' 时,按角色查找对应的 modelConfigId;
109
+ * 否则返回 undefined(走默认主流程)。
110
+ *
111
+ * @param role WorkflowRole 或场景 key
112
+ * @param tenant 租户上下文(可选)
113
+ * @returns modelConfigId,未配置则返回 undefined
114
+ */
115
+ resolveForRole(role, tenant) {
116
+ const s = this.getSettings(tenant);
117
+ const strategy = s.agentConfig?.modelTierStrategy;
118
+ if (strategy !== 'role_based' || !role)
119
+ return undefined;
120
+ const tiers = s.agentConfig?.modelTiers;
121
+ if (!tiers)
122
+ return undefined;
123
+ // 精确匹配角色
124
+ if (tiers[role])
125
+ return tiers[role];
126
+ // 分组映射:bull/bear 归为 researcher 层
127
+ if ((role === 'bull_researcher' || role === 'bear_researcher') && tiers['researcher']) {
128
+ return tiers['researcher'];
129
+ }
130
+ return undefined;
131
+ }
132
+ /**
133
+ * 根据场景 key 解析对应的 modelConfigId(场景模型分层调度)
134
+ *
135
+ * 与 resolveForRole 不同,本方法不依赖 modelTierStrategy === 'role_based',
136
+ * 只要 modelTiers 中配置了对应场景 key 即生效。
137
+ *
138
+ * 用于记忆提取管道等非主对话场景的独立模型配置。
139
+ *
140
+ * @param scene 场景 key(如 'memory_extraction', 'scene_aggregation')
141
+ * @param tenant 租户上下文(可选)
142
+ * @returns modelConfigId,未配置则返回 undefined(走默认主流程)
143
+ */
144
+ resolveForScene(scene, tenant) {
145
+ const s = this.getSettings(tenant);
146
+ const tiers = s.agentConfig?.modelTiers;
147
+ if (!tiers)
148
+ return undefined;
149
+ return tiers[scene] || undefined;
150
+ }
151
+ /**
152
+ * 根据 modelConfigId 创建降级 LLM Provider
153
+ *
154
+ * @param modelConfigId 模型配置 ID
155
+ * @param tenant 租户上下文(可选)
156
+ * @returns LLMProvider 实例,无有效配置时返回 undefined
157
+ */
158
+ createFallbackProvider(modelConfigId, tenant) {
159
+ const modelConfig = this.resolve(modelConfigId, tenant);
160
+ if (!modelConfig.provider || !modelConfig.apiKey)
161
+ return undefined;
162
+ return this.createProvider(modelConfigId, undefined, tenant);
163
+ }
164
+ /**
165
+ * 获取降级模型配置 ID(从 agentConfig.fallbackProvider)
166
+ *
167
+ * @param tenant 租户上下文(可选)
168
+ * @returns fallbackProvider modelConfigId,未配置则返回 undefined
169
+ */
170
+ getFallbackModelConfigId(tenant) {
171
+ const s = this.getSettings(tenant);
172
+ return s.agentConfig?.fallbackProvider;
173
+ }
174
+ /**
175
+ * 检查 Agent 系统是否可用(API Key 已配置)
176
+ *
177
+ * @param tenant 租户上下文(可选)
178
+ * @returns 是否可用
179
+ */
180
+ isAvailable(tenant) {
181
+ const s = this.getSettings(tenant);
182
+ const modelConfig = this.resolve(undefined, tenant);
183
+ const provider = modelConfig.provider || 'openai';
184
+ // Ollama 本地服务始终可用
185
+ if (provider === 'ollama')
186
+ return true;
187
+ // 优先使用解析后的 modelConfig.apiKey(已涵盖 modelProviders 配置)
188
+ if (modelConfig.apiKey)
189
+ return true;
190
+ // 回退检查全局 apiKeys
191
+ if (provider === 'anthropic') {
192
+ return !!(s.apiKeys?.anthropic || process.env.ANTHROPIC_API_KEY);
193
+ }
194
+ return !!(s.apiKeys?.openai || process.env.OPENAI_API_KEY);
195
+ }
196
+ /**
197
+ * 获取 Agent 不可用的具体原因
198
+ *
199
+ * @param tenant 租户上下文(可选)
200
+ * @returns 不可用原因描述
201
+ */
202
+ getUnavailableReason(tenant) {
203
+ const s = this.getSettings(tenant);
204
+ const modelConfig = this.resolve(undefined, tenant);
205
+ const provider = modelConfig.provider || 'openai';
206
+ if (provider === 'ollama') {
207
+ const endpoint = modelConfig.baseUrl || s.apiKeys?.customEndpoint || 'http://localhost:11434';
208
+ return `Ollama 服务不可用,请确认 Ollama 已启动并监听 ${endpoint}`;
209
+ }
210
+ if (provider === 'anthropic') {
211
+ const hasKey = !!(modelConfig.apiKey || s.apiKeys?.anthropic || process.env.ANTHROPIC_API_KEY);
212
+ if (!hasKey) {
213
+ return `当前供应商为 Anthropic,但未配置 API Key。请在「设置」页面填写 Anthropic API Key,或设置环境变量 ANTHROPIC_API_KEY`;
214
+ }
215
+ }
216
+ else {
217
+ // openai 或兼容供应商
218
+ const hasKey = !!(modelConfig.apiKey || s.apiKeys?.openai || process.env.OPENAI_API_KEY);
219
+ if (!hasKey) {
220
+ const providerLabel = provider === 'openai' ? 'OpenAI' : provider;
221
+ return `当前供应商为 ${providerLabel},但未配置 API Key。请在「设置」页面填写 API Key,或设置环境变量 OPENAI_API_KEY`;
222
+ }
223
+ }
224
+ return 'AI 服务不可用,请检查设置中的供应商和 API Key 配置';
225
+ }
226
+ }
227
+ //# sourceMappingURL=model-config-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-config-resolver.js","sourceRoot":"","sources":["../../../src/service/model-config-resolver.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"automation.d.ts","sourceRoot":"","sources":["../../../../src/tool/tools/automation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,wBAAgB,qBAAqB,IAAI,cAAc,EAAE,CAyJxD"}
1
+ {"version":3,"file":"automation.d.ts","sourceRoot":"","sources":["../../../../src/tool/tools/automation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAI9D,wBAAgB,qBAAqB,IAAI,cAAc,EAAE,CAsJxD"}
@@ -1,6 +1,7 @@
1
1
  // ============================================================
2
2
  // 自动化任务工具:create_automation, list_automations, delete_automation
3
3
  // ============================================================
4
+ import { getAutomationStore } from "../../store/app-stores.js";
4
5
  export function createAutomationTools() {
5
6
  return [
6
7
  // ---- create_automation ----
@@ -27,18 +28,13 @@ export function createAutomationTools() {
27
28
  },
28
29
  },
29
30
  },
30
- executor: async (args) => {
31
+ executor: async (args, ctx) => {
31
32
  try {
32
33
  const cron = await import('node-cron');
33
34
  const schedule = args.schedule;
34
35
  if (!cron.validate(schedule)) {
35
36
  return `ERROR: Invalid cron expression "${schedule}". Use 5-field format: min hour day month weekday.\nExamples: "0 9 * * *" (daily 9AM), "0 9 * * 1" (Monday 9AM), "*/30 * * * *" (every 30min)`;
36
37
  }
37
- // @ts-ignore — application-layer module
38
- const { getAutomationStore } = await import("../../store/automation-store.js");
39
- // @ts-ignore — application-layer module
40
- // @ts-ignore — application-layer module
41
- const { refreshScheduler } = await import("../../service/automation.service.js");
42
38
  const store = getAutomationStore();
43
39
  const item = store.create({
44
40
  name: args.name,
@@ -48,7 +44,11 @@ export function createAutomationTools() {
48
44
  enabled: args.enabled !== false,
49
45
  lastStatus: 'idle',
50
46
  });
51
- refreshScheduler();
47
+ // 通过 SPI Provider 刷新调度器
48
+ const automationProvider = ctx.custom?.automationProvider;
49
+ if (automationProvider?.refreshScheduler) {
50
+ automationProvider.refreshScheduler();
51
+ }
52
52
  return `Automation created successfully!\n Name: ${item.name}\n Schedule: ${schedule}\n ID: ${item.id}\n Enabled: ${item.enabled}\n\nThe task will trigger automatically according to the schedule.`;
53
53
  }
54
54
  catch (e) {
@@ -77,8 +77,6 @@ export function createAutomationTools() {
77
77
  },
78
78
  executor: async (args) => {
79
79
  try {
80
- // @ts-ignore — application-layer module
81
- const { getAutomationStore } = await import("../../store/automation-store.js");
82
80
  const store = getAutomationStore();
83
81
  let items = store.list();
84
82
  if (args.enabledOnly) {
@@ -125,21 +123,20 @@ export function createAutomationTools() {
125
123
  },
126
124
  },
127
125
  },
128
- executor: async (args) => {
126
+ executor: async (args, ctx) => {
129
127
  try {
130
128
  const id = args.id;
131
- // @ts-ignore — application-layer module
132
- const { getAutomationStore } = await import("../../store/automation-store.js");
133
- // @ts-ignore — application-layer module
134
- // @ts-ignore — application-layer module
135
- const { refreshScheduler } = await import("../../service/automation.service.js");
136
129
  const store = getAutomationStore();
137
130
  const existing = store.findById(id);
138
131
  if (!existing) {
139
132
  return `ERROR: Automation task with ID ${id} not found.`;
140
133
  }
141
134
  store.remove(id);
142
- refreshScheduler();
135
+ // 通过 SPI Provider 刷新调度器
136
+ const automationProvider = ctx.custom?.automationProvider;
137
+ if (automationProvider?.refreshScheduler) {
138
+ automationProvider.refreshScheduler();
139
+ }
143
140
  return `Automation task "${existing.name}" (ID: ${id}) has been deleted successfully.`;
144
141
  }
145
142
  catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"automation.js","sourceRoot":"","sources":["../../../../src/tool/tools/automation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"automation.js","sourceRoot":"","sources":["../../../../src/tool/tools/automation.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../../../../src/tool/tools/communication.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,yBAAyB,CAAC;AAEvE,wBAAgB,wBAAwB,IAAI,cAAc,EAAE,CAwQ3D"}
1
+ {"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../../../../src/tool/tools/communication.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,yBAAyB,CAAC;AAOvE,wBAAgB,wBAAwB,IAAI,cAAc,EAAE,CAsQ3D"}
@@ -1,6 +1,10 @@
1
1
  // ============================================================
2
2
  // 通信工具:send_email, create_event, list_events
3
3
  // ============================================================
4
+ import { resolveArtifactPath } from "../../service/artifact.service.js";
5
+ import { getProjectDataPath } from "../../utils/data-dir.js";
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
4
8
  export function createCommunicationTools() {
5
9
  return [
6
10
  // ---- send_email ----
@@ -40,12 +44,12 @@ export function createCommunicationTools() {
40
44
  },
41
45
  },
42
46
  executor: async (args, ctx) => {
43
- // @ts-ignore application-layer module
44
- const { getEmailProvider } = await import("../../email/smtp-provider.js");
45
- const fs = await import('fs');
46
- const path = await import('path');
47
+ // ToolContext 获取 EmailProvider SPI
48
+ const emailProvider = ctx.custom?.emailProvider;
49
+ if (!emailProvider) {
50
+ return 'ERROR: Email provider not configured. Please add an email connector in the Connectors page.';
51
+ }
47
52
  try {
48
- const provider = await getEmailProvider();
49
53
  // 处理附件:支持本地文件路径、artifact URL、沙箱内相对路径
50
54
  const attachments = [];
51
55
  if (args.attachments && Array.isArray(args.attachments)) {
@@ -58,12 +62,7 @@ export function createCommunicationTools() {
58
62
  const artifactMatch = filePath.match(/\/artifacts\/([^/]+)\/([^/]+)\/(.+)$/);
59
63
  if (artifactMatch) {
60
64
  const [, sessionId, artifactId, filename] = artifactMatch;
61
- try {
62
- // @ts-ignore — application-layer module
63
- const { resolveArtifactPath } = await import("../../service/artifact.service.js");
64
- resolvedPath = resolveArtifactPath(sessionId, artifactId, decodeURIComponent(filename)) || '';
65
- }
66
- catch { /* ignore */ }
65
+ resolvedPath = resolveArtifactPath(sessionId, artifactId, decodeURIComponent(filename)) || '';
67
66
  }
68
67
  // 2. 如果是本地绝对路径且文件存在
69
68
  if (!resolvedPath && path.isAbsolute(filePath) && fs.existsSync(filePath)) {
@@ -88,28 +87,24 @@ export function createCommunicationTools() {
88
87
  }
89
88
  // 5. 尝试从 data/sandboxes 下搜索
90
89
  if (!resolvedPath) {
91
- try {
92
- const { getProjectDataPath } = await import("../../utils/data-dir.js");
93
- const sandboxesBase = getProjectDataPath('sandboxes');
94
- if (fs.existsSync(sandboxesBase)) {
95
- // 搜索所有沙箱目录下的 artifacts 子目录
96
- for (const sessionDir of fs.readdirSync(sandboxesBase)) {
97
- const artifactsDir = path.join(sandboxesBase, sessionDir, '_artifacts');
98
- if (!fs.existsSync(artifactsDir))
99
- continue;
100
- for (const artDir of fs.readdirSync(artifactsDir)) {
101
- const candidate = path.join(artifactsDir, artDir, path.basename(filePath));
102
- if (fs.existsSync(candidate)) {
103
- resolvedPath = candidate;
104
- break;
105
- }
106
- }
107
- if (resolvedPath)
90
+ const sandboxesBase = getProjectDataPath('sandboxes');
91
+ if (fs.existsSync(sandboxesBase)) {
92
+ // 搜索所有沙箱目录下的 artifacts 子目录
93
+ for (const sessionDir of fs.readdirSync(sandboxesBase)) {
94
+ const artifactsDir = path.join(sandboxesBase, sessionDir, '_artifacts');
95
+ if (!fs.existsSync(artifactsDir))
96
+ continue;
97
+ for (const artDir of fs.readdirSync(artifactsDir)) {
98
+ const candidate = path.join(artifactsDir, artDir, path.basename(filePath));
99
+ if (fs.existsSync(candidate)) {
100
+ resolvedPath = candidate;
108
101
  break;
102
+ }
109
103
  }
104
+ if (resolvedPath)
105
+ break;
110
106
  }
111
107
  }
112
- catch { /* ignore */ }
113
108
  }
114
109
  if (!resolvedPath || !fs.existsSync(resolvedPath)) {
115
110
  return `ERROR: Attachment file not found: ${filePath}. ` +
@@ -128,7 +123,7 @@ export function createCommunicationTools() {
128
123
  attachments.push({ filename, content, contentType });
129
124
  }
130
125
  }
131
- await provider.send({
126
+ await emailProvider.send({
132
127
  to: args.to,
133
128
  cc: args.cc,
134
129
  subject: args.subject,
@@ -153,7 +148,7 @@ export function createCommunicationTools() {
153
148
  function: {
154
149
  name: 'create_event',
155
150
  description: 'Create a calendar event with title, start/end time, description, location, and attendees. ' +
156
- 'Generates an .ics file as a downloadable artifact. ' +
151
+ 'May generate an .ics file as a downloadable artifact if the calendar provider supports iCal export. ' +
157
152
  'Optionally sets a reminder (in minutes before start).',
158
153
  parameters: {
159
154
  type: 'object',
@@ -172,13 +167,14 @@ export function createCommunicationTools() {
172
167
  },
173
168
  },
174
169
  executor: async (args, ctx) => {
175
- // @ts-ignore application-layer module
176
- const { getCalendarStore, generateICal } = await import("../../calendar/calendar-service.js");
170
+ const calendarProvider = ctx.custom?.calendarProvider;
171
+ if (!calendarProvider) {
172
+ return 'ERROR: Calendar provider not configured. Please add a calendar connector in the Connectors page.';
173
+ }
177
174
  try {
178
- const store = getCalendarStore();
179
175
  const start = args.start;
180
176
  const end = args.end || new Date(new Date(start).getTime() + 3600000).toISOString();
181
- const event = await store.create({
177
+ const event = await calendarProvider.create({
182
178
  title: args.title,
183
179
  description: args.description,
184
180
  start, end,
@@ -187,18 +183,21 @@ export function createCommunicationTools() {
187
183
  attendees: args.attendees,
188
184
  reminderMinutes: args.reminderMinutes,
189
185
  });
190
- const icsContent = await generateICal([event]);
191
- const filename = `event_${event.id}.ics`;
192
- const sandbox = ctx.custom?.sandbox;
193
- if (sandbox) {
194
- const fsExec = sandbox.getFileSystemExecutor();
195
- await fsExec.writeFile(filename, icsContent);
196
- const emitArtifact = ctx.emitArtifact;
197
- if (emitArtifact) {
198
- emitArtifact({ artifactId: event.id, filename, mimeType: 'text/calendar', size: icsContent.length, url: `/api/work/files/${filename}`, description: `Calendar event: ${event.title}` });
186
+ // 生成 iCal 文件(如果 provider 支持)
187
+ if (calendarProvider.generateICal) {
188
+ const icsContent = await calendarProvider.generateICal([event]);
189
+ const filename = `event_${event.id}.ics`;
190
+ const sandbox = ctx.custom?.sandbox;
191
+ if (sandbox) {
192
+ const fsExec = sandbox.getFileSystemExecutor();
193
+ await fsExec.writeFile(filename, icsContent);
194
+ const emitArtifact = ctx.emitArtifact;
195
+ if (emitArtifact) {
196
+ emitArtifact({ artifactId: event.id, filename, mimeType: 'text/calendar', size: icsContent.length, url: `/api/work/files/${filename}`, description: `Calendar event: ${event.title}` });
197
+ }
199
198
  }
200
199
  }
201
- return `Event created: "${event.title}" starting ${event.start}.\nICS file: ${filename}\nEvent ID: ${event.id}`;
200
+ return `Event created: "${event.title}" starting ${event.start}.\nEvent ID: ${event.id}`;
202
201
  }
203
202
  catch (e) {
204
203
  return `ERROR creating event: ${e.message || e}`;
@@ -225,15 +224,16 @@ export function createCommunicationTools() {
225
224
  },
226
225
  },
227
226
  },
228
- executor: async (args) => {
229
- // @ts-ignore application-layer module
230
- const { getCalendarStore } = await import("../../calendar/calendar-service.js");
227
+ executor: async (args, ctx) => {
228
+ const calendarProvider = ctx.custom?.calendarProvider;
229
+ if (!calendarProvider) {
230
+ return 'ERROR: Calendar provider not configured. Please add a calendar connector in the Connectors page.';
231
+ }
231
232
  try {
232
- const store = getCalendarStore();
233
233
  const now = new Date();
234
234
  const startTime = args.startTime || now.toISOString();
235
235
  const endTime = args.endTime || new Date(now.getTime() + 30 * 86400000).toISOString();
236
- const events = await store.list(startTime, endTime);
236
+ const events = await calendarProvider.list(startTime, endTime);
237
237
  if (events.length === 0)
238
238
  return 'No events found in the specified time range.';
239
239
  const lines = events.map((e, i) => {