@yuzhf/oneainexus-openclaw-connector 0.1.4

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 (47) hide show
  1. package/README.md +221 -0
  2. package/dist/index.d.ts +13 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +12 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/setup-entry.d.ts +5 -0
  7. package/dist/setup-entry.d.ts.map +1 -0
  8. package/dist/setup-entry.js +4 -0
  9. package/dist/setup-entry.js.map +1 -0
  10. package/dist/src/channel.d.ts +3 -0
  11. package/dist/src/channel.d.ts.map +1 -0
  12. package/dist/src/channel.js +149 -0
  13. package/dist/src/channel.js.map +1 -0
  14. package/dist/src/config.d.ts +85 -0
  15. package/dist/src/config.d.ts.map +1 -0
  16. package/dist/src/config.js +116 -0
  17. package/dist/src/config.js.map +1 -0
  18. package/dist/src/inbound.d.ts +9 -0
  19. package/dist/src/inbound.d.ts.map +1 -0
  20. package/dist/src/inbound.js +336 -0
  21. package/dist/src/inbound.js.map +1 -0
  22. package/dist/src/media-bridge.d.ts +10 -0
  23. package/dist/src/media-bridge.d.ts.map +1 -0
  24. package/dist/src/media-bridge.js +258 -0
  25. package/dist/src/media-bridge.js.map +1 -0
  26. package/dist/src/outbound.d.ts +61 -0
  27. package/dist/src/outbound.d.ts.map +1 -0
  28. package/dist/src/outbound.js +467 -0
  29. package/dist/src/outbound.js.map +1 -0
  30. package/dist/src/runtime-store.d.ts +14 -0
  31. package/dist/src/runtime-store.d.ts.map +1 -0
  32. package/dist/src/runtime-store.js +27 -0
  33. package/dist/src/runtime-store.js.map +1 -0
  34. package/dist/src/sdk-worker.d.ts +12 -0
  35. package/dist/src/sdk-worker.d.ts.map +1 -0
  36. package/dist/src/sdk-worker.js +186 -0
  37. package/dist/src/sdk-worker.js.map +1 -0
  38. package/dist/src/session-delete.d.ts +12 -0
  39. package/dist/src/session-delete.d.ts.map +1 -0
  40. package/dist/src/session-delete.js +40 -0
  41. package/dist/src/session-delete.js.map +1 -0
  42. package/dist/src/types.d.ts +35 -0
  43. package/dist/src/types.d.ts.map +1 -0
  44. package/dist/src/types.js +4 -0
  45. package/dist/src/types.js.map +1 -0
  46. package/openclaw.plugin.json +60 -0
  47. package/package.json +64 -0
@@ -0,0 +1,336 @@
1
+ import { resolveAgentWorkspaceDir } from 'openclaw/plugin-sdk/agent-runtime';
2
+ import { partToOpenClawMediaPath } from './media-bridge.js';
3
+ import { DEFAULT_ACCOUNT_ID } from './types.js';
4
+ import { deliverReplyPayloadToSession, noteSessionMediaFromText, noteSessionMediaFromWorkspace, payloadHasMedia, sendStreamDone, sendStreamError, sendStreamEvent, } from './outbound.js';
5
+ import { CHANNEL_ID } from './types.js';
6
+ function extractTextFromParts(parts) {
7
+ if (!parts?.length)
8
+ return '';
9
+ return parts
10
+ .map((part) => {
11
+ if (part.type === 'text')
12
+ return part.text;
13
+ if (part.type === 'image')
14
+ return part.alt || part.name || part.url;
15
+ return part.name || part.url;
16
+ })
17
+ .filter(Boolean)
18
+ .join('\n');
19
+ }
20
+ function normalizeTurnContent(message) {
21
+ return message.content ?? extractTextFromParts(message.parts);
22
+ }
23
+ function extractEnvelope(rawMessage) {
24
+ if (!rawMessage.data || typeof rawMessage.data !== 'object') {
25
+ return {};
26
+ }
27
+ return rawMessage.data;
28
+ }
29
+ function clipText(value, maxChars) {
30
+ if (value.length <= maxChars)
31
+ return value;
32
+ return `${value.slice(0, Math.max(0, maxChars - 3))}...`;
33
+ }
34
+ function formatToolStartText(payload) {
35
+ const name = payload.name?.trim();
36
+ const phase = payload.phase?.trim();
37
+ if (!name && !phase)
38
+ return null;
39
+ return `[tool] ${name ?? 'unknown'}${phase ? ` (${phase})` : ''}`;
40
+ }
41
+ function formatItemEventText(payload) {
42
+ const title = payload.title?.trim() || payload.name?.trim() || payload.kind?.trim() || payload.itemId?.trim();
43
+ const summary = payload.summary?.trim() || payload.progressText?.trim();
44
+ const status = payload.status?.trim() || payload.phase?.trim();
45
+ if (!title && !summary && !status)
46
+ return null;
47
+ const text = `[tool-item] ${title ?? 'task'}${status ? ` - ${status}` : ''}${summary ? `: ${summary}` : ''}`;
48
+ return clipText(text, 320);
49
+ }
50
+ function formatCommandOutputText(payload) {
51
+ const output = payload.output?.trim();
52
+ const status = payload.status?.trim();
53
+ const prefix = `[command${payload.name?.trim() ? `:${payload.name.trim()}` : ''}]`;
54
+ if (output) {
55
+ return `${prefix} ${clipText(output, 800)}`;
56
+ }
57
+ if (status || payload.exitCode != null) {
58
+ return `${prefix} ${status ?? 'finished'}${payload.exitCode == null ? '' : ` (exit=${payload.exitCode})`}`;
59
+ }
60
+ return null;
61
+ }
62
+ function normalizeToolResultText(text) {
63
+ return text?.trim() ?? '';
64
+ }
65
+ function resolveLatestUserTurn(envelope) {
66
+ const turns = envelope.messages ?? [];
67
+ for (let index = turns.length - 1; index >= 0; index -= 1) {
68
+ const turn = turns[index];
69
+ if (turn?.role === 'user') {
70
+ return turn;
71
+ }
72
+ }
73
+ return null;
74
+ }
75
+ async function buildInboundMessageContext(params) {
76
+ const envelope = extractEnvelope(params.rawMessage);
77
+ const latestUserTurn = resolveLatestUserTurn(envelope);
78
+ if (!latestUserTurn) {
79
+ return null;
80
+ }
81
+ const body = normalizeTurnContent(latestUserTurn);
82
+ if (!body.trim()) {
83
+ return null;
84
+ }
85
+ const mediaParts = (latestUserTurn.parts ?? []).filter((part) => part.type === 'image' || part.type === 'file');
86
+ const mediaUrls = await Promise.all(mediaParts.map((part) => partToOpenClawMediaPath(part)));
87
+ const mediaTypes = mediaParts.map((part) => part.mimeType ?? (part.type === 'image' ? 'image/*' : 'application/octet-stream'));
88
+ return {
89
+ body,
90
+ msgContext: {
91
+ Body: body,
92
+ BodyForAgent: body,
93
+ RawBody: body,
94
+ BodyForCommands: body,
95
+ CommandBody: body,
96
+ CommandAuthorized: true,
97
+ From: params.target,
98
+ To: params.target,
99
+ AccountId: params.accountId,
100
+ SenderId: params.target,
101
+ SenderName: params.target,
102
+ MessageSid: params.rawMessage.id,
103
+ Timestamp: params.rawMessage.timestamp,
104
+ ChatType: 'direct',
105
+ Provider: CHANNEL_ID,
106
+ Surface: CHANNEL_ID,
107
+ OriginatingChannel: CHANNEL_ID,
108
+ OriginatingTo: params.target,
109
+ ExplicitDeliverRoute: true,
110
+ ...(mediaUrls.length > 0 ? { MediaUrls: mediaUrls, MediaTypes: mediaTypes } : {}),
111
+ },
112
+ };
113
+ }
114
+ export async function handleInboundSdkChat(params) {
115
+ const accountId = params.accountId ?? DEFAULT_ACCOUNT_ID;
116
+ const envelope = extractEnvelope(params.rawMessage);
117
+ const sessionId = envelope.sessionId || params.rawMessage.sessionId;
118
+ if (!sessionId) {
119
+ throw new Error('Inbound SDK chat is missing sessionId.');
120
+ }
121
+ const target = `session:${sessionId}`;
122
+ const inbound = await buildInboundMessageContext({
123
+ rawMessage: params.rawMessage,
124
+ target,
125
+ accountId,
126
+ });
127
+ if (!inbound) {
128
+ return;
129
+ }
130
+ const route = params.runtime.channel.routing.resolveAgentRoute({
131
+ cfg: params.cfg,
132
+ channel: CHANNEL_ID,
133
+ accountId,
134
+ peer: {
135
+ kind: 'direct',
136
+ id: target,
137
+ },
138
+ });
139
+ const ctxPayload = params.runtime.channel.reply.finalizeInboundContext({
140
+ ...inbound.msgContext,
141
+ SessionKey: route.sessionKey,
142
+ });
143
+ const workspaceDir = resolveAgentWorkspaceDir(params.cfg, route.agentId);
144
+ const cfgWithSession = params.cfg;
145
+ const sessionStorePath = cfgWithSession.session?.store ?? cfgWithSession.sessions?.store;
146
+ const storePath = params.runtime.channel.session.resolveStorePath(sessionStorePath, {
147
+ agentId: route.agentId,
148
+ });
149
+ await params.runtime.channel.session.recordInboundSession({
150
+ storePath,
151
+ sessionKey: route.sessionKey,
152
+ ctx: ctxPayload,
153
+ createIfMissing: true,
154
+ updateLastRoute: {
155
+ sessionKey: route.sessionKey,
156
+ channel: CHANNEL_ID,
157
+ to: target,
158
+ accountId,
159
+ },
160
+ onRecordError: (error) => {
161
+ params.runtime.logging.getChildLogger({ plugin: CHANNEL_ID }).warn(`Failed to record inbound session for ${target}: ${String(error)}`);
162
+ },
163
+ });
164
+ try {
165
+ let streamedWithPartials = false;
166
+ const itemEventDedupe = new Map();
167
+ const commandOutputDedupe = new Set();
168
+ let lastToolName;
169
+ const replyOptions = {
170
+ onPartialReply: async (payload) => {
171
+ const hasText = typeof payload.text === 'string' && payload.text.length > 0;
172
+ const hasMedia = payloadHasMedia(payload);
173
+ if (!hasText && !hasMedia) {
174
+ return;
175
+ }
176
+ streamedWithPartials = true;
177
+ await noteSessionMediaFromWorkspace(sessionId, workspaceDir);
178
+ await deliverReplyPayloadToSession({
179
+ accountId,
180
+ target,
181
+ payload,
182
+ kind: 'block',
183
+ eventType: 'partial',
184
+ });
185
+ },
186
+ onToolStart: async (payload) => {
187
+ lastToolName = payload.name?.trim() || lastToolName;
188
+ const text = formatToolStartText(payload);
189
+ if (!text)
190
+ return;
191
+ await sendStreamEvent({
192
+ accountId,
193
+ target,
194
+ text,
195
+ eventType: 'tool_start',
196
+ eventData: {
197
+ name: payload.name,
198
+ phase: payload.phase,
199
+ },
200
+ });
201
+ },
202
+ onItemEvent: async (payload) => {
203
+ console.log('[connector] onItemEvent', payload);
204
+ const signature = [
205
+ payload.itemId ?? '',
206
+ payload.phase ?? '',
207
+ payload.status ?? '',
208
+ payload.summary ?? '',
209
+ payload.progressText ?? '',
210
+ ].join('|');
211
+ const dedupeKey = payload.itemId ?? `${payload.kind ?? ''}:${payload.name ?? ''}:${payload.title ?? ''}`;
212
+ if (dedupeKey && itemEventDedupe.get(dedupeKey) === signature) {
213
+ return;
214
+ }
215
+ if (dedupeKey) {
216
+ itemEventDedupe.set(dedupeKey, signature);
217
+ }
218
+ const text = formatItemEventText(payload);
219
+ if (!text)
220
+ return;
221
+ await sendStreamEvent({
222
+ accountId,
223
+ target,
224
+ text,
225
+ eventType: 'tool_item',
226
+ eventData: {
227
+ itemId: payload.itemId,
228
+ kind: payload.kind,
229
+ title: payload.title,
230
+ name: payload.name,
231
+ phase: payload.phase,
232
+ status: payload.status,
233
+ summary: payload.summary,
234
+ progressText: payload.progressText,
235
+ },
236
+ });
237
+ },
238
+ onCommandOutput: async (payload) => {
239
+ console.log('[connector] onCommandOutput', payload);
240
+ const text = formatCommandOutputText(payload);
241
+ if (!text)
242
+ return;
243
+ noteSessionMediaFromText(sessionId, `${payload.output ?? ''}\n${text}`);
244
+ await noteSessionMediaFromWorkspace(sessionId, workspaceDir);
245
+ commandOutputDedupe.add(normalizeToolResultText(text));
246
+ await sendStreamEvent({
247
+ accountId,
248
+ target,
249
+ text,
250
+ eventType: 'tool_output',
251
+ eventData: {
252
+ itemId: payload.itemId,
253
+ phase: payload.phase,
254
+ toolCallId: payload.toolCallId,
255
+ name: payload.name,
256
+ status: payload.status,
257
+ exitCode: payload.exitCode,
258
+ output: payload.output,
259
+ },
260
+ });
261
+ },
262
+ };
263
+ await params.runtime.channel.reply.dispatchReplyWithBufferedBlockDispatcher({
264
+ ctx: ctxPayload,
265
+ cfg: params.cfg,
266
+ dispatcherOptions: {
267
+ deliver: async (payload, info) => {
268
+ if (info.kind === 'tool') {
269
+ const text = normalizeToolResultText(payload.text);
270
+ const hasMedia = payloadHasMedia(payload);
271
+ if (text) {
272
+ noteSessionMediaFromText(sessionId, text);
273
+ }
274
+ await noteSessionMediaFromWorkspace(sessionId, workspaceDir);
275
+ const isDuplicateText = text.length > 0 && commandOutputDedupe.has(text);
276
+ if (isDuplicateText && !hasMedia) {
277
+ return;
278
+ }
279
+ if (text) {
280
+ commandOutputDedupe.add(text);
281
+ }
282
+ await deliverReplyPayloadToSession({
283
+ accountId,
284
+ target,
285
+ payload: {
286
+ ...payload,
287
+ text,
288
+ },
289
+ kind: 'tool',
290
+ eventType: 'tool_output',
291
+ eventData: {
292
+ name: lastToolName,
293
+ ...(text ? { output: text } : {}),
294
+ },
295
+ });
296
+ return;
297
+ }
298
+ const shouldStripTextForDuplicate = streamedWithPartials &&
299
+ (info.kind === 'block' || info.kind === 'final') &&
300
+ typeof payload.text === 'string' &&
301
+ payload.text.trim().length > 0;
302
+ const nextPayload = shouldStripTextForDuplicate
303
+ ? {
304
+ ...payload,
305
+ text: '',
306
+ }
307
+ : payload;
308
+ await noteSessionMediaFromWorkspace(sessionId, workspaceDir);
309
+ await deliverReplyPayloadToSession({
310
+ accountId,
311
+ target,
312
+ payload: nextPayload,
313
+ kind: info.kind,
314
+ });
315
+ },
316
+ onError: (error, info) => {
317
+ params.runtime.logging.getChildLogger({ plugin: CHANNEL_ID }).error(`Reply dispatch failed for ${target} (${info.kind}): ${String(error)}`);
318
+ },
319
+ },
320
+ replyOptions,
321
+ });
322
+ await sendStreamDone({
323
+ accountId,
324
+ target,
325
+ finishReason: envelope.stream === false ? 'stop' : 'stream_end',
326
+ });
327
+ }
328
+ catch (error) {
329
+ await sendStreamError({
330
+ accountId,
331
+ target,
332
+ error,
333
+ });
334
+ }
335
+ }
336
+ //# sourceMappingURL=inbound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound.js","sourceRoot":"","sources":["../../src/inbound.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { MessagePart } from '@oneainexus/chat-sdk';
2
+ export declare function partToOpenClawMediaPath(part: Extract<MessagePart, {
3
+ type: 'image' | 'file';
4
+ }>): Promise<string>;
5
+ export declare function mediaUrlToMessagePart(mediaUrl: string, hints?: {
6
+ fileName?: string;
7
+ mimeType?: string;
8
+ size?: number;
9
+ }): Promise<MessagePart | null>;
10
+ //# sourceMappingURL=media-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-bridge.d.ts","sourceRoot":"","sources":["../../src/media-bridge.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAiLxD,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,CAAC,GACrD,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE;IACN,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GACA,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA0F7B"}
@@ -0,0 +1,258 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { tmpdir } from 'node:os';
4
+ import { fileURLToPath } from 'node:url';
5
+ const MEDIA_DIR = path.join(tmpdir(), 'oneainexus-openclaw-connector-media');
6
+ const MIME_BY_EXTENSION = {
7
+ '.png': 'image/png',
8
+ '.jpg': 'image/jpeg',
9
+ '.jpeg': 'image/jpeg',
10
+ '.gif': 'image/gif',
11
+ '.webp': 'image/webp',
12
+ '.bmp': 'image/bmp',
13
+ '.svg': 'image/svg+xml',
14
+ '.pdf': 'application/pdf',
15
+ '.txt': 'text/plain',
16
+ '.md': 'text/markdown',
17
+ '.json': 'application/json',
18
+ '.csv': 'text/csv',
19
+ '.doc': 'application/msword',
20
+ '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
21
+ '.xls': 'application/vnd.ms-excel',
22
+ '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
23
+ '.ppt': 'application/vnd.ms-powerpoint',
24
+ '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
25
+ '.zip': 'application/zip',
26
+ };
27
+ const EXTENSION_BY_MIME = Object.fromEntries(Object.entries(MIME_BY_EXTENSION).map(([extension, mime]) => [mime, extension]));
28
+ function sanitizeFileName(value) {
29
+ const trimmed = value.trim();
30
+ const sanitized = trimmed.replace(/[<>:"/\\|?*\u0000-\u001F]/g, '_');
31
+ return sanitized || 'attachment';
32
+ }
33
+ function normalizeMediaUrlInput(value) {
34
+ let raw = value.trim();
35
+ if (!raw)
36
+ return raw;
37
+ if (raw.startsWith('<') && raw.endsWith('>') && raw.length >= 2) {
38
+ raw = raw.slice(1, -1).trim();
39
+ }
40
+ const first = raw[0];
41
+ const last = raw[raw.length - 1];
42
+ if (raw.length >= 2 &&
43
+ ((first === '"' && last === '"') || (first === "'" && last === "'") || (first === '`' && last === '`'))) {
44
+ raw = raw.slice(1, -1).trim();
45
+ }
46
+ return raw;
47
+ }
48
+ function decodeDataUrl(dataUrl) {
49
+ const match = /^data:([^;,]+)?(?:;charset=[^;,]+)?(;base64)?,([\s\S]+)$/i.exec(dataUrl);
50
+ if (!match)
51
+ return null;
52
+ const mimeType = match[1]?.trim() || 'application/octet-stream';
53
+ const isBase64 = Boolean(match[2]);
54
+ const payload = match[3] ?? '';
55
+ try {
56
+ const buffer = isBase64
57
+ ? Buffer.from(payload, 'base64')
58
+ : Buffer.from(decodeURIComponent(payload), 'utf8');
59
+ return {
60
+ mimeType,
61
+ buffer,
62
+ };
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ }
68
+ function inferMimeTypeFromName(fileName) {
69
+ if (!fileName)
70
+ return undefined;
71
+ return MIME_BY_EXTENSION[path.extname(fileName).toLowerCase()];
72
+ }
73
+ function inferExtensionFromMimeType(mimeType) {
74
+ if (!mimeType)
75
+ return '';
76
+ return EXTENSION_BY_MIME[mimeType.toLowerCase()] ?? '';
77
+ }
78
+ function inferFileNameFromUrl(rawValue) {
79
+ const trimmed = rawValue.trim();
80
+ if (!trimmed)
81
+ return undefined;
82
+ if (/^data:/i.test(trimmed)) {
83
+ return undefined;
84
+ }
85
+ try {
86
+ if (trimmed.startsWith('file://')) {
87
+ return path.basename(fileURLToPath(trimmed));
88
+ }
89
+ const parsed = new URL(trimmed);
90
+ const segment = parsed.pathname.split('/').pop();
91
+ return segment ? decodeURIComponent(segment) : undefined;
92
+ }
93
+ catch {
94
+ return path.basename(trimmed);
95
+ }
96
+ }
97
+ function resolveMimeType(params) {
98
+ return params.explicitMimeType ?? inferMimeTypeFromName(params.fileName) ?? inferMimeTypeFromName(params.url);
99
+ }
100
+ function buildDataUrl(buffer, mimeType) {
101
+ const safeMimeType = mimeType?.trim() || 'application/octet-stream';
102
+ return `data:${safeMimeType};base64,${buffer.toString('base64')}`;
103
+ }
104
+ function isImageMimeType(mimeType) {
105
+ return Boolean(mimeType?.startsWith('image/'));
106
+ }
107
+ function normalizeLocalPath(value) {
108
+ return value.startsWith('file://') ? fileURLToPath(value) : value;
109
+ }
110
+ async function ensureMediaDir() {
111
+ await fs.mkdir(MEDIA_DIR, { recursive: true });
112
+ }
113
+ async function fileExists(filePath) {
114
+ try {
115
+ await fs.access(filePath);
116
+ return true;
117
+ }
118
+ catch {
119
+ return false;
120
+ }
121
+ }
122
+ async function persistMediaBuffer(params) {
123
+ await ensureMediaDir();
124
+ const baseName = sanitizeFileName(params.fileName || `attachment${inferExtensionFromMimeType(params.mimeType)}`);
125
+ const extension = path.extname(baseName) || inferExtensionFromMimeType(params.mimeType);
126
+ const stem = extension ? baseName.slice(0, -extension.length) : baseName;
127
+ const fileName = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}-${sanitizeFileName(stem)}${extension}`;
128
+ const outputPath = path.join(MEDIA_DIR, fileName);
129
+ await fs.writeFile(outputPath, params.buffer);
130
+ return outputPath;
131
+ }
132
+ async function fetchRemoteBuffer(url) {
133
+ const response = await fetch(url);
134
+ if (!response.ok) {
135
+ throw new Error(`Failed to fetch media "${url}": ${response.status} ${response.statusText}`);
136
+ }
137
+ const arrayBuffer = await response.arrayBuffer();
138
+ const mimeType = response.headers.get('content-type')?.split(';', 1)[0] ?? undefined;
139
+ const fileName = inferFileNameFromUrl(url);
140
+ return {
141
+ buffer: Buffer.from(arrayBuffer),
142
+ ...(mimeType ? { mimeType } : {}),
143
+ ...(fileName ? { fileName } : {}),
144
+ };
145
+ }
146
+ export async function partToOpenClawMediaPath(part) {
147
+ const normalizedUrl = normalizeMediaUrlInput(part.url);
148
+ if (!normalizedUrl) {
149
+ throw new Error('Empty media URL.');
150
+ }
151
+ if (/^data:/i.test(normalizedUrl)) {
152
+ const decoded = decodeDataUrl(normalizedUrl);
153
+ if (!decoded) {
154
+ throw new Error('Invalid data URL attachment.');
155
+ }
156
+ return persistMediaBuffer({
157
+ buffer: decoded.buffer,
158
+ ...(part.name ? { fileName: part.name } : {}),
159
+ ...((part.mimeType || decoded.mimeType) ? { mimeType: part.mimeType || decoded.mimeType } : {}),
160
+ });
161
+ }
162
+ if (/^https?:\/\//i.test(normalizedUrl)) {
163
+ const remote = await fetchRemoteBuffer(normalizedUrl);
164
+ return persistMediaBuffer({
165
+ buffer: remote.buffer,
166
+ ...((part.name || remote.fileName) ? { fileName: part.name || remote.fileName } : {}),
167
+ ...((part.mimeType || remote.mimeType) ? { mimeType: part.mimeType || remote.mimeType } : {}),
168
+ });
169
+ }
170
+ return normalizeLocalPath(normalizedUrl);
171
+ }
172
+ export async function mediaUrlToMessagePart(mediaUrl, hints) {
173
+ const trimmed = normalizeMediaUrlInput(mediaUrl);
174
+ if (!trimmed)
175
+ return null;
176
+ if (/^data:/i.test(trimmed)) {
177
+ const decoded = decodeDataUrl(trimmed);
178
+ if (!decoded)
179
+ return null;
180
+ const resolvedMimeType = hints?.mimeType || decoded.mimeType;
181
+ const name = sanitizeFileName(hints?.fileName || inferFileNameFromUrl(trimmed) || `attachment${inferExtensionFromMimeType(resolvedMimeType)}`);
182
+ if (isImageMimeType(resolvedMimeType)) {
183
+ return {
184
+ type: 'image',
185
+ url: trimmed,
186
+ mimeType: resolvedMimeType,
187
+ name,
188
+ alt: name,
189
+ };
190
+ }
191
+ return {
192
+ type: 'file',
193
+ url: trimmed,
194
+ mimeType: resolvedMimeType,
195
+ name,
196
+ size: hints?.size ?? decoded.buffer.length,
197
+ };
198
+ }
199
+ try {
200
+ const isRemote = /^https?:\/\//i.test(trimmed);
201
+ const maybeRelative = !trimmed.startsWith('file://') && !/^[A-Za-z][\w+.-]*:\/\//i.test(trimmed);
202
+ const resolvedRelativePath = maybeRelative ? path.resolve(trimmed) : '';
203
+ const relativeFileExists = resolvedRelativePath ? await fileExists(resolvedRelativePath) : false;
204
+ const isLocal = trimmed.startsWith('file://')
205
+ || path.isAbsolute(trimmed)
206
+ || /^[A-Za-z]:[\\/]/.test(trimmed)
207
+ || relativeFileExists;
208
+ let buffer;
209
+ let mimeType;
210
+ let fileName;
211
+ if (isRemote) {
212
+ const remote = await fetchRemoteBuffer(trimmed);
213
+ buffer = remote.buffer;
214
+ mimeType = hints?.mimeType || remote.mimeType;
215
+ fileName = hints?.fileName || remote.fileName;
216
+ }
217
+ else if (isLocal) {
218
+ const filePath = trimmed.startsWith('file://')
219
+ ? normalizeLocalPath(trimmed)
220
+ : (resolvedRelativePath && relativeFileExists)
221
+ ? resolvedRelativePath
222
+ : normalizeLocalPath(trimmed);
223
+ buffer = await fs.readFile(filePath);
224
+ fileName = hints?.fileName || path.basename(filePath);
225
+ mimeType = hints?.mimeType || inferMimeTypeFromName(fileName);
226
+ }
227
+ else {
228
+ return null;
229
+ }
230
+ const resolvedName = sanitizeFileName(hints?.fileName || fileName || inferFileNameFromUrl(trimmed) || 'attachment');
231
+ const resolvedMimeType = resolveMimeType({
232
+ ...(mimeType ? { explicitMimeType: mimeType } : {}),
233
+ fileName: resolvedName,
234
+ url: trimmed,
235
+ });
236
+ const dataUrl = buildDataUrl(buffer, resolvedMimeType);
237
+ if (isImageMimeType(resolvedMimeType)) {
238
+ return {
239
+ type: 'image',
240
+ url: dataUrl,
241
+ name: resolvedName,
242
+ alt: resolvedName,
243
+ ...(resolvedMimeType ? { mimeType: resolvedMimeType } : {}),
244
+ };
245
+ }
246
+ return {
247
+ type: 'file',
248
+ url: dataUrl,
249
+ name: resolvedName,
250
+ ...(resolvedMimeType ? { mimeType: resolvedMimeType } : {}),
251
+ size: hints?.size ?? buffer.length,
252
+ };
253
+ }
254
+ catch {
255
+ return null;
256
+ }
257
+ }
258
+ //# sourceMappingURL=media-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-bridge.js","sourceRoot":"","sources":["../../src/media-bridge.ts"],"names":[],"mappings":"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"}