@cicctencent/agent-midway 0.1.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 (160) hide show
  1. package/README.md +280 -0
  2. package/dist/adapters/express.d.ts +8 -0
  3. package/dist/adapters/express.js +91 -0
  4. package/dist/adapters/index.d.ts +5 -0
  5. package/dist/adapters/index.js +21 -0
  6. package/dist/adapters/koa.d.ts +3 -0
  7. package/dist/adapters/koa.js +75 -0
  8. package/dist/adapters/midway.d.ts +5 -0
  9. package/dist/adapters/midway.js +11 -0
  10. package/dist/adapters/next.d.ts +12 -0
  11. package/dist/adapters/next.js +89 -0
  12. package/dist/adapters/shared.d.ts +4 -0
  13. package/dist/adapters/shared.js +31 -0
  14. package/dist/channel/dingtalk.d.ts +18 -0
  15. package/dist/channel/dingtalk.js +68 -0
  16. package/dist/channel/feishu.d.ts +20 -0
  17. package/dist/channel/feishu.js +96 -0
  18. package/dist/channel/index.d.ts +46 -0
  19. package/dist/channel/index.js +311 -0
  20. package/dist/channel/types.d.ts +77 -0
  21. package/dist/channel/types.js +7 -0
  22. package/dist/channel/wecom.d.ts +22 -0
  23. package/dist/channel/wecom.js +106 -0
  24. package/dist/component.d.ts +49 -0
  25. package/dist/component.js +129 -0
  26. package/dist/connector/calendar-adapter.d.ts +19 -0
  27. package/dist/connector/calendar-adapter.js +236 -0
  28. package/dist/connector/db-adapter.d.ts +28 -0
  29. package/dist/connector/db-adapter.js +193 -0
  30. package/dist/connector/email-adapter.d.ts +23 -0
  31. package/dist/connector/email-adapter.js +192 -0
  32. package/dist/connector/fs-adapter.d.ts +15 -0
  33. package/dist/connector/fs-adapter.js +199 -0
  34. package/dist/connector/http-adapter.d.ts +29 -0
  35. package/dist/connector/http-adapter.js +181 -0
  36. package/dist/connector/index.d.ts +24 -0
  37. package/dist/connector/index.js +454 -0
  38. package/dist/connector/mcp-adapter.d.ts +27 -0
  39. package/dist/connector/mcp-adapter.js +156 -0
  40. package/dist/connector/mq-adapter.d.ts +25 -0
  41. package/dist/connector/mq-adapter.js +181 -0
  42. package/dist/connector/types.d.ts +205 -0
  43. package/dist/connector/types.js +9 -0
  44. package/dist/controller/a2a.controller.d.ts +41 -0
  45. package/dist/controller/a2a.controller.js +150 -0
  46. package/dist/controller/agent-profile.controller.d.ts +97 -0
  47. package/dist/controller/agent-profile.controller.js +200 -0
  48. package/dist/controller/agent.controller.d.ts +199 -0
  49. package/dist/controller/agent.controller.js +414 -0
  50. package/dist/controller/application.controller.d.ts +113 -0
  51. package/dist/controller/application.controller.js +217 -0
  52. package/dist/controller/automation.controller.d.ts +113 -0
  53. package/dist/controller/automation.controller.js +246 -0
  54. package/dist/controller/channel.controller.d.ts +73 -0
  55. package/dist/controller/channel.controller.js +183 -0
  56. package/dist/controller/chat.controller.d.ts +188 -0
  57. package/dist/controller/chat.controller.js +375 -0
  58. package/dist/controller/connector.controller.d.ts +134 -0
  59. package/dist/controller/connector.controller.js +257 -0
  60. package/dist/controller/knowledge-base.controller.d.ts +157 -0
  61. package/dist/controller/knowledge-base.controller.js +278 -0
  62. package/dist/controller/mcp-server.controller.d.ts +115 -0
  63. package/dist/controller/mcp-server.controller.js +236 -0
  64. package/dist/controller/model-config.controller.d.ts +139 -0
  65. package/dist/controller/model-config.controller.js +274 -0
  66. package/dist/controller/observability.controller.d.ts +124 -0
  67. package/dist/controller/observability.controller.js +142 -0
  68. package/dist/controller/security.controller.d.ts +91 -0
  69. package/dist/controller/security.controller.js +172 -0
  70. package/dist/controller/settings.controller.d.ts +83 -0
  71. package/dist/controller/settings.controller.js +280 -0
  72. package/dist/core/ai-workstation.d.ts +17 -0
  73. package/dist/core/ai-workstation.js +129 -0
  74. package/dist/core/index.d.ts +4 -0
  75. package/dist/core/index.js +20 -0
  76. package/dist/core/service-container.d.ts +12 -0
  77. package/dist/core/service-container.js +54 -0
  78. package/dist/core/sse.d.ts +6 -0
  79. package/dist/core/sse.js +56 -0
  80. package/dist/core/types.d.ts +72 -0
  81. package/dist/core/types.js +2 -0
  82. package/dist/dto/agent.dto.d.ts +21 -0
  83. package/dist/dto/agent.dto.js +79 -0
  84. package/dist/dto/ai-config.dto.d.ts +67 -0
  85. package/dist/dto/ai-config.dto.js +249 -0
  86. package/dist/dto/chat.dto.d.ts +40 -0
  87. package/dist/dto/chat.dto.js +122 -0
  88. package/dist/index.d.ts +101 -0
  89. package/dist/index.js +195 -0
  90. package/dist/memory/db-store.d.ts +33 -0
  91. package/dist/memory/db-store.js +143 -0
  92. package/dist/memory/index.d.ts +187 -0
  93. package/dist/memory/index.js +443 -0
  94. package/dist/model/ai-agent-profile.entity.d.ts +32 -0
  95. package/dist/model/ai-agent-profile.entity.js +289 -0
  96. package/dist/model/ai-application.entity.d.ts +20 -0
  97. package/dist/model/ai-application.entity.js +166 -0
  98. package/dist/model/ai-chat-memory.entity.d.ts +16 -0
  99. package/dist/model/ai-chat-memory.entity.js +123 -0
  100. package/dist/model/ai-chat-message.entity.d.ts +16 -0
  101. package/dist/model/ai-chat-message.entity.js +122 -0
  102. package/dist/model/ai-chat-skill.entity.d.ts +19 -0
  103. package/dist/model/ai-chat-skill.entity.js +155 -0
  104. package/dist/model/ai-chat-thread.entity.d.ts +15 -0
  105. package/dist/model/ai-chat-thread.entity.js +113 -0
  106. package/dist/model/ai-chat-workspace.entity.d.ts +17 -0
  107. package/dist/model/ai-chat-workspace.entity.js +136 -0
  108. package/dist/model/ai-kb-document.entity.d.ts +16 -0
  109. package/dist/model/ai-kb-document.entity.js +122 -0
  110. package/dist/model/ai-knowledge-base.entity.d.ts +22 -0
  111. package/dist/model/ai-knowledge-base.entity.js +185 -0
  112. package/dist/model/ai-mcp-server.entity.d.ts +23 -0
  113. package/dist/model/ai-mcp-server.entity.js +198 -0
  114. package/dist/model/ai-model-config.entity.d.ts +24 -0
  115. package/dist/model/ai-model-config.entity.js +200 -0
  116. package/dist/service/a2a.service.d.ts +142 -0
  117. package/dist/service/a2a.service.js +537 -0
  118. package/dist/service/agent-profile.service.d.ts +34 -0
  119. package/dist/service/agent-profile.service.js +110 -0
  120. package/dist/service/agent-server.service.d.ts +91 -0
  121. package/dist/service/agent-server.service.js +634 -0
  122. package/dist/service/agent-task-queue.service.d.ts +98 -0
  123. package/dist/service/agent-task-queue.service.js +283 -0
  124. package/dist/service/ai-chat.service.d.ts +103 -0
  125. package/dist/service/ai-chat.service.js +431 -0
  126. package/dist/service/ai-skill.service.d.ts +116 -0
  127. package/dist/service/ai-skill.service.js +457 -0
  128. package/dist/service/application.service.d.ts +42 -0
  129. package/dist/service/application.service.js +139 -0
  130. package/dist/service/automation.service.d.ts +37 -0
  131. package/dist/service/automation.service.js +196 -0
  132. package/dist/service/connector.service.d.ts +136 -0
  133. package/dist/service/connector.service.js +524 -0
  134. package/dist/service/knowledge-base.service.d.ts +138 -0
  135. package/dist/service/knowledge-base.service.js +528 -0
  136. package/dist/service/mcp-server.service.d.ts +39 -0
  137. package/dist/service/mcp-server.service.js +143 -0
  138. package/dist/service/model-config.service.d.ts +57 -0
  139. package/dist/service/model-config.service.js +168 -0
  140. package/dist/service/observability.service.d.ts +145 -0
  141. package/dist/service/observability.service.js +281 -0
  142. package/dist/service/openai.service.d.ts +88 -0
  143. package/dist/service/openai.service.js +406 -0
  144. package/dist/service/prompt-builder.service.d.ts +50 -0
  145. package/dist/service/prompt-builder.service.js +246 -0
  146. package/dist/tools/code-exec.tool.d.ts +37 -0
  147. package/dist/tools/code-exec.tool.js +162 -0
  148. package/dist/tools/datetime.tool.d.ts +21 -0
  149. package/dist/tools/datetime.tool.js +379 -0
  150. package/dist/tools/http-request.tool.d.ts +43 -0
  151. package/dist/tools/http-request.tool.js +455 -0
  152. package/dist/tools/registry.d.ts +71 -0
  153. package/dist/tools/registry.js +77 -0
  154. package/dist/tools/text-process.tool.d.ts +7 -0
  155. package/dist/tools/text-process.tool.js +366 -0
  156. package/dist/tools/web-search.tool.d.ts +28 -0
  157. package/dist/tools/web-search.tool.js +304 -0
  158. package/dist/types.d.ts +70 -0
  159. package/dist/types.js +7 -0
  160. package/package.json +69 -0
@@ -0,0 +1,379 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.datetimeCalcTool = exports.datetimeFormatTool = void 0;
4
+ // ===================== 常用时区偏移表 =====================
5
+ const TIMEZONE_OFFSETS = {
6
+ UTC: 0,
7
+ GMT: 0,
8
+ 'Asia/Shanghai': 8,
9
+ 'Asia/Tokyo': 9,
10
+ 'Asia/Seoul': 9,
11
+ 'Asia/Singapore': 8,
12
+ 'Asia/Hong_Kong': 8,
13
+ 'Asia/Taipei': 8,
14
+ 'Asia/Kolkata': 5.5,
15
+ 'Asia/Dubai': 4,
16
+ 'Europe/London': 0,
17
+ 'Europe/Paris': 1,
18
+ 'Europe/Berlin': 1,
19
+ 'Europe/Moscow': 3,
20
+ 'America/New_York': -5,
21
+ 'America/Chicago': -6,
22
+ 'America/Denver': -7,
23
+ 'America/Los_Angeles': -8,
24
+ 'America/Sao_Paulo': -3,
25
+ 'Australia/Sydney': 11,
26
+ 'Pacific/Auckland': 13,
27
+ };
28
+ /** 解析日期输入 */
29
+ function parseDate(input) {
30
+ if (!input)
31
+ return null;
32
+ // 纯数字 -> 时间戳
33
+ if (typeof input === 'number') {
34
+ // 秒级时间戳自动转毫秒
35
+ return new Date(input < 1e12 ? input * 1000 : input);
36
+ }
37
+ const str = String(input).trim();
38
+ // 纯数字字符串 -> 时间戳
39
+ if (/^\d{10,13}$/.test(str)) {
40
+ const ts = Number(str);
41
+ return new Date(ts < 1e12 ? ts * 1000 : ts);
42
+ }
43
+ // "now" / "今天" / "当前"
44
+ if (/^(now|today|今天|当前|此刻)$/i.test(str)) {
45
+ return new Date();
46
+ }
47
+ // "yesterday" / "昨天"
48
+ if (/^(yesterday|昨天)$/i.test(str)) {
49
+ const d = new Date();
50
+ d.setDate(d.getDate() - 1);
51
+ return d;
52
+ }
53
+ // "tomorrow" / "明天"
54
+ if (/^(tomorrow|明天)$/i.test(str)) {
55
+ const d = new Date();
56
+ d.setDate(d.getDate() + 1);
57
+ return d;
58
+ }
59
+ // "N days ago" / "N天前"
60
+ const daysAgo = str.match(/^(\d+)\s*(?:days?\s*ago|天前)$/i);
61
+ if (daysAgo) {
62
+ const d = new Date();
63
+ d.setDate(d.getDate() - Number(daysAgo[1]));
64
+ return d;
65
+ }
66
+ // "N days later" / "N天后"
67
+ const daysLater = str.match(/^(\d+)\s*(?:days?\s*(?:later|from\s*now)|天后)$/i);
68
+ if (daysLater) {
69
+ const d = new Date();
70
+ d.setDate(d.getDate() + Number(daysLater[1]));
71
+ return d;
72
+ }
73
+ // ISO 8601 / 常见日期格式
74
+ const d = new Date(str);
75
+ if (!isNaN(d.getTime()))
76
+ return d;
77
+ // 中文日期 "2026年1月15日"
78
+ const cnMatch = str.match(/(\d{4})\s*年\s*(\d{1,2})\s*月\s*(\d{1,2})\s*日/);
79
+ if (cnMatch) {
80
+ return new Date(Number(cnMatch[1]), Number(cnMatch[2]) - 1, Number(cnMatch[3]));
81
+ }
82
+ return null;
83
+ }
84
+ /** 将日期转为指定时区的 ISO 字符串 */
85
+ function toTimezone(date, timezone) {
86
+ const offsetHours = TIMEZONE_OFFSETS[timezone];
87
+ if (offsetHours === undefined) {
88
+ // 未知时区就用 UTC
89
+ return date.toISOString();
90
+ }
91
+ const utcMs = date.getTime() + date.getTimezoneOffset() * 60000;
92
+ const tzMs = utcMs + offsetHours * 3600000;
93
+ const tzDate = new Date(tzMs);
94
+ const sign = offsetHours >= 0 ? '+' : '-';
95
+ const absH = Math.abs(Math.floor(offsetHours));
96
+ const absM = Math.abs((offsetHours % 1) * 60);
97
+ const offset = `${sign}${String(absH).padStart(2, '0')}:${String(absM).padStart(2, '0')}`;
98
+ return tzDate.toISOString().replace('Z', offset);
99
+ }
100
+ /** 自定义格式化 */
101
+ function formatDate(date, format) {
102
+ const pad = (n) => String(n).padStart(2, '0');
103
+ return format
104
+ .replace('YYYY', String(date.getFullYear()))
105
+ .replace('MM', pad(date.getMonth() + 1))
106
+ .replace('DD', pad(date.getDate()))
107
+ .replace('HH', pad(date.getHours()))
108
+ .replace('mm', pad(date.getMinutes()))
109
+ .replace('ss', pad(date.getSeconds()))
110
+ .replace('ddd', ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][date.getDay()])
111
+ .replace('dddd', [
112
+ 'Sunday',
113
+ 'Monday',
114
+ 'Tuesday',
115
+ 'Wednesday',
116
+ 'Thursday',
117
+ 'Friday',
118
+ 'Saturday',
119
+ ][date.getDay()]);
120
+ }
121
+ /** 获取日期的详细信息 */
122
+ function getDateInfo(date, timezone) {
123
+ const tz = timezone || 'UTC';
124
+ const iso = toTimezone(date, tz);
125
+ const dayOfWeek = date.getUTCDay();
126
+ const startOfYear = new Date(Date.UTC(date.getUTCFullYear(), 0, 1));
127
+ const dayOfYear = Math.floor((date.getTime() - startOfYear.getTime()) / 86400000) + 1;
128
+ const weekNumber = Math.ceil(dayOfYear / 7);
129
+ const quarter = Math.ceil((date.getUTCMonth() + 1) / 3);
130
+ const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;
131
+ return {
132
+ iso,
133
+ timezone: tz,
134
+ timestamp: {
135
+ seconds: Math.floor(date.getTime() / 1000),
136
+ milliseconds: date.getTime(),
137
+ },
138
+ components: {
139
+ year: date.getUTCFullYear(),
140
+ month: date.getUTCMonth() + 1,
141
+ day: date.getUTCDate(),
142
+ hour: date.getUTCHours(),
143
+ minute: date.getUTCMinutes(),
144
+ second: date.getUTCSeconds(),
145
+ dayOfWeek,
146
+ dayOfWeekName: [
147
+ 'Sunday',
148
+ 'Monday',
149
+ 'Tuesday',
150
+ 'Wednesday',
151
+ 'Thursday',
152
+ 'Friday',
153
+ 'Saturday',
154
+ ][dayOfWeek],
155
+ dayOfYear,
156
+ weekNumber,
157
+ quarter,
158
+ isWeekend,
159
+ },
160
+ formatted: {
161
+ 'YYYY-MM-DD': formatDate(date, 'YYYY-MM-DD'),
162
+ 'YYYY-MM-DD HH:mm:ss': formatDate(date, 'YYYY-MM-DD HH:mm:ss'),
163
+ 'MM/DD/YYYY': formatDate(date, 'MM/DD/YYYY'),
164
+ chinese: `${date.getUTCFullYear()}年${date.getUTCMonth() + 1}月${date.getUTCDate()}日`,
165
+ },
166
+ };
167
+ }
168
+ // ===================== 工具定义 =====================
169
+ /** 日期时间格式化工具 */
170
+ exports.datetimeFormatTool = {
171
+ id: 'datetime_format',
172
+ name: '日期时间格式化',
173
+ description: '获取当前时间或解析任意日期时间。【获取当前时间请传入 input="now"】。支持多种输入:ISO 8601 字符串、时间戳(秒/毫秒)、"now"/"today"/"yesterday"/"tomorrow"/"3天前"/"5 days ago" 等自然语言。输出包含完整日期组件(年月日时分秒)、星期、季度、周数、是否周末、时区转换等。支持自定义格式化模板(如 YYYY-MM-DD HH:mm:ss)。',
174
+ category: 'utility',
175
+ parameters: {
176
+ type: 'object',
177
+ properties: {
178
+ input: {
179
+ type: 'string',
180
+ description: '日期时间输入。支持 ISO 字符串、时间戳(秒/毫秒)、"now"/"today"/"yesterday"/"tomorrow"/"3天前"/"5 days ago" 等',
181
+ },
182
+ timezone: {
183
+ type: 'string',
184
+ description: '目标时区,如 Asia/Shanghai、America/New_York、UTC。默认 UTC',
185
+ default: 'UTC',
186
+ },
187
+ format: {
188
+ type: 'string',
189
+ description: '自定义格式化模板(可选),如 "YYYY-MM-DD HH:mm:ss"、"YYYY年MM月DD日"。不填则返回完整信息。',
190
+ },
191
+ },
192
+ required: ['input'],
193
+ },
194
+ async execute(input) {
195
+ const date = parseDate(input.input);
196
+ if (!date) {
197
+ return { error: `无法解析日期输入: ${input.input}` };
198
+ }
199
+ const tz = input.timezone || 'UTC';
200
+ if (input.format) {
201
+ // 自定义格式化模式
202
+ const utcMs = date.getTime() + date.getTimezoneOffset() * 60000;
203
+ const offsetHours = TIMEZONE_OFFSETS[tz] || 0;
204
+ const tzDate = new Date(utcMs + offsetHours * 3600000);
205
+ return {
206
+ input: input.input,
207
+ timezone: tz,
208
+ formatted: formatDate(tzDate, input.format),
209
+ template: input.format,
210
+ };
211
+ }
212
+ return {
213
+ input: input.input,
214
+ ...getDateInfo(date, tz),
215
+ };
216
+ },
217
+ };
218
+ /** 日期时间计算工具 */
219
+ exports.datetimeCalcTool = {
220
+ id: 'datetime_calc',
221
+ name: '日期时间计算',
222
+ description: '执行日期时间计算。支持:add(日期加减)、diff(两个日期的差值)、range(生成日期范围列表)、compare(比较两个日期)、weekday(查找最近的工作日)。单位支持 year/month/day/hour/minute/second。',
223
+ category: 'utility',
224
+ parameters: {
225
+ type: 'object',
226
+ properties: {
227
+ operation: {
228
+ type: 'string',
229
+ description: '计算操作类型',
230
+ enum: ['add', 'diff', 'range', 'compare', 'weekday'],
231
+ },
232
+ date: {
233
+ type: 'string',
234
+ description: '基准日期(同 datetime_format 的 input 格式)',
235
+ },
236
+ date2: {
237
+ type: 'string',
238
+ description: '第二个日期(diff/compare 操作使用)',
239
+ },
240
+ amount: {
241
+ type: 'integer',
242
+ description: '加减数量(add 操作使用,负数表示减)',
243
+ },
244
+ unit: {
245
+ type: 'string',
246
+ description: '时间单位',
247
+ enum: ['year', 'month', 'day', 'hour', 'minute', 'second'],
248
+ default: 'day',
249
+ },
250
+ days: {
251
+ type: 'integer',
252
+ description: '范围天数(range 操作使用,默认 7,最大 365)',
253
+ },
254
+ },
255
+ required: ['operation', 'date'],
256
+ },
257
+ async execute(input) {
258
+ const baseDate = parseDate(input.date);
259
+ if (!baseDate) {
260
+ return { error: `无法解析基准日期: ${input.date}` };
261
+ }
262
+ switch (input.operation) {
263
+ case 'add': {
264
+ const amount = Number(input.amount) || 0;
265
+ const unit = input.unit || 'day';
266
+ const result = new Date(baseDate.getTime());
267
+ switch (unit) {
268
+ case 'year':
269
+ result.setUTCFullYear(result.getUTCFullYear() + amount);
270
+ break;
271
+ case 'month':
272
+ result.setUTCMonth(result.getUTCMonth() + amount);
273
+ break;
274
+ case 'day':
275
+ result.setUTCDate(result.getUTCDate() + amount);
276
+ break;
277
+ case 'hour':
278
+ result.setUTCHours(result.getUTCHours() + amount);
279
+ break;
280
+ case 'minute':
281
+ result.setUTCMinutes(result.getUTCMinutes() + amount);
282
+ break;
283
+ case 'second':
284
+ result.setUTCSeconds(result.getUTCSeconds() + amount);
285
+ break;
286
+ }
287
+ return {
288
+ operation: 'add',
289
+ base: baseDate.toISOString(),
290
+ amount,
291
+ unit,
292
+ result: result.toISOString(),
293
+ formatted: formatDate(result, 'YYYY-MM-DD HH:mm:ss'),
294
+ };
295
+ }
296
+ case 'diff': {
297
+ const date2 = parseDate(input.date2 || '');
298
+ if (!date2)
299
+ return { error: `无法解析第二个日期: ${input.date2}` };
300
+ const diffMs = date2.getTime() - baseDate.getTime();
301
+ return {
302
+ operation: 'diff',
303
+ date1: baseDate.toISOString(),
304
+ date2: date2.toISOString(),
305
+ positive: diffMs >= 0,
306
+ difference: {
307
+ milliseconds: diffMs,
308
+ seconds: Math.round(diffMs / 1000),
309
+ minutes: Math.round(diffMs / 60000),
310
+ hours: Math.round((diffMs / 3600000) * 10) / 10,
311
+ days: Math.round((diffMs / 86400000) * 10) / 10,
312
+ weeks: Math.round((diffMs / 604800000) * 10) / 10,
313
+ months: Math.round((diffMs / 2592000000) * 10) / 10,
314
+ },
315
+ };
316
+ }
317
+ case 'range': {
318
+ const days = Math.min(Math.max(Number(input.days) || 7, 1), 365);
319
+ const range = [];
320
+ for (let i = 0; i < days; i++) {
321
+ const d = new Date(baseDate.getTime() + i * 86400000);
322
+ range.push(formatDate(d, 'YYYY-MM-DD'));
323
+ }
324
+ return {
325
+ operation: 'range',
326
+ start: range[0],
327
+ end: range[range.length - 1],
328
+ totalDays: range.length,
329
+ dates: range,
330
+ };
331
+ }
332
+ case 'compare': {
333
+ const date2 = parseDate(input.date2 || '');
334
+ if (!date2)
335
+ return { error: `无法解析第二个日期: ${input.date2}` };
336
+ const cmp = baseDate.getTime() < date2.getTime()
337
+ ? 'before'
338
+ : baseDate.getTime() > date2.getTime()
339
+ ? 'after'
340
+ : 'equal';
341
+ return {
342
+ operation: 'compare',
343
+ date1: baseDate.toISOString(),
344
+ date2: date2.toISOString(),
345
+ result: cmp,
346
+ description: `date1 is ${cmp} date2`,
347
+ };
348
+ }
349
+ case 'weekday': {
350
+ // 查找从基准日期起最近的工作日(跳过周末)
351
+ const result = new Date(baseDate.getTime());
352
+ const dow = result.getUTCDay();
353
+ if (dow === 0)
354
+ result.setUTCDate(result.getUTCDate() + 1);
355
+ // Sunday -> Monday
356
+ else if (dow === 6)
357
+ result.setUTCDate(result.getUTCDate() + 2); // Saturday -> Monday
358
+ return {
359
+ operation: 'weekday',
360
+ original: baseDate.toISOString(),
361
+ nearestWeekday: result.toISOString(),
362
+ formatted: formatDate(result, 'YYYY-MM-DD'),
363
+ dayOfWeek: [
364
+ 'Sunday',
365
+ 'Monday',
366
+ 'Tuesday',
367
+ 'Wednesday',
368
+ 'Thursday',
369
+ 'Friday',
370
+ 'Saturday',
371
+ ][result.getUTCDay()],
372
+ adjusted: result.getTime() !== baseDate.getTime(),
373
+ };
374
+ }
375
+ default:
376
+ return { error: `不支持的操作: ${input.operation}` };
377
+ }
378
+ },
379
+ };
@@ -0,0 +1,43 @@
1
+ import type { ToolDefinition } from '../types';
2
+ /** 工具 execute 入参(扁平结构,对应 JSON Schema 参数) */
3
+ interface HttpRequestToolInput {
4
+ url: string;
5
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';
6
+ headers?: string;
7
+ queryParams?: string;
8
+ body?: string;
9
+ bodyType?: 'json' | 'form' | 'raw';
10
+ authType?: 'bearer' | 'basic' | 'apikey' | 'none';
11
+ authToken?: string;
12
+ authHeaderName?: string;
13
+ timeout?: number;
14
+ ignoreTlsErrors?: boolean;
15
+ maxResponseLength?: number;
16
+ }
17
+ interface HttpRequestOutput {
18
+ url: string;
19
+ method: string;
20
+ statusCode: number;
21
+ statusText: string;
22
+ headers: Record<string, string>;
23
+ data: any;
24
+ truncated: boolean;
25
+ duration: number;
26
+ error?: string;
27
+ }
28
+ /** HTTP 请求工具 */
29
+ export declare const httpRequestTool: ToolDefinition<HttpRequestToolInput, HttpRequestOutput>;
30
+ /** URL 解析工具 */
31
+ export declare const parseUrlTool: ToolDefinition<{
32
+ url: string;
33
+ }, {
34
+ protocol: string;
35
+ hostname: string;
36
+ port: string;
37
+ pathname: string;
38
+ search: string;
39
+ hash: string;
40
+ queryParams: Record<string, string>;
41
+ origin: string;
42
+ }>;
43
+ export {};