lightclawbot 1.0.3 → 1.0.5
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 +241 -1
- package/dist/public/data/scripts/manifest.json +11 -0
- package/dist/public/data/scripts/preflight.78097a58.sh +94 -0
- package/dist/public/data/scripts/preflight.sh +94 -0
- package/dist/src/channel.d.ts.map +1 -1
- package/dist/src/channel.js +34 -17
- package/dist/src/channel.js.map +1 -1
- package/dist/src/config.d.ts +38 -5
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +105 -7
- package/dist/src/config.js.map +1 -1
- package/dist/src/download-tool.d.ts.map +1 -1
- package/dist/src/download-tool.js +16 -16
- package/dist/src/download-tool.js.map +1 -1
- package/dist/src/file-storage.d.ts.map +1 -1
- package/dist/src/file-storage.js +3 -5
- package/dist/src/file-storage.js.map +1 -1
- package/dist/src/format-urls.d.ts +26 -0
- package/dist/src/format-urls.d.ts.map +1 -0
- package/dist/src/format-urls.js +53 -0
- package/dist/src/format-urls.js.map +1 -0
- package/dist/src/gateway.d.ts.map +1 -1
- package/dist/src/gateway.js +89 -39
- package/dist/src/gateway.js.map +1 -1
- package/dist/src/history/session-store.d.ts +4 -0
- package/dist/src/history/session-store.d.ts.map +1 -1
- package/dist/src/history/session-store.js +41 -0
- package/dist/src/history/session-store.js.map +1 -1
- package/dist/src/inbound.d.ts.map +1 -1
- package/dist/src/inbound.js +38 -15
- package/dist/src/inbound.js.map +1 -1
- package/dist/src/outbound.d.ts.map +1 -1
- package/dist/src/outbound.js +5 -3
- package/dist/src/outbound.js.map +1 -1
- package/dist/src/socket-handlers.d.ts.map +1 -1
- package/dist/src/socket-handlers.js +1 -0
- package/dist/src/socket-handlers.js.map +1 -1
- package/dist/src/types.d.ts +6 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/upload-tool.d.ts.map +1 -1
- package/dist/src/upload-tool.js +14 -19
- package/dist/src/upload-tool.js.map +1 -1
- package/package.json +6 -3
- package/skills/lightclaw-media/SKILL.md +330 -0
package/dist/src/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEnF,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAC1C,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAU5C,aAAa;AACb,eAAO,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEnF,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAC1C,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAU5C,aAAa;AACb,eAAO,MAAM,MAAM,8BAA8B,CAAC;AAElD,qBAAqB;AACrB,eAAO,MAAM,MAAM,oCAAoB,CAAC;AACxC,oBAAoB;AACpB,eAAO,MAAM,YAAY,sCAAsB,CAAC;AAChD,eAAe;AACf,eAAO,MAAM,YAAY,sCAAsB,CAAC;AAMhD,qBAAqB;AACrB,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAE1C,qBAAqB;AACrB,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAC9C,eAAO,MAAM,6BAA6B,QAAQ,CAAC;AACnD,eAAO,MAAM,4BAA4B,QAAW,CAAC;AAMrD,wCAAwC;AACxC,eAAO,MAAM,SAAS,YAAY,CAAC;AAEnC,qBAAqB;AACrB,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKvE;AAED,iEAAiE;AACjE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAK1F;AAaD,kCAAkC;AAClC,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAGlF;AAED,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAEzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAqBT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAqB/E;AAMD,2BAA2B;AAC3B,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AACrD,iBAAiB;AACjB,eAAO,MAAM,eAAe,2BAA2B,CAAC;AACxD,iBAAiB;AACjB,eAAO,MAAM,iBAAiB,8BAA8B,CAAC;AAM7D,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AACvD,eAAO,MAAM,qBAAqB,4BAA4B,CAAC;AAC/D,eAAO,MAAM,sBAAsB,6BAA6B,CAAC;AACjE,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AACzD,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAM3D,oBAAoB;AACpB,eAAO,MAAM,aAAa,SAAU,CAAC;AACrC,mBAAmB;AACnB,eAAO,MAAM,cAAc,SAAU,CAAC;AACtC,sBAAsB;AACtB,eAAO,MAAM,eAAe,QAAmB,CAAC;AAMhD,eAAe;AACf,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,aAAa;AACb,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,iBAAiB;AACjB,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAMvC,mBAAmB;AACnB,eAAO,MAAM,SAAS,QAAiB,CAAC;AACxC,kBAAkB;AAClB,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,yBAAyB;AACzB,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,kBAAkB;AAClB,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAM9C,4DAA4D;AAC5D,eAAO,MAAM,yBAAyB,QAAc,CAAC;AACrD,yBAAyB;AACzB,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,iBAAiB;AACjB,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAe;AACf,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAOrC,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,EAAE,CAmB5D;AAED,aAAa;AACb,wBAAgB,cAAc,CAC5B,GAAG,EAAE,cAAc,EACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,wBAAwB,CA4C1B;AAED,gBAAgB;AAChB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAE7D;AAED,yBAAyB;AACzB,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACvC,cAAc,CAgBhB"}
|
package/dist/src/config.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* ```json
|
|
9
9
|
"channels": {
|
|
10
10
|
"lightclawbot": {
|
|
11
|
-
"
|
|
11
|
+
"apiKeys": ["key-1", "key-2"],
|
|
12
12
|
"enabled": true
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -23,7 +23,7 @@ const ENV_API_BASE_URL = "LIGHTCLAW_API_BASE_URL";
|
|
|
23
23
|
// 域名 & URL 配置
|
|
24
24
|
// ============================================================
|
|
25
25
|
/** 核心服务域名 */
|
|
26
|
-
export const DOMAIN = "lightai.
|
|
26
|
+
export const DOMAIN = "lightai.cloud.tencent.com";
|
|
27
27
|
/** WebSocket 连接地址 */
|
|
28
28
|
export const WS_URL = `wss://${DOMAIN}`;
|
|
29
29
|
/** HTTP API 基础地址 */
|
|
@@ -51,6 +51,96 @@ export function buildAuthHeaders(apiKey) {
|
|
|
51
51
|
"x-product": X_PRODUCT,
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
+
/** WS 多 key 认证 headers(authorizations 为 JSON 数组字符串,不带 Bearer) */
|
|
55
|
+
export function buildMultiAuthHeaders(apiKeys) {
|
|
56
|
+
return {
|
|
57
|
+
authorizations: apiKeys.map(key => `Bearer ${key}`),
|
|
58
|
+
"x-product": X_PRODUCT,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// ============================================================
|
|
62
|
+
// 全局 uin → apiKey 映射管理
|
|
63
|
+
// ============================================================
|
|
64
|
+
/** 全局 uin→apiKey 映射(gateway 启动时构建,工具执行时读取) */
|
|
65
|
+
let globalApiKeyMap = new Map();
|
|
66
|
+
let globalDefaultApiKey = "";
|
|
67
|
+
/** sessionKey → apiKey 直接映射(inbound 处理时写入,tool 执行时读取) */
|
|
68
|
+
const sessionKeyToApiKey = new Map();
|
|
69
|
+
/** 设置 apiKeyMap(gateway 启动时调用) */
|
|
70
|
+
export function setApiKeyMap(map, defaultApiKey) {
|
|
71
|
+
globalApiKeyMap = map;
|
|
72
|
+
globalDefaultApiKey = defaultApiKey;
|
|
73
|
+
}
|
|
74
|
+
/** 记录 sessionKey → apiKey 映射(inbound 处理消息时调用) */
|
|
75
|
+
export function setSessionApiKey(sessionKey, apiKey) {
|
|
76
|
+
sessionKeyToApiKey.set(sessionKey.toLowerCase(), apiKey);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 统一的 apiKey 解析入口。
|
|
80
|
+
*
|
|
81
|
+
* 优先级:
|
|
82
|
+
* 1. sessionKey → 直查 sessionKeyToApiKey 映射
|
|
83
|
+
* 2. senderId (uin) → 直查 globalApiKeyMap
|
|
84
|
+
* 3. sessionKey 中解析 uin → 再查 globalApiKeyMap(兜底)
|
|
85
|
+
* 4. globalDefaultApiKey
|
|
86
|
+
*
|
|
87
|
+
* 全链路统一使用此函数获取 apiKey,避免 inbound / tool 各自维护不同的获取逻辑。
|
|
88
|
+
*/
|
|
89
|
+
export function resolveEffectiveApiKey(params) {
|
|
90
|
+
// 1. 通过 sessionKey 直接查映射(tool 执行时的主要路径)
|
|
91
|
+
if (params.sessionKey) {
|
|
92
|
+
const apiKey = sessionKeyToApiKey.get(params.sessionKey.toLowerCase());
|
|
93
|
+
if (apiKey)
|
|
94
|
+
return apiKey;
|
|
95
|
+
}
|
|
96
|
+
// 2. 通过 senderId (uin) 查映射(inbound 处理时的主要路径)
|
|
97
|
+
if (params.senderId) {
|
|
98
|
+
const apiKey = globalApiKeyMap.get(params.senderId);
|
|
99
|
+
if (apiKey)
|
|
100
|
+
return apiKey;
|
|
101
|
+
}
|
|
102
|
+
// 3. 从 sessionKey 中解析 uin,再查 globalApiKeyMap(兜底)
|
|
103
|
+
if (params.sessionKey) {
|
|
104
|
+
const uin = extractUinFromSessionKey(params.sessionKey);
|
|
105
|
+
if (uin) {
|
|
106
|
+
const apiKey = globalApiKeyMap.get(uin);
|
|
107
|
+
if (apiKey)
|
|
108
|
+
return apiKey;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// 4. 默认 apiKey
|
|
112
|
+
return globalDefaultApiKey;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 从 sessionKey 中提取 uin(peer ID)。
|
|
116
|
+
*
|
|
117
|
+
* 框架生成的 sessionKey 格式取决于 dmScope 配置:
|
|
118
|
+
* - per-channel-peer: "agent:<agentId>:<channel>:direct:<peerId>"
|
|
119
|
+
* - per-account-channel-peer: "agent:<agentId>:<channel>:<accountId>:direct:<peerId>"
|
|
120
|
+
* - per-peer: "agent:<agentId>:direct:<peerId>"
|
|
121
|
+
* - main (默认): "agent:<agentId>:main" ← 不含 peerId
|
|
122
|
+
*
|
|
123
|
+
* 也兼容旧格式 "lightclawbot:dm:<peerId>"。
|
|
124
|
+
*/
|
|
125
|
+
export function extractUinFromSessionKey(sessionKey) {
|
|
126
|
+
if (!sessionKey)
|
|
127
|
+
return undefined;
|
|
128
|
+
const lower = sessionKey.toLowerCase();
|
|
129
|
+
// 新格式:查找 ":direct:<peerId>" 片段
|
|
130
|
+
const directIdx = lower.indexOf(":direct:");
|
|
131
|
+
if (directIdx >= 0) {
|
|
132
|
+
const afterDirect = sessionKey.slice(directIdx + ":direct:".length);
|
|
133
|
+
// peerId 可能后面还跟着 ":thread:xxx" 等后缀,取第一段
|
|
134
|
+
const peerId = afterDirect.split(":")[0];
|
|
135
|
+
return peerId || undefined;
|
|
136
|
+
}
|
|
137
|
+
// 旧格式兼容:lightclawbot:dm:<peerId>
|
|
138
|
+
const legacyPrefix = `${CHANNEL_KEY}:dm:`;
|
|
139
|
+
if (lower.startsWith(legacyPrefix.toLowerCase())) {
|
|
140
|
+
return sessionKey.slice(legacyPrefix.length) || undefined;
|
|
141
|
+
}
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
54
144
|
// ============================================================
|
|
55
145
|
// API 路径配置
|
|
56
146
|
// ============================================================
|
|
@@ -118,8 +208,9 @@ export function listAccountIds(cfg) {
|
|
|
118
208
|
if (!section)
|
|
119
209
|
return [];
|
|
120
210
|
const ids = [];
|
|
121
|
-
// 默认账户:顶层有
|
|
122
|
-
|
|
211
|
+
// 默认账户:顶层有 apiKeys 即视为存在
|
|
212
|
+
const keys = section.apiKeys;
|
|
213
|
+
if (Array.isArray(keys) && keys.length > 0) {
|
|
123
214
|
ids.push(DEFAULT_ACCOUNT_ID);
|
|
124
215
|
}
|
|
125
216
|
// 命名账户
|
|
@@ -142,11 +233,17 @@ export function resolveAccount(cfg, accountId) {
|
|
|
142
233
|
const accounts = section.accounts;
|
|
143
234
|
raw = accounts?.[id] ?? {};
|
|
144
235
|
}
|
|
145
|
-
//
|
|
146
|
-
const
|
|
236
|
+
// 解析 apiKeys(配置中只有 apiKeys,不会有 apiKey)
|
|
237
|
+
const allApiKeys = Array.isArray(raw.apiKeys) ? raw.apiKeys.filter(Boolean) : [];
|
|
238
|
+
// 主 key = apiKeys[0],环境变量作为兜底
|
|
239
|
+
const apiKey = allApiKeys[0] || process.env[ENV_API_KEY] || "";
|
|
147
240
|
const apiBaseUrl = raw.apiBaseUrl || process.env[ENV_API_BASE_URL] || "";
|
|
241
|
+
// 如果环境变量提供了 key 且 allApiKeys 为空,补入
|
|
242
|
+
if (!allApiKeys.length && apiKey) {
|
|
243
|
+
allApiKeys.push(apiKey);
|
|
244
|
+
}
|
|
148
245
|
let secretSource = "none";
|
|
149
|
-
if (
|
|
246
|
+
if (allApiKeys.length > 0) {
|
|
150
247
|
secretSource = "config";
|
|
151
248
|
}
|
|
152
249
|
else if (process.env[ENV_API_KEY]) {
|
|
@@ -155,6 +252,7 @@ export function resolveAccount(cfg, accountId) {
|
|
|
155
252
|
return {
|
|
156
253
|
accountId: id,
|
|
157
254
|
apiKey,
|
|
255
|
+
allApiKeys,
|
|
158
256
|
apiBaseUrl,
|
|
159
257
|
enabled: raw.enabled ?? true,
|
|
160
258
|
name: raw.name,
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAC1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAE5C,WAAW;AACX,MAAM,WAAW,GAAG,mBAAmB,CAAC;AACxC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAElD,+DAA+D;AAC/D,cAAc;AACd,+DAA+D;AAE/D,aAAa;AACb,MAAM,CAAC,MAAM,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download-tool.d.ts","sourceRoot":"","sources":["../../src/download-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"download-tool.d.ts","sourceRoot":"","sources":["../../src/download-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AAa3E,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAE3D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;CA0B9B,CAAC;AAMF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAuHjE"}
|
|
@@ -11,7 +11,7 @@ import * as fs from "node:fs";
|
|
|
11
11
|
import * as path from "node:path";
|
|
12
12
|
import { getFileDownloadUrl, downloadFileFromCos, uploadFileToCos, } from "./file-storage.js";
|
|
13
13
|
import { formatFileSize } from "./media.js";
|
|
14
|
-
import {
|
|
14
|
+
import { resolveEffectiveApiKey } from "./config.js";
|
|
15
15
|
// ============================================================
|
|
16
16
|
// 工具参数 schema
|
|
17
17
|
// ============================================================
|
|
@@ -41,20 +41,14 @@ export const downloadToolSchema = {
|
|
|
41
41
|
required: ["action", "filePath"],
|
|
42
42
|
};
|
|
43
43
|
// ============================================================
|
|
44
|
-
// 辅助:从 api.config 动态解析出 FileStorageConfig
|
|
45
|
-
// ============================================================
|
|
46
|
-
function resolveStorageConfig(api, defaultAccountId) {
|
|
47
|
-
if (!api.config)
|
|
48
|
-
return {};
|
|
49
|
-
const account = resolveAccount(api.config, defaultAccountId);
|
|
50
|
-
return { apiKey: account.apiKey };
|
|
51
|
-
}
|
|
52
|
-
// ============================================================
|
|
53
44
|
// 工具注册(飞书工厂函数模式)
|
|
54
45
|
// ============================================================
|
|
55
46
|
export function registerDownloadTool(api) {
|
|
47
|
+
// 通过闭包捕获 api.logger,tool ctx 中没有 log
|
|
48
|
+
const log = api.logger;
|
|
56
49
|
api.registerTool((ctx) => {
|
|
57
50
|
const defaultAccountId = ctx.agentAccountId;
|
|
51
|
+
const sessionKey = ctx.sessionKey;
|
|
58
52
|
return {
|
|
59
53
|
name: DOWNLOAD_TOOL_NAME,
|
|
60
54
|
description: "Manage files on Tencent COS cloud storage. " +
|
|
@@ -65,8 +59,12 @@ export function registerDownloadTool(api) {
|
|
|
65
59
|
"Note: For batch uploading files to share with users, prefer lightclaw_upload_file instead.",
|
|
66
60
|
parameters: downloadToolSchema,
|
|
67
61
|
async execute(_toolCallId, params) {
|
|
68
|
-
//
|
|
69
|
-
|
|
62
|
+
// 调试日志:打印原始 sessionKey,帮助排查多 key 模式下的 apiKey 选取
|
|
63
|
+
// 使用 warn 级别输出,确保终端可见
|
|
64
|
+
log.warn(`[lightclaw_get_file_url] sessionKey="${sessionKey}", accountId="${defaultAccountId}"`);
|
|
65
|
+
// 每次 execute 时动态解析 apiKey(多 key 模式下通过 sessionKey 直接获取)
|
|
66
|
+
const apiKey = resolveEffectiveApiKey({ sessionKey });
|
|
67
|
+
log.warn(`[lightclaw_get_file_url] resolved apiKey="${apiKey?.slice(0, 8)}..."`);
|
|
70
68
|
const { action, filePath, localDir } = params;
|
|
71
69
|
if (!filePath || typeof filePath !== "string") {
|
|
72
70
|
return {
|
|
@@ -77,13 +75,14 @@ export function registerDownloadTool(api) {
|
|
|
77
75
|
switch (action) {
|
|
78
76
|
case "get_url": {
|
|
79
77
|
const url = getFileDownloadUrl(filePath);
|
|
78
|
+
const fileName = filePath.split("/").pop() || filePath;
|
|
80
79
|
return {
|
|
81
|
-
content: [{ type: "text", text: `
|
|
80
|
+
content: [{ type: "text", text: `[${fileName}](${url})` }],
|
|
82
81
|
details: { action, filePath, url },
|
|
83
82
|
};
|
|
84
83
|
}
|
|
85
84
|
case "download_to_local": {
|
|
86
|
-
const result = await downloadFileFromCos(filePath,
|
|
85
|
+
const result = await downloadFileFromCos(filePath, { apiKey });
|
|
87
86
|
const targetDir = localDir || process.cwd();
|
|
88
87
|
// 确保目录存在
|
|
89
88
|
if (!fs.existsSync(targetDir)) {
|
|
@@ -111,11 +110,12 @@ export function registerDownloadTool(api) {
|
|
|
111
110
|
content: [{ type: "text", text: `Error: local file not found: ${filePath}` }],
|
|
112
111
|
};
|
|
113
112
|
}
|
|
114
|
-
const uploadResult = await uploadFileToCos(filePath,
|
|
113
|
+
const uploadResult = await uploadFileToCos(filePath, { apiKey });
|
|
114
|
+
const fileName = path.basename(filePath);
|
|
115
115
|
return {
|
|
116
116
|
content: [{
|
|
117
117
|
type: "text",
|
|
118
|
-
text: `File uploaded
|
|
118
|
+
text: `File uploaded.\n\n[${fileName}](${uploadResult.url})`,
|
|
119
119
|
}],
|
|
120
120
|
details: {
|
|
121
121
|
action,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download-tool.js","sourceRoot":"","sources":["../../src/download-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,
|
|
1
|
+
{"version":3,"file":"download-tool.js","sourceRoot":"","sources":["../../src/download-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-storage.d.ts","sourceRoot":"","sources":["../../src/file-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,iBAAsB,EAC9B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"file-storage.d.ts","sourceRoot":"","sources":["../../src/file-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,iBAAsB,EAC9B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,YAAY,CAAC,CAuDvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,iBAAsB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAsCvB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,GACf,MAAM,CAER;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,iBAAsB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAwBzB;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,iBAAsB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
package/dist/src/file-storage.js
CHANGED
|
@@ -35,9 +35,8 @@ export async function uploadFileToCos(localPath, config = {}, customFileName) {
|
|
|
35
35
|
const fileBuffer = fs.readFileSync(localPath);
|
|
36
36
|
const ext = path.extname(fileName).toLowerCase();
|
|
37
37
|
const mimeType = guessMimeByExt(ext);
|
|
38
|
-
//
|
|
39
|
-
const
|
|
40
|
-
const filePath = `${datePart}/${fileName}`;
|
|
38
|
+
// 时间戳目录 + 原始文件名,天然唯一且简洁
|
|
39
|
+
const filePath = `${Date.now()}/${fileName}`;
|
|
41
40
|
// 使用 fetch + FormData 上传
|
|
42
41
|
const { Blob: NodeBlob } = await import("node:buffer");
|
|
43
42
|
const blob = new NodeBlob([fileBuffer], { type: mimeType });
|
|
@@ -78,8 +77,7 @@ export async function uploadFileToCos(localPath, config = {}, customFileName) {
|
|
|
78
77
|
* @returns 上传结果,包含公网 URL
|
|
79
78
|
*/
|
|
80
79
|
export async function uploadBufferToCos(buffer, fileName, mimeType, config = {}) {
|
|
81
|
-
const
|
|
82
|
-
const filePath = `${datePart}/${fileName}`;
|
|
80
|
+
const filePath = `${Date.now()}/${fileName}`;
|
|
83
81
|
const { Blob: NodeBlob } = await import("node:buffer");
|
|
84
82
|
const blob = new NodeBlob([new Uint8Array(buffer)], { type: mimeType });
|
|
85
83
|
const formData = new FormData();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-storage.js","sourceRoot":"","sources":["../../src/file-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,aAAa,CAAC;AA6BrB,+DAA+D;AAC/D,OAAO;AACP,+DAA+D;AAE/D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAiB,EACjB,SAA4B,EAAE,EAC9B,cAAuB;IAEvB,SAAS;IACT,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAErC,
|
|
1
|
+
{"version":3,"file":"file-storage.js","sourceRoot":"","sources":["../../src/file-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LightClaw — COS URL 格式化
|
|
3
|
+
*
|
|
4
|
+
* 将消息文本中的裸 COS 下载链接自动转换为 Markdown 链接格式:
|
|
5
|
+
* 裸链接: https://lightai.cloud.tencent.com/cosmanager/getFileStream?filePath=2026-03-15/report.pdf
|
|
6
|
+
* Markdown: [report.pdf](https://lightai.cloud.tencent.com/cosmanager/getFileStream?filePath=2026-03-15/report.pdf)
|
|
7
|
+
*
|
|
8
|
+
* 使用场景:
|
|
9
|
+
* 1. gateway.ts sendReply / sendFiles — 兜底确保最终发出去的消息格式正确
|
|
10
|
+
* 2. outbound.ts sendViaSocket — 出站消息同理
|
|
11
|
+
*
|
|
12
|
+
* 设计要点:
|
|
13
|
+
* - 负向后瞻 (?<!\]\() 避免对已有 Markdown 链接二次包装
|
|
14
|
+
* - 负向后瞻 (?<!\() 避免对 (URL) 形式的括号内链接重复处理
|
|
15
|
+
* - 从 filePath 参数提取文件名作为链接文本
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* 将文本中的裸 COS 下载链接转换为 Markdown 链接。
|
|
19
|
+
*
|
|
20
|
+
* 已是 `[xxx](url)` 格式的不会被重复处理。
|
|
21
|
+
*
|
|
22
|
+
* @param text - 原始消息文本
|
|
23
|
+
* @returns 转换后的文本
|
|
24
|
+
*/
|
|
25
|
+
export declare function formatCosUrls(text: string): string;
|
|
26
|
+
//# sourceMappingURL=format-urls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-urls.d.ts","sourceRoot":"","sources":["../../src/format-urls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA6BH;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOlD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LightClaw — COS URL 格式化
|
|
3
|
+
*
|
|
4
|
+
* 将消息文本中的裸 COS 下载链接自动转换为 Markdown 链接格式:
|
|
5
|
+
* 裸链接: https://lightai.cloud.tencent.com/cosmanager/getFileStream?filePath=2026-03-15/report.pdf
|
|
6
|
+
* Markdown: [report.pdf](https://lightai.cloud.tencent.com/cosmanager/getFileStream?filePath=2026-03-15/report.pdf)
|
|
7
|
+
*
|
|
8
|
+
* 使用场景:
|
|
9
|
+
* 1. gateway.ts sendReply / sendFiles — 兜底确保最终发出去的消息格式正确
|
|
10
|
+
* 2. outbound.ts sendViaSocket — 出站消息同理
|
|
11
|
+
*
|
|
12
|
+
* 设计要点:
|
|
13
|
+
* - 负向后瞻 (?<!\]\() 避免对已有 Markdown 链接二次包装
|
|
14
|
+
* - 负向后瞻 (?<!\() 避免对 (URL) 形式的括号内链接重复处理
|
|
15
|
+
* - 从 filePath 参数提取文件名作为链接文本
|
|
16
|
+
*/
|
|
17
|
+
import { DOMAIN, API_PATH_DOWNLOAD } from "./config.js";
|
|
18
|
+
// ============================================================
|
|
19
|
+
// 核心正则 — 匹配裸 COS 下载链接
|
|
20
|
+
// ============================================================
|
|
21
|
+
// 转义域名中的点号用于正则
|
|
22
|
+
const ESCAPED_DOMAIN = DOMAIN.replace(/\./g, "\\.");
|
|
23
|
+
const ESCAPED_PATH = API_PATH_DOWNLOAD.replace(/\//g, "\\/");
|
|
24
|
+
/**
|
|
25
|
+
* 匹配 COS 下载链接,但排除已在 Markdown 链接 `](url)` 中的情况。
|
|
26
|
+
*
|
|
27
|
+
* 结构:
|
|
28
|
+
* (?<!\]\()(?<!\() — 前面不是 "](" 也不是 "("
|
|
29
|
+
* https://DOMAIN/cosmanager/getFileStream\?filePath=
|
|
30
|
+
* ([^\s)\]]+) — 捕获组:filePath 值(遇到空白/)/] 停止)
|
|
31
|
+
*/
|
|
32
|
+
const COS_URL_RE = new RegExp(`(?<!\\]\\()(?<!\\()https://${ESCAPED_DOMAIN}${ESCAPED_PATH}\\?filePath=([^\\s)\\]]+)`, "g");
|
|
33
|
+
// ============================================================
|
|
34
|
+
// 公开 API
|
|
35
|
+
// ============================================================
|
|
36
|
+
/**
|
|
37
|
+
* 将文本中的裸 COS 下载链接转换为 Markdown 链接。
|
|
38
|
+
*
|
|
39
|
+
* 已是 `[xxx](url)` 格式的不会被重复处理。
|
|
40
|
+
*
|
|
41
|
+
* @param text - 原始消息文本
|
|
42
|
+
* @returns 转换后的文本
|
|
43
|
+
*/
|
|
44
|
+
export function formatCosUrls(text) {
|
|
45
|
+
if (!text)
|
|
46
|
+
return text;
|
|
47
|
+
return text.replace(COS_URL_RE, (fullUrl, filePath) => {
|
|
48
|
+
const decoded = decodeURIComponent(filePath);
|
|
49
|
+
const fileName = decoded.split("/").pop() || decoded;
|
|
50
|
+
return `[${fileName}](${fullUrl})`;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=format-urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-urls.js","sourceRoot":"","sources":["../../src/format-urls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAExD,+DAA+D;AAC/D,sBAAsB;AACtB,+DAA+D;AAE/D,eAAe;AACf,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACpD,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAE7D;;;;;;;GAOG;AACH,MAAM,UAAU,GAAG,IAAI,MAAM,CAC3B,8BAA8B,cAAc,GAAG,YAAY,2BAA2B,EACtF,GAAG,CACJ,CAAC;AAEF,+DAA+D;AAC/D,SAAS;AACT,+DAA+D;AAE/D;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,QAAgB,EAAE,EAAE;QAC5D,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC;QACrD,OAAO,IAAI,QAAQ,KAAK,OAAO,GAAG,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,cAAc,EAIf,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,cAAc,EAIf,MAAM,YAAY,CAAC;AA6IpB,wBAAsB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiOrE"}
|