@f2a/openclaw-f2a 0.2.20

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 (71) hide show
  1. package/README.md +510 -0
  2. package/dist/agent-manager.d.ts +78 -0
  3. package/dist/agent-manager.d.ts.map +1 -0
  4. package/dist/agent-manager.js +206 -0
  5. package/dist/agent-manager.js.map +1 -0
  6. package/dist/announcement-queue.d.ts +152 -0
  7. package/dist/announcement-queue.d.ts.map +1 -0
  8. package/dist/announcement-queue.js +307 -0
  9. package/dist/announcement-queue.js.map +1 -0
  10. package/dist/capability-detector.d.ts +21 -0
  11. package/dist/capability-detector.d.ts.map +1 -0
  12. package/dist/capability-detector.js +178 -0
  13. package/dist/capability-detector.js.map +1 -0
  14. package/dist/claim-handlers.d.ts +75 -0
  15. package/dist/claim-handlers.d.ts.map +1 -0
  16. package/dist/claim-handlers.js +368 -0
  17. package/dist/claim-handlers.js.map +1 -0
  18. package/dist/connector.d.ts +174 -0
  19. package/dist/connector.d.ts.map +1 -0
  20. package/dist/connector.js +1284 -0
  21. package/dist/connector.js.map +1 -0
  22. package/dist/index.d.ts +16 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +45 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/logger.d.ts +28 -0
  27. package/dist/logger.d.ts.map +1 -0
  28. package/dist/logger.js +44 -0
  29. package/dist/logger.js.map +1 -0
  30. package/dist/network-client.d.ts +73 -0
  31. package/dist/network-client.d.ts.map +1 -0
  32. package/dist/network-client.js +202 -0
  33. package/dist/network-client.js.map +1 -0
  34. package/dist/node-manager.d.ts +79 -0
  35. package/dist/node-manager.d.ts.map +1 -0
  36. package/dist/node-manager.js +374 -0
  37. package/dist/node-manager.js.map +1 -0
  38. package/dist/plugin.d.ts +22 -0
  39. package/dist/plugin.d.ts.map +1 -0
  40. package/dist/plugin.js +148 -0
  41. package/dist/plugin.js.map +1 -0
  42. package/dist/reputation.d.ts +156 -0
  43. package/dist/reputation.d.ts.map +1 -0
  44. package/dist/reputation.js +432 -0
  45. package/dist/reputation.js.map +1 -0
  46. package/dist/task-guard.d.ts +159 -0
  47. package/dist/task-guard.d.ts.map +1 -0
  48. package/dist/task-guard.js +763 -0
  49. package/dist/task-guard.js.map +1 -0
  50. package/dist/task-queue.d.ts +130 -0
  51. package/dist/task-queue.d.ts.map +1 -0
  52. package/dist/task-queue.js +592 -0
  53. package/dist/task-queue.js.map +1 -0
  54. package/dist/tool-handlers.d.ts +158 -0
  55. package/dist/tool-handlers.d.ts.map +1 -0
  56. package/dist/tool-handlers.js +727 -0
  57. package/dist/tool-handlers.js.map +1 -0
  58. package/dist/types.d.ts +417 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +29 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/webhook-pusher.d.ts +71 -0
  63. package/dist/webhook-pusher.d.ts.map +1 -0
  64. package/dist/webhook-pusher.js +175 -0
  65. package/dist/webhook-pusher.js.map +1 -0
  66. package/dist/webhook-server.d.ts +70 -0
  67. package/dist/webhook-server.d.ts.map +1 -0
  68. package/dist/webhook-server.js +191 -0
  69. package/dist/webhook-server.js.map +1 -0
  70. package/openclaw.plugin.json +107 -0
  71. package/package.json +53 -0
@@ -0,0 +1,374 @@
1
+ "use strict";
2
+ /**
3
+ * F2A Node Manager
4
+ * 管理 F2A Network 服务的生命周期
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.F2ANodeManager = void 0;
8
+ const child_process_1 = require("child_process");
9
+ const fs_1 = require("fs");
10
+ const path_1 = require("path");
11
+ const util_1 = require("util");
12
+ const network_1 = require("@f2a/network");
13
+ const sleep = (0, util_1.promisify)(setTimeout);
14
+ // PID 文件路径
15
+ const PID_FILE_NAME = 'f2a-node.pid';
16
+ /** 默认重启配置 */
17
+ const DEFAULT_RESTART_CONFIG = {
18
+ maxRestarts: 3, // 最多连续重启 3 次
19
+ resetWindowMs: 60000, // 1 分钟内重置计数
20
+ cooldownBaseMs: 5000, // 冷却期基础 5 秒
21
+ cooldownMaxMs: 60000 // 冷却期最大 60 秒
22
+ };
23
+ class F2ANodeManager {
24
+ process = null;
25
+ config;
26
+ healthCheckInterval;
27
+ pidFilePath;
28
+ logger;
29
+ // P1 修复:健康检查重启限制
30
+ restartConfig;
31
+ consecutiveRestarts = 0;
32
+ lastRestartTime = 0;
33
+ isRestarting = false;
34
+ constructor(config, logger) {
35
+ this.config = {
36
+ nodePath: config.nodePath || './F2A',
37
+ controlPort: config.controlPort || 9001,
38
+ controlToken: config.controlToken || this.generateToken(),
39
+ p2pPort: config.p2pPort || 9000,
40
+ enableMDNS: config.enableMDNS ?? true,
41
+ bootstrapPeers: config.bootstrapPeers || []
42
+ };
43
+ this.pidFilePath = (0, path_1.join)(this.config.nodePath, PID_FILE_NAME);
44
+ this.restartConfig = { ...DEFAULT_RESTART_CONFIG };
45
+ this.logger = logger || console;
46
+ // 启动时清理孤儿进程
47
+ this.cleanupOrphanProcesses();
48
+ }
49
+ /**
50
+ * 清理孤儿进程
51
+ * 检查 PID 文件中记录的进程是否仍在运行,如果是则尝试清理
52
+ */
53
+ cleanupOrphanProcesses() {
54
+ if (!(0, fs_1.existsSync)(this.pidFilePath)) {
55
+ return;
56
+ }
57
+ try {
58
+ const pidStr = (0, fs_1.readFileSync)(this.pidFilePath, 'utf-8').trim();
59
+ const pid = parseInt(pidStr, 10);
60
+ if (isNaN(pid)) {
61
+ // PID 文件无效,删除
62
+ (0, fs_1.unlinkSync)(this.pidFilePath);
63
+ return;
64
+ }
65
+ // 检查进程是否存在
66
+ try {
67
+ process.kill(pid, 0); // 不实际发送信号,只检查进程是否存在
68
+ // 进程存在,尝试终止
69
+ this.logger.info('[F2A:Node] 发现孤儿进程,尝试终止: pid=%d', pid);
70
+ try {
71
+ process.kill(pid, 'SIGTERM');
72
+ // 等待进程终止
73
+ setTimeout(() => {
74
+ try {
75
+ process.kill(pid, 0); // 检查是否还在运行
76
+ process.kill(pid, 'SIGKILL'); // 强制终止
77
+ }
78
+ catch {
79
+ // 进程已终止
80
+ }
81
+ }, 3000);
82
+ }
83
+ catch (killError) {
84
+ // 无法终止,可能是权限问题
85
+ this.logger.warn('[F2A:Node] 无法终止孤儿进程: pid=%d, error=%s', pid, (0, network_1.getErrorMessage)(killError));
86
+ }
87
+ }
88
+ catch {
89
+ // 进程不存在,只删除 PID 文件
90
+ }
91
+ // 删除 PID 文件
92
+ (0, fs_1.unlinkSync)(this.pidFilePath);
93
+ this.logger.info('[F2A:Node] 孤儿进程清理完成');
94
+ }
95
+ catch (error) {
96
+ this.logger.warn('[F2A:Node] 清理孤儿进程失败: error=%s', (0, network_1.getErrorMessage)(error));
97
+ }
98
+ }
99
+ /**
100
+ * 保存 PID 到文件
101
+ */
102
+ savePid(pid) {
103
+ try {
104
+ (0, fs_1.writeFileSync)(this.pidFilePath, String(pid), { mode: 0o644 });
105
+ this.logger.info('[F2A:Node] PID 文件已保存: path=%s', this.pidFilePath);
106
+ }
107
+ catch (error) {
108
+ this.logger.warn('[F2A:Node] 保存 PID 文件失败: error=%s', (0, network_1.getErrorMessage)(error));
109
+ }
110
+ }
111
+ /**
112
+ * 删除 PID 文件
113
+ */
114
+ removePidFile() {
115
+ try {
116
+ if ((0, fs_1.existsSync)(this.pidFilePath)) {
117
+ (0, fs_1.unlinkSync)(this.pidFilePath);
118
+ }
119
+ }
120
+ catch (error) {
121
+ this.logger.warn('[F2A:Node] 删除 PID 文件失败: error=%s', (0, network_1.getErrorMessage)(error));
122
+ }
123
+ }
124
+ /**
125
+ * 确保 F2A Node 在运行
126
+ */
127
+ async ensureRunning() {
128
+ if (await this.isRunning()) {
129
+ this.logger.info('[F2A:Node] Node 已在运行');
130
+ return { success: true, data: undefined };
131
+ }
132
+ return this.start();
133
+ }
134
+ /**
135
+ * 启动 F2A Node
136
+ */
137
+ async start() {
138
+ const daemonPath = (0, path_1.join)(this.config.nodePath, 'dist/daemon/main.js');
139
+ if (!(0, fs_1.existsSync)(daemonPath)) {
140
+ return {
141
+ success: false,
142
+ error: { code: 'INTERNAL_ERROR', message: `F2A Node 未找到: ${daemonPath}\n请先运行: cd ${this.config.nodePath} && npm install && npm run build` }
143
+ };
144
+ }
145
+ this.logger.info('[F2A:Node] 启动 Node...');
146
+ this.logger.info('[F2A:Node] Control Port: %d', this.config.controlPort);
147
+ this.logger.info('[F2A:Node] P2P Port: %d', this.config.p2pPort);
148
+ try {
149
+ this.process = (0, child_process_1.spawn)('node', [daemonPath], {
150
+ cwd: this.config.nodePath,
151
+ env: {
152
+ ...process.env,
153
+ F2A_CONTROL_PORT: String(this.config.controlPort),
154
+ F2A_CONTROL_TOKEN: this.config.controlToken,
155
+ F2A_P2P_PORT: String(this.config.p2pPort),
156
+ F2A_ENABLE_MDNS: String(this.config.enableMDNS),
157
+ BOOTSTRAP_PEERS: this.config.bootstrapPeers?.join(',') || ''
158
+ },
159
+ detached: true,
160
+ stdio: ['ignore', 'pipe', 'pipe']
161
+ });
162
+ // 记录子进程 PID
163
+ const pid = this.process.pid;
164
+ if (pid) {
165
+ this.savePid(pid);
166
+ }
167
+ // 监听进程退出事件
168
+ this.process.on('exit', (code, signal) => {
169
+ this.logger.info('[F2A:Node] Node 进程退出: code=%s, signal=%s', code, signal);
170
+ this.removePidFile();
171
+ this.process = null;
172
+ });
173
+ this.process.on('error', (err) => {
174
+ this.logger.error('[F2A:Node] Node 进程错误: error=%s', (0, network_1.getErrorMessage)(err));
175
+ this.removePidFile();
176
+ });
177
+ this.process.unref();
178
+ // 记录日志
179
+ this.process.stdout?.on('data', (data) => {
180
+ this.logger.info('[F2A:Node] Node stdout: %s', data.toString().trim());
181
+ });
182
+ this.process.stderr?.on('data', (data) => {
183
+ this.logger.error('[F2A:Node] Node stderr: %s', data.toString().trim());
184
+ });
185
+ // 等待启动完成
186
+ await this.waitForReady(30000);
187
+ // 启动健康检查
188
+ this.startHealthCheck();
189
+ // P1 修复:成功启动后重置重启计数器
190
+ this.consecutiveRestarts = 0;
191
+ this.logger.info('[F2A:Node] Node 启动成功');
192
+ return { success: true, data: undefined };
193
+ }
194
+ catch (error) {
195
+ const errorMsg = error instanceof Error ? error.message : String(error);
196
+ this.removePidFile();
197
+ return { success: false, error: { code: 'INTERNAL_ERROR', message: errorMsg } };
198
+ }
199
+ }
200
+ /**
201
+ * 停止 F2A Node
202
+ */
203
+ async stop() {
204
+ if (this.healthCheckInterval) {
205
+ clearInterval(this.healthCheckInterval);
206
+ }
207
+ if (this.process) {
208
+ this.logger.info('[F2A:Node] 停止 Node...');
209
+ // 尝试优雅关闭
210
+ this.process.kill('SIGTERM');
211
+ // 等待 5 秒
212
+ await sleep(5000);
213
+ // 如果还在运行,强制关闭
214
+ if (this.process.exitCode === null) {
215
+ this.process.kill('SIGKILL');
216
+ }
217
+ this.process = null;
218
+ }
219
+ else {
220
+ // 没有当前进程引用,但可能存在孤儿进程
221
+ // 尝试从 PID 文件读取并终止
222
+ if ((0, fs_1.existsSync)(this.pidFilePath)) {
223
+ try {
224
+ const pidStr = (0, fs_1.readFileSync)(this.pidFilePath, 'utf-8').trim();
225
+ const pid = parseInt(pidStr, 10);
226
+ if (!isNaN(pid)) {
227
+ this.logger.info('[F2A:Node] 尝试终止残留进程: pid=%d', pid);
228
+ try {
229
+ process.kill(pid, 'SIGTERM');
230
+ await sleep(3000);
231
+ try {
232
+ process.kill(pid, 0);
233
+ process.kill(pid, 'SIGKILL');
234
+ }
235
+ catch {
236
+ // 进程已终止
237
+ }
238
+ }
239
+ catch {
240
+ // 进程不存在或无权限
241
+ }
242
+ }
243
+ }
244
+ catch (error) {
245
+ this.logger.warn('[F2A:Node] 清理残留进程失败: error=%s', error);
246
+ }
247
+ }
248
+ }
249
+ // 清理 PID 文件
250
+ this.removePidFile();
251
+ }
252
+ /**
253
+ * 检查 Node 是否运行中
254
+ */
255
+ async isRunning() {
256
+ try {
257
+ // 添加超时,避免阻塞 Gateway 启动
258
+ const controller = new AbortController();
259
+ const timeoutId = setTimeout(() => controller.abort(), 2000); // 2 秒超时
260
+ const response = await fetch(`http://localhost:${this.config.controlPort}/health`, {
261
+ headers: {
262
+ 'Authorization': `Bearer ${this.config.controlToken}`
263
+ },
264
+ signal: controller.signal
265
+ });
266
+ clearTimeout(timeoutId);
267
+ return response.ok;
268
+ }
269
+ catch {
270
+ return false;
271
+ }
272
+ }
273
+ /**
274
+ * 获取 Node 状态
275
+ */
276
+ async getStatus() {
277
+ try {
278
+ const response = await fetch(`http://localhost:${this.config.controlPort}/status`, {
279
+ headers: {
280
+ 'Authorization': `Bearer ${this.config.controlToken}`
281
+ }
282
+ });
283
+ if (!response.ok) {
284
+ return { success: false, error: { code: 'INTERNAL_ERROR', message: 'Node 未响应' } };
285
+ }
286
+ const data = await response.json();
287
+ return { success: true, data };
288
+ }
289
+ catch (error) {
290
+ const message = error instanceof Error ? error.message : String(error);
291
+ return {
292
+ success: false,
293
+ error: { code: 'INTERNAL_ERROR', message }
294
+ };
295
+ }
296
+ }
297
+ /**
298
+ * 等待 Node 就绪
299
+ */
300
+ async waitForReady(timeout) {
301
+ const start = Date.now();
302
+ while (Date.now() - start < timeout) {
303
+ if (await this.isRunning()) {
304
+ return;
305
+ }
306
+ await sleep(500);
307
+ }
308
+ throw new Error('Node 启动超时');
309
+ }
310
+ /**
311
+ * 启动健康检查
312
+ *
313
+ * P1 修复:添加重启次数限制和冷却期,防止无限重启循环
314
+ */
315
+ startHealthCheck() {
316
+ this.healthCheckInterval = setInterval(async () => {
317
+ // 如果正在重启,跳过本次检查
318
+ if (this.isRestarting) {
319
+ return;
320
+ }
321
+ const isHealthy = await this.isRunning();
322
+ if (!isHealthy && this.process) {
323
+ // 检查是否达到重启限制
324
+ const now = Date.now();
325
+ // 如果距离上次重启超过重置窗口,重置计数
326
+ if (now - this.lastRestartTime > this.restartConfig.resetWindowMs) {
327
+ this.consecutiveRestarts = 0;
328
+ }
329
+ // 检查是否达到最大重启次数
330
+ if (this.consecutiveRestarts >= this.restartConfig.maxRestarts) {
331
+ this.logger.error('[F2A:Node] Node 健康检查失败,已达到最大重启次数: maxRestarts=%d, resetWindowMs=%d', this.restartConfig.maxRestarts, Math.round(this.restartConfig.resetWindowMs / 1000));
332
+ return;
333
+ }
334
+ // 计算冷却期(指数退避)
335
+ const cooldownMs = Math.min(this.restartConfig.cooldownBaseMs * Math.pow(2, this.consecutiveRestarts), this.restartConfig.cooldownMaxMs);
336
+ this.logger.warn('[F2A:Node] Node 健康检查失败,尝试重启: attempt=%d/%d, cooldownMs=%d', this.consecutiveRestarts + 1, this.restartConfig.maxRestarts, Math.round(cooldownMs / 1000));
337
+ this.isRestarting = true;
338
+ this.consecutiveRestarts++;
339
+ this.lastRestartTime = now;
340
+ try {
341
+ await this.stop();
342
+ await sleep(cooldownMs);
343
+ await this.start();
344
+ }
345
+ catch (error) {
346
+ this.logger.error('[F2A:Node] 重启失败: error=%s', (0, network_1.getErrorMessage)(error));
347
+ }
348
+ finally {
349
+ this.isRestarting = false;
350
+ }
351
+ }
352
+ }, 30000); // 每 30 秒检查一次
353
+ // 防止定时器阻止进程退出
354
+ if (this.healthCheckInterval.unref) {
355
+ this.healthCheckInterval.unref();
356
+ }
357
+ }
358
+ /**
359
+ * 生成随机 Token
360
+ */
361
+ generateToken() {
362
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
363
+ let token = 'f2a-';
364
+ for (let i = 0; i < 32; i++) {
365
+ token += chars.charAt(Math.floor(Math.random() * chars.length));
366
+ }
367
+ return token;
368
+ }
369
+ getConfig() {
370
+ return { ...this.config };
371
+ }
372
+ }
373
+ exports.F2ANodeManager = F2ANodeManager;
374
+ //# sourceMappingURL=node-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-manager.js","sourceRoot":"","sources":["../src/node-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * F2A OpenClaw Adapter Plugin
3
+ * OpenClaw 插件标准入口
4
+ *
5
+ * 架构说明:
6
+ * - register() 只调用 initialize(),保存配置,不打开资源
7
+ * - registerService() 注册后台服务,在 Gateway 启动后异步启用 F2A
8
+ * - 使用 setImmediate() 避免阻塞 Gateway 启动
9
+ * - 所有网络资源和定时器都使用 unref(),确保 Gateway 可以正常退出
10
+ */
11
+ import type { OpenClawPluginApi } from './types.js';
12
+ /**
13
+ * OpenClaw 插件注册函数
14
+ * 这是 OpenClaw 加载插件时调用的入口
15
+ */
16
+ export default function register(api: OpenClawPluginApi): Promise<void>;
17
+ export { F2AOpenClawAdapter } from './connector.js';
18
+ export * from './types.js';
19
+ export { TaskQueue, QueuedTask, TaskQueueStats } from './task-queue.js';
20
+ export { AnnouncementQueue, AnnouncementQueueStats } from './announcement-queue.js';
21
+ export { TaskGuard, TaskGuardReport, TaskGuardRule, TaskGuardConfig, taskGuard } from './task-guard.js';
22
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD;;;GAGG;AACH,wBAA8B,QAAQ,CAAC,GAAG,EAAE,iBAAiB,iBAgH5D;AAGD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/plugin.js ADDED
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ /**
3
+ * F2A OpenClaw Adapter Plugin
4
+ * OpenClaw 插件标准入口
5
+ *
6
+ * 架构说明:
7
+ * - register() 只调用 initialize(),保存配置,不打开资源
8
+ * - registerService() 注册后台服务,在 Gateway 启动后异步启用 F2A
9
+ * - 使用 setImmediate() 避免阻塞 Gateway 启动
10
+ * - 所有网络资源和定时器都使用 unref(),确保 Gateway 可以正常退出
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
24
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
25
+ };
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.taskGuard = exports.TaskGuard = exports.AnnouncementQueue = exports.TaskQueue = exports.F2AOpenClawAdapter = void 0;
28
+ exports.default = register;
29
+ const connector_js_1 = require("./connector.js");
30
+ /**
31
+ * OpenClaw 插件注册函数
32
+ * 这是 OpenClaw 加载插件时调用的入口
33
+ */
34
+ async function register(api) {
35
+ const plugin = new connector_js_1.F2AOpenClawAdapter();
36
+ // 从 OpenClaw 配置中获取插件配置
37
+ const pluginsConfig = api.config.plugins;
38
+ const config = pluginsConfig?.entries?.['openclaw-f2a']?.config || {};
39
+ // 将 API 引用传递给插件(用于触发心跳等操作)
40
+ const fullConfig = {
41
+ ...config,
42
+ _api: api
43
+ };
44
+ // 初始化插件 - 只保存配置,不启动服务
45
+ try {
46
+ await plugin.initialize(fullConfig);
47
+ api.logger?.info('[F2A Adapter] 初始化完成(延迟模式)');
48
+ }
49
+ catch (error) {
50
+ api.logger?.error(`[F2A Adapter] 初始化失败: ${error.message}`);
51
+ // 清理已分配的资源
52
+ try {
53
+ await plugin.shutdown?.();
54
+ }
55
+ catch (shutdownError) {
56
+ api.logger?.warn(`[F2A Adapter] 清理资源时出错: ${shutdownError.message}`);
57
+ }
58
+ // 不抛出异常,让插件以降级模式加载
59
+ api.logger?.warn('[F2A Adapter] 插件将以降级模式运行,功能受限');
60
+ return;
61
+ }
62
+ // 初始化完成后注册所有工具
63
+ const tools = plugin.getTools();
64
+ for (const tool of tools) {
65
+ api.registerTool?.({
66
+ name: tool.name,
67
+ description: tool.description,
68
+ parameters: tool.parameters,
69
+ async execute(_id, params) {
70
+ // 确保适配器已启用
71
+ if (!plugin.isInitialized()) {
72
+ api.logger?.info('[F2A Adapter] 首次使用工具,启用适配器...');
73
+ try {
74
+ await plugin.enable();
75
+ }
76
+ catch (enableError) {
77
+ api.logger?.error(`[F2A Adapter] 启用失败: ${enableError.message}`);
78
+ throw new Error(`F2A Adapter 启用失败: ${enableError.message}`);
79
+ }
80
+ }
81
+ try {
82
+ const workspace = api.config.agents?.defaults?.workspace || '.';
83
+ const mockContext = {
84
+ sessionId: _id,
85
+ workspace,
86
+ toJSON: () => ({})
87
+ };
88
+ const result = await tool.handler(params, mockContext);
89
+ if (typeof result === 'string') {
90
+ return { content: [{ type: 'text', text: result }] };
91
+ }
92
+ if (result?.content) {
93
+ return { content: [{ type: 'text', text: result.content }] };
94
+ }
95
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
96
+ }
97
+ catch (error) {
98
+ api.logger?.error(`[F2A Adapter] 工具 ${tool.name} 执行失败: ${error.message}`);
99
+ throw error;
100
+ }
101
+ }
102
+ });
103
+ }
104
+ // 注册后台服务
105
+ // 使用 setImmediate 异步启动 F2A,避免阻塞 Gateway
106
+ api.registerService?.({
107
+ id: 'f2a-adapter-service',
108
+ start: () => {
109
+ api.logger?.info('[F2A Adapter] 服务已启动');
110
+ // 使用 setImmediate 在下一个事件循环中启动 F2A
111
+ // 这样不会阻塞 Gateway 的启动流程
112
+ setImmediate(async () => {
113
+ try {
114
+ // 检查是否配置了 autoStart(默认 true)
115
+ const autoStart = config.autoStart !== false;
116
+ if (autoStart) {
117
+ api.logger?.info('[F2A Adapter] 正在启用 F2A 实例(后台模式)...');
118
+ await plugin.enable();
119
+ api.logger?.info('[F2A Adapter] F2A 实例已启用');
120
+ }
121
+ }
122
+ catch (error) {
123
+ // 启动失败不影响 Gateway 运行
124
+ api.logger?.warn(`[F2A Adapter] F2A 实例启动失败: ${error.message}`);
125
+ api.logger?.warn('[F2A Adapter] P2P 功能将不可用,但 Gateway 可继续运行');
126
+ }
127
+ });
128
+ },
129
+ stop: async () => {
130
+ api.logger?.info('[F2A Adapter] 正在停止服务...');
131
+ await plugin.shutdown?.();
132
+ api.logger?.info('[F2A Adapter] 服务已停止');
133
+ }
134
+ });
135
+ api.logger?.info(`[F2A Adapter] 已注册 ${tools.length} 个工具(延迟初始化模式)`);
136
+ }
137
+ // 重新导出主要类,供外部使用
138
+ var connector_js_2 = require("./connector.js");
139
+ Object.defineProperty(exports, "F2AOpenClawAdapter", { enumerable: true, get: function () { return connector_js_2.F2AOpenClawAdapter; } });
140
+ __exportStar(require("./types.js"), exports);
141
+ var task_queue_js_1 = require("./task-queue.js");
142
+ Object.defineProperty(exports, "TaskQueue", { enumerable: true, get: function () { return task_queue_js_1.TaskQueue; } });
143
+ var announcement_queue_js_1 = require("./announcement-queue.js");
144
+ Object.defineProperty(exports, "AnnouncementQueue", { enumerable: true, get: function () { return announcement_queue_js_1.AnnouncementQueue; } });
145
+ var task_guard_js_1 = require("./task-guard.js");
146
+ Object.defineProperty(exports, "TaskGuard", { enumerable: true, get: function () { return task_guard_js_1.TaskGuard; } });
147
+ Object.defineProperty(exports, "taskGuard", { enumerable: true, get: function () { return task_guard_js_1.taskGuard; } });
148
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}