lightclawbot 1.0.7 → 1.0.9-beta.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 (90) hide show
  1. package/README.md +47 -213
  2. package/dist/index.d.ts +3 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/channel.d.ts +1 -1
  7. package/dist/src/channel.d.ts.map +1 -1
  8. package/dist/src/channel.js +1 -1
  9. package/dist/src/channel.js.map +1 -1
  10. package/dist/src/config.d.ts +16 -6
  11. package/dist/src/config.d.ts.map +1 -1
  12. package/dist/src/config.js +18 -5
  13. package/dist/src/config.js.map +1 -1
  14. package/dist/src/download-tool.d.ts +2 -2
  15. package/dist/src/download-tool.d.ts.map +1 -1
  16. package/dist/src/download-tool.js +9 -9
  17. package/dist/src/download-tool.js.map +1 -1
  18. package/dist/src/file-storage.d.ts +9 -9
  19. package/dist/src/file-storage.d.ts.map +1 -1
  20. package/dist/src/file-storage.js +10 -10
  21. package/dist/src/file-storage.js.map +1 -1
  22. package/dist/src/format-urls.d.ts +5 -5
  23. package/dist/src/format-urls.js +8 -8
  24. package/dist/src/format-urls.js.map +1 -1
  25. package/dist/src/gateway.d.ts.map +1 -1
  26. package/dist/src/gateway.js +18 -14
  27. package/dist/src/gateway.js.map +1 -1
  28. package/dist/src/inbound.d.ts.map +1 -1
  29. package/dist/src/inbound.js +20 -21
  30. package/dist/src/inbound.js.map +1 -1
  31. package/dist/src/outbound.d.ts +1 -1
  32. package/dist/src/outbound.d.ts.map +1 -1
  33. package/dist/src/outbound.js +15 -3
  34. package/dist/src/outbound.js.map +1 -1
  35. package/dist/src/runtime.d.ts +1 -1
  36. package/dist/src/runtime.d.ts.map +1 -1
  37. package/dist/src/socket/handlers.d.ts +26 -0
  38. package/dist/src/socket/handlers.d.ts.map +1 -0
  39. package/dist/src/socket/handlers.js +130 -0
  40. package/dist/src/socket/handlers.js.map +1 -0
  41. package/dist/src/socket/index.d.ts +11 -0
  42. package/dist/src/socket/index.d.ts.map +1 -0
  43. package/dist/src/socket/index.js +9 -0
  44. package/dist/src/socket/index.js.map +1 -0
  45. package/dist/src/socket/registry.d.ts +59 -0
  46. package/dist/src/socket/registry.d.ts.map +1 -0
  47. package/dist/src/socket/registry.js +125 -0
  48. package/dist/src/socket/registry.js.map +1 -0
  49. package/dist/src/socket/reliable-emitter.d.ts +79 -0
  50. package/dist/src/socket/reliable-emitter.d.ts.map +1 -0
  51. package/dist/src/socket/reliable-emitter.js +217 -0
  52. package/dist/src/socket/reliable-emitter.js.map +1 -0
  53. package/dist/src/types.d.ts +7 -2
  54. package/dist/src/types.d.ts.map +1 -1
  55. package/dist/src/upload-tool.d.ts +2 -2
  56. package/dist/src/upload-tool.d.ts.map +1 -1
  57. package/dist/src/upload-tool.js +3 -3
  58. package/dist/src/upload-tool.js.map +1 -1
  59. package/node_modules/socket.io-parser/build/cjs/index.d.ts +14 -4
  60. package/node_modules/socket.io-parser/build/cjs/index.js +14 -6
  61. package/node_modules/socket.io-parser/build/esm/index.d.ts +14 -4
  62. package/node_modules/socket.io-parser/build/esm/index.js +14 -6
  63. package/node_modules/socket.io-parser/build/esm-debug/index.d.ts +14 -4
  64. package/node_modules/socket.io-parser/build/esm-debug/index.js +14 -6
  65. package/node_modules/socket.io-parser/package.json +1 -1
  66. package/package.json +6 -11
  67. package/skills/lightclaw-media/SKILL.md +22 -102
  68. package/dist/public/data/scripts/manifest.json +0 -11
  69. package/dist/public/data/scripts/upgrade.211d7e4c.sh +0 -266
  70. package/dist/public/data/scripts/upgrade.sh +0 -266
  71. package/dist/src/session-history.d.ts +0 -88
  72. package/dist/src/session-history.d.ts.map +0 -1
  73. package/dist/src/session-history.js +0 -598
  74. package/dist/src/session-history.js.map +0 -1
  75. package/dist/src/streaming/delta-tracker.d.ts +0 -34
  76. package/dist/src/streaming/delta-tracker.d.ts.map +0 -1
  77. package/dist/src/streaming/delta-tracker.js +0 -145
  78. package/dist/src/streaming/delta-tracker.js.map +0 -1
  79. package/dist/src/streaming/index.d.ts +0 -12
  80. package/dist/src/streaming/index.d.ts.map +0 -1
  81. package/dist/src/streaming/index.js +0 -13
  82. package/dist/src/streaming/index.js.map +0 -1
  83. package/dist/src/streaming/stream-reply-sink.d.ts +0 -59
  84. package/dist/src/streaming/stream-reply-sink.d.ts.map +0 -1
  85. package/dist/src/streaming/stream-reply-sink.js +0 -293
  86. package/dist/src/streaming/stream-reply-sink.js.map +0 -1
  87. package/dist/src/streaming/types.d.ts +0 -45
  88. package/dist/src/streaming/types.d.ts.map +0 -1
  89. package/dist/src/streaming/types.js +0 -7
  90. package/dist/src/streaming/types.js.map +0 -1
@@ -0,0 +1,217 @@
1
+ /**
2
+ * LightClaw — 可靠发送器
3
+ *
4
+ * 所有出站 socket.emit 都通过此模块,利用 Socket.IO 原生 ACK + timeout 机制:
5
+ * socket.timeout(ms).emit(event, data, (err, ...args) => { ... })
6
+ * 超时由 Socket.IO 原生处理,回调第一个参数为 Error(超时)或 null(成功)。
7
+ *
8
+ * 未收到 ACK 则指数退避重试,断线期间暂停重试、重连后立即重发。
9
+ */
10
+ import { EMIT_ACK_TIMEOUT, EMIT_MAX_RETRIES, EMIT_RETRY_BASE_DELAY, EMIT_RETRY_MAX_DELAY, EMIT_PENDING_MAX, } from "../config.js";
11
+ // ============================================================
12
+ // ReliableEmitter
13
+ // ============================================================
14
+ export class ReliableEmitter {
15
+ getSocket;
16
+ log;
17
+ pending = new Map();
18
+ paused = false;
19
+ idCounter = 0;
20
+ // 统计
21
+ stats = {
22
+ totalEmitted: 0,
23
+ totalConfirmed: 0,
24
+ totalRetries: 0,
25
+ totalFailed: 0,
26
+ };
27
+ constructor(getSocket, log) {
28
+ this.getSocket = getSocket;
29
+ this.log = log;
30
+ }
31
+ // ----------------------------------------------------------
32
+ // 公开 API
33
+ // ----------------------------------------------------------
34
+ /**
35
+ * 可靠发送 — 带 ACK 确认 + 自动重试。
36
+ *
37
+ * 每次调用都是独立的发送请求,不会因相同 msgId 被合并。
38
+ * msgId 仅用于日志追踪,内部使用自增 emitId 作为 pending key。
39
+ *
40
+ * @param event Socket.IO 事件名
41
+ * @param data 消息体
42
+ * @param msgId 业务层消息 ID(仅用于日志追踪,可选)
43
+ * @returns true = server 已确认, false = 重试耗尽未确认
44
+ */
45
+ emitWithAck(event, data, msgId) {
46
+ // 每次调用生成唯一的内部 ID,确保同一 msgId 的多次 emit 不会互相覆盖
47
+ const emitId = this.generateEmitId();
48
+ this.stats.totalEmitted++;
49
+ // 队列满时淘汰最早的
50
+ this.evictIfNeeded();
51
+ // 为消息体注入 idempotencyKey:
52
+ // 使用 emitId 作为值,确保同一次 emit 的所有重试都携带相同的 key,
53
+ // 前端据此去重,避免因 ACK 丢失重发导致用户收到重复消息。
54
+ const enrichedData = { ...data, idempotencyKey: emitId };
55
+ return new Promise((resolve) => {
56
+ const entry = {
57
+ id: emitId,
58
+ msgId,
59
+ event,
60
+ data: enrichedData,
61
+ retryCount: 0,
62
+ createdAt: Date.now(),
63
+ retryTimer: null,
64
+ resolve,
65
+ };
66
+ this.pending.set(emitId, entry);
67
+ if (this.paused) {
68
+ // 断线中,先挂着,resume 时统一重发
69
+ this.log?.info(`[ReliableEmitter] Queued while paused: emitId=${emitId}, msgId=${msgId}`);
70
+ return;
71
+ }
72
+ this.doEmit(entry);
73
+ });
74
+ }
75
+ /**
76
+ * 断线时调用 — 暂停所有重试计时器
77
+ */
78
+ pause() {
79
+ if (this.paused)
80
+ return;
81
+ this.paused = true;
82
+ for (const entry of this.pending.values()) {
83
+ if (entry.retryTimer) {
84
+ clearTimeout(entry.retryTimer);
85
+ entry.retryTimer = null;
86
+ }
87
+ }
88
+ this.log?.info(`[ReliableEmitter] Paused, ${this.pending.size} message(s) pending`);
89
+ }
90
+ /**
91
+ * 重连时调用 — 立即重发所有待确认消息
92
+ */
93
+ resume() {
94
+ if (!this.paused)
95
+ return;
96
+ this.paused = false;
97
+ this.log?.info(`[ReliableEmitter] Resumed, re-emitting ${this.pending.size} pending message(s)`);
98
+ for (const entry of this.pending.values()) {
99
+ this.doEmit(entry);
100
+ }
101
+ }
102
+ /**
103
+ * 销毁 — 清除所有定时器,resolve 所有 pending 为 false
104
+ */
105
+ destroy() {
106
+ for (const entry of this.pending.values()) {
107
+ if (entry.retryTimer)
108
+ clearTimeout(entry.retryTimer);
109
+ entry.resolve(false);
110
+ }
111
+ this.pending.clear();
112
+ this.log?.info(`[ReliableEmitter] Destroyed`);
113
+ }
114
+ /** 当前待确认消息数 */
115
+ get pendingCount() {
116
+ return this.pending.size;
117
+ }
118
+ /** 获取统计信息 */
119
+ getStats() {
120
+ return { ...this.stats, currentPending: this.pending.size };
121
+ }
122
+ // ----------------------------------------------------------
123
+ // 内部方法
124
+ // ----------------------------------------------------------
125
+ /**
126
+ * 通过 socket.timeout(ms).emit(event, data, callback) 发送消息。
127
+ *
128
+ * - 超时由 Socket.IO 原生 .timeout() 处理,无需手动 setTimeout
129
+ * - 回调签名为 (err: Error | null, ...args),err 非空说明超时或出错
130
+ * - socket.emit 是异步的,不会抛同步异常,无需 try-catch
131
+ */
132
+ doEmit(entry) {
133
+ const socket = this.getSocket();
134
+ if (!socket?.connected) {
135
+ // socket 不可用,等 resume 时重发(不计重试次数)
136
+ return;
137
+ }
138
+ socket.timeout(EMIT_ACK_TIMEOUT).emit(entry.event, entry.data, (err) => {
139
+ // 已被 destroy 或 confirm
140
+ if (!this.pending.has(entry.id))
141
+ return;
142
+ if (err) {
143
+ // 超时或服务端回传了错误
144
+ this.log?.warn(`[ReliableEmitter] ACK error: emitId=${entry.id}, msgId=${entry.msgId}, err=${err.message}, retryCount=${entry.retryCount}`);
145
+ this.scheduleRetry(entry);
146
+ }
147
+ else {
148
+ this.log?.info(`[ReliableEmitter] ACK success: emitId=${entry.id}, msgId=${entry.msgId}, retryCount=${entry.retryCount}`);
149
+ // 服务端已确认
150
+ this.confirm(entry.id);
151
+ }
152
+ });
153
+ }
154
+ confirm(id) {
155
+ const entry = this.pending.get(id);
156
+ if (!entry)
157
+ return; // 已被 confirm 或 destroy
158
+ if (entry.retryTimer) {
159
+ clearTimeout(entry.retryTimer);
160
+ entry.retryTimer = null;
161
+ }
162
+ this.pending.delete(id);
163
+ this.stats.totalConfirmed++;
164
+ entry.resolve(true);
165
+ }
166
+ scheduleRetry(entry) {
167
+ // 断线中不重试
168
+ if (this.paused)
169
+ return;
170
+ if (entry.retryCount >= EMIT_MAX_RETRIES) {
171
+ // 重试耗尽
172
+ this.pending.delete(entry.id);
173
+ this.stats.totalFailed++;
174
+ this.log?.error(`[ReliableEmitter] Gave up after ${entry.retryCount} retries: emitId=${entry.id}, msgId=${entry.msgId}, ` +
175
+ `elapsed=${Date.now() - entry.createdAt}ms`);
176
+ entry.resolve(false);
177
+ return;
178
+ }
179
+ entry.retryCount++;
180
+ this.stats.totalRetries++;
181
+ const delay = this.getRetryDelay(entry.retryCount);
182
+ this.log?.info(`[ReliableEmitter] Retry #${entry.retryCount} in ${delay}ms: emitId=${entry.id}, msgId=${entry.msgId}`);
183
+ entry.retryTimer = setTimeout(() => {
184
+ entry.retryTimer = null;
185
+ if (this.paused)
186
+ return; // 重试期间断线了
187
+ this.doEmit(entry);
188
+ }, delay);
189
+ }
190
+ /**
191
+ * 指数退避 + 随机抖动
192
+ * delay = min(base * 2^(retryCount-1) + jitter, maxDelay)
193
+ */
194
+ getRetryDelay(retryCount) {
195
+ const base = EMIT_RETRY_BASE_DELAY * Math.pow(2, retryCount - 1);
196
+ const jitter = Math.random() * 1000;
197
+ return Math.min(base + jitter, EMIT_RETRY_MAX_DELAY);
198
+ }
199
+ /** 队列满时淘汰最早的 pending 消息 */
200
+ evictIfNeeded() {
201
+ while (this.pending.size >= EMIT_PENDING_MAX) {
202
+ const oldest = this.pending.values().next().value;
203
+ if (!oldest)
204
+ break;
205
+ if (oldest.retryTimer)
206
+ clearTimeout(oldest.retryTimer);
207
+ this.pending.delete(oldest.id);
208
+ this.stats.totalFailed++;
209
+ this.log?.warn(`[ReliableEmitter] Evicted oldest pending: emitId=${oldest.id}, msgId=${oldest.msgId}`);
210
+ oldest.resolve(false);
211
+ }
212
+ }
213
+ generateEmitId() {
214
+ return `_re_${Date.now().toString(36)}_${(this.idCounter++).toString(36)}`;
215
+ }
216
+ }
217
+ //# sourceMappingURL=reliable-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reliable-emitter.js","sourceRoot":"","sources":["../../../src/socket/reliable-emitter.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ export interface FileAttachment {
14
14
  mimeType: string;
15
15
  /** base64 data URL(如 "data:text/plain;base64,...") */
16
16
  bytes?: string;
17
- /** 远程文件 URI(如 COS 下载地址),与 bytes 二选一 */
17
+ /** 远程文件 URI(如云端下载地址),与 bytes 二选一 */
18
18
  uri?: string;
19
19
  }
20
20
  /**
@@ -40,6 +40,11 @@ export interface PrivateMessageData {
40
40
  kind?: "text" | "stream_chunk" | "stream_end" | "typing_start" | "typing_stop";
41
41
  /** 回复对应的原始消息 ID */
42
42
  replyToMsgId?: string;
43
+ /**
44
+ * 幂等键:标识每次独立的 emit 调用,前端据此去重。
45
+ * 由 ReliableEmitter 在发送时自动注入,重试/重发时保持不变。
46
+ */
47
+ idempotencyKey?: string;
43
48
  }
44
49
  /** 原始配置(config.yaml 中的内容) */
45
50
  export interface AssistantAccountConfig {
@@ -63,7 +68,7 @@ export interface AssistantAccountConfig {
63
68
  /** 解析后的完整账户(含默认值和环境变量 fallback) */
64
69
  export interface ResolvedAssistantAccount {
65
70
  accountId: string;
66
- /** 主 apiKey(获取 botId、默认 COS 操作等) */
71
+ /** 主 apiKey(获取 botId、默认文件操作等) */
67
72
  apiKey: string;
68
73
  /** 所有 apiKey(含主 key),用于 WS 多 key 认证 */
69
74
  allApiKeys: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,8BAA8B;AAC9B,MAAM,WAAW,cAAc;IAC7B,UAAU;IACV,IAAI,EAAE,MAAM,CAAC;IACb,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,cAAc;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,YAAY,GAAG,cAAc,GAAG,aAAa,CAAC;IAC/E,mBAAmB;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,6BAA6B;AAC7B,MAAM,WAAW,sBAAsB;IACrC,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;IAC7C,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,mCAAmC;AACnC,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;IAC5C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;CACzC;AAMD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,wBAAwB,CAAC;IAClC,WAAW,EAAE,WAAW,CAAC;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,GAAG,CAAC,EAAE;QACJ,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAC5B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;KAC/B,CAAC;CACH;AAED,iCAAiC;AACjC,MAAM,WAAW,aAAa;IAC5B,aAAa;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU;IACV,SAAS,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * LightClaw — 文件上传工具
3
3
  *
4
- * 注册为 OpenClaw Agent Tool,允许 AI 将本地文件上传到 COS,
4
+ * 注册为 OpenClaw Agent Tool,允许 AI 将本地文件上传到云端存储,
5
5
  * 获得公网可访问的 URL,方便用户直接下载。
6
6
  *
7
7
  * 工具名: lightclaw_upload_file
8
8
  */
9
- import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
9
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk/core";
10
10
  export declare const UPLOAD_TOOL_NAME = "lightclaw_upload_file";
11
11
  export declare const uploadToolSchema: {
12
12
  type: "object";
@@ -1 +1 @@
1
- {"version":3,"file":"upload-tool.d.ts","sourceRoot":"","sources":["../../src/upload-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AAS3E,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AAExD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;CAY5B,CAAC;AAMF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAqI/D"}
1
+ {"version":3,"file":"upload-tool.d.ts","sourceRoot":"","sources":["../../src/upload-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,0BAA0B,CAAC;AAShF,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AAExD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;CAY5B,CAAC;AAMF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAqI/D"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * LightClaw — 文件上传工具
3
3
  *
4
- * 注册为 OpenClaw Agent Tool,允许 AI 将本地文件上传到 COS,
4
+ * 注册为 OpenClaw Agent Tool,允许 AI 将本地文件上传到云端存储,
5
5
  * 获得公网可访问的 URL,方便用户直接下载。
6
6
  *
7
7
  * 工具名: lightclaw_upload_file
@@ -39,7 +39,7 @@ export function registerUploadTool(api) {
39
39
  const sessionKey = ctx.sessionKey;
40
40
  return {
41
41
  name: UPLOAD_TOOL_NAME,
42
- description: "Upload local files to Tencent COS cloud storage and return publicly accessible download URLs. " +
42
+ description: "Upload local files to cloud storage and return publicly accessible download URLs. " +
43
43
  "Use this tool whenever you have generated or produced files (reports, images, documents, etc.) " +
44
44
  "that the user needs to download. This is the primary way to deliver file outputs to users. " +
45
45
  "Supports up to 5 files at once. Returns a public download URL for each uploaded file.",
@@ -47,7 +47,7 @@ export function registerUploadTool(api) {
47
47
  async execute(_toolCallId, params) {
48
48
  // 每次 execute 时动态解析 apiKey(多 key 模式下通过 sessionKey 直接获取)
49
49
  const apiKey = resolveEffectiveApiKey({ sessionKey });
50
- log.warn(`[lightclaw_upload_file] resolved apiKey="${apiKey?.slice(0, 8)}..."`);
50
+ // log.warn(`[lightclaw_upload_file] resolved apiKey="${apiKey?.slice(0, 8)}..."`);
51
51
  const { paths } = params;
52
52
  // 参数校验
53
53
  if (!Array.isArray(paths) || paths.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"upload-tool.js","sourceRoot":"","sources":["../../src/upload-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,+DAA+D;AAC/D,8BAA8B;AAC9B,+DAA+D;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAExD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,QAAiB;IACvB,UAAU,EAAE;QACV,KAAK,EAAE;YACL,IAAI,EAAE,OAAgB;YACtB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE;YAClC,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,CAAC;YACX,WAAW,EAAE,8BAA8B;SAC5C;KACF;IACD,QAAQ,EAAE,CAAC,OAAO,CAAU;CAC7B,CAAC;AAEF,+DAA+D;AAC/D,iBAAiB;AACjB,+DAA+D;AAE/D,MAAM,UAAU,kBAAkB,CAAC,GAAsB;IACvD,qCAAqC;IACrC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IAEvB,GAAG,CAAC,YAAY,CACd,CAAC,GAAG,EAAE,EAAE;QACN,MAAM,gBAAgB,GAAG,GAAG,CAAC,cAAc,CAAC;QAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAClC,OAAO;YACL,IAAI,EAAE,gBAAgB;YACtB,WAAW,EACT,gGAAgG;gBAChG,iGAAiG;gBACjG,6FAA6F;gBAC7F,uFAAuF;YACzF,UAAU,EAAE,gBAAgB;YAE5B,KAAK,CAAC,OAAO,CACX,WAAmB,EACnB,MAA2B;gBAE3B,uDAAuD;gBACvD,MAAM,MAAM,GAAG,sBAAsB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;gBACtD,GAAG,CAAC,IAAI,CAAC,4CAA4C,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;gBAEhF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;gBAEzB,OAAO;gBACP,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAChD,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uDAAuD,EAAE,CAAC;qBAC3F,CAAC;gBACJ,CAAC;gBACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oCAAoC,EAAE,CAAC;qBACxE,CAAC;gBACJ,CAAC;gBAED,WAAW;gBACX,MAAM,gBAAgB,GAAa,EAAE,CAAC;gBACtC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;wBACvC,gBAAgB,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;wBAC3D,SAAS;oBACX,CAAC;oBACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;wBACtB,gBAAgB,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;wBAC9C,SAAS;oBACX,CAAC;oBACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;wBACnB,gBAAgB,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;oBACpD,CAAC;gBACH,CAAC;gBAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;qBACxF,CAAC;gBACJ,CAAC;gBAED,iBAAiB;gBACjB,MAAM,OAAO,GAOR,EAAE,CAAC;gBAER,MAAM,WAAW,GAAG,CAAC,CAAC;gBACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;oBACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;oBAC9C,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,UAAU,CAC3C,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;wBAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;wBACnC,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;wBACjE,OAAO;4BACL,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,IAAa;4BACtB,GAAG,EAAE,YAAY,CAAC,GAAG;4BACrB,QAAQ,EAAE,YAAY,CAAC,QAAQ;4BAC/B,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;yBAChC,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;oBAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC7C,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;wBAC1B,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;4BAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBACxB,CAAC;6BAAM,CAAC;4BACN,OAAO,CAAC,IAAI,CAAC;gCACX,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gCACd,OAAO,EAAE,KAAK;gCACd,KAAK,EAAE,CAAC,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;6BACvE,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,uCAAuC;gBACvC,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,MAAM,cAAc,GAAuD,EAAE,CAAC;gBAE9E,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACnC,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;wBACvB,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;wBAChD,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAK,EAAE,CAAC,CAAC;oBAC3D,CAAC;yBAAM,CAAC;wBACN,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC;gBAED,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,KAAK,CAAC;oBAClB,CAAC,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;wBAC3B,CAAC,CAAC,mCAAmC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;wBACxF,CAAC,CAAC,uBAAuB,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBAC7C,CAAC,CAAC,YAAY,cAAc,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAExF,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oBAC1C,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;iBAC9B,CAAC;YACJ,CAAC;SACyB,CAAC;IAC/B,CAAC,EACD,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAC3B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"upload-tool.js","sourceRoot":"","sources":["../../src/upload-tool.ts"],"names":[],"mappings":"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"}
@@ -53,20 +53,30 @@ export declare class Encoder {
53
53
  interface DecoderReservedEvents {
54
54
  decoded: (packet: Packet) => void;
55
55
  }
56
+ type JSONReviver = (this: any, key: string, value: any) => any;
57
+ export interface DecoderOptions {
58
+ /**
59
+ * Custom reviver to pass down to JSON.parse()
60
+ */
61
+ reviver?: JSONReviver;
62
+ /**
63
+ * Maximum number of binary attachments per packet
64
+ * @default 10
65
+ */
66
+ maxAttachments?: number;
67
+ }
56
68
  /**
57
69
  * A socket.io Decoder instance
58
70
  *
59
71
  * @return {Object} decoder
60
72
  */
61
73
  export declare class Decoder extends Emitter<{}, {}, DecoderReservedEvents> {
62
- private reviver?;
63
74
  private reconstructor;
75
+ private opts;
64
76
  /**
65
77
  * Decoder constructor
66
- *
67
- * @param {function} reviver - custom reviver to pass down to JSON.stringify
68
78
  */
69
- constructor(reviver?: (this: any, key: string, value: any) => any);
79
+ constructor(opts?: DecoderOptions | JSONReviver);
70
80
  /**
71
81
  * Decodes an encoded packet string into packet JSON.
72
82
  *
@@ -117,12 +117,13 @@ exports.Encoder = Encoder;
117
117
  class Decoder extends component_emitter_1.Emitter {
118
118
  /**
119
119
  * Decoder constructor
120
- *
121
- * @param {function} reviver - custom reviver to pass down to JSON.stringify
122
120
  */
123
- constructor(reviver) {
121
+ constructor(opts) {
124
122
  super();
125
- this.reviver = reviver;
123
+ this.opts = Object.assign({
124
+ reviver: undefined,
125
+ maxAttachments: 10,
126
+ }, typeof opts === "function" ? { reviver: opts } : opts);
126
127
  }
127
128
  /**
128
129
  * Decodes an encoded packet string into packet JSON.
@@ -193,7 +194,14 @@ class Decoder extends component_emitter_1.Emitter {
193
194
  if (buf != Number(buf) || str.charAt(i) !== "-") {
194
195
  throw new Error("Illegal attachments");
195
196
  }
196
- p.attachments = Number(buf);
197
+ const n = Number(buf);
198
+ if (!isInteger(n) || n < 0) {
199
+ throw new Error("Illegal attachments");
200
+ }
201
+ else if (n > this.opts.maxAttachments) {
202
+ throw new Error("too many attachments");
203
+ }
204
+ p.attachments = n;
197
205
  }
198
206
  // look up namespace (if any)
199
207
  if ("/" === str.charAt(i + 1)) {
@@ -240,7 +248,7 @@ class Decoder extends component_emitter_1.Emitter {
240
248
  }
241
249
  tryParse(str) {
242
250
  try {
243
- return JSON.parse(str, this.reviver);
251
+ return JSON.parse(str, this.opts.reviver);
244
252
  }
245
253
  catch (e) {
246
254
  return false;
@@ -53,20 +53,30 @@ export declare class Encoder {
53
53
  interface DecoderReservedEvents {
54
54
  decoded: (packet: Packet) => void;
55
55
  }
56
+ type JSONReviver = (this: any, key: string, value: any) => any;
57
+ export interface DecoderOptions {
58
+ /**
59
+ * Custom reviver to pass down to JSON.parse()
60
+ */
61
+ reviver?: JSONReviver;
62
+ /**
63
+ * Maximum number of binary attachments per packet
64
+ * @default 10
65
+ */
66
+ maxAttachments?: number;
67
+ }
56
68
  /**
57
69
  * A socket.io Decoder instance
58
70
  *
59
71
  * @return {Object} decoder
60
72
  */
61
73
  export declare class Decoder extends Emitter<{}, {}, DecoderReservedEvents> {
62
- private reviver?;
63
74
  private reconstructor;
75
+ private opts;
64
76
  /**
65
77
  * Decoder constructor
66
- *
67
- * @param {function} reviver - custom reviver to pass down to JSON.stringify
68
78
  */
69
- constructor(reviver?: (this: any, key: string, value: any) => any);
79
+ constructor(opts?: DecoderOptions | JSONReviver);
70
80
  /**
71
81
  * Decodes an encoded packet string into packet JSON.
72
82
  *
@@ -108,12 +108,13 @@ export class Encoder {
108
108
  export class Decoder extends Emitter {
109
109
  /**
110
110
  * Decoder constructor
111
- *
112
- * @param {function} reviver - custom reviver to pass down to JSON.stringify
113
111
  */
114
- constructor(reviver) {
112
+ constructor(opts) {
115
113
  super();
116
- this.reviver = reviver;
114
+ this.opts = Object.assign({
115
+ reviver: undefined,
116
+ maxAttachments: 10,
117
+ }, typeof opts === "function" ? { reviver: opts } : opts);
117
118
  }
118
119
  /**
119
120
  * Decodes an encoded packet string into packet JSON.
@@ -184,7 +185,14 @@ export class Decoder extends Emitter {
184
185
  if (buf != Number(buf) || str.charAt(i) !== "-") {
185
186
  throw new Error("Illegal attachments");
186
187
  }
187
- p.attachments = Number(buf);
188
+ const n = Number(buf);
189
+ if (!isInteger(n) || n < 0) {
190
+ throw new Error("Illegal attachments");
191
+ }
192
+ else if (n > this.opts.maxAttachments) {
193
+ throw new Error("too many attachments");
194
+ }
195
+ p.attachments = n;
188
196
  }
189
197
  // look up namespace (if any)
190
198
  if ("/" === str.charAt(i + 1)) {
@@ -230,7 +238,7 @@ export class Decoder extends Emitter {
230
238
  }
231
239
  tryParse(str) {
232
240
  try {
233
- return JSON.parse(str, this.reviver);
241
+ return JSON.parse(str, this.opts.reviver);
234
242
  }
235
243
  catch (e) {
236
244
  return false;
@@ -53,20 +53,30 @@ export declare class Encoder {
53
53
  interface DecoderReservedEvents {
54
54
  decoded: (packet: Packet) => void;
55
55
  }
56
+ type JSONReviver = (this: any, key: string, value: any) => any;
57
+ export interface DecoderOptions {
58
+ /**
59
+ * Custom reviver to pass down to JSON.parse()
60
+ */
61
+ reviver?: JSONReviver;
62
+ /**
63
+ * Maximum number of binary attachments per packet
64
+ * @default 10
65
+ */
66
+ maxAttachments?: number;
67
+ }
56
68
  /**
57
69
  * A socket.io Decoder instance
58
70
  *
59
71
  * @return {Object} decoder
60
72
  */
61
73
  export declare class Decoder extends Emitter<{}, {}, DecoderReservedEvents> {
62
- private reviver?;
63
74
  private reconstructor;
75
+ private opts;
64
76
  /**
65
77
  * Decoder constructor
66
- *
67
- * @param {function} reviver - custom reviver to pass down to JSON.stringify
68
78
  */
69
- constructor(reviver?: (this: any, key: string, value: any) => any);
79
+ constructor(opts?: DecoderOptions | JSONReviver);
70
80
  /**
71
81
  * Decodes an encoded packet string into packet JSON.
72
82
  *
@@ -112,12 +112,13 @@ export class Encoder {
112
112
  export class Decoder extends Emitter {
113
113
  /**
114
114
  * Decoder constructor
115
- *
116
- * @param {function} reviver - custom reviver to pass down to JSON.stringify
117
115
  */
118
- constructor(reviver) {
116
+ constructor(opts) {
119
117
  super();
120
- this.reviver = reviver;
118
+ this.opts = Object.assign({
119
+ reviver: undefined,
120
+ maxAttachments: 10,
121
+ }, typeof opts === "function" ? { reviver: opts } : opts);
121
122
  }
122
123
  /**
123
124
  * Decodes an encoded packet string into packet JSON.
@@ -188,7 +189,14 @@ export class Decoder extends Emitter {
188
189
  if (buf != Number(buf) || str.charAt(i) !== "-") {
189
190
  throw new Error("Illegal attachments");
190
191
  }
191
- p.attachments = Number(buf);
192
+ const n = Number(buf);
193
+ if (!isInteger(n) || n < 0) {
194
+ throw new Error("Illegal attachments");
195
+ }
196
+ else if (n > this.opts.maxAttachments) {
197
+ throw new Error("too many attachments");
198
+ }
199
+ p.attachments = n;
192
200
  }
193
201
  // look up namespace (if any)
194
202
  if ("/" === str.charAt(i + 1)) {
@@ -235,7 +243,7 @@ export class Decoder extends Emitter {
235
243
  }
236
244
  tryParse(str) {
237
245
  try {
238
- return JSON.parse(str, this.reviver);
246
+ return JSON.parse(str, this.opts.reviver);
239
247
  }
240
248
  catch (e) {
241
249
  return false;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "socket.io-parser",
3
- "version": "4.2.5",
3
+ "version": "4.2.6",
4
4
  "description": "socket.io protocol parser",
5
5
  "homepage": "https://github.com/socketio/socket.io/tree/main/packages/socket.io-client#readme",
6
6
  "repository": {
package/package.json CHANGED
@@ -1,16 +1,8 @@
1
1
  {
2
2
  "name": "lightclawbot",
3
- "version": "1.0.7",
3
+ "version": "1.0.9-beta.0",
4
4
  "description": "LightClawBot channel plugin with message support, cron jobs, and proactive messaging",
5
5
  "type": "module",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/index.d.ts",
11
- "default": "./dist/index.js"
12
- }
13
- },
14
6
  "files": [
15
7
  "dist",
16
8
  "openclaw.plugin.json",
@@ -31,6 +23,9 @@
31
23
  "install": {
32
24
  "npmSpec": "lightclawbot",
33
25
  "defaultChoice": "npm"
26
+ },
27
+ "bundle": {
28
+ "stageRuntimeDependencies": true
34
29
  }
35
30
  },
36
31
  "scripts": {
@@ -56,10 +51,10 @@
56
51
  "socket.io-client"
57
52
  ],
58
53
  "peerDependencies": {
59
- "openclaw": ">=2026.0.0"
54
+ "openclaw": ">=2026.3.22"
60
55
  },
61
56
  "devDependencies": {
62
- "openclaw": "*",
57
+ "openclaw": "workspace:*",
63
58
  "typescript": "^5.7.0"
64
59
  }
65
60
  }