@rethinkingstudio/clawpilot 1.1.15-beta.0 → 1.1.15-beta.2
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/commands/pair.js +1 -1
- package/dist/commands/pair.js.map +1 -1
- package/dist/config/config.d.ts +2 -2
- package/dist/config/config.js +48 -12
- package/dist/config/config.js.map +1 -1
- package/dist/generated/build-config.d.ts +1 -0
- package/dist/generated/build-config.js +2 -0
- package/dist/generated/build-config.js.map +1 -0
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/media/assistant-attachments.d.ts +35 -0
- package/dist/media/assistant-attachments.js +144 -0
- package/dist/media/assistant-attachments.js.map +1 -0
- package/dist/media/oss-uploader.d.ts +22 -0
- package/dist/media/oss-uploader.js +180 -0
- package/dist/media/oss-uploader.js.map +1 -0
- package/dist/platform/service-manager.js +10 -7
- package/dist/platform/service-manager.js.map +1 -1
- package/dist/relay/relay-manager.js +18 -4
- package/dist/relay/relay-manager.js.map +1 -1
- package/package.json +6 -2
- package/scripts/verify-build-config.mjs +35 -0
- package/scripts/write-build-config.mjs +17 -0
- package/src/commands/pair.ts +1 -2
- package/src/config/config.ts +70 -13
- package/src/generated/build-config.ts +1 -0
- package/src/index.ts +2 -1
- package/src/media/assistant-attachments.ts +205 -0
- package/src/media/oss-uploader.ts +280 -0
- package/src/platform/service-manager.ts +10 -6
- package/src/relay/relay-manager.ts +27 -5
- package/dist/relay/session-proxy.d.ts +0 -18
- package/dist/relay/session-proxy.js +0 -75
- package/dist/relay/session-proxy.js.map +0 -1
package/dist/commands/pair.js
CHANGED
|
@@ -25,7 +25,7 @@ import { configExists, readConfig, writeConfig } from "../config/config.js";
|
|
|
25
25
|
import { installCommand } from "./install.js";
|
|
26
26
|
import qrcodeTerminal from "qrcode-terminal";
|
|
27
27
|
import { t } from "../i18n/index.js";
|
|
28
|
-
|
|
28
|
+
import { DEFAULT_RELAY_SERVER } from "../generated/build-config.js";
|
|
29
29
|
export async function pairCommand(opts) {
|
|
30
30
|
const relayServerUrl = opts.server ?? DEFAULT_RELAY_SERVER;
|
|
31
31
|
const httpBase = relayServerUrl.replace(/^wss?/, "http");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,SAAS,mBAAmB,CAAC,IAAY;IACvC,0EAA0E;IAC1E,OAAO,IAAI;SACR,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAE,gCAAgC;SAC7E,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAc,8BAA8B;SAC3E,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAoB,qCAAqC;SAClF,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAe,wCAAwC;AACzF,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,kBAAkB,EAAE,KAAK,OAAO,EAAE,CAAC;QACrC,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AACD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"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"}
|
package/dist/config/config.d.ts
CHANGED
|
@@ -15,8 +15,8 @@ export declare function readGatewayUrl(): string;
|
|
|
15
15
|
/**
|
|
16
16
|
* Reads the gateway token or password. Priority order:
|
|
17
17
|
* 1. ~/.clawai/config.json (gatewayToken / gatewayPassword)
|
|
18
|
-
* 2.
|
|
19
|
-
* 3.
|
|
18
|
+
* 2. Environment variables (OPENCLAW_GATEWAY_TOKEN / OPENCLAW_GATEWAY_PASSWORD)
|
|
19
|
+
* 3. ~/.openclaw/openclaw.json (gateway.token / gateway.auth.token)
|
|
20
20
|
*/
|
|
21
21
|
export declare function readGatewayAuth(cfg: ClawaiConfig): {
|
|
22
22
|
token?: string;
|
package/dist/config/config.js
CHANGED
|
@@ -32,36 +32,72 @@ export function readGatewayUrl() {
|
|
|
32
32
|
return "ws://localhost:18789";
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
+
function trimToUndefined(value) {
|
|
36
|
+
if (typeof value !== "string")
|
|
37
|
+
return undefined;
|
|
38
|
+
const trimmed = value.trim();
|
|
39
|
+
return trimmed ? trimmed : undefined;
|
|
40
|
+
}
|
|
41
|
+
function readGatewayAuthEnv() {
|
|
42
|
+
const token = trimToUndefined(process.env.OPENCLAW_GATEWAY_TOKEN)
|
|
43
|
+
?? trimToUndefined(process.env.CLAWDBOT_GATEWAY_TOKEN);
|
|
44
|
+
const password = trimToUndefined(process.env.OPENCLAW_GATEWAY_PASSWORD)
|
|
45
|
+
?? trimToUndefined(process.env.CLAWDBOT_GATEWAY_PASSWORD);
|
|
46
|
+
return { token, password };
|
|
47
|
+
}
|
|
48
|
+
function resolveConfiguredSecret(value) {
|
|
49
|
+
const direct = trimToUndefined(value);
|
|
50
|
+
if (direct) {
|
|
51
|
+
const envTemplate = direct.match(/^\$\{([A-Z0-9_]+)\}$/i);
|
|
52
|
+
if (envTemplate) {
|
|
53
|
+
return trimToUndefined(process.env[envTemplate[1]]);
|
|
54
|
+
}
|
|
55
|
+
return direct;
|
|
56
|
+
}
|
|
57
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const record = value;
|
|
61
|
+
const envKey = trimToUndefined(record.$env) ?? trimToUndefined(record.env);
|
|
62
|
+
if (envKey) {
|
|
63
|
+
return trimToUndefined(process.env[envKey]);
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
35
67
|
/**
|
|
36
68
|
* Reads the gateway token or password. Priority order:
|
|
37
69
|
* 1. ~/.clawai/config.json (gatewayToken / gatewayPassword)
|
|
38
|
-
* 2.
|
|
39
|
-
* 3.
|
|
70
|
+
* 2. Environment variables (OPENCLAW_GATEWAY_TOKEN / OPENCLAW_GATEWAY_PASSWORD)
|
|
71
|
+
* 3. ~/.openclaw/openclaw.json (gateway.token / gateway.auth.token)
|
|
40
72
|
*/
|
|
41
73
|
export function readGatewayAuth(cfg) {
|
|
42
74
|
if (cfg.gatewayToken || cfg.gatewayPassword) {
|
|
43
|
-
return {
|
|
75
|
+
return {
|
|
76
|
+
token: trimToUndefined(cfg.gatewayToken),
|
|
77
|
+
password: trimToUndefined(cfg.gatewayPassword),
|
|
78
|
+
};
|
|
44
79
|
}
|
|
45
|
-
|
|
80
|
+
const envAuth = readGatewayAuthEnv();
|
|
81
|
+
if (envAuth.token || envAuth.password) {
|
|
82
|
+
return envAuth;
|
|
83
|
+
}
|
|
84
|
+
// Try to read the token from OpenClaw's own config.
|
|
85
|
+
// Accept plaintext, ${ENV_VAR} templates, and simple {$env:"NAME"} refs.
|
|
46
86
|
try {
|
|
47
87
|
const configPath = resolveOpenclawConfigPath();
|
|
48
88
|
const path = existsSync(configPath) ? configPath : LEGACY_OPENCLAW_CONFIG_PATH;
|
|
49
89
|
const raw = readFileSync(path, "utf-8");
|
|
50
90
|
const json = JSON.parse(raw);
|
|
51
|
-
const token = json?.gateway?.token
|
|
52
|
-
|
|
91
|
+
const token = resolveConfiguredSecret(json?.gateway?.token)
|
|
92
|
+
?? resolveConfiguredSecret(json?.gateway?.auth?.token);
|
|
93
|
+
const password = resolveConfiguredSecret(json?.gateway?.password)
|
|
94
|
+
?? resolveConfiguredSecret(json?.gateway?.auth?.password);
|
|
53
95
|
if (token || password)
|
|
54
96
|
return { token, password };
|
|
55
97
|
}
|
|
56
98
|
catch {
|
|
57
99
|
// ignore
|
|
58
100
|
}
|
|
59
|
-
// Fall back to environment variables (e.g. set via LaunchAgent)
|
|
60
|
-
const envToken = process.env.OPENCLAW_GATEWAY_TOKEN;
|
|
61
|
-
const envPassword = process.env.OPENCLAW_GATEWAY_PASSWORD;
|
|
62
|
-
if (envToken || envPassword) {
|
|
63
|
-
return { token: envToken, password: envPassword };
|
|
64
|
-
}
|
|
65
101
|
return {};
|
|
66
102
|
}
|
|
67
103
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACpD,MAAM,2BAA2B,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;AAalF,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,uBAAuB,WAAW,4BAA4B,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC9C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,yBAAyB,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,2BAA2B,CAAC;QAC/E,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoC,CAAC;QAChE,MAAM,IAAI,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK,CAAC;QAC1C,OAAO,kBAAkB,IAAI,EAAE,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,sBAAsB,CAAC;IAChC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,GAAiB;IAC/C,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const DEFAULT_RELAY_SERVER = "https://clawpilot.codeaddict.cn";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-config.js","sourceRoot":"","sources":["../../src/generated/build-config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,iCAAiC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { runCommand } from "./commands/run.js";
|
|
|
6
6
|
import { installCommand, uninstallCommand, stopCommand, restartCommand, resetCommand } from "./commands/install.js";
|
|
7
7
|
import { statusCommand } from "./commands/status.js";
|
|
8
8
|
import { setTokenCommand } from "./commands/set-token.js";
|
|
9
|
+
import { DEFAULT_RELAY_SERVER } from "./generated/build-config.js";
|
|
9
10
|
const require = createRequire(import.meta.url);
|
|
10
11
|
const { version } = require("../package.json");
|
|
11
12
|
const program = new Command();
|
|
@@ -16,7 +17,7 @@ program
|
|
|
16
17
|
program
|
|
17
18
|
.command("pair")
|
|
18
19
|
.description("Register with relay server and display QR code for iOS pairing")
|
|
19
|
-
.option("-s, --server <url>", "Relay server URL",
|
|
20
|
+
.option("-s, --server <url>", "Relay server URL", DEFAULT_RELAY_SERVER)
|
|
20
21
|
.option("-n, --name <name>", "Display name for this host")
|
|
21
22
|
.option("--code-only", "Print only the access code and skip QR code output", false)
|
|
22
23
|
.action(async (opts) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type UploadResult } from "./oss-uploader.js";
|
|
2
|
+
export interface MediaBlock {
|
|
3
|
+
mimeType: string;
|
|
4
|
+
/** Buffer content (decoded from base64 or read from local path) */
|
|
5
|
+
data: Buffer;
|
|
6
|
+
}
|
|
7
|
+
export interface AssistantAttachment extends UploadResult {
|
|
8
|
+
width?: number;
|
|
9
|
+
height?: number;
|
|
10
|
+
durationMs?: number;
|
|
11
|
+
}
|
|
12
|
+
type ContentBlock = {
|
|
13
|
+
type: string;
|
|
14
|
+
text?: string;
|
|
15
|
+
source?: {
|
|
16
|
+
type?: string;
|
|
17
|
+
media_type?: string;
|
|
18
|
+
data?: string;
|
|
19
|
+
url?: string;
|
|
20
|
+
path?: string;
|
|
21
|
+
};
|
|
22
|
+
media_type?: string;
|
|
23
|
+
data?: string;
|
|
24
|
+
};
|
|
25
|
+
type HistoryMessage = {
|
|
26
|
+
role: string;
|
|
27
|
+
content?: ContentBlock[] | string;
|
|
28
|
+
};
|
|
29
|
+
export declare function extractMediaBlocks(history: {
|
|
30
|
+
messages?: HistoryMessage[];
|
|
31
|
+
}): MediaBlock[];
|
|
32
|
+
export declare function uploadAssistantAttachments(history: {
|
|
33
|
+
messages?: HistoryMessage[];
|
|
34
|
+
}, relayServerUrl: string, gatewayId: string, relaySecret: string): Promise<AssistantAttachment[]>;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Extract media (image / video) blocks from an OpenClaw gateway chat history
|
|
3
|
+
// response, and upload them to OSS via STS credentials from the relay server.
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
import { uploadMedia } from "./oss-uploader.js";
|
|
6
|
+
import { readFile } from "fs/promises";
|
|
7
|
+
// Max video size accepted for upload (200 MB)
|
|
8
|
+
const MAX_VIDEO_BYTES = 200 * 1024 * 1024;
|
|
9
|
+
export function extractMediaBlocks(history) {
|
|
10
|
+
const msgs = history.messages ?? [];
|
|
11
|
+
const last = [...msgs].reverse().find((m) => m.role === "assistant");
|
|
12
|
+
if (!last || !last.content)
|
|
13
|
+
return [];
|
|
14
|
+
const content = typeof last.content === "string" ? [] : last.content;
|
|
15
|
+
const blocks = [];
|
|
16
|
+
for (const block of content) {
|
|
17
|
+
if (block.type !== "image" && block.type !== "video")
|
|
18
|
+
continue;
|
|
19
|
+
const source = block.source;
|
|
20
|
+
const mimeType = source?.media_type ?? block.media_type ?? "image/jpeg";
|
|
21
|
+
// Only handle base64 and local file paths in Phase 1
|
|
22
|
+
if (source?.type === "base64" || (!source?.type && source?.data)) {
|
|
23
|
+
const raw = source?.data ?? block.data ?? "";
|
|
24
|
+
if (!raw)
|
|
25
|
+
continue;
|
|
26
|
+
try {
|
|
27
|
+
const buf = Buffer.from(raw.replace(/^data:[^;]+;base64,/, ""), "base64");
|
|
28
|
+
blocks.push({ mimeType, data: buf });
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
console.warn("[media] failed to decode base64 block, skipping");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else if (source?.type === "file" && source.path) {
|
|
35
|
+
// Local file reference — will be read asynchronously below
|
|
36
|
+
blocks.push({ mimeType, data: Buffer.alloc(0), _localPath: source.path });
|
|
37
|
+
}
|
|
38
|
+
// URL type is not handled in Phase 1
|
|
39
|
+
}
|
|
40
|
+
return blocks;
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Load local-path blocks and filter oversized videos
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
async function resolveLocalPaths(blocks) {
|
|
46
|
+
const resolved = [];
|
|
47
|
+
for (const b of blocks) {
|
|
48
|
+
if (b._localPath) {
|
|
49
|
+
try {
|
|
50
|
+
const buf = await readFile(b._localPath);
|
|
51
|
+
resolved.push({ mimeType: b.mimeType, data: buf });
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
console.warn(`[media] failed to read local file ${b._localPath}: ${err}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
resolved.push(b);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return resolved.filter((b) => {
|
|
62
|
+
if (b.mimeType.startsWith("video/") && b.data.length > MAX_VIDEO_BYTES) {
|
|
63
|
+
console.warn(`[media] video too large (${b.data.length} bytes), skipping`);
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return b.data.length > 0;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
// Fetch STS credentials from the relay server
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
async function fetchSts(relayServerUrl, gatewayId, relaySecret, mimeTypes, hasVideo) {
|
|
73
|
+
const url = `${relayServerUrl.replace(/\/$/, "")}/api/media/sts`;
|
|
74
|
+
const res = await fetch(url, {
|
|
75
|
+
method: "POST",
|
|
76
|
+
headers: { "Content-Type": "application/json" },
|
|
77
|
+
body: JSON.stringify({
|
|
78
|
+
gatewayId,
|
|
79
|
+
relaySecret,
|
|
80
|
+
count: mimeTypes.length,
|
|
81
|
+
mimeTypes,
|
|
82
|
+
durationSeconds: hasVideo ? 1800 : 600,
|
|
83
|
+
}),
|
|
84
|
+
});
|
|
85
|
+
if (!res.ok) {
|
|
86
|
+
const text = await res.text().catch(() => "");
|
|
87
|
+
throw new Error(`STS fetch failed: ${res.status} ${text}`);
|
|
88
|
+
}
|
|
89
|
+
return res.json();
|
|
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);
|
|
99
|
+
if (blocks.length === 0)
|
|
100
|
+
return [];
|
|
101
|
+
const mimeTypes = blocks.map((b) => b.mimeType);
|
|
102
|
+
const hasVideo = mimeTypes.some((m) => m.startsWith("video/"));
|
|
103
|
+
let sts;
|
|
104
|
+
try {
|
|
105
|
+
sts = await fetchSts(relayServerUrl, gatewayId, relaySecret, mimeTypes, hasVideo);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
console.error("[media] failed to fetch STS:", err);
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
const results = [];
|
|
112
|
+
// Upload images concurrently (max 3), videos serially
|
|
113
|
+
const imageBlocks = blocks.filter((b) => !b.mimeType.startsWith("video/"));
|
|
114
|
+
const videoBlocks = blocks.filter((b) => b.mimeType.startsWith("video/"));
|
|
115
|
+
// Images: up to 3 concurrent
|
|
116
|
+
const imageBatches = [];
|
|
117
|
+
for (let i = 0; i < imageBlocks.length; i += 3) {
|
|
118
|
+
imageBatches.push(imageBlocks.slice(i, i + 3));
|
|
119
|
+
}
|
|
120
|
+
for (const batch of imageBatches) {
|
|
121
|
+
const settled = await Promise.allSettled(batch.map((b) => uploadMedia(sts, b.data, b.mimeType)));
|
|
122
|
+
for (const r of settled) {
|
|
123
|
+
if (r.status === "fulfilled") {
|
|
124
|
+
results.push(r.value);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.warn("[media] image upload failed:", r.reason);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Videos: serial
|
|
132
|
+
for (const b of videoBlocks) {
|
|
133
|
+
try {
|
|
134
|
+
const r = await uploadMedia(sts, b.data, b.mimeType);
|
|
135
|
+
results.push(r);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
console.warn("[media] video upload failed:", err);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
console.log(`[media] uploaded ${results.length}/${blocks.length} attachments`);
|
|
142
|
+
return results;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=assistant-attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistant-attachments.js","sourceRoot":"","sources":["../../src/media/assistant-attachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface StsCredentials {
|
|
2
|
+
bucket: string;
|
|
3
|
+
region: string;
|
|
4
|
+
endpoint: string;
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
dirPrefix: string;
|
|
7
|
+
expiresAt: number;
|
|
8
|
+
credentials: {
|
|
9
|
+
accessKeyId: string;
|
|
10
|
+
accessKeySecret: string;
|
|
11
|
+
securityToken: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export interface UploadResult {
|
|
15
|
+
url: string;
|
|
16
|
+
thumbnailUrl?: string;
|
|
17
|
+
mimeType: string;
|
|
18
|
+
size: number;
|
|
19
|
+
}
|
|
20
|
+
export declare function putObject(sts: StsCredentials, data: Buffer, ext: string, mimeType: string): Promise<UploadResult>;
|
|
21
|
+
export declare function multipartUpload(sts: StsCredentials, data: Buffer, ext: string, mimeType: string): Promise<UploadResult>;
|
|
22
|
+
export declare function uploadMedia(sts: StsCredentials, data: Buffer, mimeType: string): Promise<UploadResult>;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { createHmac } from "crypto";
|
|
2
|
+
import { randomUUID } from "crypto";
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// OSS HMAC-SHA1 request signing (with STS security token)
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
function ossSign(method, contentMd5, contentType, date, canonicalizedHeaders, canonicalizedResource, secretKey) {
|
|
7
|
+
const stringToSign = [
|
|
8
|
+
method,
|
|
9
|
+
contentMd5,
|
|
10
|
+
contentType,
|
|
11
|
+
date,
|
|
12
|
+
canonicalizedHeaders + canonicalizedResource,
|
|
13
|
+
].join("\n");
|
|
14
|
+
return createHmac("sha1", secretKey).update(stringToSign).digest("base64");
|
|
15
|
+
}
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Simple PutObject upload (images / small files)
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
export async function putObject(sts, data, ext, mimeType) {
|
|
20
|
+
const { bucket, endpoint, baseUrl, dirPrefix, credentials } = sts;
|
|
21
|
+
const objectKey = `${dirPrefix}/${randomUUID()}${ext}`;
|
|
22
|
+
const date = new Date().toUTCString();
|
|
23
|
+
const canonicalizedResource = `/${bucket}/${objectKey}`;
|
|
24
|
+
const canonicalizedHeaders = `x-oss-security-token:${credentials.securityToken}\n`;
|
|
25
|
+
const sig = ossSign("PUT", "", mimeType, date, canonicalizedHeaders, canonicalizedResource, credentials.accessKeySecret);
|
|
26
|
+
const url = `${endpoint.replace(/\/$/, "")}/${objectKey}`;
|
|
27
|
+
const res = await fetch(url, {
|
|
28
|
+
method: "PUT",
|
|
29
|
+
headers: {
|
|
30
|
+
"Content-Type": mimeType,
|
|
31
|
+
"Date": date,
|
|
32
|
+
"x-oss-security-token": credentials.securityToken,
|
|
33
|
+
"Authorization": `OSS ${credentials.accessKeyId}:${sig}`,
|
|
34
|
+
},
|
|
35
|
+
body: data,
|
|
36
|
+
});
|
|
37
|
+
if (!res.ok) {
|
|
38
|
+
const text = await res.text().catch(() => "");
|
|
39
|
+
throw new Error(`OSS PutObject failed: ${res.status} ${text}`);
|
|
40
|
+
}
|
|
41
|
+
const publicUrl = `${baseUrl.replace(/\/$/, "")}/${objectKey}`;
|
|
42
|
+
return { url: publicUrl, mimeType, size: data.length };
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Multipart upload (videos > 10 MB)
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
const PART_SIZE = 5 * 1024 * 1024; // 5 MB per part
|
|
48
|
+
export async function multipartUpload(sts, data, ext, mimeType) {
|
|
49
|
+
const { bucket, endpoint, baseUrl, dirPrefix, credentials } = sts;
|
|
50
|
+
const objectKey = `${dirPrefix}/${randomUUID()}${ext}`;
|
|
51
|
+
const baseOssUrl = `${endpoint.replace(/\/$/, "")}/${objectKey}`;
|
|
52
|
+
function makeHeaders(method, contentType, extraHeaders, resource) {
|
|
53
|
+
const date = new Date().toUTCString();
|
|
54
|
+
const canonicalizedHeaders = [
|
|
55
|
+
"x-oss-security-token:" + credentials.securityToken,
|
|
56
|
+
...Object.entries(extraHeaders)
|
|
57
|
+
.filter(([k]) => k.startsWith("x-oss-"))
|
|
58
|
+
.sort()
|
|
59
|
+
.map(([k, v]) => `${k}:${v}`),
|
|
60
|
+
]
|
|
61
|
+
.sort()
|
|
62
|
+
.join("\n") + "\n";
|
|
63
|
+
const sig = ossSign(method, "", contentType, date, canonicalizedHeaders, `/${bucket}/${objectKey}`, credentials.accessKeySecret);
|
|
64
|
+
const headers = new Headers({
|
|
65
|
+
"Date": date,
|
|
66
|
+
"x-oss-security-token": credentials.securityToken,
|
|
67
|
+
"Authorization": `OSS ${credentials.accessKeyId}:${sig}`,
|
|
68
|
+
...extraHeaders,
|
|
69
|
+
});
|
|
70
|
+
if (contentType)
|
|
71
|
+
headers.set("Content-Type", contentType);
|
|
72
|
+
return headers;
|
|
73
|
+
}
|
|
74
|
+
// 1. Initiate
|
|
75
|
+
const initRes = await fetch(`${baseOssUrl}?uploads`, {
|
|
76
|
+
method: "POST",
|
|
77
|
+
headers: makeHeaders("POST", mimeType, {}, `/${bucket}/${objectKey}`),
|
|
78
|
+
});
|
|
79
|
+
if (!initRes.ok)
|
|
80
|
+
throw new Error(`OSS InitiateMultipartUpload failed: ${initRes.status}`);
|
|
81
|
+
const initText = await initRes.text();
|
|
82
|
+
const uploadIdMatch = initText.match(/<UploadId>([^<]+)<\/UploadId>/);
|
|
83
|
+
if (!uploadIdMatch)
|
|
84
|
+
throw new Error("OSS: could not parse UploadId");
|
|
85
|
+
const uploadId = uploadIdMatch[1];
|
|
86
|
+
// 2. Upload parts
|
|
87
|
+
const parts = [];
|
|
88
|
+
let partNumber = 1;
|
|
89
|
+
let offset = 0;
|
|
90
|
+
try {
|
|
91
|
+
while (offset < data.length) {
|
|
92
|
+
const chunk = data.slice(offset, offset + PART_SIZE);
|
|
93
|
+
const partDate = new Date().toUTCString();
|
|
94
|
+
const canonicalizedHeaders = `x-oss-security-token:${credentials.securityToken}\n`;
|
|
95
|
+
const sig = ossSign("PUT", "", "application/octet-stream", partDate, canonicalizedHeaders, `/${bucket}/${objectKey}`, credentials.accessKeySecret);
|
|
96
|
+
const partRes = await fetch(`${baseOssUrl}?partNumber=${partNumber}&uploadId=${uploadId}`, {
|
|
97
|
+
method: "PUT",
|
|
98
|
+
headers: {
|
|
99
|
+
"Content-Type": "application/octet-stream",
|
|
100
|
+
"Date": partDate,
|
|
101
|
+
"x-oss-security-token": credentials.securityToken,
|
|
102
|
+
"Authorization": `OSS ${credentials.accessKeyId}:${sig}`,
|
|
103
|
+
},
|
|
104
|
+
body: chunk,
|
|
105
|
+
});
|
|
106
|
+
if (!partRes.ok)
|
|
107
|
+
throw new Error(`OSS UploadPart ${partNumber} failed: ${partRes.status}`);
|
|
108
|
+
const etag = partRes.headers.get("etag") ?? "";
|
|
109
|
+
parts.push({ partNumber, etag });
|
|
110
|
+
partNumber++;
|
|
111
|
+
offset += PART_SIZE;
|
|
112
|
+
}
|
|
113
|
+
// 3. Complete
|
|
114
|
+
const completeBody = [
|
|
115
|
+
"<CompleteMultipartUpload>",
|
|
116
|
+
...parts.map((p) => `<Part><PartNumber>${p.partNumber}</PartNumber><ETag>${p.etag}</ETag></Part>`),
|
|
117
|
+
"</CompleteMultipartUpload>",
|
|
118
|
+
].join("");
|
|
119
|
+
const completeDate = new Date().toUTCString();
|
|
120
|
+
const cHeaders = `x-oss-security-token:${credentials.securityToken}\n`;
|
|
121
|
+
const cSig = ossSign("POST", "", "application/xml", completeDate, cHeaders, `/${bucket}/${objectKey}`, credentials.accessKeySecret);
|
|
122
|
+
const completeRes = await fetch(`${baseOssUrl}?uploadId=${uploadId}`, {
|
|
123
|
+
method: "POST",
|
|
124
|
+
headers: {
|
|
125
|
+
"Content-Type": "application/xml",
|
|
126
|
+
"Date": completeDate,
|
|
127
|
+
"x-oss-security-token": credentials.securityToken,
|
|
128
|
+
"Authorization": `OSS ${credentials.accessKeyId}:${cSig}`,
|
|
129
|
+
},
|
|
130
|
+
body: completeBody,
|
|
131
|
+
});
|
|
132
|
+
if (!completeRes.ok)
|
|
133
|
+
throw new Error(`OSS CompleteMultipartUpload failed: ${completeRes.status}`);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
// Best-effort abort to avoid billing for incomplete upload
|
|
137
|
+
try {
|
|
138
|
+
const abortDate = new Date().toUTCString();
|
|
139
|
+
const aHeaders = `x-oss-security-token:${credentials.securityToken}\n`;
|
|
140
|
+
const aSig = ossSign("DELETE", "", "", abortDate, aHeaders, `/${bucket}/${objectKey}`, credentials.accessKeySecret);
|
|
141
|
+
await fetch(`${baseOssUrl}?uploadId=${uploadId}`, {
|
|
142
|
+
method: "DELETE",
|
|
143
|
+
headers: {
|
|
144
|
+
"Date": abortDate,
|
|
145
|
+
"x-oss-security-token": credentials.securityToken,
|
|
146
|
+
"Authorization": `OSS ${credentials.accessKeyId}:${aSig}`,
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
catch { /* ignore abort errors */ }
|
|
151
|
+
throw err;
|
|
152
|
+
}
|
|
153
|
+
const publicUrl = `${baseUrl.replace(/\/$/, "")}/${objectKey}`;
|
|
154
|
+
// OSS video snapshot thumbnail URL
|
|
155
|
+
const thumbnailUrl = `${publicUrl}?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0,m_fast`;
|
|
156
|
+
return { url: publicUrl, thumbnailUrl, mimeType, size: data.length };
|
|
157
|
+
}
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
// Convenience: auto-select PutObject vs multipart based on size
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
const MULTIPART_THRESHOLD = 10 * 1024 * 1024; // 10 MB
|
|
162
|
+
export async function uploadMedia(sts, data, mimeType) {
|
|
163
|
+
const ext = mimeTypeToExt(mimeType);
|
|
164
|
+
if (data.length >= MULTIPART_THRESHOLD) {
|
|
165
|
+
return multipartUpload(sts, data, ext, mimeType);
|
|
166
|
+
}
|
|
167
|
+
return putObject(sts, data, ext, mimeType);
|
|
168
|
+
}
|
|
169
|
+
function mimeTypeToExt(mimeType) {
|
|
170
|
+
const map = {
|
|
171
|
+
"image/jpeg": ".jpg",
|
|
172
|
+
"image/png": ".png",
|
|
173
|
+
"image/gif": ".gif",
|
|
174
|
+
"image/webp": ".webp",
|
|
175
|
+
"video/mp4": ".mp4",
|
|
176
|
+
"video/quicktime": ".mov",
|
|
177
|
+
};
|
|
178
|
+
return map[mimeType] ?? ".bin";
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=oss-uploader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oss-uploader.js","sourceRoot":"","sources":["../../src/media/oss-uploader.ts"],"names":[],"mappings":"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"}
|
|
@@ -194,20 +194,23 @@ function installLinuxServiceNohup() {
|
|
|
194
194
|
return pid != null && isPidRunning(pid);
|
|
195
195
|
}
|
|
196
196
|
function installLinuxService() {
|
|
197
|
+
try {
|
|
198
|
+
if (installLinuxServiceNohup()) {
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// Fall back to systemd below.
|
|
204
|
+
}
|
|
197
205
|
if (canUseSystemdUser()) {
|
|
198
206
|
try {
|
|
199
207
|
return installLinuxServiceSystemd();
|
|
200
208
|
}
|
|
201
209
|
catch {
|
|
202
|
-
//
|
|
210
|
+
// Give up below.
|
|
203
211
|
}
|
|
204
212
|
}
|
|
205
|
-
|
|
206
|
-
return installLinuxServiceNohup();
|
|
207
|
-
}
|
|
208
|
-
catch {
|
|
209
|
-
return false;
|
|
210
|
-
}
|
|
213
|
+
return false;
|
|
211
214
|
}
|
|
212
215
|
function installWindowsService() {
|
|
213
216
|
ensureLogDir();
|