clawconnect-agent 0.1.6 → 0.1.7
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 +83 -7
- package/README.zh-CN.md +93 -17
- package/dist/commands/install.js +10 -4
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/local-handlers.js +0 -28
- package/dist/commands/local-handlers.js.map +1 -1
- package/dist/commands/pair.d.ts +2 -0
- package/dist/commands/pair.js +17 -6
- package/dist/commands/pair.js.map +1 -1
- package/dist/commands/run.js +13 -16
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/send-file.d.ts +2 -0
- package/dist/commands/send-file.js +6 -0
- package/dist/commands/send-file.js.map +1 -1
- package/dist/commands/status.d.ts +13 -1
- package/dist/commands/status.js +58 -15
- package/dist/commands/status.js.map +1 -1
- package/dist/config/config.d.ts +6 -11
- package/dist/config/config.js +19 -48
- package/dist/config/config.js.map +1 -1
- package/dist/config/env.d.ts +1 -1
- package/dist/config/env.js +4 -5
- package/dist/config/env.js.map +1 -1
- package/dist/config/profile.d.ts +11 -0
- package/dist/config/profile.js +80 -0
- package/dist/config/profile.js.map +1 -0
- package/dist/gateway-profiles.d.ts +8 -0
- package/dist/gateway-profiles.js +24 -0
- package/dist/gateway-profiles.js.map +1 -0
- package/dist/hermes/hermes-relay-manager.d.ts +49 -0
- package/dist/hermes/hermes-relay-manager.js +636 -0
- package/dist/hermes/hermes-relay-manager.js.map +1 -0
- package/dist/hermes/hermes-runtime.d.ts +8 -0
- package/dist/hermes/hermes-runtime.js +8 -0
- package/dist/hermes/hermes-runtime.js.map +1 -0
- package/dist/hermes/hermes-session-store.d.ts +15 -0
- package/dist/hermes/hermes-session-store.js +152 -0
- package/dist/hermes/hermes-session-store.js.map +1 -0
- package/dist/hermes/hermes-voice-input.d.ts +13 -0
- package/dist/hermes/hermes-voice-input.js +27 -0
- package/dist/hermes/hermes-voice-input.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-artifacts.d.ts +3 -0
- package/dist/hermes/models/hermes-runtime-artifacts.js +65 -0
- package/dist/hermes/models/hermes-runtime-artifacts.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-backups.d.ts +5 -0
- package/dist/hermes/models/hermes-runtime-backups.js +128 -0
- package/dist/hermes/models/hermes-runtime-backups.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-chat.d.ts +40 -0
- package/dist/hermes/models/hermes-runtime-chat.js +623 -0
- package/dist/hermes/models/hermes-runtime-chat.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-command-router.d.ts +2 -0
- package/dist/hermes/models/hermes-runtime-command-router.js +93 -0
- package/dist/hermes/models/hermes-runtime-command-router.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-command-utils.d.ts +3 -0
- package/dist/hermes/models/hermes-runtime-command-utils.js +19 -0
- package/dist/hermes/models/hermes-runtime-command-utils.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-cron.d.ts +11 -0
- package/dist/hermes/models/hermes-runtime-cron.js +301 -0
- package/dist/hermes/models/hermes-runtime-cron.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-lifecycle.d.ts +9 -0
- package/dist/hermes/models/hermes-runtime-lifecycle.js +111 -0
- package/dist/hermes/models/hermes-runtime-lifecycle.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-models.d.ts +29 -0
- package/dist/hermes/models/hermes-runtime-models.js +125 -0
- package/dist/hermes/models/hermes-runtime-models.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-process.d.ts +22 -0
- package/dist/hermes/models/hermes-runtime-process.js +130 -0
- package/dist/hermes/models/hermes-runtime-process.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-sessions.d.ts +5 -0
- package/dist/hermes/models/hermes-runtime-sessions.js +71 -0
- package/dist/hermes/models/hermes-runtime-sessions.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-skills.d.ts +13 -0
- package/dist/hermes/models/hermes-runtime-skills.js +322 -0
- package/dist/hermes/models/hermes-runtime-skills.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-types.d.ts +19 -0
- package/dist/hermes/models/hermes-runtime-types.js +2 -0
- package/dist/hermes/models/hermes-runtime-types.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-usage.d.ts +22 -0
- package/dist/hermes/models/hermes-runtime-usage.js +211 -0
- package/dist/hermes/models/hermes-runtime-usage.js.map +1 -0
- package/dist/hermes/models/hermes-runtime-values.d.ts +14 -0
- package/dist/hermes/models/hermes-runtime-values.js +105 -0
- package/dist/hermes/models/hermes-runtime-values.js.map +1 -0
- package/dist/i18n/index.js +4 -0
- package/dist/i18n/index.js.map +1 -1
- package/dist/index.js +115 -9
- package/dist/index.js.map +1 -1
- package/dist/platform/service-manager-common.d.ts +5 -2
- package/dist/platform/service-manager-common.js +18 -7
- package/dist/platform/service-manager-common.js.map +1 -1
- package/dist/platform/service-manager.d.ts +16 -5
- package/dist/platform/service-manager.js +85 -50
- package/dist/platform/service-manager.js.map +1 -1
- package/dist/relay/chat-history.js +18 -0
- package/dist/relay/chat-history.js.map +1 -1
- package/dist/relay/gateway-client.js +4 -3
- package/dist/relay/gateway-client.js.map +1 -1
- package/dist/relay/mobile-chat-run-bridge.d.ts +93 -0
- package/dist/relay/mobile-chat-run-bridge.js +68 -0
- package/dist/relay/mobile-chat-run-bridge.js.map +1 -0
- package/dist/relay/openclaw-voice-input.d.ts +13 -0
- package/dist/relay/openclaw-voice-input.js +18 -0
- package/dist/relay/openclaw-voice-input.js.map +1 -0
- package/dist/relay/relay-manager.d.ts +0 -3
- package/dist/relay/relay-manager.js +39 -170
- package/dist/relay/relay-manager.js.map +1 -1
- package/dist/relay/session-context.js +11 -1
- package/dist/relay/session-context.js.map +1 -1
- package/dist/relay/slash-command-catalog.d.ts +1 -1
- package/dist/relay/slash-command-catalog.generated.d.ts +0 -5
- package/dist/relay/slash-command-catalog.generated.js +0 -6
- package/dist/relay/slash-command-catalog.generated.js.map +1 -1
- package/dist/relay/voice-input.d.ts +11 -0
- package/dist/relay/voice-input.js +118 -0
- package/dist/relay/voice-input.js.map +1 -0
- package/dist/runtime-adapters.d.ts +19 -0
- package/dist/runtime-adapters.js +39 -0
- package/dist/runtime-adapters.js.map +1 -0
- package/package.json +3 -3
- package/dist/commands/voice-reply.d.ts +0 -39
- package/dist/commands/voice-reply.js +0 -329
- package/dist/commands/voice-reply.js.map +0 -1
- package/dist/relay/voice-reply-preference.d.ts +0 -25
- package/dist/relay/voice-reply-preference.js +0 -103
- package/dist/relay/voice-reply-preference.js.map +0 -1
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { execFile as execFileCb } from "node:child_process";
|
|
2
|
+
import { mkdir, mkdtemp, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { basename, extname, join } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { extensionForMimeType } from "./attachment-staging.js";
|
|
7
|
+
const execFile = promisify(execFileCb);
|
|
8
|
+
export async function prepareVoiceSendParams(rawParams, options = {}) {
|
|
9
|
+
const record = rawParams && typeof rawParams === "object" && !Array.isArray(rawParams)
|
|
10
|
+
? { ...rawParams }
|
|
11
|
+
: {};
|
|
12
|
+
const audio = resolveVoiceAudioPayload(record);
|
|
13
|
+
if (!audio) {
|
|
14
|
+
throw new Error("voice_audio_required");
|
|
15
|
+
}
|
|
16
|
+
if (!audio.mimeType.toLowerCase().startsWith("audio/")) {
|
|
17
|
+
throw new Error("voice_audio_required");
|
|
18
|
+
}
|
|
19
|
+
const languageHint = stringValue(record.languageHint);
|
|
20
|
+
const stagingRoot = options.stagingDir ?? await mkdtemp(join(tmpdir(), "clawconnect-voice-input-"));
|
|
21
|
+
await mkdir(stagingRoot, { recursive: true });
|
|
22
|
+
const audioPath = join(stagingRoot, resolveVoiceAudioFileName(audio));
|
|
23
|
+
await writeFile(audioPath, Buffer.from(audio.content, "base64"));
|
|
24
|
+
const transcribeAudio = options.transcribeAudioImpl ?? transcribeAudioWithConfiguredCommand;
|
|
25
|
+
const transcript = (await transcribeAudio({
|
|
26
|
+
audioPath,
|
|
27
|
+
mimeType: audio.mimeType,
|
|
28
|
+
languageHint,
|
|
29
|
+
})).trim();
|
|
30
|
+
if (!transcript) {
|
|
31
|
+
throw new Error("voice_transcript_empty");
|
|
32
|
+
}
|
|
33
|
+
const typedMessage = stringValue(record.message);
|
|
34
|
+
const message = typedMessage ? `${typedMessage}\n\n${transcript}` : transcript;
|
|
35
|
+
const next = {
|
|
36
|
+
...record,
|
|
37
|
+
message,
|
|
38
|
+
};
|
|
39
|
+
delete next.audio;
|
|
40
|
+
delete next.languageHint;
|
|
41
|
+
delete next.attachments;
|
|
42
|
+
return next;
|
|
43
|
+
}
|
|
44
|
+
export function voiceInputSetupMessage(error) {
|
|
45
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
46
|
+
if (!message.includes("voice_asr_not_configured")) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
return [
|
|
50
|
+
"未安装语音输入技能,暂时不能使用语音对话。",
|
|
51
|
+
"安装路径:ClawLink → 技能扩展 → 语音转文字(SenseVoice int8)→ 安装。",
|
|
52
|
+
"安装完成后会写入 OPENCLAW_ASR_COMMAND,然后重启 ClawConnect 再试。",
|
|
53
|
+
].join("\n");
|
|
54
|
+
}
|
|
55
|
+
async function transcribeAudioWithConfiguredCommand(opts) {
|
|
56
|
+
const command = process.env.OPENCLAW_ASR_COMMAND?.trim();
|
|
57
|
+
if (!command) {
|
|
58
|
+
throw new Error("voice_asr_not_configured");
|
|
59
|
+
}
|
|
60
|
+
const rendered = command
|
|
61
|
+
.replaceAll("{file}", shellQuote(opts.audioPath))
|
|
62
|
+
.replaceAll("{language}", shellQuote(opts.languageHint ?? ""))
|
|
63
|
+
.replaceAll("{mimeType}", shellQuote(opts.mimeType));
|
|
64
|
+
const { stdout } = await execFile("sh", ["-lc", rendered], {
|
|
65
|
+
timeout: 120_000,
|
|
66
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
67
|
+
});
|
|
68
|
+
return stdout.trim();
|
|
69
|
+
}
|
|
70
|
+
function resolveVoiceAudioPayload(record) {
|
|
71
|
+
const inline = normalizeAudioRecord(record.audio);
|
|
72
|
+
if (inline) {
|
|
73
|
+
return inline;
|
|
74
|
+
}
|
|
75
|
+
const attachments = Array.isArray(record.attachments) ? record.attachments : [];
|
|
76
|
+
for (const attachment of attachments) {
|
|
77
|
+
const normalized = normalizeAudioRecord(attachment);
|
|
78
|
+
if (normalized?.mimeType.toLowerCase().startsWith("audio/")) {
|
|
79
|
+
return normalized;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
function normalizeAudioRecord(value) {
|
|
85
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
const record = value;
|
|
89
|
+
const content = stringValue(record.content);
|
|
90
|
+
if (!content) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
const mimeType = stringValue(record.mimeType) ?? stringValue(record.contentType) ?? stringValue(record.type) ?? "application/octet-stream";
|
|
94
|
+
const fileName = sanitizeFileName(stringValue(record.fileName) ?? stringValue(record.name) ?? stringValue(record.filename), mimeType);
|
|
95
|
+
return { fileName, mimeType, content };
|
|
96
|
+
}
|
|
97
|
+
function resolveVoiceAudioFileName(audio) {
|
|
98
|
+
const ext = extname(audio.fileName);
|
|
99
|
+
return ext ? audio.fileName : `${audio.fileName}${extensionForMimeType(audio.mimeType)}`;
|
|
100
|
+
}
|
|
101
|
+
function sanitizeFileName(value, mimeType) {
|
|
102
|
+
const fallback = `voice-input${extensionForMimeType(mimeType)}`;
|
|
103
|
+
const trimmed = value?.trim();
|
|
104
|
+
if (!trimmed) {
|
|
105
|
+
return fallback;
|
|
106
|
+
}
|
|
107
|
+
const leaf = basename(trimmed.replace(/\\/g, "/"))
|
|
108
|
+
.replace(/[\u0000-\u001f\u007f]/g, "")
|
|
109
|
+
.trim();
|
|
110
|
+
return leaf || fallback;
|
|
111
|
+
}
|
|
112
|
+
function stringValue(value) {
|
|
113
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
114
|
+
}
|
|
115
|
+
function shellQuote(value) {
|
|
116
|
+
return `'${value.replaceAll("'", "'\\''")}'`;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=voice-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-input.js","sourceRoot":"","sources":["../../src/relay/voice-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ClawConnectConfig } from "./config/config.js";
|
|
2
|
+
import type { GatewayType } from "./gateway-profiles.js";
|
|
3
|
+
export type GatewayRuntimeContext = {
|
|
4
|
+
config: ClawConnectConfig;
|
|
5
|
+
gatewayUrl: () => string;
|
|
6
|
+
gatewayAuth: {
|
|
7
|
+
token?: string;
|
|
8
|
+
password?: string;
|
|
9
|
+
};
|
|
10
|
+
signal: AbortSignal;
|
|
11
|
+
onConnected: () => void;
|
|
12
|
+
onDisconnected: () => void;
|
|
13
|
+
};
|
|
14
|
+
export type GatewayRuntimeAdapter = {
|
|
15
|
+
type: GatewayType;
|
|
16
|
+
logsGatewayUrl: boolean;
|
|
17
|
+
start: (context: GatewayRuntimeContext) => Promise<boolean>;
|
|
18
|
+
};
|
|
19
|
+
export declare function getGatewayRuntimeAdapter(gatewayType: GatewayType): GatewayRuntimeAdapter;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { runHermesRelayManager } from "./hermes/hermes-relay-manager.js";
|
|
2
|
+
import { runRelayManager } from "./relay/relay-manager.js";
|
|
3
|
+
const OPENCLAW_RUNTIME_ADAPTER = {
|
|
4
|
+
type: "openclaw",
|
|
5
|
+
logsGatewayUrl: true,
|
|
6
|
+
start: (context) => runRelayManager({
|
|
7
|
+
relayServerUrl: context.config.relayServerUrl,
|
|
8
|
+
gatewayId: context.config.gatewayId,
|
|
9
|
+
relaySecret: context.config.relaySecret,
|
|
10
|
+
gatewayUrl: context.gatewayUrl,
|
|
11
|
+
gatewayToken: context.gatewayAuth.token,
|
|
12
|
+
gatewayPassword: context.gatewayAuth.password,
|
|
13
|
+
signal: context.signal,
|
|
14
|
+
onConnected: context.onConnected,
|
|
15
|
+
onDisconnected: context.onDisconnected,
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
const HERMES_RUNTIME_ADAPTER = {
|
|
19
|
+
type: "hermes",
|
|
20
|
+
logsGatewayUrl: false,
|
|
21
|
+
start: (context) => runHermesRelayManager({
|
|
22
|
+
relayServerUrl: context.config.relayServerUrl,
|
|
23
|
+
gatewayId: context.config.gatewayId,
|
|
24
|
+
relaySecret: context.config.relaySecret,
|
|
25
|
+
displayName: context.config.displayName,
|
|
26
|
+
capabilities: context.config.capabilities,
|
|
27
|
+
signal: context.signal,
|
|
28
|
+
onConnected: context.onConnected,
|
|
29
|
+
onDisconnected: context.onDisconnected,
|
|
30
|
+
}),
|
|
31
|
+
};
|
|
32
|
+
const RUNTIME_ADAPTERS = {
|
|
33
|
+
openclaw: OPENCLAW_RUNTIME_ADAPTER,
|
|
34
|
+
hermes: HERMES_RUNTIME_ADAPTER,
|
|
35
|
+
};
|
|
36
|
+
export function getGatewayRuntimeAdapter(gatewayType) {
|
|
37
|
+
return RUNTIME_ADAPTERS[gatewayType];
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=runtime-adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-adapters.js","sourceRoot":"","sources":["../src/runtime-adapters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAkB3D,MAAM,wBAAwB,GAA0B;IACtD,IAAI,EAAE,UAAU;IAChB,cAAc,EAAE,IAAI;IACpB,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC;QAClC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc;QAC7C,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS;QACnC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW;QACvC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,YAAY,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK;QACvC,eAAe,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ;QAC7C,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC;CACH,CAAC;AAEF,MAAM,sBAAsB,GAA0B;IACpD,IAAI,EAAE,QAAQ;IACd,cAAc,EAAE,KAAK;IACrB,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC;QACxC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc;QAC7C,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS;QACnC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW;QACvC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW;QACvC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY;QACzC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC;CACH,CAAC;AAEF,MAAM,gBAAgB,GAA+C;IACnE,QAAQ,EAAE,wBAAwB;IAClC,MAAM,EAAE,sBAAsB;CAC/B,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,WAAwB;IAC/D,OAAO,gBAAgB,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clawconnect-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "ClawConnect host agent for OpenClaw remote access",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
"postbuild": "node -e \"require('fs').chmodSync('dist/index.js', 0o755)\"",
|
|
31
31
|
"sync:slash-commands": "tsx scripts/sync-slash-command-catalog.ts",
|
|
32
32
|
"prepack": "npm run build",
|
|
33
|
-
"test": "node --test --import tsx src/commands/*.test.ts src/config/*.test.ts src/platform/*.test.ts src/relay/*.test.ts",
|
|
33
|
+
"test": "node --test --import tsx src/*.test.ts src/commands/*.test.ts src/config/*.test.ts src/platform/*.test.ts src/relay/*.test.ts src/hermes/*.test.ts",
|
|
34
|
+
"test:e2e": "tsx scripts/e2e-protocol-smoke.ts",
|
|
34
35
|
"dev": "tsx src/index.ts",
|
|
35
36
|
"start": "node dist/index.js"
|
|
36
37
|
},
|
|
37
38
|
"dependencies": {
|
|
38
39
|
"commander": "^12.1.0",
|
|
39
|
-
"edge-tts-universal": "^1.4.0",
|
|
40
40
|
"qrcode-terminal": "^0.12.0",
|
|
41
41
|
"ws": "^8.18.0"
|
|
42
42
|
},
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { sendFileCommand, type SendFileCommandOptions, type SendFileCommandDependencies } from "./send-file.js";
|
|
2
|
-
export interface VoiceReplyCommandOptions extends Pick<SendFileCommandOptions, "gateway" | "session"> {
|
|
3
|
-
text: string;
|
|
4
|
-
voice?: string;
|
|
5
|
-
rate?: string;
|
|
6
|
-
speaker?: "system" | "espeak";
|
|
7
|
-
}
|
|
8
|
-
export interface VoiceReplyCommandDependencies extends SendFileCommandDependencies {
|
|
9
|
-
sendFileCommandImpl?: typeof sendFileCommand;
|
|
10
|
-
synthesizeEdgeTtsImpl?: typeof synthesizeWithEdgeTts;
|
|
11
|
-
synthesizeSystemTtsImpl?: typeof synthesizeWithSystemTts;
|
|
12
|
-
}
|
|
13
|
-
export interface VoiceReplyCommandResult {
|
|
14
|
-
audioPath: string;
|
|
15
|
-
durationMs: number;
|
|
16
|
-
sendFileResult: Awaited<ReturnType<typeof sendFileCommand>>;
|
|
17
|
-
}
|
|
18
|
-
export declare function sendVoiceReplyCommand(opts: VoiceReplyCommandOptions, deps?: VoiceReplyCommandDependencies): Promise<VoiceReplyCommandResult>;
|
|
19
|
-
export declare function synthesizeVoiceReplyAudio(opts: {
|
|
20
|
-
text: string;
|
|
21
|
-
audioPath: string;
|
|
22
|
-
voice?: string;
|
|
23
|
-
rate?: string;
|
|
24
|
-
speaker?: "system" | "espeak";
|
|
25
|
-
}, deps?: Pick<VoiceReplyCommandDependencies, "synthesizeEdgeTtsImpl" | "synthesizeSystemTtsImpl">): Promise<void>;
|
|
26
|
-
declare function synthesizeWithEdgeTts(opts: {
|
|
27
|
-
text: string;
|
|
28
|
-
audioPath: string;
|
|
29
|
-
voice?: string;
|
|
30
|
-
rate?: string;
|
|
31
|
-
}): Promise<void>;
|
|
32
|
-
declare function synthesizeWithSystemTts(opts: {
|
|
33
|
-
text: string;
|
|
34
|
-
audioPath: string;
|
|
35
|
-
voice?: string;
|
|
36
|
-
rate?: string;
|
|
37
|
-
strict?: boolean;
|
|
38
|
-
}): Promise<void>;
|
|
39
|
-
export {};
|
|
@@ -1,329 +0,0 @@
|
|
|
1
|
-
import { execFile as execFileCb, execFileSync } from "child_process";
|
|
2
|
-
import { mkdtemp, rm, writeFile } from "fs/promises";
|
|
3
|
-
import { tmpdir } from "os";
|
|
4
|
-
import { join } from "path";
|
|
5
|
-
import { promisify } from "util";
|
|
6
|
-
import { sendFileCommand } from "./send-file.js";
|
|
7
|
-
const execFile = promisify(execFileCb);
|
|
8
|
-
export async function sendVoiceReplyCommand(opts, deps = {}) {
|
|
9
|
-
const originalText = normalizeVoiceText(opts.text);
|
|
10
|
-
if (!originalText) {
|
|
11
|
-
throw new Error("voice_reply_text_required");
|
|
12
|
-
}
|
|
13
|
-
const spokenText = stripVoiceReplyFormatting(originalText).replace(/\s+/g, " ").trim();
|
|
14
|
-
if (!spokenText) {
|
|
15
|
-
throw new Error("voice_reply_text_required");
|
|
16
|
-
}
|
|
17
|
-
const durationMs = estimateSpeechDurationMs(spokenText);
|
|
18
|
-
const tempDir = await mkdtemp(join(tmpdir(), "clawconnect-voice-reply-"));
|
|
19
|
-
const audioPath = join(tempDir, "reply.mp3");
|
|
20
|
-
try {
|
|
21
|
-
await synthesizeVoiceReplyAudio({
|
|
22
|
-
text: spokenText,
|
|
23
|
-
audioPath,
|
|
24
|
-
voice: opts.voice,
|
|
25
|
-
rate: opts.rate,
|
|
26
|
-
speaker: opts.speaker,
|
|
27
|
-
}, deps);
|
|
28
|
-
const sendFileResult = await (deps.sendFileCommandImpl ?? sendFileCommand)({
|
|
29
|
-
filePath: audioPath,
|
|
30
|
-
gateway: opts.gateway,
|
|
31
|
-
session: opts.session,
|
|
32
|
-
durationMs,
|
|
33
|
-
transcript: originalText,
|
|
34
|
-
}, deps);
|
|
35
|
-
return {
|
|
36
|
-
audioPath,
|
|
37
|
-
durationMs,
|
|
38
|
-
sendFileResult,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
catch (error) {
|
|
42
|
-
throw error;
|
|
43
|
-
}
|
|
44
|
-
finally {
|
|
45
|
-
await rm(tempDir, { recursive: true, force: true });
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
export async function synthesizeVoiceReplyAudio(opts, deps = {}) {
|
|
49
|
-
const synthesizeEdgeTts = deps.synthesizeEdgeTtsImpl ?? synthesizeWithEdgeTts;
|
|
50
|
-
const synthesizeSystemTts = deps.synthesizeSystemTtsImpl ?? synthesizeWithSystemTts;
|
|
51
|
-
if (opts.speaker === "espeak") {
|
|
52
|
-
await synthesizeSystemTts({
|
|
53
|
-
text: opts.text,
|
|
54
|
-
audioPath: opts.audioPath,
|
|
55
|
-
voice: opts.voice,
|
|
56
|
-
rate: opts.rate,
|
|
57
|
-
strict: true,
|
|
58
|
-
});
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
if (opts.speaker === "system") {
|
|
62
|
-
await synthesizeSystemTts({
|
|
63
|
-
text: opts.text,
|
|
64
|
-
audioPath: opts.audioPath,
|
|
65
|
-
voice: opts.voice,
|
|
66
|
-
rate: opts.rate,
|
|
67
|
-
strict: true,
|
|
68
|
-
});
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
try {
|
|
72
|
-
await synthesizeEdgeTts({
|
|
73
|
-
text: opts.text,
|
|
74
|
-
audioPath: opts.audioPath,
|
|
75
|
-
voice: opts.voice,
|
|
76
|
-
rate: opts.rate,
|
|
77
|
-
});
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
catch (edgeError) {
|
|
81
|
-
console.warn(`[voice-reply] edge-tts-universal failed, falling back to system TTS: ${String(edgeError)}`);
|
|
82
|
-
}
|
|
83
|
-
await synthesizeSystemTts({
|
|
84
|
-
text: opts.text,
|
|
85
|
-
audioPath: opts.audioPath,
|
|
86
|
-
voice: opts.voice,
|
|
87
|
-
rate: opts.rate,
|
|
88
|
-
strict: false,
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
async function synthesizeWithEdgeTts(opts) {
|
|
92
|
-
const { EdgeTTS } = await import("edge-tts-universal");
|
|
93
|
-
const tts = new EdgeTTS(opts.text, resolveEdgeVoice(opts.text, opts.voice), resolveEdgeProsody(opts.rate));
|
|
94
|
-
const result = await tts.synthesize();
|
|
95
|
-
const audioBuffer = Buffer.from(await result.audio.arrayBuffer());
|
|
96
|
-
await writeFile(opts.audioPath, audioBuffer);
|
|
97
|
-
}
|
|
98
|
-
async function synthesizeWithSystemTts(opts) {
|
|
99
|
-
if (process.platform === "darwin") {
|
|
100
|
-
try {
|
|
101
|
-
await synthesizeWithSay(opts.text, opts.audioPath, resolveSystemVoice(opts.text, opts.voice), resolveSystemSpeechRate(opts.rate));
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
if (opts.strict) {
|
|
106
|
-
throw error;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
await synthesizeWithEspeak(opts.text, opts.audioPath, resolveSystemSpeechRate(opts.rate));
|
|
111
|
-
}
|
|
112
|
-
async function synthesizeWithSay(text, audioPath, voice, rate) {
|
|
113
|
-
const args = ["-o", audioPath];
|
|
114
|
-
if (voice && voice.trim()) {
|
|
115
|
-
args.push("-v", voice.trim());
|
|
116
|
-
}
|
|
117
|
-
if (typeof rate === "number" && Number.isFinite(rate)) {
|
|
118
|
-
args.push("-r", String(Math.max(80, Math.min(500, Math.round(rate)))));
|
|
119
|
-
}
|
|
120
|
-
args.push(text);
|
|
121
|
-
await execFile("say", args);
|
|
122
|
-
}
|
|
123
|
-
async function synthesizeWithEspeak(text, audioPath, rate) {
|
|
124
|
-
try {
|
|
125
|
-
const args = ["-w", audioPath];
|
|
126
|
-
if (typeof rate === "number" && Number.isFinite(rate)) {
|
|
127
|
-
args.push("-s", String(Math.max(80, Math.min(450, Math.round(rate)))));
|
|
128
|
-
}
|
|
129
|
-
args.push(text);
|
|
130
|
-
await execFile("espeak-ng", args);
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
catch {
|
|
134
|
-
const args = ["-w", audioPath];
|
|
135
|
-
if (typeof rate === "number" && Number.isFinite(rate)) {
|
|
136
|
-
args.push("-s", String(Math.max(80, Math.min(450, Math.round(rate)))));
|
|
137
|
-
}
|
|
138
|
-
args.push(text);
|
|
139
|
-
await execFile("espeak", args);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
function resolveEdgeVoice(text, voice) {
|
|
143
|
-
const preferredVoice = voice?.trim();
|
|
144
|
-
if (preferredVoice && looksLikeEdgeVoice(preferredVoice)) {
|
|
145
|
-
return preferredVoice;
|
|
146
|
-
}
|
|
147
|
-
return defaultEdgeVoice(text);
|
|
148
|
-
}
|
|
149
|
-
function resolveEdgeProsody(rate) {
|
|
150
|
-
const percent = parseRatePercent(rate);
|
|
151
|
-
if (percent === undefined || percent === 0) {
|
|
152
|
-
return undefined;
|
|
153
|
-
}
|
|
154
|
-
return {
|
|
155
|
-
rate: formatRatePercent(percent),
|
|
156
|
-
volume: "+0%",
|
|
157
|
-
pitch: "+0Hz",
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
function resolveSystemVoice(text, voice) {
|
|
161
|
-
const preferredVoice = voice?.trim();
|
|
162
|
-
if (preferredVoice && !looksLikeEdgeVoice(preferredVoice)) {
|
|
163
|
-
return preferredVoice;
|
|
164
|
-
}
|
|
165
|
-
if (preferredVoice) {
|
|
166
|
-
const mappedVoice = mapEdgeVoiceToSystemVoice(preferredVoice);
|
|
167
|
-
if (mappedVoice) {
|
|
168
|
-
return mappedVoice;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
return defaultMacVoice(text);
|
|
172
|
-
}
|
|
173
|
-
function resolveSystemSpeechRate(rate) {
|
|
174
|
-
const percent = parseRatePercent(rate);
|
|
175
|
-
if (percent === undefined || percent === 0) {
|
|
176
|
-
return undefined;
|
|
177
|
-
}
|
|
178
|
-
const baseRate = 200;
|
|
179
|
-
return Math.max(80, Math.min(500, Math.round(baseRate * (1 + percent / 100))));
|
|
180
|
-
}
|
|
181
|
-
function looksLikeEdgeVoice(voice) {
|
|
182
|
-
return /Neural$/i.test(voice);
|
|
183
|
-
}
|
|
184
|
-
function defaultEdgeVoice(text) {
|
|
185
|
-
if (containsCjk(text)) {
|
|
186
|
-
return "zh-CN-XiaoxiaoNeural";
|
|
187
|
-
}
|
|
188
|
-
return "en-US-EmmaMultilingualNeural";
|
|
189
|
-
}
|
|
190
|
-
function defaultMacVoice(text) {
|
|
191
|
-
if (!containsCjk(text)) {
|
|
192
|
-
return undefined;
|
|
193
|
-
}
|
|
194
|
-
return process.env.OPENCLAW_TTS_VOICE?.trim() || "Ting-Ting";
|
|
195
|
-
}
|
|
196
|
-
function mapEdgeVoiceToSystemVoice(voice) {
|
|
197
|
-
const normalized = voice.trim().toLowerCase();
|
|
198
|
-
if (normalized.includes("yunxi")) {
|
|
199
|
-
return findSystemVoice([
|
|
200
|
-
"Eddy (中文(中国大陆))",
|
|
201
|
-
"Eddy (中文(台湾))",
|
|
202
|
-
"Grandpa (中文(中国大陆))",
|
|
203
|
-
"Grandpa (中文(台湾))",
|
|
204
|
-
"Daniel",
|
|
205
|
-
"Fred",
|
|
206
|
-
"Aman",
|
|
207
|
-
"Albert",
|
|
208
|
-
]);
|
|
209
|
-
}
|
|
210
|
-
if (normalized.includes("xiaoxiao")) {
|
|
211
|
-
return findSystemVoice([
|
|
212
|
-
"Flo (中文(中国大陆))",
|
|
213
|
-
"Flo (中文(台湾))",
|
|
214
|
-
"Grandma (中文(中国大陆))",
|
|
215
|
-
"Grandma (中文(台湾))",
|
|
216
|
-
"Samantha",
|
|
217
|
-
"Moira",
|
|
218
|
-
"Victoria",
|
|
219
|
-
]);
|
|
220
|
-
}
|
|
221
|
-
if (normalized.includes("andrew")) {
|
|
222
|
-
return findSystemVoice([
|
|
223
|
-
"Fred",
|
|
224
|
-
"Daniel",
|
|
225
|
-
"Aman",
|
|
226
|
-
"Albert",
|
|
227
|
-
"Eddy (英语(美国))",
|
|
228
|
-
"Grandpa (英语(美国))",
|
|
229
|
-
]);
|
|
230
|
-
}
|
|
231
|
-
if (normalized.includes("emma")) {
|
|
232
|
-
return findSystemVoice([
|
|
233
|
-
"Samantha",
|
|
234
|
-
"Victoria",
|
|
235
|
-
"Flo (英语(美国))",
|
|
236
|
-
"Flo (英语(英国))",
|
|
237
|
-
"Flo",
|
|
238
|
-
"Grandma (英语(美国))",
|
|
239
|
-
]);
|
|
240
|
-
}
|
|
241
|
-
return undefined;
|
|
242
|
-
}
|
|
243
|
-
function findSystemVoice(candidates) {
|
|
244
|
-
const available = getSystemVoiceNames();
|
|
245
|
-
for (const candidate of candidates) {
|
|
246
|
-
if (available.has(candidate)) {
|
|
247
|
-
return candidate;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
return undefined;
|
|
251
|
-
}
|
|
252
|
-
let systemVoiceNamesCache = null;
|
|
253
|
-
function getSystemVoiceNames() {
|
|
254
|
-
if (systemVoiceNamesCache) {
|
|
255
|
-
return systemVoiceNamesCache;
|
|
256
|
-
}
|
|
257
|
-
if (process.platform !== "darwin") {
|
|
258
|
-
systemVoiceNamesCache = new Set();
|
|
259
|
-
return systemVoiceNamesCache;
|
|
260
|
-
}
|
|
261
|
-
try {
|
|
262
|
-
const output = execFileSync("say", ["-v", "?"], { encoding: "utf-8" });
|
|
263
|
-
const names = new Set(output
|
|
264
|
-
.split(/\r?\n/)
|
|
265
|
-
.map((line) => line.trim())
|
|
266
|
-
.filter(Boolean)
|
|
267
|
-
.map((line) => line.split(/\s{2,}/)[0]?.trim())
|
|
268
|
-
.filter((value) => typeof value === "string" && value.length > 0));
|
|
269
|
-
systemVoiceNamesCache = names;
|
|
270
|
-
return names;
|
|
271
|
-
}
|
|
272
|
-
catch {
|
|
273
|
-
systemVoiceNamesCache = new Set();
|
|
274
|
-
return systemVoiceNamesCache;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
function normalizeVoiceText(text) {
|
|
278
|
-
return text.replace(/\s+/g, " ").trim();
|
|
279
|
-
}
|
|
280
|
-
function stripVoiceReplyFormatting(text) {
|
|
281
|
-
return stripMarkdownFormatting(stripEmoji(text));
|
|
282
|
-
}
|
|
283
|
-
function stripMarkdownFormatting(text) {
|
|
284
|
-
return text
|
|
285
|
-
.replace(/!\[([^\]]*)\]\((?:[^()\\]|\\.|(?:\([^()]*\)))*\)/g, "$1")
|
|
286
|
-
.replace(/\[([^\]]+)\]\((?:[^()\\]|\\.|(?:\([^()]*\)))*\)/g, "$1")
|
|
287
|
-
.replace(/```([\s\S]*?)```/g, "$1")
|
|
288
|
-
.replace(/`([^`]+)`/g, "$1")
|
|
289
|
-
.replace(/^#{1,6}\s+/gm, "")
|
|
290
|
-
.replace(/^>\s?/gm, "")
|
|
291
|
-
.replace(/^\s*[-*+]\s+/gm, "")
|
|
292
|
-
.replace(/^\s*\d+[.)]\s+/gm, "")
|
|
293
|
-
.replace(/(\*\*|__)(.*?)\1/g, "$2")
|
|
294
|
-
.replace(/(\*|_)(.*?)\1/g, "$2")
|
|
295
|
-
.replace(/~~(.*?)~~/g, "$1")
|
|
296
|
-
.replace(/[>*_`~]/g, "");
|
|
297
|
-
}
|
|
298
|
-
function stripEmoji(text) {
|
|
299
|
-
return text.replace(/(?:\p{Extended_Pictographic}(?:\uFE0F|\uFE0E)?(?:\u200D\p{Extended_Pictographic}(?:\uFE0F|\uFE0E)?)*)|(?:[\u{1F1E6}-\u{1F1FF}]{2})/gu, "");
|
|
300
|
-
}
|
|
301
|
-
function parseRatePercent(rate) {
|
|
302
|
-
const trimmed = rate?.trim();
|
|
303
|
-
if (!trimmed) {
|
|
304
|
-
return undefined;
|
|
305
|
-
}
|
|
306
|
-
const normalized = trimmed.endsWith("%") ? trimmed.slice(0, -1).trim() : trimmed;
|
|
307
|
-
const parsed = Number(normalized);
|
|
308
|
-
if (!Number.isFinite(parsed)) {
|
|
309
|
-
return undefined;
|
|
310
|
-
}
|
|
311
|
-
return parsed;
|
|
312
|
-
}
|
|
313
|
-
function formatRatePercent(ratePercent) {
|
|
314
|
-
if (ratePercent > 0) {
|
|
315
|
-
return `+${ratePercent}%`;
|
|
316
|
-
}
|
|
317
|
-
return `${ratePercent}%`;
|
|
318
|
-
}
|
|
319
|
-
function containsCjk(text) {
|
|
320
|
-
return /[\u3400-\u9fff]/.test(text);
|
|
321
|
-
}
|
|
322
|
-
function estimateSpeechDurationMs(text) {
|
|
323
|
-
const normalized = normalizeVoiceText(text);
|
|
324
|
-
if (!normalized) {
|
|
325
|
-
return 0;
|
|
326
|
-
}
|
|
327
|
-
return Math.max(1200, Math.round(normalized.length * 180));
|
|
328
|
-
}
|
|
329
|
-
//# sourceMappingURL=voice-reply.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"voice-reply.js","sourceRoot":"","sources":["../../src/commands/voice-reply.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { type GatewaySessionDefaults } from "./session-context.js";
|
|
2
|
-
import type { VoiceReplyConfig as VoiceReplySettings } from "../config/config.js";
|
|
3
|
-
export declare class VoiceReplyPreferenceStore {
|
|
4
|
-
private readonly runPreferences;
|
|
5
|
-
private readonly sessionPreferences;
|
|
6
|
-
private defaultVoiceReplySettings;
|
|
7
|
-
private sessionDefaults;
|
|
8
|
-
private defaultVoiceReplyEnabled;
|
|
9
|
-
constructor(defaultVoiceReplyEnabled?: boolean, sessionDefaults?: GatewaySessionDefaults);
|
|
10
|
-
setDefaultVoiceReplyEnabled(enabled: boolean | undefined): void;
|
|
11
|
-
setSessionDefaults(sessionDefaults: GatewaySessionDefaults): void;
|
|
12
|
-
setDefaultVoiceReplySettings(settings: VoiceReplySettings | undefined): void;
|
|
13
|
-
register(opts: {
|
|
14
|
-
runId?: string;
|
|
15
|
-
sessionKey?: string;
|
|
16
|
-
enabled: boolean;
|
|
17
|
-
voiceIdentifier?: string;
|
|
18
|
-
ratePercent?: number;
|
|
19
|
-
}): void;
|
|
20
|
-
clearRun(runId?: string): void;
|
|
21
|
-
shouldUse(runId?: string, sessionKey?: string): boolean;
|
|
22
|
-
resolveSettings(runId?: string, sessionKey?: string): VoiceReplySettings | undefined;
|
|
23
|
-
private normalizeSessionKey;
|
|
24
|
-
private normalizeSettings;
|
|
25
|
-
}
|