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.
- package/README.md +47 -213
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/src/channel.d.ts +1 -1
- package/dist/src/channel.d.ts.map +1 -1
- package/dist/src/channel.js +1 -1
- package/dist/src/channel.js.map +1 -1
- package/dist/src/config.d.ts +16 -6
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +18 -5
- package/dist/src/config.js.map +1 -1
- package/dist/src/download-tool.d.ts +2 -2
- package/dist/src/download-tool.d.ts.map +1 -1
- package/dist/src/download-tool.js +9 -9
- package/dist/src/download-tool.js.map +1 -1
- package/dist/src/file-storage.d.ts +9 -9
- package/dist/src/file-storage.d.ts.map +1 -1
- package/dist/src/file-storage.js +10 -10
- package/dist/src/file-storage.js.map +1 -1
- package/dist/src/format-urls.d.ts +5 -5
- package/dist/src/format-urls.js +8 -8
- package/dist/src/format-urls.js.map +1 -1
- package/dist/src/gateway.d.ts.map +1 -1
- package/dist/src/gateway.js +18 -14
- package/dist/src/gateway.js.map +1 -1
- package/dist/src/inbound.d.ts.map +1 -1
- package/dist/src/inbound.js +20 -21
- package/dist/src/inbound.js.map +1 -1
- package/dist/src/outbound.d.ts +1 -1
- package/dist/src/outbound.d.ts.map +1 -1
- package/dist/src/outbound.js +15 -3
- package/dist/src/outbound.js.map +1 -1
- package/dist/src/runtime.d.ts +1 -1
- package/dist/src/runtime.d.ts.map +1 -1
- package/dist/src/socket/handlers.d.ts +26 -0
- package/dist/src/socket/handlers.d.ts.map +1 -0
- package/dist/src/socket/handlers.js +130 -0
- package/dist/src/socket/handlers.js.map +1 -0
- package/dist/src/socket/index.d.ts +11 -0
- package/dist/src/socket/index.d.ts.map +1 -0
- package/dist/src/socket/index.js +9 -0
- package/dist/src/socket/index.js.map +1 -0
- package/dist/src/socket/registry.d.ts +59 -0
- package/dist/src/socket/registry.d.ts.map +1 -0
- package/dist/src/socket/registry.js +125 -0
- package/dist/src/socket/registry.js.map +1 -0
- package/dist/src/socket/reliable-emitter.d.ts +79 -0
- package/dist/src/socket/reliable-emitter.d.ts.map +1 -0
- package/dist/src/socket/reliable-emitter.js +217 -0
- package/dist/src/socket/reliable-emitter.js.map +1 -0
- package/dist/src/types.d.ts +7 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/upload-tool.d.ts +2 -2
- package/dist/src/upload-tool.d.ts.map +1 -1
- package/dist/src/upload-tool.js +3 -3
- package/dist/src/upload-tool.js.map +1 -1
- package/node_modules/socket.io-parser/build/cjs/index.d.ts +14 -4
- package/node_modules/socket.io-parser/build/cjs/index.js +14 -6
- package/node_modules/socket.io-parser/build/esm/index.d.ts +14 -4
- package/node_modules/socket.io-parser/build/esm/index.js +14 -6
- package/node_modules/socket.io-parser/build/esm-debug/index.d.ts +14 -4
- package/node_modules/socket.io-parser/build/esm-debug/index.js +14 -6
- package/node_modules/socket.io-parser/package.json +1 -1
- package/package.json +6 -11
- package/skills/lightclaw-media/SKILL.md +22 -102
- package/dist/public/data/scripts/manifest.json +0 -11
- package/dist/public/data/scripts/upgrade.211d7e4c.sh +0 -266
- package/dist/public/data/scripts/upgrade.sh +0 -266
- package/dist/src/session-history.d.ts +0 -88
- package/dist/src/session-history.d.ts.map +0 -1
- package/dist/src/session-history.js +0 -598
- package/dist/src/session-history.js.map +0 -1
- package/dist/src/streaming/delta-tracker.d.ts +0 -34
- package/dist/src/streaming/delta-tracker.d.ts.map +0 -1
- package/dist/src/streaming/delta-tracker.js +0 -145
- package/dist/src/streaming/delta-tracker.js.map +0 -1
- package/dist/src/streaming/index.d.ts +0 -12
- package/dist/src/streaming/index.d.ts.map +0 -1
- package/dist/src/streaming/index.js +0 -13
- package/dist/src/streaming/index.js.map +0 -1
- package/dist/src/streaming/stream-reply-sink.d.ts +0 -59
- package/dist/src/streaming/stream-reply-sink.d.ts.map +0 -1
- package/dist/src/streaming/stream-reply-sink.js +0 -293
- package/dist/src/streaming/stream-reply-sink.js.map +0 -1
- package/dist/src/streaming/types.d.ts +0 -45
- package/dist/src/streaming/types.d.ts.map +0 -1
- package/dist/src/streaming/types.js +0 -7
- 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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"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
71
|
+
/** 主 apiKey(获取 botId、默认文件操作等) */
|
|
67
72
|
apiKey: string;
|
|
68
73
|
/** 所有 apiKey(含主 key),用于 WS 多 key 认证 */
|
|
69
74
|
allApiKeys: string[];
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
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,
|
|
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"}
|
package/dist/src/upload-tool.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* LightClaw — 文件上传工具
|
|
3
3
|
*
|
|
4
|
-
* 注册为 OpenClaw Agent Tool,允许 AI
|
|
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
|
|
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,
|
|
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(
|
|
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(
|
|
121
|
+
constructor(opts) {
|
|
124
122
|
super();
|
|
125
|
-
this.
|
|
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
|
-
|
|
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(
|
|
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(
|
|
112
|
+
constructor(opts) {
|
|
115
113
|
super();
|
|
116
|
-
this.
|
|
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
|
-
|
|
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(
|
|
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(
|
|
116
|
+
constructor(opts) {
|
|
119
117
|
super();
|
|
120
|
-
this.
|
|
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
|
-
|
|
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;
|
package/package.json
CHANGED
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lightclawbot",
|
|
3
|
-
"version": "1.0.
|
|
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.
|
|
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
|
}
|