@hywkp/sider 0.0.4 → 0.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 +280 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -1
- package/dist/index.js.map +1 -1
- package/dist/src/channel.d.ts +12 -0
- package/dist/src/channel.d.ts.map +1 -1
- package/dist/src/channel.js +369 -151
- package/dist/src/channel.js.map +1 -1
- package/dist/src/inbound-media.d.ts +24 -0
- package/dist/src/inbound-media.d.ts.map +1 -0
- package/dist/src/inbound-media.js +56 -0
- package/dist/src/inbound-media.js.map +1 -0
- package/dist/src/media-upload.d.ts +31 -0
- package/dist/src/media-upload.d.ts.map +1 -0
- package/dist/src/media-upload.js +319 -0
- package/dist/src/media-upload.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { loadOutboundMediaFromUrl, resolveOutboundMediaUrls } from "openclaw/plugin-sdk";
|
|
3
|
+
const DEFAULT_MIME = "application/octet-stream";
|
|
4
|
+
const MIME_BY_EXTENSION = {
|
|
5
|
+
".jpg": "image/jpeg",
|
|
6
|
+
".jpeg": "image/jpeg",
|
|
7
|
+
".png": "image/png",
|
|
8
|
+
".gif": "image/gif",
|
|
9
|
+
".webp": "image/webp",
|
|
10
|
+
".bmp": "image/bmp",
|
|
11
|
+
".svg": "image/svg+xml",
|
|
12
|
+
".pdf": "application/pdf",
|
|
13
|
+
".txt": "text/plain",
|
|
14
|
+
".json": "application/json",
|
|
15
|
+
".zip": "application/zip",
|
|
16
|
+
};
|
|
17
|
+
const EXTENSION_BY_MIME = {
|
|
18
|
+
"image/jpeg": ".jpg",
|
|
19
|
+
"image/png": ".png",
|
|
20
|
+
"image/gif": ".gif",
|
|
21
|
+
"image/webp": ".webp",
|
|
22
|
+
"image/bmp": ".bmp",
|
|
23
|
+
"image/svg+xml": ".svg",
|
|
24
|
+
"application/pdf": ".pdf",
|
|
25
|
+
"text/plain": ".txt",
|
|
26
|
+
"application/json": ".json",
|
|
27
|
+
"application/zip": ".zip",
|
|
28
|
+
};
|
|
29
|
+
function toRecord(value) {
|
|
30
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
function normalizeMime(raw) {
|
|
36
|
+
const value = raw?.trim().toLowerCase();
|
|
37
|
+
if (!value) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
const normalized = value.split(";")[0]?.trim();
|
|
41
|
+
return normalized || undefined;
|
|
42
|
+
}
|
|
43
|
+
function extFromPath(raw) {
|
|
44
|
+
const qPos = raw.indexOf("?");
|
|
45
|
+
const sanitized = qPos >= 0 ? raw.slice(0, qPos) : raw;
|
|
46
|
+
const slashPos = Math.max(sanitized.lastIndexOf("/"), sanitized.lastIndexOf("\\"));
|
|
47
|
+
const last = slashPos >= 0 ? sanitized.slice(slashPos + 1) : sanitized;
|
|
48
|
+
const dotPos = last.lastIndexOf(".");
|
|
49
|
+
return dotPos >= 0 ? last.slice(dotPos).toLowerCase() : "";
|
|
50
|
+
}
|
|
51
|
+
function fileNameFromMediaUrl(raw) {
|
|
52
|
+
try {
|
|
53
|
+
if (/^https?:\/\//i.test(raw) || /^file:\/\//i.test(raw)) {
|
|
54
|
+
const pathname = new URL(raw).pathname;
|
|
55
|
+
const seg = pathname.split("/").filter(Boolean).pop();
|
|
56
|
+
return seg || undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// no-op
|
|
61
|
+
}
|
|
62
|
+
const qPos = raw.indexOf("?");
|
|
63
|
+
const sanitized = qPos >= 0 ? raw.slice(0, qPos) : raw;
|
|
64
|
+
const seg = sanitized.split(/[\\/]/).filter(Boolean).pop();
|
|
65
|
+
return seg || undefined;
|
|
66
|
+
}
|
|
67
|
+
function normalizeFileName(raw, fallback) {
|
|
68
|
+
const base = (raw ?? "").trim().split(/[\\/]/).filter(Boolean).pop() ?? "";
|
|
69
|
+
const cleaned = base.replace(/[\u0000-\u001f]/g, "");
|
|
70
|
+
if (!cleaned || cleaned === "." || cleaned === "..") {
|
|
71
|
+
return fallback;
|
|
72
|
+
}
|
|
73
|
+
return cleaned.slice(0, 255);
|
|
74
|
+
}
|
|
75
|
+
function inferMimeFromFileName(fileName) {
|
|
76
|
+
const ext = extFromPath(fileName);
|
|
77
|
+
return MIME_BY_EXTENSION[ext];
|
|
78
|
+
}
|
|
79
|
+
function inferFallbackFileName(params) {
|
|
80
|
+
const ext = EXTENSION_BY_MIME[params.mimeType];
|
|
81
|
+
if (ext) {
|
|
82
|
+
return `attachment${ext}`;
|
|
83
|
+
}
|
|
84
|
+
return params.mediaKind === "image" ? "attachment.png" : "attachment.bin";
|
|
85
|
+
}
|
|
86
|
+
function sha256Hex(buffer) {
|
|
87
|
+
return createHash("sha256").update(buffer).digest("hex");
|
|
88
|
+
}
|
|
89
|
+
function resolveGatewayApiUrl(gatewayUrl, path) {
|
|
90
|
+
const url = new URL(gatewayUrl);
|
|
91
|
+
const basePath = url.pathname.replace(/\/+$/, "");
|
|
92
|
+
const suffix = path.startsWith("/") ? path : `/${path}`;
|
|
93
|
+
url.pathname = `${basePath}${suffix}`;
|
|
94
|
+
url.search = "";
|
|
95
|
+
url.hash = "";
|
|
96
|
+
return url.toString();
|
|
97
|
+
}
|
|
98
|
+
async function readResponseErrorBody(response) {
|
|
99
|
+
try {
|
|
100
|
+
const text = (await response.text()).trim();
|
|
101
|
+
return text;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return "";
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async function postJson(params) {
|
|
108
|
+
const response = await fetch(params.url, {
|
|
109
|
+
method: "POST",
|
|
110
|
+
headers: {
|
|
111
|
+
"Content-Type": "application/json",
|
|
112
|
+
},
|
|
113
|
+
body: JSON.stringify(params.body),
|
|
114
|
+
signal: AbortSignal.timeout(params.timeoutMs),
|
|
115
|
+
});
|
|
116
|
+
const text = await response.text();
|
|
117
|
+
if (!response.ok) {
|
|
118
|
+
const hint = text ? `: ${text.slice(0, 300)}` : "";
|
|
119
|
+
throw new Error(`HTTP ${response.status} ${response.statusText}${hint}`);
|
|
120
|
+
}
|
|
121
|
+
let parsed = {};
|
|
122
|
+
if (text.trim()) {
|
|
123
|
+
try {
|
|
124
|
+
parsed = JSON.parse(text);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
throw new Error(`invalid JSON response from ${params.url}: ${String(error)}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return parsed;
|
|
131
|
+
}
|
|
132
|
+
function parseFileInitResult(value) {
|
|
133
|
+
const record = toRecord(value);
|
|
134
|
+
if (!record) {
|
|
135
|
+
throw new Error("files/init returned invalid response");
|
|
136
|
+
}
|
|
137
|
+
const fileId = typeof record.file_id === "string" ? record.file_id.trim() : "";
|
|
138
|
+
const objectKey = typeof record.object_key === "string" ? record.object_key.trim() : "";
|
|
139
|
+
const uploadUrl = typeof record.upload_url === "string" ? record.upload_url.trim() : "";
|
|
140
|
+
if (!fileId || !objectKey || !uploadUrl) {
|
|
141
|
+
throw new Error("files/init response missing file_id/object_key/upload_url");
|
|
142
|
+
}
|
|
143
|
+
return { fileId, objectKey, uploadUrl };
|
|
144
|
+
}
|
|
145
|
+
async function initFileUpload(params) {
|
|
146
|
+
const url = resolveGatewayApiUrl(params.account.gatewayUrl, "/v1/files/init");
|
|
147
|
+
const response = await postJson({
|
|
148
|
+
url,
|
|
149
|
+
timeoutMs: params.account.sendTimeoutMs,
|
|
150
|
+
body: {
|
|
151
|
+
session_id: params.sessionId,
|
|
152
|
+
name: params.fileName,
|
|
153
|
+
size: params.size,
|
|
154
|
+
mime: params.mimeType,
|
|
155
|
+
sha256: params.sha256,
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
return parseFileInitResult(response);
|
|
159
|
+
}
|
|
160
|
+
async function uploadToObjectStore(params) {
|
|
161
|
+
const headers = {};
|
|
162
|
+
if (params.mimeType) {
|
|
163
|
+
headers["Content-Type"] = params.mimeType;
|
|
164
|
+
}
|
|
165
|
+
if (params.sha256) {
|
|
166
|
+
// Required by gateway presign input (PutObjectInput.Metadata["sha256"]).
|
|
167
|
+
headers["x-amz-meta-sha256"] = params.sha256;
|
|
168
|
+
}
|
|
169
|
+
const response = await fetch(params.uploadUrl, {
|
|
170
|
+
method: "PUT",
|
|
171
|
+
headers,
|
|
172
|
+
body: new Uint8Array(params.buffer),
|
|
173
|
+
signal: AbortSignal.timeout(params.timeoutMs),
|
|
174
|
+
});
|
|
175
|
+
if (!response.ok) {
|
|
176
|
+
const detail = await readResponseErrorBody(response);
|
|
177
|
+
const hint = detail ? `: ${detail.slice(0, 300)}` : "";
|
|
178
|
+
throw new Error(`upload failed (${response.status} ${response.statusText})${hint}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async function completeFileUploadBestEffort(params) {
|
|
182
|
+
const url = resolveGatewayApiUrl(params.account.gatewayUrl, "/v1/files/complete");
|
|
183
|
+
try {
|
|
184
|
+
await postJson({
|
|
185
|
+
url,
|
|
186
|
+
timeoutMs: params.account.sendTimeoutMs,
|
|
187
|
+
body: {
|
|
188
|
+
session_id: params.sessionId,
|
|
189
|
+
file_id: params.fileId,
|
|
190
|
+
object_key: params.objectKey,
|
|
191
|
+
size: params.size,
|
|
192
|
+
sha256: params.sha256,
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
params.logger?.warn?.("sider files/complete failed (ignored)", {
|
|
198
|
+
accountId: params.account.accountId,
|
|
199
|
+
sessionId: params.sessionId,
|
|
200
|
+
fileId: params.fileId,
|
|
201
|
+
objectKey: params.objectKey,
|
|
202
|
+
error: String(error),
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async function uploadMediaToSider(params) {
|
|
207
|
+
const loaded = await loadOutboundMediaFromUrl(params.mediaUrl, {
|
|
208
|
+
mediaLocalRoots: params.mediaLocalRoots,
|
|
209
|
+
});
|
|
210
|
+
const contentType = normalizeMime(loaded.contentType);
|
|
211
|
+
const inferredKind = loaded.kind === "image" || contentType?.startsWith("image/") ? "image" : "file";
|
|
212
|
+
const sourceName = loaded.fileName || fileNameFromMediaUrl(params.mediaUrl);
|
|
213
|
+
const fallbackName = inferFallbackFileName({
|
|
214
|
+
mimeType: contentType ?? DEFAULT_MIME,
|
|
215
|
+
mediaKind: inferredKind,
|
|
216
|
+
});
|
|
217
|
+
const fileName = normalizeFileName(sourceName, fallbackName);
|
|
218
|
+
const mimeType = contentType || inferMimeFromFileName(fileName) || DEFAULT_MIME;
|
|
219
|
+
const size = loaded.buffer.length;
|
|
220
|
+
if (size <= 0) {
|
|
221
|
+
throw new Error(`empty media buffer from ${params.mediaUrl}`);
|
|
222
|
+
}
|
|
223
|
+
const sha256 = sha256Hex(loaded.buffer);
|
|
224
|
+
const initResult = await initFileUpload({
|
|
225
|
+
account: params.account,
|
|
226
|
+
sessionId: params.sessionId,
|
|
227
|
+
fileName,
|
|
228
|
+
size,
|
|
229
|
+
mimeType,
|
|
230
|
+
sha256,
|
|
231
|
+
});
|
|
232
|
+
params.logger?.debug?.("sider files/init success", {
|
|
233
|
+
accountId: params.account.accountId,
|
|
234
|
+
sessionId: params.sessionId,
|
|
235
|
+
fileId: initResult.fileId,
|
|
236
|
+
objectKey: initResult.objectKey,
|
|
237
|
+
size,
|
|
238
|
+
mimeType,
|
|
239
|
+
});
|
|
240
|
+
try {
|
|
241
|
+
await uploadToObjectStore({
|
|
242
|
+
uploadUrl: initResult.uploadUrl,
|
|
243
|
+
mimeType,
|
|
244
|
+
sha256,
|
|
245
|
+
buffer: loaded.buffer,
|
|
246
|
+
timeoutMs: params.account.sendTimeoutMs,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
params.logger?.warn?.("sider object upload failed", {
|
|
251
|
+
accountId: params.account.accountId,
|
|
252
|
+
sessionId: params.sessionId,
|
|
253
|
+
fileId: initResult.fileId,
|
|
254
|
+
objectKey: initResult.objectKey,
|
|
255
|
+
mimeType,
|
|
256
|
+
hasSha256Header: Boolean(sha256),
|
|
257
|
+
error: String(error),
|
|
258
|
+
});
|
|
259
|
+
throw error;
|
|
260
|
+
}
|
|
261
|
+
await completeFileUploadBestEffort({
|
|
262
|
+
account: params.account,
|
|
263
|
+
sessionId: params.sessionId,
|
|
264
|
+
fileId: initResult.fileId,
|
|
265
|
+
objectKey: initResult.objectKey,
|
|
266
|
+
size,
|
|
267
|
+
sha256,
|
|
268
|
+
logger: params.logger,
|
|
269
|
+
});
|
|
270
|
+
return {
|
|
271
|
+
fileId: initResult.fileId,
|
|
272
|
+
objectKey: initResult.objectKey,
|
|
273
|
+
fileName,
|
|
274
|
+
mimeType,
|
|
275
|
+
size,
|
|
276
|
+
sha256,
|
|
277
|
+
mediaKind: inferredKind,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
export async function buildSiderPartsFromReplyPayload(params) {
|
|
281
|
+
const parts = [];
|
|
282
|
+
const text = params.payload.text?.trim();
|
|
283
|
+
if (text) {
|
|
284
|
+
parts.push({
|
|
285
|
+
type: "core.text",
|
|
286
|
+
spec_version: 1,
|
|
287
|
+
payload: { text },
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
const mediaUrls = resolveOutboundMediaUrls(params.payload);
|
|
291
|
+
for (const mediaUrl of mediaUrls) {
|
|
292
|
+
const uploaded = await uploadMediaToSider({
|
|
293
|
+
account: params.account,
|
|
294
|
+
sessionId: params.sessionId,
|
|
295
|
+
mediaUrl,
|
|
296
|
+
mediaLocalRoots: params.mediaLocalRoots,
|
|
297
|
+
logger: params.logger,
|
|
298
|
+
});
|
|
299
|
+
parts.push({
|
|
300
|
+
type: "core.file",
|
|
301
|
+
spec_version: 1,
|
|
302
|
+
payload: {
|
|
303
|
+
file_id: uploaded.fileId,
|
|
304
|
+
object_key: uploaded.objectKey,
|
|
305
|
+
name: uploaded.fileName,
|
|
306
|
+
size: uploaded.size,
|
|
307
|
+
mime: uploaded.mimeType,
|
|
308
|
+
sha256: uploaded.sha256,
|
|
309
|
+
upload_status: "uploaded",
|
|
310
|
+
},
|
|
311
|
+
meta: {
|
|
312
|
+
source_media_url: mediaUrl,
|
|
313
|
+
media_kind: uploaded.mediaKind,
|
|
314
|
+
},
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
return parts;
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=media-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-upload.js","sourceRoot":"","sources":["../../src/media-upload.ts"],"names":[],"mappings":"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"}
|