@rethinkingstudio/clawpilot 2.1.7-internal.0 → 2.1.7-internal.10
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/dist/ccconnect/api-client.d.ts +13 -0
- package/dist/ccconnect/api-client.js +3 -0
- package/dist/ccconnect/api-client.js.map +1 -1
- package/dist/ccconnect/project-config.d.ts +25 -0
- package/dist/ccconnect/project-config.js +309 -0
- package/dist/ccconnect/project-config.js.map +1 -0
- package/dist/media/assistant-attachments.d.ts +2 -0
- package/dist/media/assistant-attachments.js +18 -18
- package/dist/media/assistant-attachments.js.map +1 -1
- package/dist/relay/ccconnect-relay-manager.js +586 -20
- package/dist/relay/ccconnect-relay-manager.js.map +1 -1
- package/package.json +1 -1
|
@@ -14,6 +14,18 @@ export interface CCConnectProject {
|
|
|
14
14
|
name: string;
|
|
15
15
|
agent_type?: string;
|
|
16
16
|
sessions_count?: number;
|
|
17
|
+
heartbeat_enabled?: boolean;
|
|
18
|
+
platforms?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface CCConnectProjectDetail extends CCConnectProject {
|
|
21
|
+
work_dir?: string;
|
|
22
|
+
mode?: string;
|
|
23
|
+
agent_mode?: string;
|
|
24
|
+
active_session_keys?: string[];
|
|
25
|
+
platform_configs?: Array<{
|
|
26
|
+
type?: string;
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
}>;
|
|
17
29
|
}
|
|
18
30
|
export interface CCConnectSessionSummary {
|
|
19
31
|
id: string;
|
|
@@ -48,6 +60,7 @@ export declare class CCConnectManagementClient {
|
|
|
48
60
|
constructor(options: CCConnectClientOptions);
|
|
49
61
|
status(): Promise<CCConnectStatus>;
|
|
50
62
|
listProjects(): Promise<CCConnectProject[]>;
|
|
63
|
+
getProject(project: string): Promise<CCConnectProjectDetail>;
|
|
51
64
|
listSessions(project: string): Promise<CCConnectSessionSummary[]>;
|
|
52
65
|
getSession(project: string, id: string, historyLimit?: number): Promise<CCConnectSessionDetail>;
|
|
53
66
|
createSession(project: string, sessionKey: string, name: string): Promise<CCConnectSessionSummary>;
|
|
@@ -12,6 +12,9 @@ export class CCConnectManagementClient {
|
|
|
12
12
|
const data = await this.get("/projects");
|
|
13
13
|
return data.projects ?? [];
|
|
14
14
|
}
|
|
15
|
+
async getProject(project) {
|
|
16
|
+
return this.get(`/projects/${encodeURIComponent(project)}`);
|
|
17
|
+
}
|
|
15
18
|
async listSessions(project) {
|
|
16
19
|
const data = await this.get(`/projects/${encodeURIComponent(project)}/sessions`);
|
|
17
20
|
return data.sessions ?? [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/ccconnect/api-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/ccconnect/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface CreateCCConnectProjectParams {
|
|
2
|
+
name?: string;
|
|
3
|
+
workDir?: string;
|
|
4
|
+
agentType?: string;
|
|
5
|
+
mode?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CCConnectProjectCandidate {
|
|
8
|
+
name: string;
|
|
9
|
+
path: string;
|
|
10
|
+
source: "history" | "configured" | "common";
|
|
11
|
+
markers: string[];
|
|
12
|
+
existingProjectName?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function createCCConnectProject(params: CreateCCConnectProjectParams): {
|
|
15
|
+
name: string;
|
|
16
|
+
workDir: string;
|
|
17
|
+
agentType: string;
|
|
18
|
+
mode: string;
|
|
19
|
+
configPath: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function restartCCConnect(configPath?: string): void;
|
|
22
|
+
export declare function discoverCCConnectProjects(existingProjects: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
workDir?: string;
|
|
25
|
+
}>): CCConnectProjectCandidate[];
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, statSync, writeFileSync } from "fs";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
import { basename, dirname, join } from "path";
|
|
5
|
+
const DEFAULT_CONFIG_PATH = join(homedir(), ".cc-connect", "config.toml");
|
|
6
|
+
const DIR_HISTORY_PATH = join(homedir(), ".cc-connect", "dir_history.json");
|
|
7
|
+
const SUPPORTED_AGENT_TYPES = new Set([
|
|
8
|
+
"claudecode",
|
|
9
|
+
"codex",
|
|
10
|
+
"gemini",
|
|
11
|
+
"cursor",
|
|
12
|
+
"qoder",
|
|
13
|
+
"opencode",
|
|
14
|
+
"kimi",
|
|
15
|
+
"iflow",
|
|
16
|
+
"pi",
|
|
17
|
+
]);
|
|
18
|
+
export function createCCConnectProject(params) {
|
|
19
|
+
const name = normalizeProjectName(params.name);
|
|
20
|
+
const workDir = normalizeWorkDir(params.workDir);
|
|
21
|
+
const agentType = normalizeAgentType(params.agentType);
|
|
22
|
+
const mode = normalizeMode(params.mode);
|
|
23
|
+
const configPath = process.env.CCCONNECT_CONFIG?.trim() || DEFAULT_CONFIG_PATH;
|
|
24
|
+
const current = existsSync(configPath) ? readFileSync(configPath, "utf-8") : "";
|
|
25
|
+
if (projectExists(current, name)) {
|
|
26
|
+
throw new Error(`cc-connect project already exists: ${name}`);
|
|
27
|
+
}
|
|
28
|
+
const next = `${current.trimEnd()}\n\n${renderPocketClawProject({ name, workDir, agentType, mode })}\n`;
|
|
29
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
30
|
+
writeFileSync(configPath, next, { encoding: "utf-8", mode: 0o600 });
|
|
31
|
+
return { name, workDir, agentType, mode, configPath };
|
|
32
|
+
}
|
|
33
|
+
export function restartCCConnect(configPath = process.env.CCCONNECT_CONFIG?.trim() || DEFAULT_CONFIG_PATH) {
|
|
34
|
+
const command = resolveCCConnectCommand();
|
|
35
|
+
const child = spawn(command.bin, [...command.args, "--config", configPath, "--force"], {
|
|
36
|
+
detached: true,
|
|
37
|
+
stdio: "ignore",
|
|
38
|
+
});
|
|
39
|
+
child.unref();
|
|
40
|
+
}
|
|
41
|
+
export function discoverCCConnectProjects(existingProjects) {
|
|
42
|
+
const candidates = new Map();
|
|
43
|
+
const existingByRealPath = new Map();
|
|
44
|
+
for (const project of existingProjects) {
|
|
45
|
+
if (!project.workDir)
|
|
46
|
+
continue;
|
|
47
|
+
const realPath = safeRealPath(project.workDir);
|
|
48
|
+
if (realPath) {
|
|
49
|
+
existingByRealPath.set(realPath, project.name);
|
|
50
|
+
addCandidate(candidates, {
|
|
51
|
+
name: project.name,
|
|
52
|
+
path: project.workDir,
|
|
53
|
+
source: "configured",
|
|
54
|
+
markers: detectProjectMarkers(project.workDir),
|
|
55
|
+
existingProjectName: project.name,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const dir of readDirHistory()) {
|
|
60
|
+
addDiscoveredPath(candidates, dir, "history", existingByRealPath);
|
|
61
|
+
}
|
|
62
|
+
for (const root of commonProjectRoots()) {
|
|
63
|
+
for (const dir of scanProjectRoot(root, 2)) {
|
|
64
|
+
addDiscoveredPath(candidates, dir, "common", existingByRealPath);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return Array.from(candidates.values())
|
|
68
|
+
.filter((candidate) => candidate.markers.length > 0 || candidate.existingProjectName)
|
|
69
|
+
.sort(compareCandidates)
|
|
70
|
+
.slice(0, 50);
|
|
71
|
+
}
|
|
72
|
+
function normalizeProjectName(value) {
|
|
73
|
+
const raw = value?.trim() ?? "";
|
|
74
|
+
if (!raw)
|
|
75
|
+
throw new Error("project name is required");
|
|
76
|
+
const normalized = raw.replace(/[^\w.-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 48);
|
|
77
|
+
if (!normalized)
|
|
78
|
+
throw new Error("project name is invalid");
|
|
79
|
+
return normalized;
|
|
80
|
+
}
|
|
81
|
+
function normalizeWorkDir(value) {
|
|
82
|
+
const raw = value?.trim() ?? "";
|
|
83
|
+
if (!raw)
|
|
84
|
+
throw new Error("work directory is required");
|
|
85
|
+
if (!existsSync(raw) || !statSync(raw).isDirectory()) {
|
|
86
|
+
throw new Error(`work directory does not exist: ${raw}`);
|
|
87
|
+
}
|
|
88
|
+
return raw;
|
|
89
|
+
}
|
|
90
|
+
function normalizeAgentType(value) {
|
|
91
|
+
const agentType = value?.trim() || "claudecode";
|
|
92
|
+
if (!SUPPORTED_AGENT_TYPES.has(agentType)) {
|
|
93
|
+
throw new Error(`unsupported cc-connect agent type: ${agentType}`);
|
|
94
|
+
}
|
|
95
|
+
return agentType;
|
|
96
|
+
}
|
|
97
|
+
function normalizeMode(value) {
|
|
98
|
+
return value?.trim() || "default";
|
|
99
|
+
}
|
|
100
|
+
function projectExists(config, name) {
|
|
101
|
+
const projectBlocks = config.split(/\n\s*\[\[projects\]\]\s*\n/g).slice(1);
|
|
102
|
+
return projectBlocks.some((block) => {
|
|
103
|
+
const match = block.match(/^\s*name\s*=\s*"((?:\\"|[^"])*)"/m);
|
|
104
|
+
return match?.[1]?.replace(/\\"/g, "\"") === name;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function renderPocketClawProject(params) {
|
|
108
|
+
const linePort = pocketClawLinePort(params.name);
|
|
109
|
+
const callbackPath = `/_pocketclaw_${params.name.replace(/[^\w.-]+/g, "_")}`;
|
|
110
|
+
return `[[projects]]
|
|
111
|
+
name = "${escapeTomlString(params.name)}"
|
|
112
|
+
|
|
113
|
+
[projects.agent]
|
|
114
|
+
type = "${escapeTomlString(params.agentType)}"
|
|
115
|
+
|
|
116
|
+
[projects.agent.options]
|
|
117
|
+
work_dir = "${escapeTomlString(params.workDir)}"
|
|
118
|
+
mode = "${escapeTomlString(params.mode)}"
|
|
119
|
+
|
|
120
|
+
# PocketClaw uses cc-connect [bridge]. This inert LINE platform only satisfies
|
|
121
|
+
# cc-connect project validation and is not exposed to the mobile app. Each
|
|
122
|
+
# generated project gets a stable private port to avoid webhook bind conflicts.
|
|
123
|
+
[[projects.platforms]]
|
|
124
|
+
type = "line"
|
|
125
|
+
|
|
126
|
+
[projects.platforms.options]
|
|
127
|
+
channel_secret = "pocketclaw-placeholder"
|
|
128
|
+
channel_token = "pocketclaw-placeholder"
|
|
129
|
+
port = "${linePort}"
|
|
130
|
+
callback_path = "${escapeTomlString(callbackPath)}"
|
|
131
|
+
`;
|
|
132
|
+
}
|
|
133
|
+
function escapeTomlString(value) {
|
|
134
|
+
return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
135
|
+
}
|
|
136
|
+
function pocketClawLinePort(projectName) {
|
|
137
|
+
let hash = 0;
|
|
138
|
+
for (const char of projectName) {
|
|
139
|
+
hash = (hash * 31 + char.charCodeAt(0)) >>> 0;
|
|
140
|
+
}
|
|
141
|
+
return 18_000 + (hash % 1_000);
|
|
142
|
+
}
|
|
143
|
+
function addDiscoveredPath(candidates, path, source, existingByRealPath) {
|
|
144
|
+
const realPath = safeRealPath(path);
|
|
145
|
+
if (!realPath)
|
|
146
|
+
return;
|
|
147
|
+
const markers = detectProjectMarkers(realPath);
|
|
148
|
+
if (markers.length === 0 && !existingByRealPath.has(realPath))
|
|
149
|
+
return;
|
|
150
|
+
addCandidate(candidates, {
|
|
151
|
+
name: deriveProjectName(realPath),
|
|
152
|
+
path: realPath,
|
|
153
|
+
source,
|
|
154
|
+
markers,
|
|
155
|
+
existingProjectName: existingByRealPath.get(realPath),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
function addCandidate(candidates, candidate) {
|
|
159
|
+
const realPath = safeRealPath(candidate.path);
|
|
160
|
+
if (!realPath)
|
|
161
|
+
return;
|
|
162
|
+
const previous = candidates.get(realPath);
|
|
163
|
+
if (!previous || sourceRank(candidate.source) < sourceRank(previous.source)) {
|
|
164
|
+
candidates.set(realPath, { ...candidate, path: realPath });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function readDirHistory() {
|
|
168
|
+
if (!existsSync(DIR_HISTORY_PATH))
|
|
169
|
+
return [];
|
|
170
|
+
try {
|
|
171
|
+
const raw = JSON.parse(readFileSync(DIR_HISTORY_PATH, "utf-8"));
|
|
172
|
+
if (!raw || typeof raw !== "object")
|
|
173
|
+
return [];
|
|
174
|
+
return Object.values(raw).flatMap((value) => {
|
|
175
|
+
if (Array.isArray(value)) {
|
|
176
|
+
return value.filter((entry) => typeof entry === "string");
|
|
177
|
+
}
|
|
178
|
+
return [];
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function commonProjectRoots() {
|
|
186
|
+
return [
|
|
187
|
+
join(homedir(), "workspace"),
|
|
188
|
+
join(homedir(), "Developer"),
|
|
189
|
+
join(homedir(), "Code"),
|
|
190
|
+
join(homedir(), "Projects"),
|
|
191
|
+
];
|
|
192
|
+
}
|
|
193
|
+
function scanProjectRoot(root, maxDepth) {
|
|
194
|
+
const rootPath = safeRealPath(root);
|
|
195
|
+
if (!rootPath)
|
|
196
|
+
return [];
|
|
197
|
+
const found = [];
|
|
198
|
+
const queue = [{ path: rootPath, depth: 0 }];
|
|
199
|
+
while (queue.length > 0 && found.length < 100) {
|
|
200
|
+
const current = queue.shift();
|
|
201
|
+
if (!current)
|
|
202
|
+
break;
|
|
203
|
+
const markers = detectProjectMarkers(current.path);
|
|
204
|
+
if (markers.length > 0) {
|
|
205
|
+
found.push(current.path);
|
|
206
|
+
if (current.depth > 0)
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (current.depth >= maxDepth)
|
|
210
|
+
continue;
|
|
211
|
+
for (const child of safeReadDirs(current.path)) {
|
|
212
|
+
if (shouldSkipDir(child.name))
|
|
213
|
+
continue;
|
|
214
|
+
queue.push({ path: join(current.path, child.name), depth: current.depth + 1 });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return found;
|
|
218
|
+
}
|
|
219
|
+
function detectProjectMarkers(path) {
|
|
220
|
+
const markers = [];
|
|
221
|
+
if (!safeIsDirectory(path))
|
|
222
|
+
return markers;
|
|
223
|
+
if (existsSync(join(path, ".git")))
|
|
224
|
+
markers.push("git");
|
|
225
|
+
if (existsSync(join(path, "package.json")))
|
|
226
|
+
markers.push("node");
|
|
227
|
+
if (existsSync(join(path, "Package.swift")))
|
|
228
|
+
markers.push("swift");
|
|
229
|
+
if (existsSync(join(path, "go.mod")))
|
|
230
|
+
markers.push("go");
|
|
231
|
+
if (existsSync(join(path, "pyproject.toml")))
|
|
232
|
+
markers.push("python");
|
|
233
|
+
if (existsSync(join(path, "Cargo.toml")))
|
|
234
|
+
markers.push("rust");
|
|
235
|
+
if (existsSync(join(path, "Gemfile")))
|
|
236
|
+
markers.push("ruby");
|
|
237
|
+
if (existsSync(join(path, "composer.json")))
|
|
238
|
+
markers.push("php");
|
|
239
|
+
if (safeReadDirs(path).some((entry) => entry.name.endsWith(".xcodeproj")))
|
|
240
|
+
markers.push("xcode");
|
|
241
|
+
return markers;
|
|
242
|
+
}
|
|
243
|
+
function safeReadDirs(path) {
|
|
244
|
+
try {
|
|
245
|
+
return readdirSync(path, { withFileTypes: true })
|
|
246
|
+
.filter((entry) => entry.isDirectory())
|
|
247
|
+
.map((entry) => ({ name: entry.name }));
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return [];
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function safeRealPath(path) {
|
|
254
|
+
try {
|
|
255
|
+
if (!safeIsDirectory(path))
|
|
256
|
+
return undefined;
|
|
257
|
+
return realpathSync(path);
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
return undefined;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function safeIsDirectory(path) {
|
|
264
|
+
try {
|
|
265
|
+
return existsSync(path) && statSync(path).isDirectory();
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function shouldSkipDir(name) {
|
|
272
|
+
return name === ".git"
|
|
273
|
+
|| name === "node_modules"
|
|
274
|
+
|| name === "DerivedData"
|
|
275
|
+
|| name === "Library"
|
|
276
|
+
|| name === "build"
|
|
277
|
+
|| name === "dist"
|
|
278
|
+
|| name === ".cache"
|
|
279
|
+
|| name === ".venv"
|
|
280
|
+
|| name.startsWith(".");
|
|
281
|
+
}
|
|
282
|
+
function deriveProjectName(path) {
|
|
283
|
+
return basename(path).replace(/[^\w.-]+/g, "-").replace(/^-+|-+$/g, "") || "project";
|
|
284
|
+
}
|
|
285
|
+
function sourceRank(source) {
|
|
286
|
+
if (source === "configured")
|
|
287
|
+
return 0;
|
|
288
|
+
if (source === "history")
|
|
289
|
+
return 1;
|
|
290
|
+
return 2;
|
|
291
|
+
}
|
|
292
|
+
function compareCandidates(a, b) {
|
|
293
|
+
const existingDelta = Number(Boolean(b.existingProjectName)) - Number(Boolean(a.existingProjectName));
|
|
294
|
+
if (existingDelta !== 0)
|
|
295
|
+
return existingDelta;
|
|
296
|
+
const sourceDelta = sourceRank(a.source) - sourceRank(b.source);
|
|
297
|
+
if (sourceDelta !== 0)
|
|
298
|
+
return sourceDelta;
|
|
299
|
+
return a.name.localeCompare(b.name, undefined, { sensitivity: "base" });
|
|
300
|
+
}
|
|
301
|
+
function resolveCCConnectCommand() {
|
|
302
|
+
if (process.env.CCCONNECT_BIN?.trim()) {
|
|
303
|
+
return { bin: process.env.CCCONNECT_BIN.trim(), args: [] };
|
|
304
|
+
}
|
|
305
|
+
return process.platform === "win32"
|
|
306
|
+
? { bin: "cmd", args: ["/c", "where cc-connect >nul 2>nul && cc-connect || npx -y cc-connect"] }
|
|
307
|
+
: { bin: "sh", args: ["-lc", "command -v cc-connect >/dev/null 2>&1 && exec cc-connect \"$@\" || exec npx -y cc-connect \"$@\"", "cc-connect"] };
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=project-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/ccconnect/project-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ export interface MediaBlock {
|
|
|
3
3
|
mimeType: string;
|
|
4
4
|
/** Buffer content (decoded from base64 or read from local path) */
|
|
5
5
|
data: Buffer;
|
|
6
|
+
fileName?: string;
|
|
6
7
|
}
|
|
7
8
|
export interface AssistantAttachment extends UploadResult {
|
|
8
9
|
width?: number;
|
|
@@ -29,6 +30,7 @@ type HistoryMessage = {
|
|
|
29
30
|
export declare function extractMediaBlocks(history: {
|
|
30
31
|
messages?: HistoryMessage[];
|
|
31
32
|
}): MediaBlock[];
|
|
33
|
+
export declare function uploadMediaBlocks(blocks: MediaBlock[], relayServerUrl: string, gatewayId: string, relaySecret: string): Promise<AssistantAttachment[]>;
|
|
32
34
|
export declare function uploadAssistantAttachments(history: {
|
|
33
35
|
messages?: HistoryMessage[];
|
|
34
36
|
}, relayServerUrl: string, gatewayId: string, relaySecret: string): Promise<AssistantAttachment[]>;
|
|
@@ -88,17 +88,13 @@ async function fetchSts(relayServerUrl, gatewayId, relaySecret, mimeTypes, hasVi
|
|
|
88
88
|
}
|
|
89
89
|
return res.json();
|
|
90
90
|
}
|
|
91
|
-
|
|
92
|
-
// Main: extract + upload → return attachments[]
|
|
93
|
-
// ---------------------------------------------------------------------------
|
|
94
|
-
export async function uploadAssistantAttachments(history, relayServerUrl, gatewayId, relaySecret) {
|
|
95
|
-
const rawBlocks = extractMediaBlocks(history);
|
|
96
|
-
if (rawBlocks.length === 0)
|
|
97
|
-
return [];
|
|
98
|
-
const blocks = await resolveLocalPaths(rawBlocks);
|
|
91
|
+
export async function uploadMediaBlocks(blocks, relayServerUrl, gatewayId, relaySecret) {
|
|
99
92
|
if (blocks.length === 0)
|
|
100
93
|
return [];
|
|
101
|
-
const
|
|
94
|
+
const resolved = await resolveLocalPaths(blocks);
|
|
95
|
+
if (resolved.length === 0)
|
|
96
|
+
return [];
|
|
97
|
+
const mimeTypes = resolved.map((b) => b.mimeType);
|
|
102
98
|
const hasVideo = mimeTypes.some((m) => m.startsWith("video/"));
|
|
103
99
|
let sts;
|
|
104
100
|
try {
|
|
@@ -109,36 +105,40 @@ export async function uploadAssistantAttachments(history, relayServerUrl, gatewa
|
|
|
109
105
|
return [];
|
|
110
106
|
}
|
|
111
107
|
const results = [];
|
|
112
|
-
|
|
113
|
-
const
|
|
114
|
-
const videoBlocks = blocks.filter((b) => b.mimeType.startsWith("video/"));
|
|
115
|
-
// Images: up to 3 concurrent
|
|
108
|
+
const imageBlocks = resolved.filter((b) => !b.mimeType.startsWith("video/"));
|
|
109
|
+
const videoBlocks = resolved.filter((b) => b.mimeType.startsWith("video/"));
|
|
116
110
|
const imageBatches = [];
|
|
117
111
|
for (let i = 0; i < imageBlocks.length; i += 3) {
|
|
118
112
|
imageBatches.push(imageBlocks.slice(i, i + 3));
|
|
119
113
|
}
|
|
120
114
|
for (const batch of imageBatches) {
|
|
121
|
-
const settled = await Promise.allSettled(batch.map((b) => uploadMedia(sts, b.data, b.mimeType)));
|
|
115
|
+
const settled = await Promise.allSettled(batch.map((b) => uploadMedia(sts, b.data, b.mimeType, b.fileName)));
|
|
122
116
|
for (const r of settled) {
|
|
123
117
|
if (r.status === "fulfilled") {
|
|
124
118
|
results.push(r.value);
|
|
125
119
|
}
|
|
126
120
|
else {
|
|
127
|
-
console.warn("[media]
|
|
121
|
+
console.warn("[media] upload failed:", r.reason);
|
|
128
122
|
}
|
|
129
123
|
}
|
|
130
124
|
}
|
|
131
|
-
// Videos: serial
|
|
132
125
|
for (const b of videoBlocks) {
|
|
133
126
|
try {
|
|
134
|
-
const r = await uploadMedia(sts, b.data, b.mimeType);
|
|
127
|
+
const r = await uploadMedia(sts, b.data, b.mimeType, b.fileName);
|
|
135
128
|
results.push(r);
|
|
136
129
|
}
|
|
137
130
|
catch (err) {
|
|
138
131
|
console.warn("[media] video upload failed:", err);
|
|
139
132
|
}
|
|
140
133
|
}
|
|
141
|
-
console.log(`[media] uploaded ${results.length}/${
|
|
134
|
+
console.log(`[media] uploaded ${results.length}/${resolved.length} attachments`);
|
|
142
135
|
return results;
|
|
143
136
|
}
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
// Main: extract + upload → return attachments[]
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
export async function uploadAssistantAttachments(history, relayServerUrl, gatewayId, relaySecret) {
|
|
141
|
+
const rawBlocks = extractMediaBlocks(history);
|
|
142
|
+
return uploadMediaBlocks(rawBlocks, relayServerUrl, gatewayId, relaySecret);
|
|
143
|
+
}
|
|
144
144
|
//# sourceMappingURL=assistant-attachments.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistant-attachments.js","sourceRoot":"","sources":["../../src/media/assistant-attachments.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,8EAA8E;AAE9E,OAAO,EAAE,WAAW,EAA0C,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,8CAA8C;AAC9C,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"assistant-attachments.js","sourceRoot":"","sources":["../../src/media/assistant-attachments.ts"],"names":[],"mappings":"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"}
|