@f2a/openclaw-adapter 0.1.0 → 0.2.0

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 (61) hide show
  1. package/dist/announcement-queue.d.ts +72 -1
  2. package/dist/announcement-queue.d.ts.map +1 -1
  3. package/dist/announcement-queue.js +145 -20
  4. package/dist/announcement-queue.js.map +1 -1
  5. package/dist/claim-handlers.d.ts +75 -0
  6. package/dist/claim-handlers.d.ts.map +1 -0
  7. package/dist/claim-handlers.js +368 -0
  8. package/dist/claim-handlers.js.map +1 -0
  9. package/dist/connector.d.ts +46 -18
  10. package/dist/connector.d.ts.map +1 -1
  11. package/dist/connector.js +319 -592
  12. package/dist/connector.js.map +1 -1
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +2 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/logger.d.ts +28 -0
  18. package/dist/logger.d.ts.map +1 -0
  19. package/dist/logger.js +44 -0
  20. package/dist/logger.js.map +1 -0
  21. package/dist/network-client.d.ts +17 -1
  22. package/dist/network-client.d.ts.map +1 -1
  23. package/dist/network-client.js +119 -23
  24. package/dist/network-client.js.map +1 -1
  25. package/dist/node-manager.d.ts +20 -0
  26. package/dist/node-manager.d.ts.map +1 -1
  27. package/dist/node-manager.js +194 -18
  28. package/dist/node-manager.js.map +1 -1
  29. package/dist/plugin.d.ts +1 -1
  30. package/dist/plugin.d.ts.map +1 -1
  31. package/dist/plugin.js +4 -5
  32. package/dist/plugin.js.map +1 -1
  33. package/dist/reputation.d.ts +85 -1
  34. package/dist/reputation.d.ts.map +1 -1
  35. package/dist/reputation.js +222 -9
  36. package/dist/reputation.js.map +1 -1
  37. package/dist/task-guard.d.ts +82 -0
  38. package/dist/task-guard.d.ts.map +1 -1
  39. package/dist/task-guard.js +449 -16
  40. package/dist/task-guard.js.map +1 -1
  41. package/dist/task-queue.d.ts +55 -7
  42. package/dist/task-queue.d.ts.map +1 -1
  43. package/dist/task-queue.js +477 -12
  44. package/dist/task-queue.js.map +1 -1
  45. package/dist/tool-handlers.d.ts +158 -0
  46. package/dist/tool-handlers.d.ts.map +1 -0
  47. package/dist/tool-handlers.js +724 -0
  48. package/dist/tool-handlers.js.map +1 -0
  49. package/dist/types.d.ts +112 -15
  50. package/dist/types.d.ts.map +1 -1
  51. package/dist/types.js +23 -0
  52. package/dist/types.js.map +1 -1
  53. package/dist/webhook-pusher.d.ts +71 -0
  54. package/dist/webhook-pusher.d.ts.map +1 -0
  55. package/dist/webhook-pusher.js +174 -0
  56. package/dist/webhook-pusher.js.map +1 -0
  57. package/dist/webhook-server.d.ts +8 -1
  58. package/dist/webhook-server.d.ts.map +1 -1
  59. package/dist/webhook-server.js +65 -7
  60. package/dist/webhook-server.js.map +1 -1
  61. package/package.json +21 -8
@@ -1,19 +1,70 @@
1
1
  /**
2
2
  * F2A Announcement Queue
3
3
  * 管理任务广播和认领(Claim Pattern)
4
+ *
5
+ * 设计说明:
6
+ * - 默认导出类而非单例,便于测试和依赖注入
7
+ * - createAnnouncementQueue() 工厂函数提供默认实例
4
8
  */
5
9
  import type { TaskAnnouncement, TaskClaim } from './types.js';
10
+ import { EventEmitter } from 'eventemitter3';
11
+ /**
12
+ * 任务广播队列统计信息
13
+ *
14
+ * 提供任务广播各状态的数量统计,用于监控队列健康状态和任务处理进度。
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const stats: AnnouncementQueueStats = {
19
+ * open: 5, // 5 个开放认领的任务
20
+ * claimed: 3, // 3 个已被认领
21
+ * delegated: 12, // 12 个已委托执行
22
+ * expired: 2, // 2 个已过期
23
+ * total: 22 // 总计 22 个广播
24
+ * };
25
+ *
26
+ * // 监控队列健康状态
27
+ * if (stats.open > 10) {
28
+ * console.warn('待认领任务过多,考虑通知更多 Agent');
29
+ * }
30
+ * ```
31
+ */
6
32
  export interface AnnouncementQueueStats {
33
+ /** 开放认领中的任务数量 */
7
34
  open: number;
35
+ /** 已被认领的任务数量 */
8
36
  claimed: number;
37
+ /** 已委托执行的任务数量 */
9
38
  delegated: number;
39
+ /** 已过期的任务数量 */
10
40
  expired: number;
41
+ /** 任务广播总数 */
11
42
  total: number;
12
43
  }
13
- export declare class AnnouncementQueue {
44
+ export interface AnnouncementQueueOptions {
45
+ maxSize?: number;
46
+ maxAgeMs?: number;
47
+ }
48
+ /** 过期事件载荷 */
49
+ export interface AnnouncementExpiredEvent {
50
+ announcementId: string;
51
+ taskType: string;
52
+ from: string;
53
+ timestamp: number;
54
+ reason: 'timeout' | 'manual';
55
+ }
56
+ /** 事件类型定义 */
57
+ export interface AnnouncementQueueEvents {
58
+ 'announcement:expired': (event: AnnouncementExpiredEvent) => void;
59
+ 'announcement:created': (announcement: TaskAnnouncement) => void;
60
+ 'announcement:claimed': (announcement: TaskAnnouncement, claim: TaskClaim) => void;
61
+ }
62
+ export declare class AnnouncementQueue extends EventEmitter<AnnouncementQueueEvents> {
14
63
  private announcements;
15
64
  private maxSize;
16
65
  private maxAgeMs;
66
+ /** 正在处理的广播 ID 集合,用于防止并发操作 */
67
+ private processingLocks;
17
68
  constructor(options?: {
18
69
  maxSize?: number;
19
70
  maxAgeMs?: number;
@@ -36,6 +87,9 @@ export declare class AnnouncementQueue {
36
87
  submitClaim(announcementId: string, claim: Omit<TaskClaim, 'claimId' | 'timestamp' | 'status' | 'announcementId'>): TaskClaim | null;
37
88
  /**
38
89
  * 接受认领
90
+ * 使用锁机制防止竞态条件
91
+ *
92
+ * P1 修复:确保锁在任何情况下都能被释放,包括异常情况
39
93
  */
40
94
  acceptClaim(announcementId: string, claimId: string): TaskClaim | null;
41
95
  /**
@@ -66,6 +120,23 @@ export declare class AnnouncementQueue {
66
120
  * 清空
67
121
  */
68
122
  clear(): void;
123
+ /**
124
+ * 强制清除孤立锁
125
+ * P1 修复:用于处理异常导致的锁未释放情况
126
+ *
127
+ * @param maxLockAgeMs 锁的最大存活时间(毫秒),默认 30 秒
128
+ * @returns 清除的锁数量
129
+ */
130
+ forceClearOrphanLocks(maxLockAgeMs?: number): number;
131
+ /**
132
+ * 检查是否有孤立锁
133
+ * 用于监控和调试
134
+ */
135
+ hasOrphanLocks(): boolean;
69
136
  }
137
+ export declare function createAnnouncementQueue(options?: {
138
+ maxSize?: number;
139
+ maxAgeMs?: number;
140
+ }): AnnouncementQueue;
70
141
  export declare const announcementQueue: AnnouncementQueue;
71
142
  //# sourceMappingURL=announcement-queue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"announcement-queue.d.ts","sourceRoot":"","sources":["../src/announcement-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAK7D;;OAEG;IACH,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,gBAAgB;IAsBpH;;OAEG;IACH,OAAO,IAAI,gBAAgB,EAAE;IAM7B;;OAEG;IACH,GAAG,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIzD;;OAEG;IACH,WAAW,CACT,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,gBAAgB,CAAC,GAC5E,SAAS,GAAG,IAAI;IAsBnB;;OAEG;IACH,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAuBtE;;OAEG;IACH,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAWtE;;OAEG;IACH,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAQ9C;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE;IAW5C;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAMtD;;OAEG;IACH,QAAQ,IAAI,sBAAsB;IAWlC;;OAEG;IACH,OAAO,IAAI,IAAI;IAgBf;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAGD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
1
+ {"version":3,"file":"announcement-queue.d.ts","sourceRoot":"","sources":["../src/announcement-queue.ts"],"names":[],"mappings":"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"}
@@ -2,14 +2,25 @@
2
2
  /**
3
3
  * F2A Announcement Queue
4
4
  * 管理任务广播和认领(Claim Pattern)
5
+ *
6
+ * 设计说明:
7
+ * - 默认导出类而非单例,便于测试和依赖注入
8
+ * - createAnnouncementQueue() 工厂函数提供默认实例
5
9
  */
6
10
  Object.defineProperty(exports, "__esModule", { value: true });
7
11
  exports.announcementQueue = exports.AnnouncementQueue = void 0;
8
- class AnnouncementQueue {
12
+ exports.createAnnouncementQueue = createAnnouncementQueue;
13
+ const crypto_1 = require("crypto");
14
+ const logger_js_1 = require("./logger.js");
15
+ const eventemitter3_1 = require("eventemitter3");
16
+ class AnnouncementQueue extends eventemitter3_1.EventEmitter {
9
17
  announcements = new Map();
10
18
  maxSize;
11
19
  maxAgeMs;
20
+ /** 正在处理的广播 ID 集合,用于防止并发操作 */
21
+ processingLocks = new Set();
12
22
  constructor(options) {
23
+ super();
13
24
  this.maxSize = options?.maxSize || 100;
14
25
  this.maxAgeMs = options?.maxAgeMs || 30 * 60 * 1000; // 30分钟
15
26
  }
@@ -21,9 +32,11 @@ class AnnouncementQueue {
21
32
  this.cleanup();
22
33
  // 检查容量
23
34
  if (this.announcements.size >= this.maxSize) {
35
+ logger_js_1.queueLogger.error(' create: queue is full, size=%d, maxSize=%d', this.announcements.size, this.maxSize);
24
36
  throw new Error('Announcement queue is full');
25
37
  }
26
- const id = `ann-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
38
+ // 使用 crypto.randomUUID() 生成唯一 ID,避免碰撞
39
+ const id = `ann-${(0, crypto_1.randomUUID)()}`;
27
40
  const created = {
28
41
  ...announcement,
29
42
  announcementId: id,
@@ -32,12 +45,17 @@ class AnnouncementQueue {
32
45
  claims: []
33
46
  };
34
47
  this.announcements.set(id, created);
48
+ logger_js_1.queueLogger.info(' create: announcementId=%s, from=%s, taskType=%s', id, announcement.from, announcement.taskType);
49
+ // 发出创建事件
50
+ this.emit('announcement:created', created);
35
51
  return created;
36
52
  }
37
53
  /**
38
54
  * 获取所有开放的广播
39
55
  */
40
56
  getOpen() {
57
+ // 在获取开放广播前先清理过期数据,避免返回过期数据
58
+ this.cleanup();
41
59
  return Array.from(this.announcements.values())
42
60
  .filter(a => a.status === 'open')
43
61
  .sort((a, b) => a.timestamp - b.timestamp);
@@ -53,11 +71,23 @@ class AnnouncementQueue {
53
71
  */
54
72
  submitClaim(announcementId, claim) {
55
73
  const announcement = this.announcements.get(announcementId);
56
- if (!announcement)
74
+ if (!announcement) {
75
+ logger_js_1.queueLogger.warn(' submitClaim: announcement not found, id=%s, claimant=%s', announcementId, claim.claimant);
57
76
  return null;
58
- if (announcement.status !== 'open')
77
+ }
78
+ if (announcement.status !== 'open') {
79
+ logger_js_1.queueLogger.warn(' submitClaim: announcement not open, id=%s, status=%s, claimant=%s', announcementId, announcement.status, claim.claimant);
59
80
  return null;
60
- const claimId = `claim-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
81
+ }
82
+ // 检查该 claimant 是否已经提交过认领(防止重复认领)
83
+ const existingClaim = announcement.claims?.find(c => c.claimant === claim.claimant);
84
+ if (existingClaim) {
85
+ logger_js_1.queueLogger.info(' submitClaim: duplicate claim ignored, id=%s, claimant=%s, existingClaimId=%s', announcementId, claim.claimant, existingClaim.claimId);
86
+ // 返回已存在的认领,而不是创建新的
87
+ return existingClaim;
88
+ }
89
+ // 使用 crypto.randomUUID() 生成唯一 ID
90
+ const claimId = `claim-${(0, crypto_1.randomUUID)()}`;
61
91
  const created = {
62
92
  ...claim,
63
93
  claimId,
@@ -69,41 +99,89 @@ class AnnouncementQueue {
69
99
  announcement.claims = [];
70
100
  }
71
101
  announcement.claims.push(created);
102
+ logger_js_1.queueLogger.info(' submitClaim: claimId=%s, announcementId=%s, claimant=%s', claimId, announcementId, claim.claimant);
72
103
  return created;
73
104
  }
74
105
  /**
75
106
  * 接受认领
107
+ * 使用锁机制防止竞态条件
108
+ *
109
+ * P1 修复:确保锁在任何情况下都能被释放,包括异常情况
76
110
  */
77
111
  acceptClaim(announcementId, claimId) {
78
112
  const announcement = this.announcements.get(announcementId);
79
- if (!announcement)
113
+ if (!announcement) {
114
+ logger_js_1.queueLogger.warn(' acceptClaim: announcement not found, id=%s, claimId=%s', announcementId, claimId);
115
+ return null;
116
+ }
117
+ // 检查是否已被锁定(正在被其他操作处理)
118
+ if (this.processingLocks.has(announcementId)) {
119
+ logger_js_1.queueLogger.warn(' acceptClaim: announcement is being processed, id=%s, claimId=%s', announcementId, claimId);
80
120
  return null;
121
+ }
122
+ // 检查广播状态
123
+ if (announcement.status !== 'open') {
124
+ logger_js_1.queueLogger.warn(' acceptClaim: announcement not open, id=%s, status=%s, claimId=%s', announcementId, announcement.status, claimId);
125
+ return null;
126
+ }
81
127
  const claim = announcement.claims?.find(c => c.claimId === claimId);
82
- if (!claim)
128
+ if (!claim) {
129
+ logger_js_1.queueLogger.warn(' acceptClaim: claim not found, announcementId=%s, claimId=%s', announcementId, claimId);
83
130
  return null;
84
- // 标记该认领为接受
85
- claim.status = 'accepted';
86
- // 拒绝其他认领
87
- announcement.claims?.forEach(c => {
88
- if (c.claimId !== claimId) {
89
- c.status = 'rejected';
131
+ }
132
+ // 获取锁
133
+ this.processingLocks.add(announcementId);
134
+ try {
135
+ // 再次检查广播状态(双重检查)
136
+ if (announcement.status !== 'open') {
137
+ logger_js_1.queueLogger.warn(' acceptClaim: race condition detected, announcement status changed, id=%s, status=%s, claimId=%s', announcementId, announcement.status, claimId);
138
+ return null;
90
139
  }
91
- });
92
- // 标记广播为已认领
93
- announcement.status = 'claimed';
94
- return claim;
140
+ // 标记该认领为接受
141
+ claim.status = 'accepted';
142
+ // 拒绝其他认领(幂等操作,已拒绝的保持不变)
143
+ const rejectedCount = announcement.claims?.filter(c => {
144
+ if (c.claimId !== claimId && c.status !== 'rejected') {
145
+ c.status = 'rejected';
146
+ return true;
147
+ }
148
+ return false;
149
+ }).length || 0;
150
+ // 标记广播为已认领
151
+ announcement.status = 'claimed';
152
+ logger_js_1.queueLogger.info(' acceptClaim: claimId=%s, announcementId=%s, claimant=%s, rejectedCount=%d', claimId, announcementId, claim.claimant, rejectedCount);
153
+ // 发出认领事件(在锁内发出,确保状态一致)
154
+ this.emit('announcement:claimed', announcement, claim);
155
+ return claim;
156
+ }
157
+ catch (error) {
158
+ // P1 修复:记录异常并返回 null,但不改变状态
159
+ logger_js_1.queueLogger.error(' acceptClaim: unexpected error, id=%s, claimId=%s, error=%s', announcementId, claimId, error);
160
+ // 注意:不恢复状态,因为操作可能已部分完成
161
+ // 但锁会在 finally 中释放
162
+ return null;
163
+ }
164
+ finally {
165
+ // 确保锁在任何情况下都能被释放
166
+ this.processingLocks.delete(announcementId);
167
+ }
95
168
  }
96
169
  /**
97
170
  * 拒绝认领
98
171
  */
99
172
  rejectClaim(announcementId, claimId) {
100
173
  const announcement = this.announcements.get(announcementId);
101
- if (!announcement)
174
+ if (!announcement) {
175
+ logger_js_1.queueLogger.warn(' rejectClaim: announcement not found, id=%s, claimId=%s', announcementId, claimId);
102
176
  return null;
177
+ }
103
178
  const claim = announcement.claims?.find(c => c.claimId === claimId);
104
- if (!claim)
179
+ if (!claim) {
180
+ logger_js_1.queueLogger.warn(' rejectClaim: claim not found, announcementId=%s, claimId=%s', announcementId, claimId);
105
181
  return null;
182
+ }
106
183
  claim.status = 'rejected';
184
+ logger_js_1.queueLogger.info(' rejectClaim: claimId=%s, announcementId=%s, claimant=%s', claimId, announcementId, claim.claimant);
107
185
  return claim;
108
186
  }
109
187
  /**
@@ -155,27 +233,74 @@ class AnnouncementQueue {
155
233
  */
156
234
  cleanup() {
157
235
  const now = Date.now();
236
+ let expiredCount = 0;
237
+ let deletedCount = 0;
158
238
  for (const [id, announcement] of this.announcements) {
159
239
  const age = now - announcement.timestamp;
160
240
  if (age > this.maxAgeMs) {
161
241
  if (announcement.status === 'open') {
162
242
  announcement.status = 'expired';
243
+ expiredCount++;
244
+ // 发出过期事件,通知外部系统
245
+ const expiredEvent = {
246
+ announcementId: announcement.announcementId,
247
+ taskType: announcement.taskType,
248
+ from: announcement.from,
249
+ timestamp: announcement.timestamp,
250
+ reason: 'timeout'
251
+ };
252
+ this.emit('announcement:expired', expiredEvent);
253
+ logger_js_1.queueLogger.info('cleanup: announcement expired, id=%s, taskType=%s, from=%s', announcement.announcementId, announcement.taskType, announcement.from);
163
254
  }
164
255
  // 删除已过期一段时间的
165
256
  if (age > this.maxAgeMs * 2) {
166
257
  this.announcements.delete(id);
258
+ deletedCount++;
167
259
  }
168
260
  }
169
261
  }
262
+ if (expiredCount > 0 || deletedCount > 0) {
263
+ logger_js_1.queueLogger.info(' cleanup: expired=%d, deleted=%d, remaining=%d', expiredCount, deletedCount, this.announcements.size);
264
+ }
170
265
  }
171
266
  /**
172
267
  * 清空
173
268
  */
174
269
  clear() {
175
270
  this.announcements.clear();
271
+ // P1 修复:同时清理孤立锁
272
+ this.processingLocks.clear();
273
+ }
274
+ /**
275
+ * 强制清除孤立锁
276
+ * P1 修复:用于处理异常导致的锁未释放情况
277
+ *
278
+ * @param maxLockAgeMs 锁的最大存活时间(毫秒),默认 30 秒
279
+ * @returns 清除的锁数量
280
+ */
281
+ forceClearOrphanLocks(maxLockAgeMs = 30000) {
282
+ // 由于当前实现没有记录锁的获取时间,我们只能清除所有锁
283
+ // 这是一个安全操作,因为锁只是为了防止并发,不会丢失数据
284
+ const count = this.processingLocks.size;
285
+ this.processingLocks.clear();
286
+ if (count > 0) {
287
+ logger_js_1.queueLogger.warn(' forceClearOrphanLocks: cleared %d orphan locks', count);
288
+ }
289
+ return count;
290
+ }
291
+ /**
292
+ * 检查是否有孤立锁
293
+ * 用于监控和调试
294
+ */
295
+ hasOrphanLocks() {
296
+ return this.processingLocks.size > 0;
176
297
  }
177
298
  }
178
299
  exports.AnnouncementQueue = AnnouncementQueue;
179
- // 导出单例
300
+ // 工厂函数:创建新的 AnnouncementQueue 实例
301
+ function createAnnouncementQueue(options) {
302
+ return new AnnouncementQueue(options);
303
+ }
304
+ // 默认实例(向后兼容,但建议使用依赖注入)
180
305
  exports.announcementQueue = new AnnouncementQueue();
181
306
  //# sourceMappingURL=announcement-queue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"announcement-queue.js","sourceRoot":"","sources":["../src/announcement-queue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"announcement-queue.js","sourceRoot":"","sources":["../src/announcement-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * F2A OpenClaw Connector - Claim Handlers
3
+ * 认领模式处理器模块 - 处理任务广播和认领相关工具
4
+ */
5
+ import type { SessionContext, ToolResult } from './types.js';
6
+ import type { F2AOpenClawAdapter } from './connector.js';
7
+ /**
8
+ * 认领模式处理器参数类型
9
+ */
10
+ export interface ClaimHandlerParams {
11
+ announce: {
12
+ task_type: string;
13
+ description: string;
14
+ required_capabilities?: string[];
15
+ estimated_complexity?: number;
16
+ reward?: number;
17
+ timeout?: number;
18
+ };
19
+ listAnnouncements: {
20
+ capability?: string;
21
+ limit?: number;
22
+ };
23
+ claim: {
24
+ announcement_id: string;
25
+ estimated_time?: number;
26
+ confidence?: number;
27
+ };
28
+ manageClaims: {
29
+ announcement_id: string;
30
+ action: 'list' | 'accept' | 'reject';
31
+ claim_id?: string;
32
+ };
33
+ myClaims: {
34
+ status?: 'pending' | 'accepted' | 'rejected' | 'all';
35
+ };
36
+ }
37
+ /**
38
+ * 认领模式处理器类
39
+ * 包含所有认领相关工具的处理逻辑
40
+ */
41
+ export declare class ClaimHandlers {
42
+ private adapter;
43
+ constructor(adapter: F2AOpenClawAdapter);
44
+ /**
45
+ * 处理 f2a_announce 工具
46
+ * 广播任务到 F2A 网络
47
+ */
48
+ handleAnnounce(params: ClaimHandlerParams['announce'], context: SessionContext): Promise<ToolResult>;
49
+ /**
50
+ * 处理 f2a_list_announcements 工具
51
+ * 查看当前开放的任务广播
52
+ */
53
+ handleListAnnouncements(params: ClaimHandlerParams['listAnnouncements'], context: SessionContext): Promise<ToolResult>;
54
+ /**
55
+ * 处理 f2a_claim 工具
56
+ * 认领一个开放的任务广播
57
+ */
58
+ handleClaim(params: ClaimHandlerParams['claim'], context: SessionContext): Promise<ToolResult>;
59
+ /**
60
+ * 处理 f2a_manage_claims 工具
61
+ * 管理我的任务广播的认领
62
+ */
63
+ handleManageClaims(params: ClaimHandlerParams['manageClaims'], context: SessionContext): Promise<ToolResult>;
64
+ /**
65
+ * 处理 f2a_my_claims 工具
66
+ * 查看我提交的任务认领状态
67
+ */
68
+ handleMyClaims(params: ClaimHandlerParams['myClaims'], context: SessionContext): Promise<ToolResult>;
69
+ /**
70
+ * 处理 f2a_announcement_stats 工具
71
+ * 查看任务广播统计
72
+ */
73
+ handleAnnouncementStats(params: {}, context: SessionContext): Promise<ToolResult>;
74
+ }
75
+ //# sourceMappingURL=claim-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim-handlers.d.ts","sourceRoot":"","sources":["../src/claim-handlers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAGX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAazD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;QACjC,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,iBAAiB,EAAE;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE;QACL,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,YAAY,EAAE;QACZ,eAAe,EAAE,MAAM,CAAC;QACxB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,EAAE;QACR,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC;KACtD,CAAC;CACH;AAED;;;GAGG;AACH,qBAAa,aAAa;IACZ,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,kBAAkB;IAE/C;;;OAGG;IACG,cAAc,CAClB,MAAM,EAAE,kBAAkB,CAAC,UAAU,CAAC,EACtC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IAyFtB;;;OAGG;IACG,uBAAuB,CAC3B,MAAM,EAAE,kBAAkB,CAAC,mBAAmB,CAAC,EAC/C,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IAkDtB;;;OAGG;IACG,WAAW,CACf,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,EACnC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IAkFtB;;;OAGG;IACG,kBAAkB,CACtB,MAAM,EAAE,kBAAkB,CAAC,cAAc,CAAC,EAC1C,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IAgGtB;;;OAGG;IACG,cAAc,CAClB,MAAM,EAAE,kBAAkB,CAAC,UAAU,CAAC,EACtC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IA0CtB;;;OAGG;IACG,uBAAuB,CAC3B,MAAM,EAAE,EAAE,EACV,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;CAkBvB"}