@yoooclaw/cli 0.0.5 → 0.0.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 +24 -8
- package/dist/bin.cjs +5911 -5695
- package/dist/bin.cjs.map +44 -43
- package/dist/errors.d.ts +10 -0
- package/dist/index.cjs +5911 -5695
- package/dist/index.cjs.map +44 -43
- package/dist/version.d.ts +2 -0
- package/package.json +5 -1
package/dist/bin.cjs.map
CHANGED
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
3
|
+
"sources": ["../../../node_modules/ws/lib/constants.js", "../../../node_modules/ws/lib/buffer-util.js", "../../../node_modules/ws/lib/limiter.js", "../../../node_modules/ws/lib/permessage-deflate.js", "../../../node_modules/ws/lib/validation.js", "../../../node_modules/ws/lib/receiver.js", "../../../node_modules/ws/lib/sender.js", "../../../node_modules/ws/lib/event-target.js", "../../../node_modules/ws/lib/extension.js", "../../../node_modules/ws/lib/websocket.js", "../../../node_modules/ws/lib/stream.js", "../../../node_modules/ws/lib/subprotocol.js", "../../../node_modules/ws/lib/websocket-server.js", "../../../node_modules/openclaw/dist/json-files-DMrq2IfK.js", "../../../node_modules/openclaw/dist/home-dir-BnP38vVl.js", "../../../node_modules/openclaw/dist/paths-Y4UT24Of.js", "../../../node_modules/openclaw/dist/pairing-token-C5g4QivV.js", "../../../node_modules/openclaw/dist/device-auth-BRUxebMD.js", "../../../node_modules/openclaw/dist/device-pairing-DeNkV6bj.js", "../../../node_modules/openclaw/dist/device-bootstrap-DKsEcfsd.js", "../../../node_modules/openclaw/dist/device-bootstrap-DTI1FU3A.js", "../../../node_modules/openclaw/dist/plugin-sdk/device-bootstrap.js", "../src/program.ts", "../src/command-tree.ts", "../src/context.ts", "../src/paths.ts", "../src/errors.ts", "../src/output/format.ts", "../src/version.ts", "../src/fs-utils.ts", "../src/prompt.ts", "../src/config/store.ts", "../src/config/schema.ts", "../src/credentials/store.ts", "../src/credentials/keychain.ts", "../src/credentials/refs.ts", "../src/commands/config.ts", "../src/commands/profile.ts", "../src/daemon/lock.ts", "../src/daemon/client.ts", "../src/commands/auth.ts", "../src/notification/query.ts", "../../phone-notifications/src/cli/helpers.ts", "../../phone-notifications/src/cli/ntf-query.ts", "../../phone-notifications/src/notification/storage.ts", "../../phone-notifications/src/notification/feishu-normalize.ts", "../../phone-notifications/src/ingest-context.ts", "../../phone-notifications/src/plugin/notifications.ts", "../../phone-notifications/src/tunnel/utils.ts", "../../phone-notifications/src/tunnel/http-proxy.ts", "../../phone-notifications/src/plugin/shared.ts", "../../phone-notifications/src/recording/storage.ts", "../../phone-notifications/src/recording/state-machine.ts", "../../phone-notifications/src/recording/transcript-document.ts", "../../phone-notifications/src/recording/downloader.ts", "../../phone-notifications/src/recording/asr.ts", "../../phone-notifications/src/auth/credentials.ts", "../../phone-notifications/src/profile/detect.ts", "../../phone-notifications/src/profile/paths.ts", "../../phone-notifications/src/profile/runtime-paths.ts", "../../phone-notifications/src/env.ts", "../../phone-notifications/src/recording/whisper-local.ts", "../../phone-notifications/src/recording/account-oss.ts", "../../phone-notifications/src/recording/handler.ts", "../../phone-notifications/src/plugin/recordings.ts", "../../phone-notifications/src/light-rules/storage.ts", "../../phone-notifications/src/light/repeat.ts", "../../phone-notifications/src/light-rules/registry.ts", "../../phone-notifications/src/light/validators.ts", "../../phone-notifications/src/light-rules/names.ts", "../../phone-notifications/src/light-rules/gateway.ts", "../../phone-notifications/src/light/sender.ts", "../../phone-notifications/src/light/protocol.ts", "../../phone-notifications/src/tunnel/relay-client.ts", "../../../node_modules/ws/wrapper.mjs", "../../phone-notifications/src/tunnel/proxy.ts", "../../phone-notifications/src/tunnel/device-identity.ts", "../../phone-notifications/src/tunnel/ws-proxy.ts", "../src/shared.ts", "../src/commands/notification.ts", "../src/notification/sync.ts", "../src/commands/sync.ts", "../src/commands/recording.ts", "../src/image/storage.ts", "../src/commands/image.ts", "../src/log/reader.ts", "../src/commands/log.ts", "../src/commands/migrate.ts", "../src/commands/update.ts", "../src/commands/doctor.ts", "../src/commands/skills.ts", "../src/commands/daemon.ts", "../src/daemon/main.ts", "../src/daemon/logger.ts", "../src/daemon/runtime.ts", "../src/image/channel.ts", "../src/monitor/store.ts", "../src/daemon/light-send.ts", "../src/daemon/recording-events.ts", "../src/daemon/recording-bridge.ts", "../src/daemon/gateway-compat.ts", "../src/daemon/relay-dispatcher.ts", "../src/daemon/relay.ts", "../src/daemon/tunnel-supervisor.ts", "../src/commands/daemon-services.ts", "../src/commands/registry.ts", "../src/index.ts", "../src/bin.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"export const TRANSCRIPT_DOCUMENT_SCHEMA_VERSION = 1;\n\nexport interface TranscriptDocumentSource {\n provider: string;\n taskId?: string;\n requestId?: string;\n status?: string;\n}\n\nexport interface TranscriptDocumentSegment {\n text: string;\n startMs?: number;\n endMs?: number;\n speakerId?: number;\n}\n\nexport interface TranscriptDocumentContentItem {\n content: string;\n speakerId?: number;\n startTime?: number;\n endTime?: number;\n}\n\nexport interface TranscriptDocumentNormalized {\n title?: string;\n category?: string;\n summary?: string;\n text: string;\n segments: TranscriptDocumentSegment[];\n}\n\nexport interface TranscriptDocument {\n schemaVersion: number;\n recordingId: string;\n generatedAt: string;\n source: TranscriptDocumentSource;\n normalized: TranscriptDocumentNormalized;\n raw?: unknown;\n}\n\nexport function buildTranscriptDataFilename(recordingId: string): string {\n return `${recordingId}.json`;\n}\n\nexport function buildTranscriptDocument(params: {\n recordingId: string;\n generatedAt?: string;\n source: TranscriptDocumentSource;\n title?: string;\n category?: string;\n summary?: string;\n text?: string;\n segments?: TranscriptDocumentSegment[];\n raw?: unknown;\n}): TranscriptDocument {\n const segments = normalizeSegments(params.segments);\n const text = normalizePossiblyEmptyText(params.text) ?? joinSegmentsText(segments) ?? \"\";\n\n return {\n schemaVersion: TRANSCRIPT_DOCUMENT_SCHEMA_VERSION,\n recordingId: params.recordingId,\n generatedAt: params.generatedAt ?? new Date().toISOString(),\n source: {\n provider: params.source.provider,\n taskId: normalizeOptionalText(params.source.taskId),\n requestId: normalizeOptionalText(params.source.requestId),\n status: normalizeOptionalText(params.source.status),\n },\n normalized: {\n title: normalizeOptionalText(params.title),\n category: normalizeOptionalText(params.category),\n summary: normalizePossiblyEmptyText(params.summary),\n text,\n segments,\n },\n raw: params.raw,\n };\n}\n\nexport function parseTranscriptDocument(\n value: string | unknown,\n): TranscriptDocument | undefined {\n const parsed = typeof value === \"string\"\n ? parseJson(value)\n : value;\n\n if (!parsed || typeof parsed !== \"object\") {\n return undefined;\n }\n\n const doc = parsed as Record<string, unknown>;\n const recordingId = normalizeOptionalText(doc.recordingId);\n const generatedAt = normalizeOptionalText(doc.generatedAt);\n const source = normalizeSource(doc.source);\n const normalized = normalizeDocumentBody(doc.normalized);\n\n if (!recordingId || !generatedAt || !source || !normalized) {\n return undefined;\n }\n\n return {\n schemaVersion:\n typeof doc.schemaVersion === \"number\"\n ? doc.schemaVersion\n : TRANSCRIPT_DOCUMENT_SCHEMA_VERSION,\n recordingId,\n generatedAt,\n source,\n normalized,\n raw: doc.raw,\n };\n}\n\nexport function extractTranscriptTextFromDocument(\n doc: TranscriptDocument | undefined,\n): string | undefined {\n if (!doc) return undefined;\n return normalizePossiblyEmptyText(doc.normalized.text)\n ?? joinSegmentsText(doc.normalized.segments);\n}\n\nexport function extractTranscriptSummaryFromDocument(\n doc: TranscriptDocument | undefined,\n): string | undefined {\n if (!doc) return undefined;\n return normalizePossiblyEmptyText(doc.normalized.summary);\n}\n\nexport function extractTranscriptTitleFromDocument(\n doc: TranscriptDocument | undefined,\n): string | undefined {\n if (!doc) return undefined;\n return normalizeOptionalText(doc.normalized.title);\n}\n\nexport function extractSourceTextListFromDocument(\n doc: TranscriptDocument | undefined,\n): TranscriptDocumentContentItem[] | undefined {\n if (!doc) return undefined;\n\n const fromNormalized = doc.normalized.segments\n .map((segment) => ({\n content: segment.text,\n speakerId: segment.speakerId,\n startTime: segment.startMs,\n endTime: segment.endMs,\n }))\n .filter((segment) => normalizeOptionalText(segment.content));\n\n if (fromNormalized.length > 0) {\n return fromNormalized;\n }\n\n const rawList = extractRawSourceTextList(doc.raw);\n if (rawList.length > 0) {\n return rawList;\n }\n\n const normalizedText = normalizeOptionalText(doc.normalized.text);\n return normalizedText\n ? [{ content: normalizedText }]\n : undefined;\n}\n\nfunction parseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeSource(value: unknown): TranscriptDocumentSource | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const source = value as Record<string, unknown>;\n const provider = normalizeOptionalText(source.provider);\n if (!provider) {\n return undefined;\n }\n\n return {\n provider,\n taskId: normalizeOptionalText(source.taskId),\n requestId: normalizeOptionalText(source.requestId),\n status: normalizeOptionalText(source.status),\n };\n}\n\nfunction normalizeDocumentBody(\n value: unknown,\n): TranscriptDocumentNormalized | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const normalized = value as Record<string, unknown>;\n const segments = normalizeSegments(normalized.segments);\n const text = normalizePossiblyEmptyText(normalized.text) ?? joinSegmentsText(segments);\n if (text === undefined) {\n return undefined;\n }\n\n return {\n title: normalizeOptionalText(normalized.title),\n category: normalizeOptionalText(normalized.category),\n summary: normalizePossiblyEmptyText(normalized.summary),\n text,\n segments,\n };\n}\n\nfunction normalizeSegments(value: unknown): TranscriptDocumentSegment[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .map((item) => normalizeSegment(item))\n .filter((item): item is TranscriptDocumentSegment => !!item);\n}\n\nfunction normalizeSegment(value: unknown): TranscriptDocumentSegment | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const segment = value as Record<string, unknown>;\n const text = normalizeOptionalText(segment.text);\n if (!text) {\n return undefined;\n }\n\n return {\n text,\n startMs: normalizeOptionalNumber(segment.startMs),\n endMs: normalizeOptionalNumber(segment.endMs),\n speakerId: normalizeOptionalInteger(segment.speakerId),\n };\n}\n\nfunction joinSegmentsText(\n segments: TranscriptDocumentSegment[],\n): string | undefined {\n const parts = segments\n .map((segment) => normalizeOptionalText(segment.text))\n .filter((segment): segment is string => !!segment);\n\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.join(\"\\n\\n\");\n}\n\nfunction extractRawSourceTextList(raw: unknown): TranscriptDocumentContentItem[] {\n if (!raw || typeof raw !== \"object\") {\n return [];\n }\n\n const recordResult = (raw as { recordResult?: unknown }).recordResult;\n if (!recordResult || typeof recordResult !== \"object\") {\n return [];\n }\n\n const sourceTextList = (recordResult as { sourceTextList?: unknown }).sourceTextList;\n if (!Array.isArray(sourceTextList)) {\n return [];\n }\n\n return sourceTextList\n .flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const value = item as Record<string, unknown>;\n const content = normalizeOptionalText(value.content);\n if (!content) {\n return [];\n }\n\n return [{\n content,\n speakerId: normalizeOptionalInteger(value.speakerId),\n startTime: normalizeOptionalNumber(value.startTime),\n endTime: normalizeOptionalNumber(value.endTime),\n }];\n });\n}\n\nfunction normalizeOptionalText(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim()\n ? value.trim()\n : undefined;\n}\n\nfunction normalizePossiblyEmptyText(value: unknown): string | undefined {\n return typeof value === \"string\"\n ? value.trim()\n : undefined;\n}\n\nfunction normalizeOptionalNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction normalizeOptionalInteger(value: unknown): number | undefined {\n return Number.isInteger(value)\n ? Number(value)\n : undefined;\n}\n",
|
|
6
|
-
"/**\n * 宿主状态目录 / 配置文件路径解析。\n *\n * 由 host.ts 的内部实现迁移而来,保持行为完全一致:\n * 优先 env,其次 jvsclaw 可写 state 提示,再次 openclaw 标记文件、\n * qclaw 元数据,最后回退 ~/.openclaw。\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\ninterface QClawMeta {\n stateDir?: string;\n configPath?: string;\n}\n\nconst DEFAULT_JVSCLAW_STATE_DIR = \"/home/admin/.openclaw\";\n\nexport function trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nexport function homeDir(): string {\n return process.env.HOME || process.env.USERPROFILE || \"/tmp\";\n}\n\nexport function expandUserPath(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n if (value === \"~\") {\n return homeDir();\n }\n if (value.startsWith(\"~/\")) {\n return join(homeDir(), value.slice(2));\n }\n return value;\n}\n\nfunction candidateMetaPaths(): string[] {\n const home = homeDir();\n return [\n join(home, \".qclaw\", \"qclaw.json\"),\n join(home, \".qclow\", \"qclaw.json\"),\n ];\n}\n\nexport function loadQClawMeta(): QClawMeta | undefined {\n for (const metaPath of candidateMetaPaths()) {\n if (!existsSync(metaPath)) {\n continue;\n }\n try {\n const parsed = JSON.parse(readFileSync(metaPath, \"utf-8\")) as QClawMeta;\n return {\n stateDir: expandUserPath(trimToUndefined(parsed?.stateDir)),\n configPath: expandUserPath(trimToUndefined(parsed?.configPath)),\n };\n } catch {\n // ignore invalid metadata and keep trying\n }\n }\n return undefined;\n}\n\nexport function resolveStateDirFromEnv(): string | undefined {\n return expandUserPath(\n trimToUndefined(process.env.JVSCLAW_STATE_DIR) ??\n trimToUndefined(process.env.JVSCLAW_HOME) ??\n trimToUndefined(process.env.OPENCLAW_STATE_DIR) ??\n trimToUndefined(process.env.QCLAW_STATE_DIR) ??\n trimToUndefined(process.env.OPENCLAW_ROOT) ??\n trimToUndefined(process.env.OPENCLAW_HOME) ??\n trimToUndefined(process.env.QCLAW_HOME),\n );\n}\n\nexport function resolveConfigPathFromEnv(): string | undefined {\n return expandUserPath(\n trimToUndefined(process.env.JVSCLAW_CONFIG_PATH) ??\n trimToUndefined(process.env.OPENCLAW_CONFIG_PATH) ??\n trimToUndefined(process.env.QCLAW_CONFIG_PATH),\n );\n}\n\nfunction hasJvsclawProfileEnv(): boolean {\n return trimToUndefined(process.env.CLAW_PROFILE)?.toLowerCase() === \"jvsclaw\";\n}\n\nfunction hasPersistedJvsclawProfile(): boolean {\n try {\n const content = readFileSync(join(DEFAULT_JVSCLAW_STATE_DIR, \".env\"), \"utf-8\");\n return content\n .split(\"\\n\")\n .some((line) => line.trim().toLowerCase() === \"claw_profile=jvsclaw\");\n } catch {\n return false;\n }\n}\n\nexport function hasOpenClawMarkers(): boolean {\n const baseDir = join(homeDir(), \".openclaw\");\n return [\n join(baseDir, \"openclaw.json\"),\n join(baseDir, \"credentials.json\"),\n join(baseDir, \"extensions\"),\n ].some((candidate) => existsSync(candidate));\n}\n\nexport function resolveStateDir(): string {\n const envDir = resolveStateDirFromEnv();\n if (envDir) {\n return envDir;\n }\n\n if (hasJvsclawProfileEnv() || hasPersistedJvsclawProfile()) {\n return DEFAULT_JVSCLAW_STATE_DIR;\n }\n\n if (hasOpenClawMarkers()) {\n return join(homeDir(), \".openclaw\");\n }\n\n const meta = loadQClawMeta();\n if (meta?.stateDir) {\n return meta.stateDir;\n }\n if (meta?.configPath) {\n return dirname(meta.configPath);\n }\n\n return join(homeDir(), \".openclaw\");\n}\n\nexport function resolveConfigPath(stateDir = resolveStateDir()): string {\n const envConfigPath = resolveConfigPathFromEnv();\n if (envConfigPath) {\n return envConfigPath;\n }\n\n const meta = loadQClawMeta();\n if (\n meta?.configPath &&\n (!meta.stateDir || !stateDir || meta.stateDir === stateDir)\n ) {\n return meta.configPath;\n }\n\n return join(stateDir, \"openclaw.json\");\n}\n\nexport function resolveStateFile(filename: string): string {\n return join(resolveStateDir(), filename);\n}\n",
|
|
7
|
-
"/**\n * 宿主检测。\n *\n * - detectHostKind():旧的路径/状态目录家族检测(openclaw | qclaw),行为与 host.ts 完全一致。\n * - resolveClawKind():新的渠道 Profile 选择(openclaw | arkclaw | jvsclaw),\n * 优先级 CLAW_PROFILE 环境变量 > 自动检测兜底 > openclaw。\n * 安装脚本按渠道写入 CLAW_PROFILE;jvsclaw 下该文件位于可写 state\n * (/home/admin/.openclaw),未写时退回自动检测,向后兼容。\n */\nimport { readFileSync } from \"node:fs\";\nimport type { ClawKind, HostKind } from \"./types.js\";\nimport {\n loadQClawMeta,\n hasOpenClawMarkers,\n resolveConfigPathFromEnv,\n resolveStateDirFromEnv,\n resolveStateFile,\n trimToUndefined,\n} from \"./paths.js\";\n\nfunction detectHostKindFromPath(value: string | undefined): HostKind | undefined {\n if (!value) {\n return undefined;\n }\n const normalized = value.replace(/\\\\/g, \"/\").toLowerCase();\n if (\n normalized.endsWith(\"/.qclaw\") ||\n normalized.includes(\"/.qclaw/\") ||\n normalized.endsWith(\"/.qclow\") ||\n normalized.includes(\"/.qclow/\")\n ) {\n return \"qclaw\";\n }\n if (normalized.endsWith(\"/.openclaw\") || normalized.includes(\"/.openclaw/\")) {\n return \"openclaw\";\n }\n return undefined;\n}\n\nexport function detectHostKind(): HostKind {\n if (\n trimToUndefined(process.env.QCLAW_STATE_DIR) ||\n trimToUndefined(process.env.QCLAW_CONFIG_PATH) ||\n trimToUndefined(process.env.QCLAW_HOME)\n ) {\n return \"qclaw\";\n }\n\n const pathHintKind =\n detectHostKindFromPath(resolveStateDirFromEnv()) ??\n detectHostKindFromPath(resolveConfigPathFromEnv());\n if (pathHintKind) {\n return pathHintKind;\n }\n\n if (hasOpenClawMarkers()) {\n return \"openclaw\";\n }\n\n if (loadQClawMeta()) {\n return \"qclaw\";\n }\n\n return \"openclaw\";\n}\n\nconst VALID_CLAW_KINDS: ReadonlySet<string> = new Set<ClawKind>([\n \"openclaw\",\n \"arkclaw\",\n \"jvsclaw\",\n]);\n\n/** 读取持久化到 <stateDir>/.env 的 CLAW_PROFILE(安装脚本 --channel 写入)。 */\nfunction readPersistedClawProfile(): string | undefined {\n let content: string;\n try {\n content = readFileSync(resolveStateFile(\".env\"), \"utf-8\");\n } catch {\n return undefined;\n }\n for (const line of content.split(\"\\n\")) {\n const eq = line.indexOf(\"=\");\n if (eq < 1) continue;\n if (line.slice(0, eq).trim() === \"CLAW_PROFILE\") {\n return line.slice(eq + 1).trim();\n }\n }\n return undefined;\n}\n\n/**\n * 选择渠道 Profile。\n * 优先级:CLAW_PROFILE 环境变量 > 持久化的 .env(安装脚本 --channel)> 默认 openclaw。\n * 安装脚本带 --channel 时写入 .env,运行期零歧义;不带则回退用户自己的 openclaw。\n */\nexport function resolveClawKind(): ClawKind {\n const fromEnv = trimToUndefined(process.env.CLAW_PROFILE)?.toLowerCase();\n if (fromEnv && VALID_CLAW_KINDS.has(fromEnv)) {\n return fromEnv as ClawKind;\n }\n\n const persisted = readPersistedClawProfile()?.toLowerCase();\n if (persisted && VALID_CLAW_KINDS.has(persisted)) {\n return persisted as ClawKind;\n }\n\n // 自动检测兜底:qclaw 与 openclaw 同属 apiKey 家族,统一归为 openclaw。\n return \"openclaw\";\n}\n",
|
|
8
|
-
"/**\n * 宿主路径/检测的兼容入口。\n *\n * 实现已迁移到 src/profile/{paths,detect}.ts。本文件保留原有导出签名,\n * 让现有 import 路径(\"../host.js\" 等)无需改动,行为完全一致。\n * 新代码请优先从 \"./profile/index.js\" 引入 resolveClawProfile()。\n */\nexport type { HostKind } from \"./profile/types.js\";\nexport { detectHostKind } from \"./profile/detect.js\";\nexport {\n resolveStateDir,\n resolveConfigPath,\n resolveStateFile,\n} from \"./profile/paths.js\";\n",
|
|
9
|
-
"import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n watch,\n} from \"node:fs\";\nimport { dirname, basename } from \"node:path\";\nimport { resolveStateFile } from \"../host.js\";\n\ninterface Credentials {\n /**\n * 推荐:API Key 明文(例如 ock_xxx)\n */\n apiKey?: string;\n /**\n * 兼容旧字段:历史上这里存的是 token;现在等价于 apiKey\n */\n token?: string;\n /**\n * 当前环境(development / production),由 ntf env switch 写入\n */\n env?: string;\n}\n\nexport function credentialsPath(): string {\n return resolveStateFile(\"credentials.json\");\n}\n\nexport function readCredentials(): Credentials {\n const path = credentialsPath();\n if (!existsSync(path)) return {};\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nexport function writeCredentials(creds: Credentials): void {\n const path = credentialsPath();\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n writeFileSync(path, JSON.stringify(creds, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n}\n\nexport function loadApiKey(): string | undefined {\n const creds = readCredentials();\n return creds.apiKey ?? creds.token;\n}\n\nexport function requireApiKey(): string {\n const apiKey = loadApiKey();\n if (!apiKey) {\n throw new Error(\n `API Key 未设置,请先写入 ${credentialsPath()},或通过宿主 CLI 执行 ntf auth set-api-key <apiKey>`,\n );\n }\n return apiKey;\n}\n\n// ---- Backward-compatible exports (旧代码仍可编译;语义等价于 apiKey) ----\nexport function loadToken(): string | undefined {\n return loadApiKey();\n}\n\nexport function requireToken(): string {\n return requireApiKey();\n}\n\n/** 监听 credentials 文件变化(如 set-token 后)触发 callback;返回取消监听的函数 */\nexport function watchCredentials(onChange: () => void): () => void {\n const path = credentialsPath();\n const dir = dirname(path);\n const filename = basename(path);\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n const delayMs = 200;\n\n const listener = (_event: string, changedName: string | null) => {\n if (!changedName || (changedName !== filename && !changedName.endsWith(filename))) return;\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n onChange();\n }, delayMs);\n };\n\n let watcher: ReturnType<typeof watch> | null = null;\n try {\n watcher = watch(dir, { persistent: false }, listener);\n } catch {\n // 目录可能不存在\n }\n\n return () => {\n if (debounceTimer) clearTimeout(debounceTimer);\n watcher?.close();\n };\n}\n",
|
|
10
|
-
"import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { readCredentials } from \"./auth/credentials.js\";\nimport { resolveStateFile } from \"./host.js\";\n\nfunction writeDotEnv(key: string, value: string): void {\n const path = resolveStateFile(\".env\");\n mkdirSync(dirname(path), { recursive: true });\n const existing = existsSync(path) ? readFileSync(path, \"utf-8\") : \"\";\n const lines = existing.split(\"\\n\");\n const prefix = `${key}=`;\n const idx = lines.findIndex((l) => l.startsWith(prefix));\n const newLine = `${prefix}${value}`;\n if (idx >= 0) {\n lines[idx] = newLine;\n } else {\n if (existing && !existing.endsWith(\"\\n\")) lines.push(\"\");\n lines.push(newLine);\n }\n writeFileSync(path, lines.join(\"\\n\"), \"utf-8\");\n}\n\nexport type EnvName = \"development\" | \"test\" | \"production\";\n\nconst DEFAULT_ENV_HOSTS: Record<EnvName, string> = {\n development: \"openclaw-service-dev.yoooclaw.com\",\n test: \"openclaw-service-test.yoooclaw.com\",\n production: \"openclaw-service.yoooclaw.com\",\n};\n\ninterface EnvUrls {\n lightApiUrl: string;\n appNameMapUrl: string;\n relayTunnelUrl: string;\n modelProxyLongRecordingSubmitTaskUrl: string;\n modelProxyLongRecordingQueryTaskResultBaseUrl: string;\n accountFileDeleteUrl: string;\n gatewayConnectStatusUrl: string;\n /** jvsclaw 实例就绪/密文换 apiKey 接口(复用插件现有接口 host)。 */\n clawManagerInstanceReadyUrl: string;\n}\n\nfunction normalizeHost(host: string | undefined): string | undefined {\n const trimmed = host?.trim();\n if (!trimmed) return undefined;\n return trimmed\n .replace(/^https?:\\/\\//, \"\")\n .replace(/^wss?:\\/\\//, \"\")\n .replace(/\\/+$/, \"\");\n}\n\nfunction getEnvHost(env: EnvName): string {\n let host: string | undefined;\n switch (env) {\n case \"development\":\n host = process.env.OPENCLAW_HOST_DEVELOPMENT;\n break;\n case \"test\":\n host = process.env.OPENCLAW_HOST_TEST;\n break;\n case \"production\":\n host = process.env.OPENCLAW_HOST_PRODUCTION;\n break;\n }\n return normalizeHost(host) ?? DEFAULT_ENV_HOSTS[env];\n}\n\nfunction buildEnvUrls(host: string): EnvUrls {\n const https = `https://${host}`;\n const wss = `wss://${host}`;\n return {\n lightApiUrl: `${https}/api/message/tob/sendMessage`,\n relayTunnelUrl: `${wss}/message/messages/ws/plugin`,\n appNameMapUrl: `${https}/api/application-config/app-package/config-all`,\n modelProxyLongRecordingSubmitTaskUrl: `${https}/api/model-proxy/long-recording/submit-task`,\n modelProxyLongRecordingQueryTaskResultBaseUrl: `${https}/api/model-proxy/long-recording/query-task-result`,\n accountFileDeleteUrl: `${https}/api/account/file/delete`,\n gatewayConnectStatusUrl: `${https}/api/message/messageBridge/plugin/gateway-connect-status`,\n clawManagerInstanceReadyUrl: `${https}/claw-manager/internal/claw-manager/instance/ready`,\n };\n}\n\nconst VALID_ENVS: ReadonlySet<string> = new Set<string>([\n \"development\",\n \"test\",\n \"production\",\n]);\n\nfunction readDotEnv(): Record<string, string> {\n const path = resolveStateFile(\".env\");\n if (!existsSync(path)) return {};\n return Object.fromEntries(\n readFileSync(path, \"utf-8\")\n .split(\"\\n\")\n .flatMap((line) => {\n const eq = line.indexOf(\"=\");\n if (eq < 1) return [];\n return [[line.slice(0, eq).trim(), line.slice(eq + 1).trim()]];\n }),\n );\n}\n\n/** 读取持久化到 .env 的环境名称;仅反映本地配置,不考虑进程环境变量。 */\nexport function readPersistedEnvName(): EnvName | undefined {\n const fromDotEnv = readDotEnv()[\"PHONE_NOTIFICATIONS_ENV\"]?.trim();\n if (fromDotEnv && VALID_ENVS.has(fromDotEnv)) return fromDotEnv as EnvName;\n return undefined;\n}\n\n/** 读取当前环境名称。优先级:PHONE_NOTIFICATIONS_ENV 环境变量 > .env > credentials.json > 默认 production */\nexport function loadEnvName(): EnvName {\n const fromEnvVar = process.env.PHONE_NOTIFICATIONS_ENV?.trim();\n if (fromEnvVar && VALID_ENVS.has(fromEnvVar)) return fromEnvVar as EnvName;\n\n const fromDotEnv = readPersistedEnvName();\n if (fromDotEnv) return fromDotEnv;\n\n const { env } = readCredentials();\n if (env && VALID_ENVS.has(env)) return env as EnvName;\n\n return \"production\";\n}\n\n/** 持久化当前环境到 .env */\nexport function saveEnvName(env: EnvName): void {\n if (!VALID_ENVS.has(env)) {\n throw new Error(\n `无效的环境名称: ${env},可选值: ${[...VALID_ENVS].join(\", \")}`,\n );\n }\n writeDotEnv(\"PHONE_NOTIFICATIONS_ENV\", env);\n}\n\n/** 获取当前环境的 URL 配置 */\nexport function getEnvUrls(env?: EnvName): EnvUrls {\n return buildEnvUrls(getEnvHost(env ?? loadEnvName()));\n}\n\n/** 获取所有可用环境名称 */\nexport function getAvailableEnvs(): EnvName[] {\n return [\"development\", \"test\", \"production\"];\n}\n",
|
|
11
|
-
"/**\n * 本地 Whisper 转写模块(arc-long-recording §6.4)\n *\n * 插件内置 Whisper 推理能力:\n * 1. 自动检测运行环境与硬件配置(§6.4.1)\n * 2. 选择最优推理后端(§6.4.2)\n * 3. 根据可用内存自动选择模型规格(§6.4.3)\n * 4. 首次使用时下载模型文件(§6.4.5)\n * 5. 通过 whisper.cpp CLI 执行本地离线转写\n */\n\nimport { execSync, execFileSync, spawnSync, type SpawnSyncReturns } from \"node:child_process\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n statSync,\n createWriteStream,\n unlinkSync,\n copyFileSync,\n openSync,\n readSync,\n closeSync,\n} from \"node:fs\";\nimport { join, dirname, basename } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport { platform, arch, totalmem, cpus, freemem } from \"node:os\";\nimport type {\n WhisperLocalConfig,\n WhisperModelSize,\n WhisperModelSource,\n WhisperBackend,\n WhisperEnvironmentInfo,\n} from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\nimport type { TranscriptionResult, TranscriptSegment } from \"./asr.js\";\n\n// ─── Constants ───\n\nconst WHISPER_MODELS_DIR = \"whisper-models\";\nconst WHISPER_BIN_DIR = \"whisper-bin\";\n\n/** Hugging Face GGML 模型下载 URL 模板(海外) */\nconst HF_MODEL_URL_TEMPLATE =\n \"https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-{model}.bin\";\n\n/** 国内 ModelScope 镜像 URL 模板(lihuoo/whisper.cpp-asr-model-collection) */\nconst MODELSCOPE_MODEL_URL_TEMPLATE =\n \"https://modelscope.cn/models/lihuoo/whisper.cpp-asr-model-collection/resolve/master/{model}.bin\";\n\n/** 连通性探测超时(ms) */\nconst PROBE_TIMEOUT_MS = 5_000;\n\n/** 模型规格 → 文件名映射 */\nconst MODEL_FILENAMES: Record<WhisperModelSize, string> = {\n tiny: \"ggml-tiny.bin\",\n base: \"ggml-base.bin\",\n small: \"ggml-small.bin\",\n medium: \"ggml-medium.bin\",\n \"large-v3\": \"ggml-large-v3.bin\",\n};\n\n/** 模型规格 → 推理内存需求 GB(§6.4.3) */\nconst MODEL_MEMORY_REQUIREMENTS: Record<WhisperModelSize, number> = {\n tiny: 1,\n base: 1.5,\n small: 3,\n medium: 6,\n \"large-v3\": 11,\n};\n\n/** 模型规格 → 磁盘占用(字节,近似值) */\nconst MODEL_DISK_SIZES: Record<WhisperModelSize, number> = {\n tiny: 75 * 1024 * 1024,\n base: 140 * 1024 * 1024,\n small: 460 * 1024 * 1024,\n medium: 1500 * 1024 * 1024,\n \"large-v3\": 3000 * 1024 * 1024,\n};\n\n/** whisper.cpp JSON 输出格式 */\ninterface WhisperCppJsonOutput {\n transcription?: Array<{\n timestamps?: { from: string; to: string };\n offsets?: { from: number; to: number };\n text: string;\n }>;\n}\n\n// ─── Public API ───\n\n/**\n * 检测运行环境与硬件配置(§6.4.1)\n *\n * 检测操作系统、CPU 架构、GPU、可用内存,\n * 推荐最优推理后端与模型规格。\n */\nexport function detectEnvironment(logger: Logger): WhisperEnvironmentInfo {\n const os = platform() as \"darwin\" | \"linux\" | \"win32\";\n const cpuArch = arch() as \"arm64\" | \"x64\";\n const isAppleSilicon = os === \"darwin\" && cpuArch === \"arm64\";\n const hasCuda = detectCuda(logger);\n\n // 推荐后端(§6.4.2)\n let recommendedBackend: WhisperBackend;\n if (isAppleSilicon) {\n recommendedBackend = \"coreml\";\n } else if (hasCuda) {\n recommendedBackend = \"cuda\";\n } else {\n recommendedBackend = \"cpu\";\n }\n\n // 可用内存\n const availableMemoryGB = getAvailableMemoryGB(recommendedBackend, logger);\n const physicalCores = getPhysicalCoreCount();\n\n // 推荐模型\n const recommendedModel = selectModelByMemory(availableMemoryGB, isAppleSilicon);\n\n const info: WhisperEnvironmentInfo = {\n os,\n arch: cpuArch,\n isAppleSilicon,\n hasCuda,\n recommendedBackend,\n availableMemoryGB: Math.round(availableMemoryGB * 10) / 10,\n recommendedModel,\n physicalCores,\n };\n\n logger.info(\n `[whisper-local] 环境检测完成: os=${os}, arch=${cpuArch}, ` +\n `appleSilicon=${isAppleSilicon}, cuda=${hasCuda}, ` +\n `backend=${recommendedBackend}, memory=${info.availableMemoryGB}GB, ` +\n `model=${recommendedModel}, cores=${physicalCores}`,\n );\n\n return info;\n}\n\n/**\n * 根据可用内存自动选择模型规格(§6.4.3)\n *\n * 策略:优先匹配可用内存最大能承载的模型(向下取最近档位)。\n * Apple Silicon CoreML 后端内存效率更高,同档位需求降低 ~30%。\n */\nexport function selectModelByMemory(\n availableGB: number,\n isAppleSilicon: boolean = false,\n): WhisperModelSize {\n // Apple Silicon CoreML 内存效率提升约 30%\n const effectiveGB = isAppleSilicon ? availableGB / 0.7 : availableGB;\n\n if (effectiveGB >= 12) return \"large-v3\";\n if (effectiveGB >= 8) return \"medium\";\n if (effectiveGB >= 6) return \"small\";\n if (effectiveGB >= 4) return \"base\";\n return \"tiny\";\n}\n\n/**\n * 解析模型存储目录\n */\nexport function resolveModelsDir(dataDir: string): string {\n const dir = join(dataDir, WHISPER_MODELS_DIR);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n\n/**\n * 解析 whisper.cpp 二进制目录\n */\nexport function resolveBinDir(dataDir: string): string {\n const dir = join(dataDir, WHISPER_BIN_DIR);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n\n/**\n * 检查模型文件是否已下载(§6.4.5)\n */\nexport function isModelDownloaded(modelsDir: string, modelSize: WhisperModelSize): boolean {\n const modelPath = join(modelsDir, MODEL_FILENAMES[modelSize]);\n if (!existsSync(modelPath)) return false;\n\n // 简单校验:文件大小至少为预期大小的 80%(防止下载不完整)\n try {\n const stat = statSync(modelPath);\n const expectedSize = MODEL_DISK_SIZES[modelSize];\n return stat.size >= expectedSize * 0.8;\n } catch {\n return false;\n }\n}\n\n/**\n * 下载 Whisper 模型文件(§6.4.5)\n *\n * 下载源选择策略:\n * - modelMirrorUrl 存在 → 使用自定义 URL\n * - modelSource = \"huggingface\" → 直接使用 Hugging Face\n * - modelSource = \"domestic\" → 直接使用国内镜像(ModelScope)\n * - modelSource = \"auto\"(默认)→ 先探测 Hugging Face 连通性(5s 超时),\n * 可达则用 HF,不可达则回退国内镜像\n */\nexport async function downloadModel(\n modelsDir: string,\n modelSize: WhisperModelSize,\n logger: Logger,\n modelSource?: WhisperModelSource,\n mirrorUrl?: string,\n): Promise<{ ok: boolean; modelPath: string; error?: string }> {\n const filename = MODEL_FILENAMES[modelSize];\n const modelPath = join(modelsDir, filename);\n\n // 已存在且完整 → 跳过\n if (isModelDownloaded(modelsDir, modelSize)) {\n logger.info(`[whisper-local] 模型已存在,跳过下载: ${filename}`);\n return { ok: true, modelPath };\n }\n\n // 解析下载 URL\n const url = await resolveModelUrl(modelSize, modelSource, mirrorUrl, logger);\n\n logger.info(\n `[whisper-local] 开始下载模型: ${modelSize} (${formatBytes(MODEL_DISK_SIZES[modelSize])})`,\n );\n logger.info(`[whisper-local] 下载 URL: ${url}`);\n\n const result = await downloadFromUrl(url, modelPath, logger);\n\n // auto 模式且 HF 失败 → 尝试国内镜像回退\n if (\n !result.ok &&\n !mirrorUrl &&\n (modelSource === \"auto\" || !modelSource) &&\n url.includes(\"huggingface.co\")\n ) {\n const fallbackUrl = MODELSCOPE_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n logger.info(\n `[whisper-local] Hugging Face 下载失败,回退至国内镜像(ModelScope): ${fallbackUrl}`,\n );\n return downloadFromUrl(fallbackUrl, modelPath, logger);\n }\n\n return result;\n}\n\n/**\n * 解析模型下载 URL\n */\nasync function resolveModelUrl(\n modelSize: WhisperModelSize,\n modelSource: WhisperModelSource | undefined,\n mirrorUrl: string | undefined,\n logger: Logger,\n): Promise<string> {\n // 自定义 URL 优先级最高\n if (mirrorUrl) {\n return `${mirrorUrl.replace(/\\/$/, \"\")}/${MODEL_FILENAMES[modelSize]}`;\n }\n\n const source = modelSource ?? \"auto\";\n\n switch (source) {\n case \"huggingface\":\n return HF_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n case \"domestic\":\n return MODELSCOPE_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n case \"auto\": {\n // 探测 Hugging Face 连通性\n const hfReachable = await probeUrl(\"https://huggingface.co\", logger);\n if (hfReachable) {\n logger.info(\"[whisper-local] Hugging Face 可达,使用海外源\");\n return HF_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n }\n logger.info(\"[whisper-local] Hugging Face 不可达,使用国内镜像(ModelScope)\");\n return MODELSCOPE_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n }\n default:\n return HF_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n }\n}\n\n/**\n * 探测 URL 连通性(HEAD 请求,短超时)\n */\nasync function probeUrl(url: string, logger: Logger): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), PROBE_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: \"HEAD\",\n signal: controller.signal,\n });\n return res.ok || res.status === 301 || res.status === 302;\n } finally {\n clearTimeout(timer);\n }\n } catch (err: any) {\n logger.info(\n `[whisper-local] 连通性探测失败: ${url} (${err?.name ?? err?.message ?? \"unknown\"})`,\n );\n return false;\n }\n}\n\n/**\n * 从指定 URL 下载模型文件至本地\n */\nasync function downloadFromUrl(\n url: string,\n modelPath: string,\n logger: Logger,\n): Promise<{ ok: boolean; modelPath: string; error?: string }> {\n const tmpPath = `${modelPath}.downloading`;\n\n try {\n mkdirSync(dirname(modelPath), { recursive: true });\n\n const controller = new AbortController();\n // 模型下载超时:30 分钟(large-v3 约 3GB)\n const timer = setTimeout(() => controller.abort(), 30 * 60 * 1000);\n\n try {\n const res = await fetch(url, { signal: controller.signal });\n\n if (!res.ok) {\n return {\n ok: false,\n modelPath,\n error: `模型下载失败: HTTP ${res.status} ${res.statusText}`,\n };\n }\n\n if (!res.body) {\n return { ok: false, modelPath, error: \"模型下载失败: 响应体为空\" };\n }\n\n const contentLength = Number(res.headers.get(\"content-length\") ?? 0);\n const writeStream = createWriteStream(tmpPath);\n const readable = Readable.fromWeb(res.body as any);\n\n // 下载进度日志\n let downloaded = 0;\n let lastLogPercent = 0;\n readable.on(\"data\", (chunk: Buffer) => {\n downloaded += chunk.length;\n if (contentLength > 0) {\n const percent = Math.floor((downloaded / contentLength) * 100);\n if (percent >= lastLogPercent + 10) {\n logger.info(\n `[whisper-local] 下载进度: ${percent}% (${formatBytes(downloaded)} / ${formatBytes(contentLength)})`,\n );\n lastLogPercent = percent;\n }\n }\n });\n\n await pipeline(readable, writeStream);\n } finally {\n clearTimeout(timer);\n }\n\n // 重命名为正式文件\n const { renameSync } = await import(\"node:fs\");\n renameSync(tmpPath, modelPath);\n\n const fileSize = statSync(modelPath).size;\n logger.info(\n `[whisper-local] 模型下载完成: ${basename(modelPath)} (${formatBytes(fileSize)})`,\n );\n\n return { ok: true, modelPath };\n } catch (err: any) {\n // 清理临时文件\n try {\n if (existsSync(tmpPath)) unlinkSync(tmpPath);\n } catch { /* ignore */ }\n\n const msg = err?.name === \"AbortError\"\n ? \"模型下载超时(30 分钟)\"\n : (err?.message ?? String(err));\n logger.error(`[whisper-local] 模型下载失败: ${msg}`);\n return { ok: false, modelPath, error: msg };\n }\n}\n\n/**\n * 查找 whisper.cpp CLI 二进制文件\n *\n * 按以下优先级查找:\n * 1. 插件数据目录下的 whisper-bin/\n * 2. 系统 PATH 中的 whisper-cli / whisper-cpp / whisper\n */\nexport function findWhisperBinary(dataDir: string, logger: Logger): string | null {\n // 1. 检查插件 bin 目录\n const binDir = resolveBinDir(dataDir);\n const binNames = platform() === \"win32\"\n ? [\"whisper-cli.exe\", \"whisper.exe\", \"main.exe\"]\n : [\"whisper-cli\", \"whisper\", \"main\"];\n\n for (const name of binNames) {\n const binPath = join(binDir, name);\n if (existsSync(binPath)) {\n logger.info(`[whisper-local] 找到本地二进制: ${binPath}`);\n return binPath;\n }\n }\n\n // 2. 检查系统 PATH\n const pathNames = platform() === \"win32\"\n ? [\"whisper-cli\", \"whisper-cpp\", \"whisper\"]\n : [\"whisper-cli\", \"whisper-cpp\", \"whisper\"];\n\n for (const name of pathNames) {\n try {\n const cmd = platform() === \"win32\" ? \"where\" : \"which\";\n const result = execSync(`${cmd} ${name}`, { encoding: \"utf-8\", stdio: \"pipe\" }).trim();\n if (result) {\n logger.info(`[whisper-local] 找到系统 PATH 二进制: ${result}`);\n return result.split(\"\\n\")[0].trim();\n }\n } catch {\n // not found, continue\n }\n }\n\n logger.warn(\"[whisper-local] 未找到 whisper.cpp 二进制文件\");\n return null;\n}\n\n/**\n * 使用本地 Whisper 执行转写(§6.4)\n *\n * @param audioFilePath 本地音频文件绝对路径\n * @param localConfig 本地 Whisper 配置\n * @param dataDir 插件数据目录(存放模型和二进制)\n * @param logger 日志\n */\nexport async function transcribeWithWhisperLocal(\n audioFilePath: string,\n localConfig: WhisperLocalConfig,\n dataDir: string,\n logger: Logger,\n): Promise<TranscriptionResult> {\n // 1. 检测环境\n const env = detectEnvironment(logger);\n\n // 2. 确定后端、模型、线程数\n const backend = localConfig.backend ?? env.recommendedBackend;\n const modelSize = localConfig.model ?? env.recommendedModel;\n const threads = localConfig.threads ?? env.physicalCores;\n const language = localConfig.language ?? \"auto\";\n const translate = localConfig.translate ?? false;\n\n logger.info(\n `[whisper-local] 转写参数: backend=${backend}, model=${modelSize}, ` +\n `threads=${threads}, language=${language}, translate=${translate}`,\n );\n\n // 3. 查找 whisper.cpp 二进制\n const whisperBin = findWhisperBinary(dataDir, logger);\n if (!whisperBin) {\n return {\n ok: false,\n error:\n \"未找到 whisper.cpp 二进制文件。请安装 whisper.cpp 并确保 whisper-cli 在 PATH 中,\" +\n `或将二进制文件放入 ${resolveBinDir(dataDir)}`,\n };\n }\n\n // 4. 确保模型已下载\n const modelsDir = resolveModelsDir(dataDir);\n if (!isModelDownloaded(modelsDir, modelSize)) {\n logger.info(`[whisper-local] 模型 ${modelSize} 未下载,开始下载...`);\n const downloadResult = await downloadModel(\n modelsDir,\n modelSize,\n logger,\n localConfig.modelSource,\n localConfig.modelMirrorUrl,\n );\n if (!downloadResult.ok) {\n return { ok: false, error: `模型下载失败: ${downloadResult.error}` };\n }\n }\n\n const modelPath = join(modelsDir, MODEL_FILENAMES[modelSize]);\n\n // 5. 音频格式转换(whisper.cpp 仅支持 16kHz mono WAV)\n // 通过 magic bytes 判断真实格式,不依赖扩展名\n let inputPath = audioFilePath;\n let tmpWavPath: string | null = null;\n\n const actualFmt = detectAudioFormat(audioFilePath);\n if (actualFmt !== \".wav\") {\n tmpWavPath = audioFilePath.replace(/\\.[^.]+$/, \".whisper.wav\");\n logger.info(\n `[whisper-local] 转换音频格式: ${audioFilePath} (${actualFmt ?? \"未知\"}) → WAV (16kHz mono)`,\n );\n\n const convertResult = convertToWav(audioFilePath, tmpWavPath, actualFmt, logger);\n if (!convertResult.ok) {\n return { ok: false, error: convertResult.error! };\n }\n inputPath = tmpWavPath;\n }\n\n // 6. 构建 whisper.cpp CLI 参数\n const args = buildWhisperArgs({\n audioFilePath: inputPath,\n modelPath,\n language,\n translate,\n threads,\n backend,\n });\n\n logger.info(`[whisper-local] 执行: ${whisperBin} ${args.join(\" \")}`);\n\n // 7. 执行转写\n try {\n const startMs = Date.now();\n let result: SpawnSyncReturns<string>;\n\n try {\n result = spawnSync(whisperBin, args, {\n encoding: \"utf-8\" as const,\n timeout: 60 * 60 * 1000, // 1 小时超时(5 小时录音)\n maxBuffer: 100 * 1024 * 1024, // 100MB stdout buffer\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch (err: any) {\n cleanupTmpWav(tmpWavPath);\n return { ok: false, error: `whisper.cpp 执行失败: ${err?.message ?? err}` };\n }\n\n if (result.status !== 0) {\n cleanupTmpWav(tmpWavPath);\n const stderr = result.stderr?.slice(0, 500) ?? \"\";\n return {\n ok: false,\n error: `whisper.cpp 退出码 ${result.status}: ${stderr}`,\n };\n }\n\n const elapsed = Date.now() - startMs;\n logger.info(`[whisper-local] 转写耗时: ${Math.round(elapsed / 1000)}s`);\n\n // 8. 读取 JSON 输出文件(--output-json 将结果写入 {inputPath}.json)\n const jsonPath = inputPath + \".json\";\n let jsonContent: string;\n\n if (existsSync(jsonPath)) {\n jsonContent = readFileSync(jsonPath, \"utf-8\");\n // 清理 JSON 文件\n try { unlinkSync(jsonPath); } catch { /* ignore */ }\n } else {\n // 回退:尝试解析 stdout(部分 whisper.cpp 版本可能输出到 stdout)\n jsonContent = result.stdout;\n }\n\n cleanupTmpWav(tmpWavPath);\n\n return parseWhisperOutput(jsonContent, logger);\n } catch (err: any) {\n cleanupTmpWav(tmpWavPath);\n return { ok: false, error: `whisper.cpp 转写异常: ${err?.message ?? err}` };\n }\n}\n\n/**\n * 获取本地 Whisper 状态信息(供 App 查询环境检测结果)\n */\nexport function getWhisperLocalStatus(\n dataDir: string,\n logger: Logger,\n): {\n environment: WhisperEnvironmentInfo;\n binaryFound: boolean;\n binaryPath: string | null;\n downloadedModels: WhisperModelSize[];\n} {\n const env = detectEnvironment(logger);\n const binaryPath = findWhisperBinary(dataDir, logger);\n const modelsDir = resolveModelsDir(dataDir);\n\n const allModels: WhisperModelSize[] = [\"tiny\", \"base\", \"small\", \"medium\", \"large-v3\"];\n const downloadedModels = allModels.filter((m) => isModelDownloaded(modelsDir, m));\n\n return {\n environment: env,\n binaryFound: binaryPath !== null,\n binaryPath,\n downloadedModels,\n };\n}\n\n// ─── Internal Helpers ───\n\n/**\n * 检测 CUDA 是否可用(§6.4.1)\n */\nfunction detectCuda(logger: Logger): boolean {\n try {\n // 尝试运行 nvidia-smi\n execSync(\"nvidia-smi\", { encoding: \"utf-8\", stdio: \"pipe\", timeout: 5000 });\n logger.info(\"[whisper-local] 检测到 NVIDIA GPU (nvidia-smi)\");\n return true;\n } catch {\n // nvidia-smi 不存在或执行失败\n }\n\n // 检查 CUDA runtime 库\n if (platform() === \"linux\") {\n try {\n const ldconfig = execSync(\"ldconfig -p 2>/dev/null | grep libcudart\", {\n encoding: \"utf-8\",\n stdio: \"pipe\",\n timeout: 5000,\n });\n if (ldconfig.includes(\"libcudart\")) {\n logger.info(\"[whisper-local] 检测到 CUDA runtime (ldconfig)\");\n return true;\n }\n } catch { /* ignore */ }\n }\n\n return false;\n}\n\n/**\n * 获取可用内存(GB)\n *\n * CUDA 后端使用 VRAM,其余使用系统 RAM。\n */\nfunction getAvailableMemoryGB(backend: WhisperBackend, logger: Logger): number {\n if (backend === \"cuda\") {\n // 尝试获取 GPU VRAM\n try {\n const output = execSync(\n \"nvidia-smi --query-gpu=memory.free --format=csv,noheader,nounits\",\n { encoding: \"utf-8\", stdio: \"pipe\", timeout: 5000 },\n );\n const freeVramMB = parseInt(output.trim().split(\"\\n\")[0], 10);\n if (!Number.isNaN(freeVramMB) && freeVramMB > 0) {\n return freeVramMB / 1024;\n }\n } catch {\n logger.warn(\"[whisper-local] 无法获取 GPU VRAM,使用系统 RAM 代替\");\n }\n }\n\n // 使用系统可用内存(取 total 的 80% 和 free 的较大值作为可用估计)\n const totalGB = totalmem() / (1024 * 1024 * 1024);\n const freeGB = freemem() / (1024 * 1024 * 1024);\n return Math.max(freeGB, totalGB * 0.6);\n}\n\n/**\n * 获取物理 CPU 核心数\n */\nfunction getPhysicalCoreCount(): number {\n const cpuList = cpus();\n if (cpuList.length === 0) return 4; // fallback\n\n // 简单估算:逻辑核 / 2(假设超线程)\n // macOS ARM 无超线程,直接使用逻辑核数\n if (platform() === \"darwin\" && arch() === \"arm64\") {\n // Apple Silicon: P-cores only (exclude E-cores for inference)\n // 简化处理:使用总核数\n return cpuList.length;\n }\n\n return Math.max(1, Math.floor(cpuList.length / 2));\n}\n\n/**\n * 通过文件头 magic bytes 检测音频的真实格式\n * @returns 正确的文件扩展名(如 .aiff, .wav, .m4a),或 null\n */\nfunction detectAudioFormat(filePath: string): string | null {\n try {\n const fd = openSync(filePath, \"r\");\n const buf = Buffer.alloc(12);\n readSync(fd, buf, 0, 12, 0);\n closeSync(fd);\n\n const header = buf.toString(\"ascii\", 0, 4);\n const header8 = buf.toString(\"ascii\", 0, 8);\n\n // RIFF....WAVE = WAV\n if (header === \"RIFF\" && buf.toString(\"ascii\", 8, 12) === \"WAVE\") return \".wav\";\n // FORM....AIFF / FORM....AIFC = AIFF\n if (header === \"FORM\") {\n const sub = buf.toString(\"ascii\", 8, 12);\n if (sub === \"AIFF\" || sub === \"AIFC\") return \".aiff\";\n }\n // ftyp = MP4/M4A/AAC container\n if (buf.toString(\"ascii\", 4, 8) === \"ftyp\") return \".m4a\";\n // ID3 or 0xFF 0xFB = MP3\n if (header.startsWith(\"ID3\") || (buf[0] === 0xff && (buf[1] & 0xe0) === 0xe0)) return \".mp3\";\n // OggS = Ogg (Vorbis/Opus)\n if (header === \"OggS\") return \".ogg\";\n // fLaC = FLAC\n if (header === \"fLaC\") return \".flac\";\n\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * 将音频文件转换为 whisper.cpp 所需的 16kHz mono WAV 格式\n *\n * 转换链(按优先级):\n * 1. ffmpeg — 支持全格式,含 OGG/Opus\n * 2. opusdec — 专用于 OGG/Opus(来自 brew install opus-tools)\n * 3. afconvert — macOS 内置,支持 AIFF/M4A/AAC;需正确文件扩展名\n *\n * @param actualFmt detectAudioFormat 检测到的真实格式(如 \".ogg\", \".aiff\"),可为 null\n */\nfunction convertToWav(\n inputPath: string,\n outputPath: string,\n actualFmt: string | null,\n logger: Logger,\n): { ok: boolean; error?: string } {\n // 尝试 ffmpeg(可自动检测格式,不依赖扩展名)\n try {\n const ffmpegResult = spawnSync(\"ffmpeg\", [\n \"-y\", \"-i\", inputPath,\n \"-ar\", \"16000\", \"-ac\", \"1\", \"-c:a\", \"pcm_s16le\",\n outputPath,\n ], {\n encoding: \"utf-8\",\n timeout: 120_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (ffmpegResult.status === 0 && existsSync(outputPath)) {\n logger.info(`[whisper-local] ffmpeg 转换完成: ${outputPath}`);\n return { ok: true };\n }\n } catch {\n // ffmpeg 不可用,继续尝试其他方式\n }\n\n // 2. opusdec — 专用于 OGG/Opus(ffmpeg 不可用时)\n if (actualFmt === \".ogg\") {\n try {\n const opusResult = spawnSync(\n \"opusdec\",\n [\"--rate\", \"16000\", \"--mono\", inputPath, outputPath],\n { encoding: \"utf-8\", timeout: 120_000, stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n );\n if (opusResult.status === 0 && existsSync(outputPath)) {\n logger.info(`[whisper-local] opusdec 转换完成: ${outputPath}`);\n return { ok: true };\n }\n } catch { /* opusdec 不可用,继续 */ }\n }\n\n // 3. macOS afconvert — 支持 AIFF/M4A/AAC,不支持 OGG\n if (process.platform === \"darwin\" && actualFmt !== \".ogg\") {\n // afconvert 依赖扩展名判断输入格式,先确保扩展名正确\n let actualInputPath = inputPath;\n let tmpCopy: string | null = null;\n const detectedExt = actualFmt;\n\n if (detectedExt && !inputPath.endsWith(detectedExt)) {\n // 扩展名不匹配,创建带正确扩展名的临时副本\n tmpCopy = inputPath + \".detected\" + detectedExt;\n try {\n copyFileSync(inputPath, tmpCopy);\n actualInputPath = tmpCopy;\n logger.info(\n `[whisper-local] 检测到实际格式 ${detectedExt},临时重命名`,\n );\n } catch {\n tmpCopy = null;\n }\n }\n\n try {\n const afResult = spawnSync(\"afconvert\", [\n \"-f\", \"WAVE\", \"-d\", \"LEI16@16000\", \"-c\", \"1\",\n actualInputPath, outputPath,\n ], {\n encoding: \"utf-8\",\n timeout: 120_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n // 清理临时副本\n if (tmpCopy && existsSync(tmpCopy)) {\n try { unlinkSync(tmpCopy); } catch { /* ignore */ }\n }\n\n if (afResult.status === 0 && existsSync(outputPath)) {\n logger.info(`[whisper-local] afconvert 转换完成: ${outputPath}`);\n return { ok: true };\n }\n\n const stderr = afResult.stderr?.slice(0, 200) ?? \"\";\n return { ok: false, error: `afconvert 转换失败 (exit ${afResult.status}): ${stderr}` };\n } catch (err: any) {\n // 清理临时副本\n if (tmpCopy && existsSync(tmpCopy)) {\n try { unlinkSync(tmpCopy); } catch { /* ignore */ }\n }\n return { ok: false, error: `afconvert 不可用: ${err?.message}` };\n }\n }\n\n const fmtHint = actualFmt === \".ogg\"\n ? \"OGG/Opus 格式需要 ffmpeg 或 opus-tools(brew install opus-tools)\"\n : \"请安装 ffmpeg(brew install ffmpeg)或确保音频文件为 WAV 格式\";\n return { ok: false, error: `无法将音频转换为 WAV 格式。${fmtHint}` };\n}\n\n/** 清理临时 WAV 文件 */\nfunction cleanupTmpWav(path: string | null): void {\n if (path && existsSync(path)) {\n try { unlinkSync(path); } catch { /* ignore */ }\n }\n}\n\n/**\n * 构建 whisper.cpp CLI 参数\n */\nfunction buildWhisperArgs(params: {\n audioFilePath: string;\n modelPath: string;\n language: string;\n translate: boolean;\n threads: number;\n backend: WhisperBackend;\n}): string[] {\n const args: string[] = [\n \"--model\", params.modelPath,\n \"--file\", params.audioFilePath,\n \"--output-json\", // JSON 格式输出到 {audioFilePath}.json\n \"--no-prints\", // 抑制模型信息输出\n \"--threads\", String(params.threads),\n ];\n\n // 语言\n if (params.language && params.language !== \"auto\") {\n args.push(\"--language\", params.language);\n } else {\n args.push(\"--language\", \"auto\");\n }\n\n // 翻译为英文\n if (params.translate) {\n args.push(\"--translate\");\n }\n\n return args;\n}\n\n/**\n * 解析 whisper.cpp JSON 输出\n */\nfunction parseWhisperOutput(\n stdout: string,\n logger: Logger,\n): TranscriptionResult {\n if (!stdout || !stdout.trim()) {\n return { ok: false, error: \"whisper.cpp 无输出\" };\n }\n\n try {\n const data = JSON.parse(stdout.trim()) as WhisperCppJsonOutput;\n\n if (!data.transcription || !Array.isArray(data.transcription)) {\n // 可能是纯文本输出\n return {\n ok: true,\n text: stdout.trim(),\n segments: [],\n };\n }\n\n const segments: TranscriptSegment[] = [];\n const textParts: string[] = [];\n\n for (const item of data.transcription) {\n const text = item.text?.trim() ?? \"\";\n if (!text) continue;\n\n textParts.push(text);\n\n const startMs = item.offsets?.from ?? parseTimestamp(item.timestamps?.from);\n const endMs = item.offsets?.to ?? parseTimestamp(item.timestamps?.to);\n\n segments.push({\n start_ms: startMs,\n end_ms: endMs,\n text,\n });\n }\n\n const fullText = textParts.join(\" \");\n\n logger.info(\n `[whisper-local] 转写完成: ${fullText.length} 字, ${segments.length} 段`,\n );\n\n return {\n ok: true,\n text: fullText,\n segments,\n };\n } catch (err: any) {\n logger.warn(`[whisper-local] JSON 解析失败,尝试纯文本: ${err?.message}`);\n\n // Fallback: 将 stdout 视为纯文本\n return {\n ok: true,\n text: stdout.trim(),\n segments: [],\n };\n }\n}\n\n/**\n * 解析 whisper.cpp 时间戳字符串 \"HH:MM:SS,mmm\" → 毫秒\n */\nfunction parseTimestamp(ts?: string): number {\n if (!ts) return 0;\n // \"00:00:05,000\" or \"00:00:05.000\"\n const match = ts.match(/^(\\d+):(\\d+):(\\d+)[,.](\\d+)$/);\n if (!match) return 0;\n const [, h, m, s, ms] = match;\n return (\n parseInt(h, 10) * 3600000 +\n parseInt(m, 10) * 60000 +\n parseInt(s, 10) * 1000 +\n parseInt(ms, 10)\n );\n}\n\n/**\n * 格式化字节数\n */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)}GB`;\n}\n",
|
|
12
|
-
"/**\n * ASR 转写调度器(§6 / §7)\n *\n * 按 arc-long-recording §6.2 定义的两层配置结构调度 ASR:\n * - mode = \"api\":YoooClaw 托管云端 ASR(经 model-proxy 长录音接口调用)\n * - mode = \"local\":本地 Whisper 转写(§6.4,内置 whisper.cpp 推理)\n * - mode = \"yoooclaw\":YoooClaw 自建 ASR(P2,预留接口)\n *\n * 转写流程:\n * 1. 读取录音 OSS URL 与本地文件\n * 2. 调用云端 model-proxy 或本地 Whisper 获取转写文本\n * 3. 将关键点以 [关键点 MM:SS] 内嵌转写文本\n * 4. 自动生成摘要标题(≤ 10 字)\n * 5. 写入 /recordings/transcripts/日期_时间_摘要.md\n */\n\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { resolveStateDir } from \"../host.js\";\nimport type {\n AsrConfig,\n AsrApiConfig,\n RecordingMarker,\n RecordingAsrInitResult,\n RecordingTranscriptItem,\n} from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\nimport { requireApiKey, loadApiKey } from \"../auth/credentials.js\";\nimport { getEnvUrls } from \"../env.js\";\nimport {\n buildTranscriptDataFilename,\n buildTranscriptDocument,\n extractSourceTextListFromDocument,\n} from \"./transcript-document.js\";\n\nconst DEFAULT_LONG_RECORDING_POLL_INTERVAL_MS = 2000;\nconst DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS = 3600;\nconst LONG_RECORDING_RUNNING_STATUSES = new Set([\"PENDING\", \"RUNNING\", \"SUSPENDED\"]);\nconst LONG_RECORDING_TERMINAL_FAILURE_STATUSES = new Set([\"FAILED\", \"CANCELED\", \"UNKNOWN\"]);\n\nconst DEFAULT_HTTP_MAX_ATTEMPTS = 3;\nconst DEFAULT_HTTP_RETRY_BACKOFF_MS = 2000;\n\n// ─── Types ───\n\nexport interface TranscriptionResult {\n ok: boolean;\n /** 转写全文 */\n text?: string;\n /** 带时间戳的分段(如 ASR 支持) */\n segments?: TranscriptSegment[];\n /** 自动生成的摘要标题 */\n summary?: string;\n /** 给客户端展示的摘要文本 */\n summaryText?: string;\n /** 分类信息(如会议纪要、采访) */\n category?: string;\n /** 转写来源信息 */\n sourceInfo?: {\n provider: string;\n taskId?: string;\n requestId?: string;\n status?: string;\n };\n /** Provider 原始响应,供后续兼容字段演进 */\n rawResponse?: unknown;\n /** 错误信息 */\n error?: string;\n}\n\nexport interface TranscriptSegment {\n /** 开始时间(毫秒) */\n start_ms: number;\n /** 结束时间(毫秒) */\n end_ms: number;\n /** 文本内容 */\n text: string;\n /** 说话人 ID(如云端 ASR 返回) */\n speaker_id?: number;\n}\n\ninterface ModelProxyLongRecordingSubmitRequest {\n audioOssUrl: string;\n language?: string;\n enableNormalization?: boolean;\n}\n\ninterface ModelProxyLongRecordingResult {\n sourceText?: string | null;\n sourceTextList?: ModelProxyLongRecordingSourceTextItem[] | null;\n summaryResult?: string | null;\n category?: string | null;\n title?: string | null;\n}\n\ninterface ModelProxyLongRecordingSourceTextItem {\n content?: string | null;\n speakerId?: number | null;\n startTime?: number | null;\n endTime?: number | null;\n}\n\ninterface ModelProxyLongRecordingStatusResponse {\n taskId?: string;\n status?: string;\n requestId?: string;\n errorMessage?: string | null;\n recordResult?: ModelProxyLongRecordingResult | null;\n}\n\ninterface ResponseEnvelope<T> {\n success?: boolean;\n code?: number | string;\n message?: string | null;\n e?: unknown;\n data?: T | null;\n}\n\n// ─── Public API ───\n\n/**\n * 判断 ASR 是否已配置\n */\nexport function isAsrConfigured(config?: AsrConfig): boolean {\n return !!config && !validateAsrConfig(config);\n}\n\n/**\n * 校验客户端下发的 ASR 配置。\n * 返回 undefined 表示配置可用;返回字符串表示错误原因。\n */\nexport function validateAsrConfig(config?: AsrConfig): string | undefined {\n if (!config?.mode) {\n return \"asr.mode is required\";\n }\n\n switch (config.mode) {\n case \"local\":\n case \"api\":\n return undefined;\n case \"yoooclaw\":\n return \"YoooClaw ASR 尚未实现(P2)\";\n default:\n return `未知的 ASR mode: ${(config as { mode: string }).mode}`;\n }\n}\n\n/**\n * 显式初始化 ASR 能力。\n * - mode=api:校验插件本地 API Key 是否存在,并返回最终使用的 model-proxy submit-task endpoint\n * - mode=local:按配置预下载模型,并返回本地环境状态\n */\nexport async function initializeAsr(\n config: AsrConfig,\n dataDir: string,\n logger: Logger,\n): Promise<RecordingAsrInitResult> {\n const validationError = validateAsrConfig(config);\n if (validationError) {\n return {\n ok: false,\n mode: config.mode,\n error: validationError,\n };\n }\n\n switch (config.mode) {\n case \"api\": {\n const endpoint = resolveModelProxyLongRecordingSubmitEndpoint(config.api);\n const keyConfigured = hasText(config.api?.apiKey) || hasText(loadApiKey());\n\n if (!keyConfigured) {\n return {\n ok: false,\n mode: \"api\",\n provider: \"model-proxy\",\n endpoint,\n language: config.api?.language ?? \"auto\",\n keyConfigured: false,\n error:\n \"API Key 未设置,请在本次 asr.api.apiKey 中传入,或先写入 credentials.json / 执行 ntf auth set-api-key <apiKey>\",\n };\n }\n\n return {\n ok: true,\n mode: \"api\",\n provider: \"model-proxy\",\n endpoint,\n language: config.api?.language ?? \"auto\",\n keyConfigured: true,\n };\n }\n case \"local\": {\n const localConfig = config.local ?? {};\n const {\n getWhisperLocalStatus,\n downloadModel,\n resolveModelsDir,\n } = await import(\"./whisper-local.js\");\n\n const initialStatus = getWhisperLocalStatus(dataDir, logger);\n const requestedModel = localConfig.model ?? initialStatus.environment.recommendedModel;\n\n const modelsDir = resolveModelsDir(dataDir);\n const downloadResult = await downloadModel(\n modelsDir,\n requestedModel,\n logger,\n localConfig.modelSource,\n localConfig.modelMirrorUrl,\n );\n if (!downloadResult.ok) {\n return {\n ok: false,\n mode: \"local\",\n model: requestedModel,\n localStatus: {\n ...initialStatus,\n requestedModel,\n },\n error: `模型下载失败: ${downloadResult.error}`,\n };\n }\n\n const finalStatus = getWhisperLocalStatus(dataDir, logger);\n if (!finalStatus.binaryFound) {\n return {\n ok: false,\n mode: \"local\",\n model: requestedModel,\n localStatus: {\n ...finalStatus,\n requestedModel,\n },\n error:\n \"模型已就绪,但未找到 whisper.cpp 二进制文件。请安装 whisper.cpp 并确保 whisper-cli 在 PATH 中。\",\n };\n }\n\n return {\n ok: true,\n mode: \"local\",\n model: requestedModel,\n language: localConfig.language ?? \"auto\",\n localStatus: {\n ...finalStatus,\n requestedModel,\n },\n };\n }\n case \"yoooclaw\":\n return {\n ok: false,\n mode: \"yoooclaw\",\n error: \"YoooClaw ASR 尚未实现(P2)\",\n };\n default:\n return {\n ok: false,\n mode: config.mode,\n error: `未知的 ASR mode: ${config.mode}`,\n };\n }\n}\n\n/**\n * 执行 ASR 转写\n *\n * @param audioFilePath 本地音频文件绝对路径\n * @param config ASR 配置(两层结构:mode + api/local)\n * @param logger 日志\n * @param options 额外上下文(云端 ASR 需要 OSS URL)\n */\nexport async function transcribeAudio(\n audioFilePath: string,\n config: AsrConfig,\n logger: Logger,\n options: {\n audioOssUrl?: string;\n audioDurationMs?: number;\n } = {},\n): Promise<TranscriptionResult> {\n if (!existsSync(audioFilePath)) {\n return { ok: false, error: `音频文件不存在: ${audioFilePath}` };\n }\n\n logger.info(\n `[asr] 开始转写: mode=${config.mode}, file=${audioFilePath}`,\n );\n\n try {\n switch (config.mode) {\n case \"api\":\n return await transcribeWithModelProxy(\n options.audioOssUrl,\n options.audioDurationMs,\n config.api,\n logger,\n );\n case \"local\":\n return await transcribeWithWhisperLocal(audioFilePath, config, logger);\n case \"yoooclaw\":\n return { ok: false, error: \"YoooClaw ASR 尚未实现(P2)\" };\n default:\n return {\n ok: false,\n error: `未知的 ASR mode: ${config.mode}`,\n };\n }\n } catch (err: any) {\n const msg = err?.message ?? String(err);\n logger.error(`[asr] 转写异常: ${msg}`);\n return { ok: false, error: msg };\n }\n}\n\n/**\n * 将转写结果与关键点标记合并,生成最终 Markdown 转写文本\n *\n * @param result 转写结果\n * @param markers 关键点列表\n * @param recordingName 录音名称\n * @param durationSec 录音总时长(秒)\n * @param createdAt 录音创建时间\n */\nexport function buildTranscriptMarkdown(\n result: TranscriptionResult,\n markers: RecordingMarker[],\n recordingName: string,\n durationSec: number,\n createdAt: string,\n): string { \n const summary = result.summary ?? recordingName.slice(0, 10);\n const lines: string[] = [];\n\n // 元数据头\n lines.push(`# ${summary}`);\n lines.push(\"\");\n lines.push(`> 录音名称:${recordingName}`);\n lines.push(`> 时长:${formatDuration(durationSec)}`);\n lines.push(`> 创建时间:${createdAt}`);\n if (markers.length > 0) {\n lines.push(`> 关键点数:${markers.length}`);\n }\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n\n if (result.segments && result.segments.length > 0) {\n // 有分段的转写文本:在合适的位置插入关键点标记\n const sortedMarkers = [...markers].sort(\n (a, b) => a.timestamp_ms - b.timestamp_ms,\n );\n let markerIdx = 0;\n\n for (const seg of result.segments) {\n // 在当前段之前插入所有对应的关键点\n while (\n markerIdx < sortedMarkers.length &&\n sortedMarkers[markerIdx].timestamp_ms <= seg.start_ms\n ) {\n const m = sortedMarkers[markerIdx];\n lines.push(\n `**[关键点 ${formatTimestamp(m.timestamp_ms)}]**`,\n );\n lines.push(\"\");\n markerIdx++;\n }\n\n const segmentText = formatTranscriptSegmentText(seg);\n if (segmentText) {\n lines.push(segmentText);\n lines.push(\"\");\n }\n }\n\n // 追加剩余关键点\n while (markerIdx < sortedMarkers.length) {\n const m = sortedMarkers[markerIdx];\n lines.push(\n `**[关键点 ${formatTimestamp(m.timestamp_ms)}]**`,\n );\n lines.push(\"\");\n markerIdx++;\n }\n } else if (result.text) {\n // 纯文本转写:在文本头部集中列出关键点\n if (markers.length > 0) {\n lines.push(\"### 关键点\");\n lines.push(\"\");\n for (const m of markers) {\n lines.push(`- **[关键点 ${formatTimestamp(m.timestamp_ms)}]**`);\n }\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n }\n lines.push(result.text);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * 从转写文本中提取摘要标题(≤ 10 字)\n */\nexport function extractSummary(text: string): string {\n // 取第一句话,截断到 10 字\n const firstLine = text.split(/[。!?\\n]/).find((s) => s.trim().length > 0);\n if (!firstLine) return \"录音转写\";\n const trimmed = firstLine.trim();\n return trimmed.length <= 10 ? trimmed : trimmed.slice(0, 10);\n}\n\n/**\n * 完整的转写工作流:转写 → 生成 Markdown → 写入文件\n */\nexport async function runTranscriptionWorkflow(params: {\n audioFilePath: string;\n audioOssUrl?: string;\n config: AsrConfig;\n markers: RecordingMarker[];\n recordingName: string;\n durationSec: number;\n createdAt: string;\n transcriptsDir: string;\n transcriptDataDir: string;\n summariesDir: string;\n recordingId: string;\n logger: Logger;\n}): Promise<{\n ok: boolean;\n transcriptFilename?: string;\n transcriptDataFilename?: string;\n summaryFilename?: string;\n transcript?: RecordingTranscriptItem[];\n summary?: string;\n title?: string;\n error?: string;\n}> {\n const {\n audioFilePath,\n audioOssUrl,\n config,\n markers,\n recordingName,\n durationSec,\n createdAt,\n transcriptsDir,\n transcriptDataDir,\n summariesDir,\n recordingId,\n logger,\n } = params;\n\n // 1. ASR 转写\n const result = await transcribeAudio(audioFilePath, config, logger, {\n audioOssUrl,\n audioDurationMs: Math.max(0, Math.round(durationSec * 1000)),\n });\n if (!result.ok) {\n return { ok: false, error: result.error };\n }\n\n // 2. 提取摘要\n const title = normalizeOptionalText(result.summary)\n ? normalizeOptionalText(result.summary)!\n : extractSummary(result.text ?? \"\");\n const summary = result.summaryText ?? \"\";\n result.summary = title;\n const transcriptData = buildTranscriptDocument({\n recordingId,\n generatedAt: new Date().toISOString(),\n source: result.sourceInfo ?? {\n provider: config.mode === \"api\" ? \"model-proxy\" : config.mode,\n },\n title,\n category: result.category,\n summary,\n text: result.text,\n segments: (result.segments ?? []).map((segment) => ({\n text: segment.text,\n startMs: segment.start_ms,\n endMs: segment.end_ms,\n speakerId: segment.speaker_id,\n })),\n raw: result.rawResponse,\n });\n\n // 3. 生成 Markdown\n const markdown = buildTranscriptMarkdown(\n result,\n markers,\n recordingName,\n durationSec,\n createdAt,\n );\n\n // 4. 写入文件\n const transcriptDataFilename = buildTranscriptDataFilename(recordingId);\n const transcriptDataPath = join(transcriptDataDir, transcriptDataFilename);\n writeFileSync(\n transcriptDataPath,\n JSON.stringify(transcriptData, null, 2),\n \"utf-8\",\n );\n logger.info(`[asr] 转写 JSON 已写入: ${transcriptDataPath}`);\n\n const safeSummary = title\n .replace(/[/\\\\:*?\"<>|]/g, \"\")\n .trim()\n .slice(0, 20);\n const filename = safeSummary\n ? `${recordingId}_${safeSummary}.md`\n : `${recordingId}.md`;\n const filePath = join(transcriptsDir, filename);\n writeFileSync(filePath, markdown, \"utf-8\");\n logger.info(`[asr] 转写文本已写入: ${filePath}`);\n\n let summaryFilename: string | undefined;\n if (summary) {\n summaryFilename = `${recordingId}.md`;\n const summaryFilePath = join(summariesDir, summaryFilename);\n writeFileSync(summaryFilePath, summary, \"utf-8\");\n logger.info(`[asr] 摘要文本已写入: ${summaryFilePath}`);\n }\n\n return {\n ok: true,\n transcriptFilename: filename,\n transcriptDataFilename,\n summaryFilename,\n transcript: extractSourceTextListFromDocument(transcriptData),\n summary,\n title,\n };\n}\n\n// ─── ASR Provider Implementations ───\n\n/**\n * 通过 model-proxy 的长录音接口执行云端转写。\n */\nasync function transcribeWithModelProxy(\n audioOssUrl: string | undefined,\n audioDurationMs: number | undefined,\n apiConfig: AsrApiConfig | undefined,\n logger: Logger,\n): Promise<TranscriptionResult> {\n const normalizedAudioOssUrl = normalizeOptionalText(audioOssUrl);\n if (!normalizedAudioOssUrl) {\n return { ok: false, error: \"API 模式缺少 audioOssUrl,无法调用 model-proxy\" };\n }\n\n const apiKey = resolveModelProxyApiKey(apiConfig);\n const submitEndpoint = resolveModelProxyLongRecordingSubmitEndpoint(apiConfig);\n const submitBody = buildLongRecordingSubmitRequest(normalizedAudioOssUrl, apiConfig);\n\n logger.info(\n `[asr-submit] 提交长录音任务: endpoint=${submitEndpoint}, body=${stringifyForLog(submitBody) ?? \"{}\"}`,\n );\n\n let res: Response;\n try {\n res = await fetchWithRetry(\n submitEndpoint,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key-Id\": apiKey,\n },\n body: JSON.stringify(submitBody),\n },\n { logger, context: \"asr-submit\" },\n );\n } catch (err: any) {\n const msg = err?.message ?? String(err);\n logger.error(`[asr-submit] 提交长录音任务网络异常 (已重试): ${msg}`);\n return {\n ok: false,\n error: `Model Proxy ASR submit network error: ${msg}`,\n };\n }\n\n if (!res.ok) {\n const errText = await res.text();\n logger.error(\n `[asr-submit-response] 提交长录音任务失败: status=${res.status}, body=${errText.slice(0, 500)}`,\n );\n return {\n ok: false,\n error: `Model Proxy ASR error: ${res.status} ${errText.slice(0, 200)}`,\n };\n }\n\n const raw = (await res.json()) as\n | ModelProxyLongRecordingStatusResponse\n | ResponseEnvelope<ModelProxyLongRecordingStatusResponse>;\n logger.info(\n `[asr-submit-response] 提交长录音任务响应: ${stringifyForLog(raw) ?? \"{}\"}`,\n );\n const submitEnvelopeError = buildModelProxyEnvelopeError(raw);\n if (submitEnvelopeError) {\n logger.error(\n `[asr-submit-response] 提交长录音任务失败: ${submitEnvelopeError}`,\n );\n return {\n ok: false,\n error: `Model Proxy ASR 提交失败: ${submitEnvelopeError}`,\n };\n }\n\n const data = unwrapResponse(raw);\n const taskId = normalizeOptionalText(data?.taskId);\n const requestId = normalizeOptionalText(data?.requestId);\n const status = normalizeLongRecordingStatus(data?.status);\n\n if (!taskId) {\n return {\n ok: false,\n error: \"Model Proxy ASR 响应缺少 taskId\",\n };\n }\n\n logger.info(\n `[asr] Model Proxy 长录音任务已提交: taskId=${taskId}, status=${status ?? \"UNKNOWN\"}, requestId=${requestId ?? \"n/a\"}`,\n );\n\n if (status && LONG_RECORDING_TERMINAL_FAILURE_STATUSES.has(status)) {\n return {\n ok: false,\n error: buildLongRecordingStatusError(data, status),\n };\n }\n\n return await pollLongRecordingTaskResult({\n apiKey,\n taskId,\n initialRequestId: requestId,\n audioDurationMs,\n apiConfig,\n logger,\n });\n}\n\n/**\n * 本地 Whisper 转写(§6.4 — 内置 whisper.cpp 推理)\n */\nasync function transcribeWithWhisperLocal(\n audioFilePath: string,\n config: AsrConfig,\n logger: Logger,\n): Promise<TranscriptionResult> {\n const { transcribeWithWhisperLocal: runLocal } = await import(\"./whisper-local.js\");\n\n // 解析插件数据目录(与模型/二进制存放位置)\n // 优先使用环境变量指定的目录,否则使用音频文件所在目录的上两级(recordings 的父目录)\n const dataDir =\n resolveStateDir() ??\n join(audioFilePath, \"..\", \"..\", \"..\");\n\n const localConfig = config.local ?? {};\n\n const result = await runLocal(\n audioFilePath,\n localConfig,\n dataDir,\n logger,\n );\n\n if (result.ok && result.text) {\n const { extractSummary: extract } = await import(\"./asr.js\");\n result.summary = extract(result.text);\n result.sourceInfo = {\n provider: \"whisper-local\",\n status: \"SUCCEEDED\",\n };\n }\n\n return result;\n}\n\n// ─── Helpers ───\n\nfunction resolveModelProxyLongRecordingSubmitEndpoint(apiConfig?: AsrApiConfig): string {\n return apiConfig?.endpoint?.trim() || getEnvUrls().modelProxyLongRecordingSubmitTaskUrl;\n}\n\nfunction resolveModelProxyApiKey(apiConfig?: AsrApiConfig): string {\n const requestApiKey = normalizeOptionalText(apiConfig?.apiKey);\n return normalizeApiKeyHeaderValue(requestApiKey ?? requireApiKey());\n}\n\nfunction resolveModelProxyLongRecordingQueryTaskResultBaseUrl(\n apiConfig?: AsrApiConfig,\n): string {\n const customEndpoint = apiConfig?.endpoint?.trim();\n if (customEndpoint) {\n return deriveLongRecordingQueryTaskResultBaseUrl(customEndpoint);\n }\n return getEnvUrls().modelProxyLongRecordingQueryTaskResultBaseUrl;\n}\n\nfunction deriveLongRecordingQueryTaskResultBaseUrl(endpoint: string): string {\n const trimmed = endpoint.replace(/\\/+$/, \"\");\n if (trimmed.endsWith(\"/submit-task\")) {\n return `${trimmed.slice(0, -\"/submit-task\".length)}/query-task-result`;\n }\n return trimmed;\n}\n\nfunction buildLongRecordingSubmitRequest(\n audioOssUrl: string,\n apiConfig?: AsrApiConfig,\n): ModelProxyLongRecordingSubmitRequest {\n const body: ModelProxyLongRecordingSubmitRequest = {\n audioOssUrl,\n };\n\n if (apiConfig?.language?.trim()) {\n body.language = apiConfig.language.trim();\n }\n if (typeof apiConfig?.enableNormalization === \"boolean\") {\n body.enableNormalization = apiConfig.enableNormalization;\n }\n\n return body;\n}\n\nasync function pollLongRecordingTaskResult(params: {\n apiKey: string;\n taskId: string;\n initialRequestId?: string;\n audioDurationMs?: number;\n apiConfig?: AsrApiConfig;\n logger: Logger;\n}): Promise<TranscriptionResult> {\n const {\n apiKey,\n taskId,\n initialRequestId,\n audioDurationMs,\n apiConfig,\n logger,\n } = params;\n const queryBaseUrl = resolveModelProxyLongRecordingQueryTaskResultBaseUrl(apiConfig);\n let lastStatus: string | undefined;\n\n const pollIntervalMs = getPollIntervalMs();\n\n for (let attempt = 1; attempt <= DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS; attempt++) {\n const queryUrl = `${queryBaseUrl}/${encodeURIComponent(taskId)}`;\n let res: Response;\n try {\n res = await fetch(queryUrl, {\n method: \"GET\",\n headers: {\n \"X-Api-Key-Id\": apiKey,\n },\n });\n } catch (err: any) {\n const msg = err?.message ?? String(err);\n logger.warn(\n `[asr-query] 长录音任务查询网络异常: taskId=${taskId}, attempt=${attempt}, error=${msg} — 等待下次轮询`,\n );\n if (attempt < DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS) {\n await sleep(pollIntervalMs);\n continue;\n }\n return {\n ok: false,\n error: `Model Proxy ASR query network error: ${msg}`,\n };\n }\n\n if (!res.ok) {\n const errText = await res.text().catch(() => \"\");\n if (isRetryableHttpStatus(res.status)) {\n logger.warn(\n `[asr-query] 长录音任务查询暂时失败: taskId=${taskId}, attempt=${attempt}, status=${res.status}, body=${errText.slice(0, 200)} — 等待下次轮询`,\n );\n if (attempt < DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS) {\n await sleep(pollIntervalMs);\n continue;\n }\n } else {\n logger.error(\n `[asr-query-response] 长录音任务查询失败: taskId=${taskId}, attempt=${attempt}, status=${res.status}, body=${errText.slice(0, 500)}`,\n );\n }\n return {\n ok: false,\n error: `Model Proxy ASR query error: ${res.status} ${errText.slice(0, 200)}`,\n };\n }\n\n const raw = (await res.json()) as\n | ModelProxyLongRecordingStatusResponse\n | ResponseEnvelope<ModelProxyLongRecordingStatusResponse>;\n const queryEnvelopeError = buildModelProxyEnvelopeError(raw);\n if (queryEnvelopeError) {\n logger.error(\n `[asr-query-response] 长录音任务查询失败: taskId=${taskId}, attempt=${attempt}, ${queryEnvelopeError}`,\n );\n return {\n ok: false,\n error: `Model Proxy ASR 查询失败: ${queryEnvelopeError}`,\n };\n }\n\n const data = unwrapResponse(raw);\n const status = normalizeLongRecordingStatus(data?.status) ?? \"UNKNOWN\";\n const requestId = normalizeOptionalText(data?.requestId) ?? initialRequestId;\n\n if (status !== lastStatus) {\n logger.info(\n `[asr-query-response] 长录音任务查询响应: taskId=${taskId}, attempt=${attempt}, body=${stringifyForLog(raw) ?? \"{}\"}`,\n );\n logger.info(\n `[asr] Model Proxy 长录音任务状态: taskId=${taskId}, status=${status}, attempt=${attempt}, requestId=${requestId ?? \"n/a\"}`,\n );\n lastStatus = status;\n }\n\n if (status === \"SUCCEEDED\") {\n return buildLongRecordingSuccessResult(\n taskId,\n requestId,\n data,\n audioDurationMs,\n logger,\n );\n }\n\n if (LONG_RECORDING_TERMINAL_FAILURE_STATUSES.has(status)) {\n return {\n ok: false,\n error: buildLongRecordingStatusError(data, status),\n };\n }\n\n if (!LONG_RECORDING_RUNNING_STATUSES.has(status)) {\n return {\n ok: false,\n error: `Model Proxy ASR 返回未知任务状态: ${status}`,\n };\n }\n\n if (attempt < DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS) {\n await sleep(pollIntervalMs);\n }\n }\n\n return {\n ok: false,\n error:\n `Model Proxy ASR 轮询超时: taskId=${taskId}, waited=${DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS * pollIntervalMs}ms`,\n };\n}\n\nfunction buildLongRecordingSuccessResult(\n taskId: string,\n requestId: string | undefined,\n data: ModelProxyLongRecordingStatusResponse | undefined,\n audioDurationMs: number | undefined,\n logger: Logger,\n): TranscriptionResult {\n const sourceTextList = normalizeLongRecordingSourceTextList(\n data?.recordResult?.sourceTextList,\n );\n const listResult = extractLongRecordingTextFromList(sourceTextList, audioDurationMs);\n const sourceText = normalizeOptionalText(data?.recordResult?.sourceText);\n const summaryText = normalizeOptionalText(data?.recordResult?.summaryResult) ?? \"\";\n const title = normalizeOptionalText(data?.recordResult?.title);\n const category = normalizeOptionalText(data?.recordResult?.category);\n const text = listResult.text ?? sourceText ?? summaryText;\n const status = normalizeLongRecordingStatus(data?.status) ?? \"SUCCEEDED\";\n\n if (!listResult.text && !sourceText && summaryText) {\n logger.warn(\n `[asr] Model Proxy 长录音结果缺少 sourceTextList/sourceText,已回退使用 summaryResult 作为转写文本: taskId=${taskId}`,\n );\n }\n\n logger.info(\n `[asr] Model Proxy 长录音转写完成: taskId=${taskId}, requestId=${requestId ?? \"n/a\"}, chars=${text.length}`,\n );\n\n return {\n ok: true,\n text,\n segments: listResult.segments,\n summary: title,\n summaryText,\n category,\n sourceInfo: {\n provider: \"model-proxy\",\n taskId,\n requestId,\n status,\n },\n rawResponse: data,\n };\n}\n\nfunction buildLongRecordingStatusError(\n data: ModelProxyLongRecordingStatusResponse | undefined,\n status: string,\n): string {\n const errorMessage = normalizeOptionalText(data?.errorMessage);\n return errorMessage\n ? `Model Proxy ASR ${status}: ${errorMessage}`\n : `Model Proxy ASR ${status}`;\n}\n\nfunction buildModelProxyEnvelopeError(\n payload:\n | ModelProxyLongRecordingStatusResponse\n | ResponseEnvelope<ModelProxyLongRecordingStatusResponse>,\n): string | undefined {\n if (!payload || typeof payload !== \"object\" || !(\"data\" in payload)) {\n return undefined;\n }\n\n const envelope = payload as ResponseEnvelope<ModelProxyLongRecordingStatusResponse>;\n const explicitFailure = envelope.success === false;\n const message = normalizeOptionalText(envelope.message);\n if (!explicitFailure && (!message || envelope.data)) {\n return undefined;\n }\n\n const code = normalizeOptionalCode(envelope.code);\n if (code && message) {\n return `${code} ${message}`;\n }\n return message ?? code ?? \"response envelope indicates failure\";\n}\n\nfunction unwrapResponse(\n payload:\n | ModelProxyLongRecordingStatusResponse\n | ResponseEnvelope<ModelProxyLongRecordingStatusResponse>,\n): ModelProxyLongRecordingStatusResponse | undefined {\n if (\n payload &&\n typeof payload === \"object\" &&\n \"data\" in payload &&\n payload.data &&\n typeof payload.data === \"object\"\n ) {\n return payload.data;\n }\n\n return payload as ModelProxyLongRecordingStatusResponse;\n}\n\nfunction normalizeApiKeyHeaderValue(apiKey: string): string {\n return apiKey.startsWith(\"Bearer \")\n ? apiKey.slice(\"Bearer \".length)\n : apiKey;\n}\n\nfunction normalizeLongRecordingStatus(status: unknown): string | undefined {\n return typeof status === \"string\" && status.trim()\n ? status.trim().toUpperCase()\n : undefined;\n}\n\nfunction normalizeOptionalText(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim()\n ? value.trim()\n : undefined;\n}\n\nfunction normalizeOptionalCode(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n return undefined;\n}\n\nfunction normalizeOptionalInteger(value: unknown): number | undefined {\n return Number.isInteger(value)\n ? Number(value)\n : undefined;\n}\n\nfunction normalizeOptionalNonNegativeNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : undefined;\n}\n\nfunction normalizeLongRecordingSourceTextList(\n value: unknown,\n): Array<{\n content: string;\n speakerId?: number;\n startTime?: number;\n endTime?: number;\n}> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const record = item as Record<string, unknown>;\n const content = normalizeOptionalText(record.content);\n if (!content) {\n return [];\n }\n\n return [{\n content,\n speakerId: normalizeOptionalInteger(record.speakerId),\n startTime: normalizeOptionalNonNegativeNumber(record.startTime),\n endTime: normalizeOptionalNonNegativeNumber(record.endTime),\n }];\n });\n}\n\nfunction extractLongRecordingTextFromList(\n items: Array<{\n content: string;\n speakerId?: number;\n startTime?: number;\n endTime?: number;\n }>,\n finalFallbackEndMs?: number,\n): {\n text?: string;\n segments: TranscriptSegment[];\n} {\n if (items.length === 0) {\n return {\n segments: [],\n };\n }\n\n const segments = items.map((item, index) => {\n const startMs = item.startTime ?? 0;\n const explicitEndMs = item.endTime;\n const nextStart = items[index + 1]?.startTime;\n const fallbackEndMs = index === items.length - 1\n ? normalizeOptionalNonNegativeNumber(finalFallbackEndMs)\n : undefined;\n const endMs = explicitEndMs ?? nextStart ?? fallbackEndMs ?? startMs;\n\n return {\n start_ms: startMs,\n end_ms: Math.max(startMs, endMs),\n text: item.content,\n speaker_id: item.speakerId,\n };\n });\n\n return {\n text: items.map((item) => item.content).join(\"\\n\\n\"),\n segments,\n };\n}\n\nfunction stringifyForLog(value: unknown, maxLength = 500): string | undefined {\n if (value == null) {\n return undefined;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed ? trimmed.slice(0, maxLength) : undefined;\n }\n\n try {\n const serialized = JSON.stringify(value);\n return serialized ? serialized.slice(0, maxLength) : undefined;\n } catch {\n return String(value).slice(0, maxLength);\n }\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRetryableHttpStatus(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction getHttpRetryBackoffMs(): number {\n const raw = process.env.OPENCLAW_ASR_HTTP_RETRY_BACKOFF_MS;\n if (raw) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return parsed;\n }\n }\n return DEFAULT_HTTP_RETRY_BACKOFF_MS;\n}\n\nfunction getPollIntervalMs(): number {\n const raw = process.env.OPENCLAW_ASR_POLL_INTERVAL_MS;\n if (raw) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return parsed;\n }\n }\n return DEFAULT_LONG_RECORDING_POLL_INTERVAL_MS;\n}\n\n/**\n * 带重试的 fetch 包装:\n * - HTTP 5xx / 429:按指数退避重试\n * - 网络异常(fetch throw):按指数退避重试\n * - HTTP 4xx(除 429)/ 2xx / 3xx:直接返回,由调用方处理\n *\n * 用于 ASR submit 这类一次性请求;polling 走自己的节奏,无需此包装。\n */\nasync function fetchWithRetry(\n url: string,\n init: RequestInit,\n options: {\n logger: Logger;\n context: string;\n maxAttempts?: number;\n backoffMs?: number;\n },\n): Promise<Response> {\n const maxAttempts = options.maxAttempts ?? DEFAULT_HTTP_MAX_ATTEMPTS;\n const baseBackoff = options.backoffMs ?? getHttpRetryBackoffMs();\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const res = await fetch(url, init);\n if (isRetryableHttpStatus(res.status) && attempt < maxAttempts) {\n const errText = await res.text().catch(() => \"\");\n const delay = baseBackoff * Math.pow(2, attempt - 1);\n options.logger.warn(\n `[${options.context}] HTTP ${res.status} (attempt ${attempt}/${maxAttempts}), ${delay}ms 后重试, body=${errText.slice(0, 200)}`,\n );\n await sleep(delay);\n continue;\n }\n return res;\n } catch (err) {\n lastError = err;\n if (attempt < maxAttempts) {\n const delay = baseBackoff * Math.pow(2, attempt - 1);\n const msg = (err as any)?.message ?? String(err);\n options.logger.warn(\n `[${options.context}] 网络异常 (attempt ${attempt}/${maxAttempts}): ${msg}, ${delay}ms 后重试`,\n );\n await sleep(delay);\n continue;\n }\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n}\n\nfunction extractTranscriptSummary(text: string): string {\n const normalized = text.replace(/\\s+/g, \" \").trim();\n if (!normalized) {\n return \"\";\n }\n\n const sentence = normalized\n .split(/[。!?!?]/)\n .map((part) => part.trim())\n .find((part) => part.length > 0);\n\n const candidate = sentence || normalized;\n return candidate.length <= 120\n ? candidate\n : `${candidate.slice(0, 117).trimEnd()}...`;\n}\n/** 毫秒 → \"MM:SS\" */\nfunction formatTimestamp(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n}\n\n/** 秒 → \"HH:MM:SS\" 或 \"MM:SS\" */\nfunction formatDuration(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = Math.floor(seconds % 60);\n if (h > 0) {\n return `${h}:${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n }\n return `${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n}\n\nfunction hasText(value: unknown): boolean {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction formatTranscriptSegmentText(segment: TranscriptSegment): string {\n const text = segment.text.trim();\n if (!text) {\n return text;\n }\n\n if (typeof segment.speaker_id === \"number\") {\n return `说话人${segment.speaker_id}:${text}`;\n }\n\n return text;\n}\n",
|
|
13
5
|
"'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n CLOSE_TIMEOUT: 30000,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n",
|
|
14
6
|
"'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n",
|
|
15
7
|
"'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n",
|
|
@@ -33,84 +25,93 @@
|
|
|
33
25
|
"import \"./device-pairing-DeNkV6bj.js\";\nimport \"./device-bootstrap-DKsEcfsd.js\";\nexport {};\n",
|
|
34
26
|
"import { i as listDevicePairing, t as approveDevicePairing } from \"../device-pairing-DeNkV6bj.js\";\nimport { a as PAIRING_SETUP_BOOTSTRAP_PROFILE, n as issueDeviceBootstrapToken, o as normalizeDeviceBootstrapProfile, r as revokeDeviceBootstrapToken, s as sameDeviceBootstrapProfile, t as clearDeviceBootstrapTokens } from \"../device-bootstrap-DKsEcfsd.js\";\nimport \"../device-bootstrap-DTI1FU3A.js\";\nexport { PAIRING_SETUP_BOOTSTRAP_PROFILE, approveDevicePairing, clearDeviceBootstrapTokens, issueDeviceBootstrapToken, listDevicePairing, normalizeDeviceBootstrapProfile, revokeDeviceBootstrapToken, sameDeviceBootstrapProfile };\n",
|
|
35
27
|
"/**\n * 构建 yoooclaw 的 commander 程序。\n *\n * 命令树结构(service / subcommand / shortcut / options)来自 command-tree.ts;\n * 实现体由 commands/registry.ts 按 path(如 `config init`)提供,未注册则回落 notImplemented。\n */\nimport { Command } from \"commander\";\nimport {\n COMMAND_TREE,\n type OptionSpec,\n type ServiceSpec,\n} from \"./command-tree.js\";\nimport { buildContext, type CliContext, type GlobalFlags } from \"./context.js\";\nimport { renderError, renderResult } from \"./output/format.js\";\nimport { YoooclawError, notImplemented } from \"./errors.js\";\nimport { CLI_VERSION } from \"./version.js\";\nimport { HANDLERS } from \"./commands/registry.js\";\n\n/** 命令处理器签名:拿到上下文 + commander 解析后的参数/选项,返回可序列化结果。 */\nexport type CommandHandler = (\n ctx: CliContext,\n args: unknown[],\n opts: Record<string, unknown>,\n) => unknown;\n\n/** 把 handler 包成 commander action:解析 ctx → 执行 → 统一渲染结果 / 错误。 */\nfunction wrapAction(handler: CommandHandler) {\n return async (...rawArgs: unknown[]): Promise<void> => {\n // commander 传参:[...positional, options, command]\n const command = rawArgs.at(-1) as Command;\n const opts = rawArgs.at(-2) as Record<string, unknown>;\n const positionals = rawArgs.slice(0, -2);\n const globals = command.optsWithGlobals() as GlobalFlags;\n\n let ctx: CliContext | undefined;\n try {\n ctx = buildContext(globals);\n const result = await handler(ctx, positionals, opts);\n renderResult(result, { format: ctx.format });\n } catch (err) {\n const format = ctx?.format ?? \"json\";\n renderError(err, { format });\n process.exitCode = err instanceof YoooclawError ? err.exitCode : 1;\n }\n };\n}\n\n/** 解析某个 path 的 handler,未注册则给 notImplemented 占位。 */\nfunction resolveHandler(path: string): CommandHandler {\n const handler = HANDLERS[path];\n if (handler) return handler;\n return () => {\n throw notImplemented(path);\n };\n}\n\nfunction applyOptions(cmd: Command, options: OptionSpec[] | undefined): void {\n for (const opt of options ?? []) {\n if (opt.default !== undefined) {\n cmd.option(opt.flags, opt.summary, opt.default);\n } else {\n cmd.option(opt.flags, opt.summary);\n }\n }\n}\n\nfunction attachService(program: Command, spec: ServiceSpec): void {\n const service = program.command(spec.name).description(spec.summary);\n\n // leaf 命令:直接挂 action(如 `yoooclaw doctor` / `yoooclaw api <method> <path>`)\n if (!spec.subcommands || spec.subcommands.length === 0) {\n if (spec.args) {\n service.arguments(spec.args);\n }\n applyOptions(service, spec.options);\n service.action(wrapAction(resolveHandler(spec.name)));\n } else {\n for (const sub of spec.subcommands) {\n const subCmd = service.command(sub.name).description(sub.summary);\n applyOptions(subCmd, sub.options);\n // path 的注册 key 用「服务名 + 子命令名(去掉位置参数占位)」\n subCmd.action(wrapAction(resolveHandler(handlerKey(spec.name, sub.name))));\n }\n }\n\n // shortcuts(`+` 前缀)作为该 service 下的子命令注册\n for (const shortcut of spec.shortcuts ?? []) {\n const shortcutCmd = service\n .command(shortcut.name)\n .description(shortcut.summary);\n applyOptions(shortcutCmd, shortcut.options);\n shortcutCmd.action(\n wrapAction(resolveHandler(handlerKey(spec.name, shortcut.name))),\n );\n }\n}\n\n/** 注册表的 path key:去掉子命令名里的位置参数占位(`show <id>` → `show`)。 */\nexport function handlerKey(service: string, subName: string): string {\n const bare = subName.split(/\\s+/)[0];\n return `${service} ${bare}`;\n}\n\n/** 构建并返回顶层 commander 程序。 */\nexport function buildProgram(): Command {\n const program = new Command();\n\n program\n .name(\"yoooclaw\")\n .description(\n \"yoooclaw —— 独立守护进程 + CLI:接收手机通知、Relay 隧道、灯效规则评估(Agent-Native)\",\n )\n .version(CLI_VERSION, \"-v, --version\", \"显示 CLI 版本号\")\n // 全局 flags(对所有命令生效)\n .option(\"--profile <name>\", \"切换 profile(默认 default)\")\n .option(\n \"--format <format>\",\n \"输出格式:json|pretty|table|ndjson(TTY 默认 pretty,管道默认 json)\",\n )\n .option(\"--quiet\", \"抑制进度日志,只输出最终结果\")\n .option(\"--no-color\", \"关闭终端颜色\")\n .showHelpAfterError();\n\n for (const spec of COMMAND_TREE) {\n attachService(program, spec);\n }\n\n return program;\n}\n",
|
|
36
|
-
"/**\n * 命令树声明 —— Service-oriented,对齐 lark-cli 形态与本仓 PRD「命令树总览」。\n *\n * 这是命令树的**单一事实来源**:program.ts 据此构建 commander 程序(结构 + options),\n * 实现体由 commands/registry.ts 按 path 提供;未注册的 path 回落 notImplemented 占位。\n *\n * daemon 依赖标记(仅文档用途,体现在 summary 里):\n * 🟢 不需要 daemon 🟡 需要 daemon 在跑 🔵 进程类(管理 daemon 自身)\n */\n\nexport interface OptionSpec {\n /** commander flags,如 `--from <iso8601>`、`--follow` */\n flags: string;\n summary: string;\n /** 默认值(仅对带值的 option 有意义) */\n default?: string;\n}\n\nexport interface SubcommandSpec {\n /** 子命令名 + 位置参数,如 `show <id>`、`api <method> <path>` */\n name: string;\n summary: string;\n options?: OptionSpec[];\n}\n\nexport interface ShortcutSpec {\n /** 含 `+` 前缀的快捷命令名,如 `+today` */\n name: string;\n summary: string;\n options?: OptionSpec[];\n}\n\nexport interface ServiceSpec {\n name: string;\n summary: string;\n /** 子命令列表。leaf 命令(直接执行,无子命令)省略此项并提供 `args`。 */\n subcommands?: SubcommandSpec[];\n /** leaf 命令的位置参数,如 `[keyword]`、`<method> <path>`。 */\n args?: string;\n /** leaf 命令的 options。 */\n options?: OptionSpec[];\n shortcuts?: ShortcutSpec[];\n}\n\nconst NOTIFICATION_QUERY_OPTIONS: OptionSpec[] = [\n { flags: \"--from <iso8601>\", summary: \"开始时间,如 2026-03-01T09:00:00+08:00\" },\n { flags: \"--to <iso8601>\", summary: \"结束时间\" },\n { flags: \"--app <name>\", summary: \"按应用过滤(支持中英文别名)\" },\n { flags: \"--sender <name>\", summary: \"按发送人/标题过滤\" },\n { flags: \"--conversation-type <type>\", summary: \"会话类型 group|private\" },\n { flags: \"--keyword <text>\", summary: \"在标题/内容/发送人/会话名中搜索\" },\n { flags: \"--limit <n>\", summary: \"最大返回条数\", default: \"100\" },\n];\n\nexport const COMMAND_TREE: ServiceSpec[] = [\n {\n name: \"config\",\n summary: \"配置管理 🟢\",\n subcommands: [\n {\n name: \"init\",\n summary: \"交互式首次向导,生成 config + gateway token\",\n options: [\n { flags: \"--non-interactive\", summary: \"跳过向导(配合 --from-file)\" },\n { flags: \"--from-file <path>\", summary: \"从 JSON 文件导入配置(- 为 stdin)\" },\n { flags: \"--force\", summary: \"已存在 config 时覆盖\" },\n ],\n },\n {\n name: \"show\",\n summary: \"显示当前 profile 配置(敏感字段遮罩)\",\n options: [{ flags: \"--show-secrets\", summary: \"输出敏感字段明文(需 TTY)\" }],\n },\n { name: \"set <key> <value>\", summary: \"设置单个配置项(点号路径)\" },\n { name: \"unset <key>\", summary: \"删除单个配置项\" },\n ],\n },\n {\n name: \"profile\",\n summary: \"多 profile 管理 🟢\",\n subcommands: [\n { name: \"list\", summary: \"列出所有 profile,标注 active\" },\n { name: \"use <name>\", summary: \"切换 active profile\" },\n { name: \"create <name>\", summary: \"新建 profile(走 config init 向导)\" },\n {\n name: \"delete <name>\",\n summary: \"删除 profile(非 active,需 --yes)\",\n options: [{ flags: \"--yes\", summary: \"跳过确认\" }],\n },\n ],\n },\n {\n name: \"auth\",\n summary: \"凭据与鉴权 🟢/🟡\",\n subcommands: [\n {\n name: \"set-api-key <key>\",\n summary: \"写入 account 级 api-key 到共享凭据文件(- 从 stdin 读)🟢\",\n options: [{ flags: \"--keychain\", summary: \"写入 OS keychain 而非文件\" }],\n },\n {\n name: \"token-rotate\",\n summary: \"生成新 gateway token 并热重载 🟡\",\n options: [{ flags: \"--length <n>\", summary: \"token 字节长度\", default: \"32\" }],\n },\n { name: \"status\", summary: \"显示鉴权状态(本地检查,不调 daemon)🟢\" },\n { name: \"check\", summary: \"端到端鉴权体检(调 daemon /daemon/status)🟡\" },\n ],\n },\n {\n name: \"daemon\",\n summary: \"守护进程管理 🔵\",\n subcommands: [\n {\n name: \"start\",\n summary: \"启动 daemon(默认后台 detach)\",\n options: [\n { flags: \"--bind <host>\", summary: \"监听地址(默认 config.daemon.bind)\" },\n { flags: \"--port <n>\", summary: \"监听端口(默认 config.daemon.port)\" },\n { flags: \"--no-detach\", summary: \"前台运行(systemd/launchd 用)\" },\n { flags: \"--log-level <level>\", summary: \"error|warn|info|debug|trace\" },\n ],\n },\n { name: \"stop\", summary: \"停止 daemon(SIGTERM → 10s → SIGKILL)\" },\n { name: \"restart\", summary: \"stop + start,保留原启动参数\" },\n { name: \"status\", summary: \"打印 daemon 状态(PID/端口/relay/规则数...)\" },\n {\n name: \"logs\",\n summary: \"跟踪 daemon 日志\",\n options: [\n { flags: \"-f, --follow\", summary: \"持续 tail\" },\n { flags: \"--lines <n>\", summary: \"初始展示行数\", default: \"100\" },\n { flags: \"--level <level>\", summary: \"过滤日志级别\" },\n ],\n },\n {\n name: \"run-foreground\",\n summary: \"(内部)前台运行 daemon 主循环,供 detach 子进程调用\",\n options: [\n { flags: \"--bind <host>\", summary: \"监听地址\" },\n { flags: \"--port <n>\", summary: \"监听端口\" },\n { flags: \"--log-level <level>\", summary: \"日志级别\" },\n ],\n },\n ],\n },\n {\n name: \"notification\",\n summary: \"通知查询 🟢\",\n subcommands: [\n { name: \"search\", summary: \"按筛选条件查询通知,时间倒序\", options: NOTIFICATION_QUERY_OPTIONS },\n {\n name: \"summary\",\n summary: \"聚合统计 + 样例摘要,供 Agent 总结\",\n options: [\n ...NOTIFICATION_QUERY_OPTIONS,\n { flags: \"--sample <n>\", summary: \"返回最近样例条数\", default: \"30\" },\n { flags: \"--top <n>\", summary: \"聚合榜单条数\", default: \"10\" },\n ],\n },\n {\n name: \"stats\",\n summary: \"按维度聚合统计\",\n options: [\n { flags: \"--from <date>\", summary: \"YYYY-MM-DD,默认 7 天前\" },\n { flags: \"--to <date>\", summary: \"YYYY-MM-DD,默认今天\" },\n { flags: \"--app <name>\", summary: \"仅统计指定应用\" },\n { flags: \"--dim <dim>\", summary: \"date|app|sender|hour|all\", default: \"all\" },\n ],\n },\n { name: \"storage-path\", summary: \"打印 notifications 目录绝对路径\" },\n ],\n shortcuts: [\n { name: \"+today\", summary: \"今日通知摘要\" },\n { name: \"+recent\", summary: \"最近 1 小时通知\" },\n { name: \"+unread\", summary: \"(预留)未读通知\" },\n ],\n },\n {\n name: \"sync\",\n summary: \"通知同步给记忆系统 🟢\",\n subcommands: [\n { name: \"scan\", summary: \"扫描未处理通知,返回各日期待同步摘要\" },\n {\n name: \"fetch\",\n summary: \"获取指定日期未处理通知详情\",\n options: [\n { flags: \"--date <YYYY-MM-DD>\", summary: \"目标日期(必填)\" },\n { flags: \"--max-end-index <index>\", summary: \"本次快照允许读取的最大 endIndex\" },\n ],\n },\n {\n name: \"commit\",\n summary: \"标记指定日期当前批次处理完成\",\n options: [\n { flags: \"--date <YYYY-MM-DD>\", summary: \"目标日期(必填)\" },\n { flags: \"--end-index <index>\", summary: \"本批次 fetch 返回的 endIndex\" },\n ],\n },\n ],\n },\n {\n name: \"recording\",\n summary: \"录音管理 🟢/🟡\",\n subcommands: [\n {\n name: \"list\",\n summary: \"列出所有录音 🟢\",\n options: [{ flags: \"--status <status>\", summary: \"按传输状态过滤\" }],\n },\n { name: \"status <id>\", summary: \"查看单条录音详情 🟢\" },\n { name: \"storage-path\", summary: \"打印录音存储目录绝对路径 🟢\" },\n {\n name: \"setup-asr\",\n summary: \"交互式配置 ASR 转写参数 🟢\",\n options: [\n { flags: \"--mode <mode>\", summary: \"api | local(默认 api)\" },\n { flags: \"--api-key <key>\", summary: \"api 模式:可选;留空则用 account ock- key\" },\n { flags: \"--endpoint <url>\", summary: \"api 模式:自定义 model-proxy 端点\" },\n { flags: \"--language <lang>\", summary: \"api 模式:语言提示,如 zh / en / auto\" },\n { flags: \"--model <name>\", summary: \"local 模式:Whisper 模型名\" },\n { flags: \"--non-interactive\", summary: \"跳过向导,从参数构造配置\" },\n ],\n },\n {\n name: \"events\",\n summary: \"查询录音状态事件流(JSONL) 🟢\",\n options: [\n { flags: \"--id <recordingId>\", summary: \"只看某条录音的事件\" },\n { flags: \"--since <duration>\", summary: \"回看时间窗,如 10m / 1h / 24h\" },\n { flags: \"--watch\", summary: \"持续跟随新事件(tail -f)\" },\n { flags: \"--limit <n>\", summary: \"返回条数上限\", default: \"200\" },\n ],\n },\n ],\n shortcuts: [{ name: \"+latest\", summary: \"展示最新一条录音详情\" }],\n },\n {\n name: \"image\",\n summary: \"图片管理 🟢\",\n subcommands: [\n {\n name: \"list\",\n summary: \"列出所有图片\",\n options: [\n { flags: \"--status <status>\", summary: \"syncing|synced|sync_failed\" },\n { flags: \"--app <name>\", summary: \"按来源应用过滤\" },\n { flags: \"--from <iso8601>\", summary: \"created_at 起\" },\n { flags: \"--to <iso8601>\", summary: \"created_at 止\" },\n { flags: \"--limit <n>\", summary: \"最大返回条数\", default: \"100\" },\n ],\n },\n { name: \"status <id>\", summary: \"查看单张图片详情\" },\n {\n name: \"path <id>\",\n summary: \"打印图片本地文件绝对路径\",\n options: [{ flags: \"--thumbnail\", summary: \"返回缩略图路径(若有)\" }],\n },\n { name: \"storage-path\", summary: \"打印图片存储目录绝对路径\" },\n ],\n shortcuts: [{ name: \"+latest\", summary: \"展示最新一张图片详情\" }],\n },\n {\n name: \"light\",\n summary: \"灯效硬件控制 🟡\",\n subcommands: [\n {\n name: \"send\",\n summary: \"发送灯效指令到硬件(--segments / --preset / --rule 三选一)\",\n options: [\n { flags: \"--segments <json>\", summary: \"灯效参数 JSON(原始段)\" },\n { flags: \"--preset <name>\", summary: \"内置预设 id(如 red-steady / red-strobe-3)\" },\n { flags: \"--rule <name>\", summary: \"已保存的 lightrule 名\" },\n { flags: \"--repeat\", summary: \"无限循环播放(覆盖来源默认值)\" },\n { flags: \"--repeat-times <n>\", summary: \"整条组合重复次数(0=无限,覆盖来源默认值)\" },\n ],\n },\n ],\n shortcuts: [{ name: \"+blink\", summary: \"灯效连通性测试(red-strobe-3)\" }],\n },\n {\n name: \"lightrule\",\n summary: \"灯效规则管理 🟡\",\n subcommands: [\n { name: \"list\", summary: \"列出所有规则及状态\" },\n { name: \"show <id>\", summary: \"查看单条规则详情\" },\n {\n name: \"create\",\n summary: \"创建规则(--from-file / --intent ...)\",\n options: [\n { flags: \"--from-file <path>\", summary: \"从 JSON/YAML 读规则(- 为 stdin)\" },\n { flags: \"--name <text>\", summary: \"规则名\" },\n { flags: \"--intent <text>\", summary: \"自然语言意图描述\" },\n { flags: \"--light-action <json>\", summary: \"命中后的 light 动作 JSON\" },\n { flags: \"--match-rules <json>\", summary: \"前置硬过滤规则 JSON\" },\n ],\n },\n {\n name: \"update <id>\",\n summary: \"更新现有规则\",\n options: [\n { flags: \"--from-file <path>\", summary: \"从 JSON/YAML 读规则(- 为 stdin)\" },\n { flags: \"--name <text>\", summary: \"规则名\" },\n { flags: \"--intent <text>\", summary: \"自然语言意图描述\" },\n { flags: \"--light-action <json>\", summary: \"命中后的 light 动作 JSON\" },\n { flags: \"--match-rules <json>\", summary: \"前置硬过滤规则 JSON\" },\n ],\n },\n {\n name: \"delete <id>\",\n summary: \"删除规则(--yes)\",\n options: [{ flags: \"--yes\", summary: \"跳过确认\" }],\n },\n { name: \"enable <id>\", summary: \"启用单条规则\" },\n { name: \"disable <id>\", summary: \"停用单条规则\" },\n ],\n shortcuts: [\n { name: \"+on\", summary: \"启用所有规则\" },\n { name: \"+off\", summary: \"停用所有规则(保留定义)\" },\n ],\n },\n {\n name: \"monitor\",\n summary: \"定时通知监控任务 🟡\",\n subcommands: [\n { name: \"list\", summary: \"列出所有监控任务\" },\n { name: \"show <name>\", summary: \"查看监控任务详情\" },\n {\n name: \"create <name>\",\n summary: \"创建监控任务(cron 驱动)\",\n options: [\n { flags: \"--description <text>\", summary: \"任务描述(必填)\" },\n { flags: \"--match-rules <json>\", summary: \"匹配规则 JSON(必填)\" },\n { flags: \"--schedule <cron>\", summary: \"cron 表达式(必填)\" },\n ],\n },\n {\n name: \"delete <name>\",\n summary: \"删除监控任务(--yes)\",\n options: [{ flags: \"--yes\", summary: \"跳过确认\" }],\n },\n { name: \"enable <name>\", summary: \"启用监控任务\" },\n { name: \"disable <name>\", summary: \"暂停监控任务\" },\n ],\n },\n {\n name: \"tunnel\",\n summary: \"Relay 隧道 🟡\",\n subcommands: [\n { name: \"status\", summary: \"查询 Relay 连接状态\" },\n { name: \"reconnect\", summary: \"强制重连\" },\n ],\n shortcuts: [{ name: \"+test\", summary: \"端到端联通性自检(echo 回环)\" }],\n },\n {\n name: \"log\",\n summary: \"日志检索 🟢\",\n args: \"[keyword]\",\n options: [\n { flags: \"--from <date>\", summary: \"YYYY-MM-DD,默认 7 天前\" },\n { flags: \"--to <date>\", summary: \"YYYY-MM-DD,默认今天\" },\n { flags: \"--limit <n>\", summary: \"最大返回条数\", default: \"50\" },\n { flags: \"--level <level>\", summary: \"过滤日志级别\" },\n ],\n shortcuts: [{ name: \"+errors\", summary: \"昨天起的 error 级日志\" }],\n },\n {\n name: \"gateway\",\n summary: \"协议自检 🟢/🟡\",\n subcommands: [\n {\n name: \"test\",\n summary: \"模拟手机端调 daemon /notifications,验证连通/鉴权/relay 🟡\",\n options: [\n { flags: \"--from-phone-ip <ip>\", summary: \"模拟来源 IP\" },\n { flags: \"--via-relay\", summary: \"强制走 Relay 隧道\" },\n ],\n },\n ],\n },\n {\n name: \"api\",\n summary: \"Raw HTTP escape hatch 🟡\",\n args: \"<method> <path>\",\n options: [\n { flags: \"--data <json>\", summary: \"请求体(@file 读文件、- 读 stdin)\" },\n { flags: \"--header <key:value>\", summary: \"追加 header(可重复)\" },\n ],\n },\n {\n name: \"migrate\",\n summary: \"从 openclaw 插件迁移数据 🟢\",\n subcommands: [\n {\n name: \"from-openclaw\",\n summary: \"迁移 notifications/recordings/规则/api-key 到 ~/.yoooclaw\",\n options: [\n { flags: \"--dry-run\", summary: \"只打印迁移计划,不写入\" },\n { flags: \"--source <path>\", summary: \"自定义源目录,默认 ~/.openclaw\" },\n ],\n },\n ],\n },\n {\n name: \"update\",\n summary: \"版本检查 🟢\",\n subcommands: [\n {\n name: \"self\",\n summary: \"检查 npm 最新版本并提示(不自动更新)\",\n options: [\n { flags: \"--beta\", summary: \"检查 beta channel\" },\n { flags: \"--json\", summary: \"只输出版本信息 JSON\" },\n ],\n },\n ],\n },\n {\n name: \"skills\",\n summary: \"Agent 技能管理:把随包发布的 SKILL.md 装到 agent 可发现目录 🟢\",\n subcommands: [\n { name: \"list\", summary: \"列出随 CLI 发布的内置 Skill 及其触发说明\" },\n { name: \"targets\", summary: \"列出支持的 Agent skills 目录与自动探测结果\" },\n {\n name: \"install\",\n summary: \"把内置 Skill 安装到 agent skills 目录(默认自动探测,软链)\",\n options: [\n { flags: \"--agent <agent>\", summary: \"安装目标 agent:auto|claude|codex|custom\", default: \"auto\" },\n { flags: \"--target <dir>\", summary: \"安装目标目录;传入后优先于自动探测\" },\n { flags: \"--copy\", summary: \"复制而非软链(升级后不随包自动更新)\" },\n { flags: \"--force\", summary: \"目标已存在同名 Skill 时覆盖\" },\n ],\n },\n ],\n },\n {\n name: \"doctor\",\n summary: \"环境自检:Node/目录/keychain/daemon/relay 🟢/🟡\",\n options: [\n { flags: \"--json\", summary: \"JSON 输出(给脚本用)\" },\n { flags: \"--fix\", summary: \"自动修复可修复的问题\" },\n ],\n },\n];\n",
|
|
28
|
+
"/**\n * 命令树声明 —— Service-oriented,对齐 lark-cli 形态与本仓 PRD「命令树总览」。\n *\n * 这是命令树的**单一事实来源**:program.ts 据此构建 commander 程序(结构 + options),\n * 实现体由 commands/registry.ts 按 path 提供;未注册的 path 回落 notImplemented 占位。\n *\n * daemon 依赖标记(仅文档用途,体现在 summary 里):\n * 🟢 不需要 daemon 🟡 需要 daemon 在跑 🔵 进程类(管理 daemon 自身)\n */\n\nexport interface OptionSpec {\n /** commander flags,如 `--from <iso8601>`、`--follow` */\n flags: string;\n summary: string;\n /** 默认值(仅对带值的 option 有意义) */\n default?: string;\n}\n\nexport interface SubcommandSpec {\n /** 子命令名 + 位置参数,如 `show <id>`、`api <method> <path>` */\n name: string;\n summary: string;\n options?: OptionSpec[];\n}\n\nexport interface ShortcutSpec {\n /** 含 `+` 前缀的快捷命令名,如 `+today` */\n name: string;\n summary: string;\n options?: OptionSpec[];\n}\n\nexport interface ServiceSpec {\n name: string;\n summary: string;\n /** 子命令列表。leaf 命令(直接执行,无子命令)省略此项并提供 `args`。 */\n subcommands?: SubcommandSpec[];\n /** leaf 命令的位置参数,如 `[keyword]`、`<method> <path>`。 */\n args?: string;\n /** leaf 命令的 options。 */\n options?: OptionSpec[];\n shortcuts?: ShortcutSpec[];\n}\n\nconst NOTIFICATION_QUERY_OPTIONS: OptionSpec[] = [\n { flags: \"--from <iso8601>\", summary: \"开始时间,如 2026-03-01T09:00:00+08:00\" },\n { flags: \"--to <iso8601>\", summary: \"结束时间\" },\n { flags: \"--app <name>\", summary: \"按应用过滤(支持中英文别名)\" },\n { flags: \"--sender <name>\", summary: \"按发送人/标题过滤\" },\n { flags: \"--conversation-type <type>\", summary: \"会话类型 group|private\" },\n { flags: \"--keyword <text>\", summary: \"在标题/内容/发送人/会话名中搜索\" },\n { flags: \"--client <label>\", summary: \"按 clientLabel 过滤;all 为全部\" },\n { flags: \"--limit <n>\", summary: \"最大返回条数\", default: \"100\" },\n];\n\nexport const COMMAND_TREE: ServiceSpec[] = [\n {\n name: \"config\",\n summary: \"配置管理 🟢\",\n subcommands: [\n {\n name: \"init\",\n summary: \"交互式首次向导,生成 config + gateway token\",\n options: [\n { flags: \"--non-interactive\", summary: \"跳过向导(配合 --from-file)\" },\n { flags: \"--from-file <path>\", summary: \"从 JSON 文件导入配置(- 为 stdin)\" },\n { flags: \"--force\", summary: \"已存在 config 时覆盖\" },\n ],\n },\n {\n name: \"show\",\n summary: \"显示当前 profile 配置(敏感字段遮罩)\",\n options: [{ flags: \"--show-secrets\", summary: \"输出敏感字段明文(需 TTY)\" }],\n },\n { name: \"set <key> <value>\", summary: \"设置单个配置项(点号路径)\" },\n { name: \"unset <key>\", summary: \"删除单个配置项\" },\n ],\n },\n {\n name: \"profile\",\n summary: \"多 profile 管理 🟢\",\n subcommands: [\n { name: \"list\", summary: \"列出所有 profile,标注 active\" },\n { name: \"use <name>\", summary: \"切换 active profile\" },\n { name: \"create <name>\", summary: \"新建 profile(走 config init 向导)\" },\n {\n name: \"delete <name>\",\n summary: \"删除 profile(非 active,需 --yes)\",\n options: [{ flags: \"--yes\", summary: \"跳过确认\" }],\n },\n ],\n },\n {\n name: \"auth\",\n summary: \"凭据与鉴权 🟢/🟡\",\n subcommands: [\n {\n name: \"set-api-key <key>\",\n summary: \"设置/轮换 account 级 default api-key(- 从 stdin 读)🟢\",\n options: [{ flags: \"--keychain\", summary: \"写入 OS keychain 而非文件\" }],\n },\n {\n name: \"add-api-key <key>\",\n summary: \"新增一条 multi-key api-key(- 从 stdin 读)🟢\",\n options: [\n { flags: \"--label <label>\", summary: \"api-key label([a-z0-9-]{1,32})\" },\n { flags: \"--default\", summary: \"设为 default key\" },\n { flags: \"--force\", summary: \"label 已存在时覆盖\" },\n ],\n },\n { name: \"list-api-keys\", summary: \"列出 api-key 条目(key 自动遮罩)🟢\" },\n { name: \"remove-api-key <label>\", summary: \"删除指定 label 的 api-key 🟢\" },\n { name: \"set-default-api-key <label>\", summary: \"切换 default api-key 🟢\" },\n {\n name: \"token-rotate\",\n summary: \"生成新 gateway token 并热重载 🟡\",\n options: [{ flags: \"--length <n>\", summary: \"token 字节长度\", default: \"32\" }],\n },\n { name: \"status\", summary: \"显示鉴权状态(本地检查,不调 daemon)🟢\" },\n { name: \"check\", summary: \"端到端鉴权体检(调 daemon /daemon/status)🟡\" },\n ],\n },\n {\n name: \"daemon\",\n summary: \"守护进程管理 🔵\",\n subcommands: [\n {\n name: \"start\",\n summary: \"启动 daemon(默认后台 detach)\",\n options: [\n { flags: \"--bind <host>\", summary: \"监听地址(默认 config.daemon.bind)\" },\n { flags: \"--port <n>\", summary: \"监听端口(默认 config.daemon.port)\" },\n { flags: \"--no-detach\", summary: \"前台运行(systemd/launchd 用)\" },\n { flags: \"--log-level <level>\", summary: \"error|warn|info|debug|trace\" },\n ],\n },\n { name: \"stop\", summary: \"停止 daemon(SIGTERM → 10s → SIGKILL)\" },\n { name: \"restart\", summary: \"stop + start,保留原启动参数\" },\n { name: \"reload\", summary: \"重读凭据并增量刷新 Relay 隧道\" },\n { name: \"status\", summary: \"打印 daemon 状态(PID/端口/relay/规则数...)\" },\n {\n name: \"logs\",\n summary: \"跟踪 daemon 日志\",\n options: [\n { flags: \"-f, --follow\", summary: \"持续 tail\" },\n { flags: \"--lines <n>\", summary: \"初始展示行数\", default: \"100\" },\n { flags: \"--level <level>\", summary: \"过滤日志级别\" },\n ],\n },\n {\n name: \"run-foreground\",\n summary: \"(内部)前台运行 daemon 主循环,供 detach 子进程调用\",\n options: [\n { flags: \"--bind <host>\", summary: \"监听地址\" },\n { flags: \"--port <n>\", summary: \"监听端口\" },\n { flags: \"--log-level <level>\", summary: \"日志级别\" },\n ],\n },\n ],\n },\n {\n name: \"notification\",\n summary: \"通知查询 🟢\",\n subcommands: [\n { name: \"search\", summary: \"按筛选条件查询通知,时间倒序\", options: NOTIFICATION_QUERY_OPTIONS },\n {\n name: \"summary\",\n summary: \"聚合统计 + 样例摘要,供 Agent 总结\",\n options: [\n ...NOTIFICATION_QUERY_OPTIONS,\n { flags: \"--sample <n>\", summary: \"返回最近样例条数\", default: \"30\" },\n { flags: \"--top <n>\", summary: \"聚合榜单条数\", default: \"10\" },\n ],\n },\n {\n name: \"stats\",\n summary: \"按维度聚合统计\",\n options: [\n { flags: \"--from <date>\", summary: \"YYYY-MM-DD,默认 7 天前\" },\n { flags: \"--to <date>\", summary: \"YYYY-MM-DD,默认今天\" },\n { flags: \"--app <name>\", summary: \"仅统计指定应用\" },\n { flags: \"--client <label>\", summary: \"按 clientLabel 过滤;all 为全部\" },\n { flags: \"--dim <dim>\", summary: \"date|app|sender|hour|client|all\", default: \"all\" },\n ],\n },\n { name: \"storage-path\", summary: \"打印 notifications 目录绝对路径\" },\n ],\n shortcuts: [\n { name: \"+today\", summary: \"今日通知摘要\", options: [{ flags: \"--client <label>\", summary: \"按 clientLabel 过滤;all 为全部\" }] },\n { name: \"+recent\", summary: \"最近 1 小时通知\", options: [{ flags: \"--client <label>\", summary: \"按 clientLabel 过滤;all 为全部\" }] },\n { name: \"+unread\", summary: \"(预留)未读通知\" },\n ],\n },\n {\n name: \"sync\",\n summary: \"通知同步给记忆系统 🟢\",\n subcommands: [\n { name: \"scan\", summary: \"扫描未处理通知,返回各日期待同步摘要\" },\n {\n name: \"fetch\",\n summary: \"获取指定日期未处理通知详情\",\n options: [\n { flags: \"--date <YYYY-MM-DD>\", summary: \"目标日期(必填)\" },\n { flags: \"--max-end-index <index>\", summary: \"本次快照允许读取的最大 endIndex\" },\n ],\n },\n {\n name: \"commit\",\n summary: \"标记指定日期当前批次处理完成\",\n options: [\n { flags: \"--date <YYYY-MM-DD>\", summary: \"目标日期(必填)\" },\n { flags: \"--end-index <index>\", summary: \"本批次 fetch 返回的 endIndex\" },\n ],\n },\n ],\n },\n {\n name: \"recording\",\n summary: \"录音管理 🟢/🟡\",\n subcommands: [\n {\n name: \"list\",\n summary: \"列出所有录音 🟢\",\n options: [\n { flags: \"--status <status>\", summary: \"按传输状态过滤\" },\n { flags: \"--client <label>\", summary: \"按 clientLabel 过滤;all 为全部\" },\n ],\n },\n { name: \"status <id>\", summary: \"查看单条录音详情 🟢\" },\n { name: \"storage-path\", summary: \"打印录音存储目录绝对路径 🟢\" },\n {\n name: \"setup-asr\",\n summary: \"交互式配置 ASR 转写参数 🟢\",\n options: [\n { flags: \"--mode <mode>\", summary: \"api | local(默认 api)\" },\n { flags: \"--api-key <key>\", summary: \"api 模式:可选;留空则用 account ock- key\" },\n { flags: \"--endpoint <url>\", summary: \"api 模式:自定义 model-proxy 端点\" },\n { flags: \"--language <lang>\", summary: \"api 模式:语言提示,如 zh / en / auto\" },\n { flags: \"--model <name>\", summary: \"local 模式:Whisper 模型名\" },\n { flags: \"--non-interactive\", summary: \"跳过向导,从参数构造配置\" },\n ],\n },\n {\n name: \"events\",\n summary: \"查询录音状态事件流(JSONL) 🟢\",\n options: [\n { flags: \"--id <recordingId>\", summary: \"只看某条录音的事件\" },\n { flags: \"--since <duration>\", summary: \"回看时间窗,如 10m / 1h / 24h\" },\n { flags: \"--watch\", summary: \"持续跟随新事件(tail -f)\" },\n { flags: \"--limit <n>\", summary: \"返回条数上限\", default: \"200\" },\n ],\n },\n ],\n shortcuts: [{ name: \"+latest\", summary: \"展示最新一条录音详情\" }],\n },\n {\n name: \"image\",\n summary: \"图片管理 🟢\",\n subcommands: [\n {\n name: \"list\",\n summary: \"列出所有图片\",\n options: [\n { flags: \"--status <status>\", summary: \"syncing|synced|sync_failed\" },\n { flags: \"--app <name>\", summary: \"按来源应用过滤\" },\n { flags: \"--client <label>\", summary: \"按 clientLabel 过滤;all 为全部\" },\n { flags: \"--from <iso8601>\", summary: \"created_at 起\" },\n { flags: \"--to <iso8601>\", summary: \"created_at 止\" },\n { flags: \"--limit <n>\", summary: \"最大返回条数\", default: \"100\" },\n ],\n },\n { name: \"status <id>\", summary: \"查看单张图片详情\" },\n {\n name: \"path <id>\",\n summary: \"打印图片本地文件绝对路径\",\n options: [{ flags: \"--thumbnail\", summary: \"返回缩略图路径(若有)\" }],\n },\n { name: \"storage-path\", summary: \"打印图片存储目录绝对路径\" },\n ],\n shortcuts: [{ name: \"+latest\", summary: \"展示最新一张图片详情\" }],\n },\n {\n name: \"light\",\n summary: \"灯效硬件控制 🟡\",\n subcommands: [\n {\n name: \"send\",\n summary: \"发送灯效指令到硬件(--segments / --preset / --rule 三选一)\",\n options: [\n { flags: \"--segments <json>\", summary: \"灯效参数 JSON(原始段)\" },\n { flags: \"--preset <name>\", summary: \"内置预设 id(如 red-steady / red-strobe-3)\" },\n { flags: \"--rule <name>\", summary: \"已保存的 lightrule 名\" },\n { flags: \"--repeat\", summary: \"无限循环播放(覆盖来源默认值)\" },\n { flags: \"--repeat-times <n>\", summary: \"整条组合重复次数(0=无限,覆盖来源默认值)\" },\n ],\n },\n ],\n shortcuts: [{ name: \"+blink\", summary: \"灯效连通性测试(red-strobe-3)\" }],\n },\n {\n name: \"lightrule\",\n summary: \"灯效规则管理 🟡\",\n subcommands: [\n { name: \"list\", summary: \"列出所有规则及状态\" },\n { name: \"show <id>\", summary: \"查看单条规则详情\" },\n {\n name: \"create\",\n summary: \"创建规则(--from-file / --intent ...)\",\n options: [\n { flags: \"--from-file <path>\", summary: \"从 JSON/YAML 读规则(- 为 stdin)\" },\n { flags: \"--name <text>\", summary: \"规则名\" },\n { flags: \"--intent <text>\", summary: \"自然语言意图描述\" },\n { flags: \"--light-action <json>\", summary: \"命中后的 light 动作 JSON\" },\n { flags: \"--match-rules <json>\", summary: \"前置硬过滤规则 JSON\" },\n ],\n },\n {\n name: \"update <id>\",\n summary: \"更新现有规则\",\n options: [\n { flags: \"--from-file <path>\", summary: \"从 JSON/YAML 读规则(- 为 stdin)\" },\n { flags: \"--name <text>\", summary: \"规则名\" },\n { flags: \"--intent <text>\", summary: \"自然语言意图描述\" },\n { flags: \"--light-action <json>\", summary: \"命中后的 light 动作 JSON\" },\n { flags: \"--match-rules <json>\", summary: \"前置硬过滤规则 JSON\" },\n ],\n },\n {\n name: \"delete <id>\",\n summary: \"删除规则(--yes)\",\n options: [{ flags: \"--yes\", summary: \"跳过确认\" }],\n },\n { name: \"enable <id>\", summary: \"启用单条规则\" },\n { name: \"disable <id>\", summary: \"停用单条规则\" },\n ],\n shortcuts: [\n { name: \"+on\", summary: \"启用所有规则\" },\n { name: \"+off\", summary: \"停用所有规则(保留定义)\" },\n ],\n },\n {\n name: \"monitor\",\n summary: \"定时通知监控任务 🟡\",\n subcommands: [\n { name: \"list\", summary: \"列出所有监控任务\" },\n { name: \"show <name>\", summary: \"查看监控任务详情\" },\n {\n name: \"create <name>\",\n summary: \"创建监控任务(cron 驱动)\",\n options: [\n { flags: \"--description <text>\", summary: \"任务描述(必填)\" },\n { flags: \"--match-rules <json>\", summary: \"匹配规则 JSON(必填)\" },\n { flags: \"--schedule <cron>\", summary: \"cron 表达式(必填)\" },\n ],\n },\n {\n name: \"delete <name>\",\n summary: \"删除监控任务(--yes)\",\n options: [{ flags: \"--yes\", summary: \"跳过确认\" }],\n },\n { name: \"enable <name>\", summary: \"启用监控任务\" },\n { name: \"disable <name>\", summary: \"暂停监控任务\" },\n ],\n },\n {\n name: \"tunnel\",\n summary: \"Relay 隧道 🟡\",\n subcommands: [\n {\n name: \"status\",\n summary: \"查询 Relay 连接状态\",\n options: [{ flags: \"--client <label>\", summary: \"只看指定 clientLabel;all 为全部\" }],\n },\n {\n name: \"reconnect\",\n summary: \"强制重连\",\n options: [{ flags: \"--client <label>\", summary: \"只重连指定 clientLabel\" }],\n },\n ],\n shortcuts: [\n {\n name: \"+test\",\n summary: \"端到端联通性自检(echo 回环)\",\n options: [{ flags: \"--client <label>\", summary: \"用指定 clientLabel 的 api-key 做回环写入\" }],\n },\n ],\n },\n {\n name: \"log\",\n summary: \"日志检索 🟢\",\n args: \"[keyword]\",\n options: [\n { flags: \"--from <date>\", summary: \"YYYY-MM-DD,默认 7 天前\" },\n { flags: \"--to <date>\", summary: \"YYYY-MM-DD,默认今天\" },\n { flags: \"--limit <n>\", summary: \"最大返回条数\", default: \"50\" },\n { flags: \"--level <level>\", summary: \"过滤日志级别\" },\n ],\n shortcuts: [{ name: \"+errors\", summary: \"昨天起的 error 级日志\" }],\n },\n {\n name: \"gateway\",\n summary: \"协议自检 🟢/🟡\",\n subcommands: [\n {\n name: \"test\",\n summary: \"模拟手机端调 daemon /notifications,验证连通/鉴权/relay 🟡\",\n options: [\n { flags: \"--from-phone-ip <ip>\", summary: \"模拟来源 IP\" },\n { flags: \"--via-relay\", summary: \"强制走 Relay 隧道\" },\n ],\n },\n ],\n },\n {\n name: \"api\",\n summary: \"Raw HTTP escape hatch 🟡\",\n args: \"<method> <path>\",\n options: [\n { flags: \"--data <json>\", summary: \"请求体(@file 读文件、- 读 stdin)\" },\n { flags: \"--header <key:value>\", summary: \"追加 header(可重复)\" },\n ],\n },\n {\n name: \"migrate\",\n summary: \"从 openclaw 插件迁移数据 🟢\",\n subcommands: [\n {\n name: \"from-openclaw\",\n summary: \"迁移 notifications/recordings/规则/api-key 到 ~/.yoooclaw\",\n options: [\n { flags: \"--dry-run\", summary: \"只打印迁移计划,不写入\" },\n { flags: \"--source <path>\", summary: \"自定义源目录,默认 ~/.openclaw\" },\n ],\n },\n ],\n },\n {\n name: \"update\",\n summary: \"版本检查 🟢\",\n subcommands: [\n {\n name: \"self\",\n summary: \"检查 npm 最新版本并提示(不自动更新)\",\n options: [\n { flags: \"--beta\", summary: \"检查 beta channel\" },\n { flags: \"--json\", summary: \"只输出版本信息 JSON\" },\n ],\n },\n ],\n },\n {\n name: \"skills\",\n summary: \"Agent 技能管理:把随包发布的 SKILL.md 装到 agent 可发现目录 🟢\",\n subcommands: [\n { name: \"list\", summary: \"列出随 CLI 发布的内置 Skill 及其触发说明\" },\n { name: \"targets\", summary: \"列出支持的 Agent skills 目录与自动探测结果\" },\n {\n name: \"install\",\n summary: \"把内置 Skill 安装到 agent skills 目录(默认自动探测,软链)\",\n options: [\n { flags: \"--agent <agent>\", summary: \"安装目标 agent:auto|claude|codex|custom\", default: \"auto\" },\n { flags: \"--target <dir>\", summary: \"安装目标目录;传入后优先于自动探测\" },\n { flags: \"--copy\", summary: \"复制而非软链(升级后不随包自动更新)\" },\n { flags: \"--force\", summary: \"目标已存在同名 Skill 时覆盖\" },\n ],\n },\n ],\n },\n {\n name: \"doctor\",\n summary: \"环境自检:Node/目录/keychain/daemon/relay 🟢/🟡\",\n options: [\n { flags: \"--json\", summary: \"JSON 输出(给脚本用)\" },\n { flags: \"--fix\", summary: \"自动修复可修复的问题\" },\n ],\n },\n];\n",
|
|
37
29
|
"/**\n * 全局执行上下文 —— 由全局 flags 解析得到,贯穿所有命令。\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport {\n DEFAULT_PROFILE,\n activeProfilePath,\n profilePaths,\n type ProfilePaths,\n} from \"./paths.js\";\nimport { resolveFormat, type OutputFormat } from \"./output/format.js\";\n\nexport interface GlobalFlags {\n profile?: string;\n format?: string;\n quiet?: boolean;\n color?: boolean;\n}\n\nexport interface CliContext {\n profile: string;\n paths: ProfilePaths;\n format: OutputFormat;\n quiet: boolean;\n color: boolean;\n}\n\n/** 解析当前 active profile:--profile > $YOOOCLAW_PROFILE > active-profile 文件 > default。 */\nexport function resolveActiveProfile(flagProfile?: string): string {\n if (flagProfile?.trim()) return flagProfile.trim();\n const envProfile = process.env.YOOOCLAW_PROFILE?.trim();\n if (envProfile) return envProfile;\n const file = activeProfilePath();\n if (existsSync(file)) {\n const name = readFileSync(file, \"utf-8\").trim();\n if (name) return name;\n }\n return DEFAULT_PROFILE;\n}\n\n/** 把全局 flags 物化成贯穿命令的 CliContext。 */\nexport function buildContext(flags: GlobalFlags): CliContext {\n const profile = resolveActiveProfile(flags.profile);\n return {\n profile,\n paths: profilePaths(profile),\n format: resolveFormat(flags.format),\n quiet: flags.quiet ?? false,\n // commander 对 --no-color 解析为 color:false;缺省 true\n color: flags.color ?? true,\n };\n}\n",
|
|
38
30
|
"/**\n * `~/.yoooclaw/` 目录布局解析(对齐 PRD「数据模型 / 目录布局」)。\n *\n * ~/.yoooclaw/\n * credentials.json account 级共享凭据(api-key),跨 profile 且与插件共享\n * active-profile 当前 active profile 名(文本)\n * profiles/<profile>/\n * config.json\n * credentials.json instance 级密文(gateway token / webhook secret)\n * daemon.lock / daemon.log\n * notifications/ recordings/ images/ light-rules/ state/\n */\nimport { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const DEFAULT_PROFILE = \"default\";\n\n/** CLI 根数据目录。可用 `YOOOCLAW_HOME` 覆盖(测试 / 多实例隔离)。 */\nexport function rootDir(): string {\n return process.env.YOOOCLAW_HOME?.trim() || join(homedir(), \".yoooclaw\");\n}\n\n/** account 级共享凭据文件(顶层,跨 profile + 插件共享)。 */\nexport function sharedCredentialsPath(): string {\n return join(rootDir(), \"credentials.json\");\n}\n\n/** 记录当前 active profile 的文本文件。 */\nexport function activeProfilePath(): string {\n return join(rootDir(), \"active-profile\");\n}\n\n/** 某个 profile 的目录。 */\nexport function profileDir(profile: string): string {\n return join(rootDir(), \"profiles\", profile);\n}\n\nexport interface ProfilePaths {\n profile: string;\n dir: string;\n config: string;\n credentials: string;\n daemonLock: string;\n daemonLog: string;\n notifications: string;\n recordings: string;\n images: string;\n lightRules: string;\n state: string;\n}\n\n/** profiles/ 根目录。 */\nexport function profilesRoot(): string {\n return join(rootDir(), \"profiles\");\n}\n\n/** 列出已存在的 profile 名(profiles/ 下的目录)。 */\nexport function listProfileNames(): string[] {\n const root = profilesRoot();\n if (!existsSync(root)) return [];\n return readdirSync(root, { withFileTypes: true })\n .filter((e) => e.isDirectory())\n .map((e) => e.name)\n .sort((a, b) => a.localeCompare(b));\n}\n\n/** 读取 active-profile 文件内容(不存在返回 undefined)。 */\nexport function readActiveProfile(): string | undefined {\n const file = activeProfilePath();\n if (!existsSync(file)) return undefined;\n const name = readFileSync(file, \"utf-8\").trim();\n return name || undefined;\n}\n\n/** 解析某个 profile 下的全部关键路径。 */\nexport function profilePaths(profile: string): ProfilePaths {\n const dir = profileDir(profile);\n return {\n profile,\n dir,\n config: join(dir, \"config.json\"),\n credentials: join(dir, \"credentials.json\"),\n daemonLock: join(dir, \"daemon.lock\"),\n daemonLog: join(dir, \"daemon.log\"),\n notifications: join(dir, \"notifications\"),\n recordings: join(dir, \"recordings\"),\n images: join(dir, \"images\"),\n lightRules: join(dir, \"light-rules\"),\n state: join(dir, \"state\"),\n };\n}\n",
|
|
39
|
-
"/**\n * 结构化错误码 —— 进入半正式契约,命名前缀统一 `YOOOCLAW_*`。\n * 命令失败时统一以 `{ ok: false, error: { code, message, ... } }` 输出(见 output/format.ts)。\n */\nexport const ErrorCode = {\n /** 通用 / 未归类错误 */\n UNKNOWN: \"YOOOCLAW_UNKNOWN\",\n /** 参数校验失败 */\n INVALID_ARGUMENT: \"YOOOCLAW_INVALID_ARGUMENT\",\n /** 该命令尚未实现(脚手架阶段占位) */\n NOT_IMPLEMENTED: \"YOOOCLAW_NOT_IMPLEMENTED\",\n /** daemon 未运行 */\n DAEMON_NOT_RUNNING: \"YOOOCLAW_DAEMON_NOT_RUNNING\",\n /** daemon 已在运行(单例保护) */\n DAEMON_ALREADY_RUNNING: \"YOOOCLAW_DAEMON_ALREADY_RUNNING\",\n /** 鉴权失败 / token 不一致 */\n UNAUTHORIZED: \"YOOOCLAW_UNAUTHORIZED\",\n /** 配置缺失或非法 */\n CONFIG_INVALID: \"YOOOCLAW_CONFIG_INVALID\",\n /** profile 不存在 */\n PROFILE_NOT_FOUND: \"YOOOCLAW_PROFILE_NOT_FOUND\",\n /** 图片尚未下载完成 */\n IMAGE_NOT_READY: \"YOOOCLAW_IMAGE_NOT_READY\",\n /** 资源未找到 */\n NOT_FOUND: \"YOOOCLAW_NOT_FOUND\",\n /** 资源已存在(如 profile 重名) */\n ALREADY_EXISTS: \"YOOOCLAW_ALREADY_EXISTS\",\n /** 存储目录不可用 */\n STORAGE_UNAVAILABLE: \"YOOOCLAW_STORAGE_UNAVAILABLE\",\n /** 凭据缺失 */\n CREDENTIAL_MISSING: \"YOOOCLAW_CREDENTIAL_MISSING\",\n /** OS keychain 不可用 */\n KEYCHAIN_UNAVAILABLE: \"YOOOCLAW_KEYCHAIN_UNAVAILABLE\",\n /** 网络 / 出站调用失败 */\n NETWORK_ERROR: \"YOOOCLAW_NETWORK_ERROR\",\n /** 操作被用户取消或需要确认 */\n CONFIRMATION_REQUIRED: \"YOOOCLAW_CONFIRMATION_REQUIRED\",\n /** 需要 TTY 交互但当前非交互环境 */\n NOT_INTERACTIVE: \"YOOOCLAW_NOT_INTERACTIVE\",\n} as const;\n\nexport type ErrorCodeValue = (typeof ErrorCode)[keyof typeof ErrorCode];\n\nexport interface YoooclawErrorDetails {\n hint?: string;\n checkedPaths?: string[];\n [key: string]: unknown;\n}\n\n/**\n * 携带结构化错误码的错误。CLI 顶层捕获后按 `--format` 序列化为统一错误 schema。\n */\nexport class YoooclawError extends Error {\n readonly code: ErrorCodeValue;\n readonly details: YoooclawErrorDetails;\n /** 进程退出码,默认 1 */\n readonly exitCode: number;\n\n constructor(\n code: ErrorCodeValue,\n message: string,\n details: YoooclawErrorDetails = {},\n exitCode = 1,\n ) {\n super(message);\n this.name = \"YoooclawError\";\n this.code = code;\n this.details = details;\n this.exitCode = exitCode;\n }\n\n toErrorPayload(): {\n code: ErrorCodeValue;\n message: string;\n } & YoooclawErrorDetails {\n return { code: this.code, message: this.message, ...this.details };\n }\n}\n\nexport function notImplemented(command: string): YoooclawError {\n return new YoooclawError(\n ErrorCode.NOT_IMPLEMENTED,\n `命令 \\`${command}\\` 尚未实现`,\n { hint: \"该命令处于脚手架阶段,后续按 imp 文档逐步落地\" },\n );\n}\n",
|
|
31
|
+
"/**\n * 结构化错误码 —— 进入半正式契约,命名前缀统一 `YOOOCLAW_*`。\n * 命令失败时统一以 `{ ok: false, error: { code, message, ... } }` 输出(见 output/format.ts)。\n */\nexport const ErrorCode = {\n /** 通用 / 未归类错误 */\n UNKNOWN: \"YOOOCLAW_UNKNOWN\",\n /** 参数校验失败 */\n INVALID_ARGUMENT: \"YOOOCLAW_INVALID_ARGUMENT\",\n /** 该命令尚未实现(脚手架阶段占位) */\n NOT_IMPLEMENTED: \"YOOOCLAW_NOT_IMPLEMENTED\",\n /** daemon 未运行 */\n DAEMON_NOT_RUNNING: \"YOOOCLAW_DAEMON_NOT_RUNNING\",\n /** daemon 已在运行(单例保护) */\n DAEMON_ALREADY_RUNNING: \"YOOOCLAW_DAEMON_ALREADY_RUNNING\",\n /** 鉴权失败 / token 不一致 */\n UNAUTHORIZED: \"YOOOCLAW_UNAUTHORIZED\",\n /** 配置缺失或非法 */\n CONFIG_INVALID: \"YOOOCLAW_CONFIG_INVALID\",\n /** profile 不存在 */\n PROFILE_NOT_FOUND: \"YOOOCLAW_PROFILE_NOT_FOUND\",\n /** 图片尚未下载完成 */\n IMAGE_NOT_READY: \"YOOOCLAW_IMAGE_NOT_READY\",\n /** 资源未找到 */\n NOT_FOUND: \"YOOOCLAW_NOT_FOUND\",\n /** 资源已存在(如 profile 重名) */\n ALREADY_EXISTS: \"YOOOCLAW_ALREADY_EXISTS\",\n /** 存储目录不可用 */\n STORAGE_UNAVAILABLE: \"YOOOCLAW_STORAGE_UNAVAILABLE\",\n /** 凭据缺失 */\n CREDENTIAL_MISSING: \"YOOOCLAW_CREDENTIAL_MISSING\",\n /** OS keychain 不可用 */\n KEYCHAIN_UNAVAILABLE: \"YOOOCLAW_KEYCHAIN_UNAVAILABLE\",\n /** api-key label 不合法 */\n APIKEY_LABEL_INVALID: \"YOOOCLAW_APIKEY_LABEL_INVALID\",\n /** api-key label 已存在 */\n APIKEY_LABEL_DUPLICATE: \"YOOOCLAW_APIKEY_LABEL_DUPLICATE\",\n /** api-key label 不存在 */\n APIKEY_LABEL_NOT_FOUND: \"YOOOCLAW_APIKEY_LABEL_NOT_FOUND\",\n /** multi-key 模式不支持 keychain 写入 */\n KEYCHAIN_MULTI_UNSUPPORTED: \"YOOOCLAW_KEYCHAIN_MULTI_UNSUPPORTED\",\n /** tunnel label 不存在 */\n TUNNEL_LABEL_NOT_FOUND: \"YOOOCLAW_TUNNEL_LABEL_NOT_FOUND\",\n /** 网络 / 出站调用失败 */\n NETWORK_ERROR: \"YOOOCLAW_NETWORK_ERROR\",\n /** 操作被用户取消或需要确认 */\n CONFIRMATION_REQUIRED: \"YOOOCLAW_CONFIRMATION_REQUIRED\",\n /** 需要 TTY 交互但当前非交互环境 */\n NOT_INTERACTIVE: \"YOOOCLAW_NOT_INTERACTIVE\",\n} as const;\n\nexport type ErrorCodeValue = (typeof ErrorCode)[keyof typeof ErrorCode];\n\nexport interface YoooclawErrorDetails {\n hint?: string;\n checkedPaths?: string[];\n [key: string]: unknown;\n}\n\n/**\n * 携带结构化错误码的错误。CLI 顶层捕获后按 `--format` 序列化为统一错误 schema。\n */\nexport class YoooclawError extends Error {\n readonly code: ErrorCodeValue;\n readonly details: YoooclawErrorDetails;\n /** 进程退出码,默认 1 */\n readonly exitCode: number;\n\n constructor(\n code: ErrorCodeValue,\n message: string,\n details: YoooclawErrorDetails = {},\n exitCode = 1,\n ) {\n super(message);\n this.name = \"YoooclawError\";\n this.code = code;\n this.details = details;\n this.exitCode = exitCode;\n }\n\n toErrorPayload(): {\n code: ErrorCodeValue;\n message: string;\n } & YoooclawErrorDetails {\n return { code: this.code, message: this.message, ...this.details };\n }\n}\n\nexport function notImplemented(command: string): YoooclawError {\n return new YoooclawError(\n ErrorCode.NOT_IMPLEMENTED,\n `命令 \\`${command}\\` 尚未实现`,\n { hint: \"该命令处于脚手架阶段,后续按 imp 文档逐步落地\" },\n );\n}\n",
|
|
40
32
|
"/**\n * 统一输出层 —— 所有命令的 stdout 走这里序列化。\n *\n * 支持 `--format json|pretty|table|ndjson`:\n * - json JSON.stringify(data) 单行 (非 TTY / 管道默认)\n * - pretty JSON.stringify(data, null, 2) (TTY 默认;后续可加颜色)\n * - table 表格输出(结果为数组时)\n * - ndjson 每条结果一行 JSON,无包裹数组 (流式 / Agent 消费)\n *\n * 错误与正常输出共用同一 schema:`{ ok: false, error: { code, message, ... } }`。\n */\nimport { YoooclawError, type ErrorCodeValue } from \"../errors.js\";\n\nexport type OutputFormat = \"json\" | \"pretty\" | \"table\" | \"ndjson\";\nexport const OUTPUT_FORMATS: OutputFormat[] = [\n \"json\",\n \"pretty\",\n \"table\",\n \"ndjson\",\n];\n\n/** 解析用户传入的 --format;`auto` / 缺省时按 TTY 判定。 */\nexport function resolveFormat(\n requested: string | undefined,\n isTty = process.stdout.isTTY ?? false,\n): OutputFormat {\n if (requested && requested !== \"auto\") {\n if ((OUTPUT_FORMATS as string[]).includes(requested)) {\n return requested as OutputFormat;\n }\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\" as ErrorCodeValue,\n `不支持的输出格式:${requested}`,\n { hint: `可选值:${OUTPUT_FORMATS.join(\" | \")} | auto` },\n );\n }\n return isTty ? \"pretty\" : \"json\";\n}\n\ninterface RenderOptions {\n format: OutputFormat;\n /** 写出目标,默认 process.stdout。便于测试。 */\n stream?: NodeJS.WritableStream;\n}\n\nfunction write(stream: NodeJS.WritableStream, text: string): void {\n stream.write(text.endsWith(\"\\n\") ? text : text + \"\\n\");\n}\n\n/** 渲染一次成功结果。data 任意结构;table/ndjson 在数组时逐行展开。 */\nexport function renderResult(data: unknown, opts: RenderOptions): void {\n const stream = opts.stream ?? process.stdout;\n switch (opts.format) {\n case \"json\":\n write(stream, JSON.stringify(data));\n return;\n case \"pretty\":\n write(stream, JSON.stringify(data, null, 2));\n return;\n case \"ndjson\": {\n const rows = Array.isArray(data) ? data : [data];\n for (const row of rows) stream.write(JSON.stringify(row) + \"\\n\");\n return;\n }\n case \"table\":\n write(stream, renderTable(data));\n return;\n }\n}\n\n/**\n * 渲染错误。统一 schema:{ ok: false, error: {...} }。\n * 默认写 stdout —— 与正常输出同一通道,让 `--format json | jq` 等 Agent 管道能读到错误体;\n * 失败由非零退出码表达。\n */\nexport function renderError(err: unknown, opts: RenderOptions): void {\n const stream = opts.stream ?? process.stdout;\n const error =\n err instanceof YoooclawError\n ? err.toErrorPayload()\n : {\n code: \"YOOOCLAW_UNKNOWN\",\n message: err instanceof Error ? err.message : String(err),\n };\n const payload = { ok: false, error };\n const text =\n opts.format === \"pretty\"\n ? JSON.stringify(payload, null, 2)\n : JSON.stringify(payload);\n write(stream, text);\n}\n\n/** 极简表格渲染:对象数组 → 列对齐文本;其余 fallback 到 pretty JSON。 */\nfunction renderTable(data: unknown): string {\n if (!Array.isArray(data) || data.length === 0) {\n return JSON.stringify(data, null, 2);\n }\n const rows = data.filter(\n (r): r is Record<string, unknown> =>\n typeof r === \"object\" && r !== null && !Array.isArray(r),\n );\n if (rows.length !== data.length) {\n return JSON.stringify(data, null, 2);\n }\n const columns = Array.from(\n rows.reduce<Set<string>>((set, row) => {\n for (const key of Object.keys(row)) set.add(key);\n return set;\n }, new Set()),\n );\n const cell = (v: unknown): string =>\n v === null || v === undefined\n ? \"\"\n : typeof v === \"object\"\n ? JSON.stringify(v)\n : String(v);\n const widths = columns.map((col) =>\n Math.max(col.length, ...rows.map((row) => cell(row[col]).length)),\n );\n const pad = (text: string, width: number) => text.padEnd(width);\n const header = columns.map((col, i) => pad(col, widths[i])).join(\" \");\n const divider = widths.map((w) => \"-\".repeat(w)).join(\" \");\n const body = rows\n .map((row) =>\n columns.map((col, i) => pad(cell(row[col]), widths[i])).join(\" \"),\n )\n .join(\"\\n\");\n return [header, divider, body].join(\"\\n\");\n}\n",
|
|
41
|
-
"import { readFileSync } from \"node:fs\";\n\ndeclare const __CLI_VERSION__: string | undefined;\n\ninterface PackageJson {\n version?: string;\n}\n\nfunction readBuildInjectedVersion(): string | undefined {\n if (typeof __CLI_VERSION__ !== \"string\") {\n return undefined;\n }\n const version = __CLI_VERSION__.trim();\n return version || undefined;\n}\n\nfunction readVersionFromPackageJson(): string | undefined {\n try {\n const packageJsonUrl = new URL(\"../package.json\", import.meta.url);\n const packageJson = JSON.parse(\n readFileSync(packageJsonUrl, \"utf-8\"),\n ) as PackageJson;\n const version = packageJson.version?.trim();\n return version || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const CLI_VERSION =\n readBuildInjectedVersion() ?? readVersionFromPackageJson() ?? \"unknown\";\n",
|
|
33
|
+
"import { readFileSync } from \"node:fs\";\n\ndeclare const __CLI_VERSION__: string | undefined;\ndeclare const __CLI_DIST__: string | undefined;\n\ninterface PackageJson {\n version?: string;\n}\n\nfunction readBuildInjectedVersion(): string | undefined {\n if (typeof __CLI_VERSION__ !== \"string\") {\n return undefined;\n }\n const version = __CLI_VERSION__.trim();\n return version || undefined;\n}\n\nfunction readVersionFromPackageJson(): string | undefined {\n try {\n const packageJsonUrl = new URL(\"../package.json\", import.meta.url);\n const packageJson = JSON.parse(\n readFileSync(packageJsonUrl, \"utf-8\"),\n ) as PackageJson;\n const version = packageJson.version?.trim();\n return version || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const CLI_VERSION =\n readBuildInjectedVersion() ?? readVersionFromPackageJson() ?? \"unknown\";\n\nexport type CliDist = \"npm\" | \"native\" | \"dev\";\n\nfunction readBuildInjectedDist(): CliDist | undefined {\n if (typeof __CLI_DIST__ !== \"string\") return undefined;\n const value = __CLI_DIST__.trim();\n if (value === \"npm\" || value === \"native\" || value === \"dev\") return value;\n return undefined;\n}\n\nexport const CLI_DIST: CliDist = readBuildInjectedDist() ?? \"dev\";\n",
|
|
42
34
|
"/**\n * 文件系统工具 —— 统一目录/文件权限与原子写。\n *\n * 凭据与配置落盘的安全约束(PRD「非功能需求 / 安全」):\n * - 目录 0700、敏感文件 0600;\n * - 写入走「临时文件 + rename」原子替换,避免半截写。\n */\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { YoooclawError } from \"./errors.js\";\n\n/** 目录默认权限(私有)。 */\nexport const DIR_MODE = 0o700;\n/** 敏感文件权限(仅属主可读写)。 */\nexport const SECRET_FILE_MODE = 0o600;\n/** 普通配置文件权限。 */\nexport const CONFIG_FILE_MODE = 0o644;\n\n/** 确保目录存在并尽力收紧权限(Windows 上 chmod 基本 no-op)。 */\nexport function ensureDir(dir: string, mode: number = DIR_MODE): void {\n mkdirSync(dir, { recursive: true, mode });\n try {\n chmodSync(dir, mode);\n } catch {\n // Windows / 受限文件系统:忽略\n }\n}\n\n/** 原子写文件:先写临时文件再 rename,最后 chmod。 */\nexport function writeFileAtomic(\n filePath: string,\n contents: string,\n mode: number = CONFIG_FILE_MODE,\n): void {\n ensureDir(dirname(filePath));\n const tmp = join(\n dirname(filePath),\n `.${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`,\n );\n writeFileSync(tmp, contents, { mode });\n renameSync(tmp, filePath);\n try {\n chmodSync(filePath, mode);\n } catch {\n // 忽略\n }\n}\n\n/** 写 JSON(两空格缩进 + 末尾换行)。 */\nexport function writeJsonFile(\n filePath: string,\n data: unknown,\n mode: number = CONFIG_FILE_MODE,\n): void {\n writeFileAtomic(filePath, JSON.stringify(data, null, 2) + \"\\n\", mode);\n}\n\n/** 读 JSON;文件不存在返回 undefined;解析失败抛 CONFIG_INVALID。 */\nexport function readJsonFile<T = unknown>(filePath: string): T | undefined {\n if (!existsSync(filePath)) return undefined;\n let raw: string;\n try {\n raw = readFileSync(filePath, \"utf-8\");\n } catch (err) {\n throw new YoooclawError(\n \"YOOOCLAW_CONFIG_INVALID\",\n `读取文件失败:${filePath}`,\n { cause: err instanceof Error ? err.message : String(err) },\n );\n }\n try {\n return JSON.parse(raw) as T;\n } catch {\n throw new YoooclawError(\n \"YOOOCLAW_CONFIG_INVALID\",\n `文件不是合法 JSON:${filePath}`,\n { hint: \"可手动修复或删除后重新生成\" },\n );\n }\n}\n",
|
|
43
35
|
"/**\n * 交互式输入工具(config init / setup-asr / 删除确认等)。\n *\n * 非 TTY 环境调用任何 prompt 都抛 NOT_INTERACTIVE,避免在管道里挂起。\n */\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin, stdout } from \"node:process\";\nimport { YoooclawError } from \"./errors.js\";\n\nexport function isInteractive(): boolean {\n return Boolean(stdin.isTTY && stdout.isTTY);\n}\n\nfunction ensureInteractive(): void {\n if (!isInteractive()) {\n throw new YoooclawError(\n \"YOOOCLAW_NOT_INTERACTIVE\",\n \"当前为非交互环境,无法进行交互式输入\",\n { hint: \"改用 --non-interactive --from-file,或在 TTY 中运行\" },\n );\n }\n}\n\n/** 提一个问题,返回去空白后的回答;提供 defaultValue 时回车采用默认。 */\nexport async function ask(question: string, defaultValue?: string): Promise<string> {\n ensureInteractive();\n const suffix = defaultValue ? ` [${defaultValue}]` : \"\";\n const rl = createInterface({ input: stdin, output: stdout });\n try {\n const answer = (await rl.question(`${question}${suffix}: `)).trim();\n return answer || defaultValue || \"\";\n } finally {\n rl.close();\n }\n}\n\n/** Yes/No 确认,默认值由 defaultYes 决定。 */\nexport async function confirm(question: string, defaultYes = false): Promise<boolean> {\n const hint = defaultYes ? \"Y/n\" : \"y/N\";\n const answer = (await ask(`${question} (${hint})`)).toLowerCase();\n if (!answer) return defaultYes;\n return answer === \"y\" || answer === \"yes\";\n}\n\n/** 读取 stdin 全部内容(用于 `--from-file -` / `set-api-key -`)。 */\nexport async function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stdin) {\n chunks.push(Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n",
|
|
44
36
|
"/**\n * config.json 读写 + 点号路径 get/set/unset + 敏感字段遮罩。\n */\nimport { existsSync } from \"node:fs\";\nimport type { ProfilePaths } from \"../paths.js\";\nimport { readJsonFile, writeJsonFile, CONFIG_FILE_MODE } from \"../fs-utils.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport {\n defaultConfig,\n SECRET_REF_PATHS,\n type YoooclawConfig,\n} from \"./schema.js\";\n\ntype PlainObject = Record<string, unknown>;\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** 深合并:用 source 覆盖 target(仅对象递归,数组/标量整体替换)。 */\nexport function deepMerge<T>(target: T, source: unknown): T {\n if (!isPlainObject(source)) return target;\n const out: PlainObject = isPlainObject(target) ? { ...target } : {};\n for (const [key, value] of Object.entries(source)) {\n const prev = out[key];\n out[key] = isPlainObject(value) && isPlainObject(prev)\n ? deepMerge(prev, value)\n : value;\n }\n return out as T;\n}\n\nexport function configExists(paths: ProfilePaths): boolean {\n return existsSync(paths.config);\n}\n\n/** 读取 config;缺失字段用默认值补齐。文件不存在则返回纯默认。 */\nexport function loadConfig(paths: ProfilePaths): YoooclawConfig {\n const base = defaultConfig(paths.credentials);\n const stored = readJsonFile<Partial<YoooclawConfig>>(paths.config);\n if (!stored) return base;\n return deepMerge(base, stored);\n}\n\n/** 要求 config 必须已存在(如 daemon 启动场景),否则报错。 */\nexport function requireConfig(paths: ProfilePaths): YoooclawConfig {\n if (!configExists(paths)) {\n throw new YoooclawError(\n \"YOOOCLAW_CONFIG_INVALID\",\n `profile \\`${paths.profile}\\` 尚未初始化`,\n { hint: \"先运行 yoooclaw config init\", checkedPaths: [paths.config] },\n );\n }\n return loadConfig(paths);\n}\n\nexport function saveConfig(paths: ProfilePaths, config: YoooclawConfig): void {\n writeJsonFile(paths.config, config, CONFIG_FILE_MODE);\n}\n\n/** 按点号路径取值。 */\nexport function getByPath(obj: unknown, path: string): unknown {\n const segments = path.split(\".\");\n let cursor: unknown = obj;\n for (const seg of segments) {\n if (!isPlainObject(cursor)) return undefined;\n cursor = cursor[seg];\n }\n return cursor;\n}\n\n/** 按点号路径设值(中间缺失对象自动创建)。返回新对象(原地修改 obj 的拷贝语义由调用方保证)。 */\nexport function setByPath(obj: PlainObject, path: string, value: unknown): void {\n const segments = path.split(\".\");\n let cursor: PlainObject = obj;\n for (let i = 0; i < segments.length - 1; i += 1) {\n const seg = segments[i];\n if (!isPlainObject(cursor[seg])) cursor[seg] = {};\n cursor = cursor[seg] as PlainObject;\n }\n cursor[segments.at(-1)!] = value;\n}\n\n/** 按点号路径删除;返回是否删除了字段。 */\nexport function unsetByPath(obj: PlainObject, path: string): boolean {\n const segments = path.split(\".\");\n let cursor: PlainObject = obj;\n for (let i = 0; i < segments.length - 1; i += 1) {\n const seg = segments[i];\n if (!isPlainObject(cursor[seg])) return false;\n cursor = cursor[seg] as PlainObject;\n }\n const last = segments.at(-1)!;\n if (!(last in cursor)) return false;\n delete cursor[last];\n return true;\n}\n\nconst NUMBER_PATHS = new Set([\n \"daemon.port\",\n \"relay.heartbeatSec\",\n \"relay.reconnectBackoffMs\",\n \"notification.retentionDays\",\n \"lightRules.evaluator.timeoutMs\",\n \"lightRules.evaluator.retries\",\n \"image.maxBytes\",\n]);\nconst BOOLEAN_PATHS = new Set([\n \"daemon.detach\",\n \"relay.enabled\",\n \"lightRules.enabled\",\n \"autoUpdate.enabled\",\n]);\nconst ARRAY_PATHS = new Set([\"notification.ignoredApps\"]);\n\n/** 把命令行字符串值按目标字段类型强转。 */\nexport function coerceConfigValue(path: string, raw: string): unknown {\n if (NUMBER_PATHS.has(path)) {\n if (path === \"notification.retentionDays\" && (raw === \"null\" || raw === \"\")) {\n return null;\n }\n const n = Number(raw);\n if (!Number.isFinite(n)) {\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n `${path} 需要数字,收到:${raw}`,\n );\n }\n return n;\n }\n if (BOOLEAN_PATHS.has(path)) {\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n `${path} 需要 true/false,收到:${raw}`,\n );\n }\n if (ARRAY_PATHS.has(path)) {\n return raw.split(\",\").map((s) => s.trim()).filter(Boolean);\n }\n return raw;\n}\n\n/** 深拷贝并遮罩敏感字段,供 `config show` 用。inline: 引用整体遮罩。 */\nexport function maskConfig(config: YoooclawConfig): YoooclawConfig {\n const clone = structuredClone(config);\n for (const path of SECRET_REF_PATHS) {\n const value = getByPath(clone, path);\n if (typeof value === \"string\" && value.startsWith(\"inline:\")) {\n setByPath(clone as unknown as PlainObject, path, \"inline:****\");\n }\n }\n return clone;\n}\n",
|
|
45
37
|
"/**\n * yoooclaw daemon 配置 schema(per-profile `config.json`)。\n *\n * 对齐 PRD「数据模型 / config.json 结构」。敏感字段(gateway token / webhook secret)\n * 不直接落在这里,而是用 `*Ref` 抽象引用指向 credentials 文件 / keychain / env。\n */\n\nexport const CONFIG_VERSION = 1;\n\nexport type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\nexport type OutputDefaultFormat = \"auto\" | \"json\" | \"pretty\" | \"table\" | \"ndjson\";\n\nexport interface DaemonSection {\n bind: string;\n port: number;\n logLevel: LogLevel;\n detach: boolean;\n}\n\nexport interface AuthSection {\n mode: \"token\";\n /** gateway token 的抽象引用(env: / file: / keychain: / inline:)。 */\n tokenRef: string;\n}\n\nexport interface RelaySection {\n url: string;\n heartbeatSec: number;\n reconnectBackoffMs: number;\n enabled: boolean;\n}\n\nexport interface NotificationSection {\n /** 本地保留天数;null 表示永久保存。 */\n retentionDays: number | null;\n ignoredApps: string[];\n}\n\nexport interface WebhookEvaluatorSection {\n mode: \"webhook\";\n webhookUrl: string;\n /** webhook secret 的抽象引用。 */\n webhookSecretRef: string;\n timeoutMs: number;\n retries: number;\n}\n\nexport interface LightRulesSection {\n enabled: boolean;\n evaluator?: WebhookEvaluatorSection;\n}\n\nexport interface AutoUpdateSection {\n enabled: boolean;\n channel: \"stable\" | \"beta\";\n}\n\nexport interface OutputSection {\n defaultFormat: OutputDefaultFormat;\n}\n\nexport interface ImageSection {\n /** 单文件下载上限(字节),超限拒绝下载并标记 sync_failed。 */\n maxBytes: number;\n}\n\nexport interface YoooclawConfig {\n version: number;\n daemon: DaemonSection;\n auth: AuthSection;\n relay: RelaySection;\n notification: NotificationSection;\n lightRules: LightRulesSection;\n autoUpdate: AutoUpdateSection;\n output: OutputSection;\n image: ImageSection;\n}\n\n/**\n * 默认 Relay 隧道地址 —— 复用 phone-notifications 插件那套托管 Relay 服务。\n * host 在构建期由 OPENCLAW_HOST_PRODUCTION 注入(见 scripts/build.ts),与插件 env.ts 同源;\n * 未注入时回退到生产域名字面量,保证脱离构建链路也能直连。\n */\nconst RELAY_HOST = process.env.OPENCLAW_HOST_PRODUCTION || \"openclaw-service.yoooclaw.com\";\nexport const DEFAULT_RELAY_URL = `wss://${RELAY_HOST}/message/messages/ws/plugin`;\nexport const DEFAULT_PORT = 18789;\nexport const DEFAULT_BIND = \"127.0.0.1\";\nexport const DEFAULT_IMAGE_MAX_BYTES = 20 * 1024 * 1024;\n\n/** 生成某个 profile 的默认 config。tokenRef/secretRef 默认指向该 profile 的 credentials 文件。 */\nexport function defaultConfig(credentialsPath: string): YoooclawConfig {\n return {\n version: CONFIG_VERSION,\n daemon: {\n bind: DEFAULT_BIND,\n port: DEFAULT_PORT,\n logLevel: \"info\",\n detach: true,\n },\n auth: {\n mode: \"token\",\n tokenRef: `file:${credentialsPath}#gatewayToken`,\n },\n relay: {\n url: DEFAULT_RELAY_URL,\n heartbeatSec: 10,\n reconnectBackoffMs: 2000,\n enabled: true,\n },\n notification: {\n retentionDays: null,\n ignoredApps: [],\n },\n lightRules: {\n enabled: true,\n },\n autoUpdate: {\n enabled: true,\n channel: \"stable\",\n },\n output: {\n defaultFormat: \"auto\",\n },\n image: {\n maxBytes: DEFAULT_IMAGE_MAX_BYTES,\n },\n };\n}\n\n/** 默认 webhook 评估器(config init 启用灯效评估时填充)。 */\nexport function defaultEvaluator(credentialsPath: string): WebhookEvaluatorSection {\n return {\n mode: \"webhook\",\n webhookUrl: \"\",\n webhookSecretRef: `file:${credentialsPath}#evaluatorSecret`,\n timeoutMs: 5000,\n retries: 1,\n };\n}\n\n/** config.json 里需要遮罩展示的敏感引用字段(点号路径)。 */\nexport const SECRET_REF_PATHS = [\n \"auth.tokenRef\",\n \"lightRules.evaluator.webhookSecretRef\",\n];\n",
|
|
46
|
-
"/**\n * 凭据存取 —— account 级 api-key(共享)与 instance 级 gateway token(per-profile)。\n *\n * api-key 分层解析(PRD「凭据解析顺序与插件共享」),命中即停:\n * 1. env YOOOCLAW_API_KEY —— 显式覆盖\n * 2. keychain yoooclaw/api-key —— 可选加固\n * 3. file ~/.yoooclaw/credentials.json#apiKey —— 默认共享底座(与插件共用)\n */\nimport { randomBytes } from \"node:crypto\";\nimport { sharedCredentialsPath } from \"../paths.js\";\nimport { readJsonFile, writeJsonFile, SECRET_FILE_MODE } from \"../fs-utils.js\";\nimport { keychainAvailable, keychainGet, keychainSet } from \"./keychain.js\";\nimport { resolveRef, writeRef, type ResolvedRef } from \"./refs.js\";\nimport type { YoooclawConfig } from \"../config/schema.js\";\nimport { YoooclawError } from \"../errors.js\";\n\nexport const API_KEY_ENV = \"YOOOCLAW_API_KEY\";\nexport const KEYCHAIN_SERVICE = \"yoooclaw\";\nexport const KEYCHAIN_API_KEY_ACCOUNT = \"api-key\";\nexport const API_KEY_FIELD = \"apiKey\";\n\nexport interface ApiKeyResolution {\n value?: string;\n source: \"env\" | \"keychain\" | \"file\" | \"none\";\n location?: string;\n}\n\n/** 按分层顺序解析 account 级 api-key。 */\nexport function resolveApiKey(): ApiKeyResolution {\n const env = process.env[API_KEY_ENV]?.trim();\n if (env) return { value: env, source: \"env\", location: API_KEY_ENV };\n\n if (keychainAvailable()) {\n const r = keychainGet(KEYCHAIN_SERVICE, KEYCHAIN_API_KEY_ACCOUNT);\n if (r.value) {\n return { value: r.value, source: \"keychain\", location: `${KEYCHAIN_SERVICE}/${KEYCHAIN_API_KEY_ACCOUNT}` };\n }\n }\n\n const file = sharedCredentialsPath();\n const data = readJsonFile<Record<string, unknown>>(file);\n const value = data?.[API_KEY_FIELD];\n if (typeof value === \"string\" && value) {\n return { value, source: \"file\", location: file };\n }\n\n return { source: \"none\" };\n}\n\n/** 写入 account 级 api-key。默认写共享文件;--keychain 时写 OS keychain。 */\nexport function setApiKey(key: string, useKeychain: boolean): ApiKeyResolution {\n if (useKeychain) {\n if (!keychainSet(KEYCHAIN_SERVICE, KEYCHAIN_API_KEY_ACCOUNT, key)) {\n throw new YoooclawError(\n \"YOOOCLAW_KEYCHAIN_UNAVAILABLE\",\n \"当前平台无法写入 keychain,请去掉 --keychain 改写共享文件\",\n );\n }\n return { value: key, source: \"keychain\", location: `${KEYCHAIN_SERVICE}/${KEYCHAIN_API_KEY_ACCOUNT}` };\n }\n const file = sharedCredentialsPath();\n const data = readJsonFile<Record<string, unknown>>(file) ?? {};\n data[API_KEY_FIELD] = key;\n writeJsonFile(file, data, SECRET_FILE_MODE);\n return { value: key, source: \"file\", location: file };\n}\n\n/** 解析当前 profile 的 gateway token(按 config.auth.tokenRef)。 */\nexport function resolveGatewayToken(config: YoooclawConfig): ResolvedRef {\n return resolveRef(config.auth.tokenRef);\n}\n\n/** 写入/轮换 gateway token(按 config.auth.tokenRef 的 scheme)。 */\nexport function writeGatewayToken(config: YoooclawConfig, value: string): ResolvedRef {\n return writeRef(config.auth.tokenRef, value);\n}\n\n/** 生成一个随机 token(hex)。 */\nexport function generateToken(bytes = 32): string {\n return randomBytes(bytes).toString(\"hex\");\n}\n",
|
|
38
|
+
"/**\n * 凭据存取 —— account 级 api-key(共享)与 instance 级 gateway token(per-profile)。\n *\n * api-key 分层解析(PRD「凭据解析顺序与插件共享」),命中即停:\n * 1. env YOOOCLAW_API_KEY —— 显式覆盖\n * 2. keychain yoooclaw/api-key —— 可选加固\n * 3. file ~/.yoooclaw/credentials.json#apiKey —— 默认共享底座(与插件共用)\n */\nimport { randomBytes } from \"node:crypto\";\nimport { sharedCredentialsPath } from \"../paths.js\";\nimport { readJsonFile, writeJsonFile, SECRET_FILE_MODE } from \"../fs-utils.js\";\nimport { keychainAvailable, keychainGet, keychainSet } from \"./keychain.js\";\nimport { resolveRef, writeRef, type ResolvedRef } from \"./refs.js\";\nimport type { YoooclawConfig } from \"../config/schema.js\";\nimport { ErrorCode, YoooclawError } from \"../errors.js\";\n\nexport const API_KEY_ENV = \"YOOOCLAW_API_KEY\";\nexport const KEYCHAIN_SERVICE = \"yoooclaw\";\nexport const KEYCHAIN_API_KEY_ACCOUNT = \"api-key\";\nexport const API_KEY_FIELD = \"apiKey\";\nexport const API_KEYS_FIELD = \"apiKeys\";\n\nexport interface ApiKeyResolution {\n value?: string;\n source: ApiKeyEntry[\"source\"] | \"none\";\n location?: string;\n label?: string;\n}\n\nexport interface ApiKeyEntry {\n label: string;\n key: string;\n default: boolean;\n source: \"env\" | \"keychain\" | \"file\";\n createdAt?: string;\n}\n\nexport type CredentialMode =\n | \"env-single\"\n | \"file-multi\"\n | \"keychain-single\"\n | \"legacy-file-single\"\n | \"none\";\n\nexport interface CredentialSet {\n mode: CredentialMode;\n entries: ApiKeyEntry[];\n defaultEntry?: ApiKeyEntry;\n location?: string;\n legacyApiKeyPresent: boolean;\n shadowedKeychainPresent: boolean;\n warnings: string[];\n}\n\nexport interface StoredApiKeyEntry {\n label: string;\n key: string;\n default?: boolean;\n createdAt?: string;\n}\n\nconst RESERVED_LABELS = new Set([\"all\", \"legacy\", \"env\", \"keychain\", \"local\"]);\nconst LABEL_RE = /^[a-z0-9-]{1,32}$/;\n\nfunction readSharedCredentials(): Record<string, unknown> {\n return readJsonFile<Record<string, unknown>>(sharedCredentialsPath()) ?? {};\n}\n\nfunction writeSharedCredentials(data: Record<string, unknown>): void {\n writeJsonFile(sharedCredentialsPath(), data, SECRET_FILE_MODE);\n}\n\nfunction normalizeStoredEntry(raw: unknown, warnings: string[]): StoredApiKeyEntry | null {\n if (!raw || typeof raw !== \"object\") {\n warnings.push(\"apiKeys[] 包含非对象条目,已跳过\");\n return null;\n }\n const item = raw as Record<string, unknown>;\n const label = typeof item.label === \"string\" ? item.label.trim() : \"\";\n const key = typeof item.key === \"string\" ? item.key.trim() : \"\";\n if (!isValidApiKeyLabel(label)) {\n warnings.push(`apiKeys[] 包含非法 label: ${label || \"<empty>\"},已跳过`);\n return null;\n }\n if (!key) {\n warnings.push(`apiKeys[] label=${label} 的 key 为空,已跳过`);\n return null;\n }\n return {\n label,\n key,\n default: item.default === true,\n createdAt: typeof item.createdAt === \"string\" ? item.createdAt : undefined,\n };\n}\n\nfunction normalizeStoredEntries(raw: unknown, warnings: string[]): StoredApiKeyEntry[] {\n if (!Array.isArray(raw)) return [];\n const seen = new Set<string>();\n const entries: StoredApiKeyEntry[] = [];\n for (const item of raw) {\n const normalized = normalizeStoredEntry(item, warnings);\n if (!normalized) continue;\n if (seen.has(normalized.label)) {\n warnings.push(`apiKeys[] label=${normalized.label} 重复,已跳过后续条目`);\n continue;\n }\n seen.add(normalized.label);\n entries.push(normalized);\n }\n return entries;\n}\n\nfunction toRuntimeEntries(entries: StoredApiKeyEntry[]): ApiKeyEntry[] {\n const defaultIdx = entries.findIndex((entry) => entry.default === true);\n const effectiveDefaultIdx = entries.length === 0 ? -1 : defaultIdx >= 0 ? defaultIdx : 0;\n return entries.map((entry, idx) => ({\n label: entry.label,\n key: entry.key,\n default: idx === effectiveDefaultIdx,\n source: \"file\",\n createdAt: entry.createdAt,\n }));\n}\n\nfunction defaultEntry(entries: ApiKeyEntry[]): ApiKeyEntry | undefined {\n return entries.find((entry) => entry.default) ?? entries[0];\n}\n\nfunction keychainValue(): string | undefined {\n if (!keychainAvailable()) return undefined;\n const r = keychainGet(KEYCHAIN_SERVICE, KEYCHAIN_API_KEY_ACCOUNT);\n return r.value || undefined;\n}\n\nfunction hasOwn(data: Record<string, unknown>, field: string): boolean {\n return Object.prototype.hasOwnProperty.call(data, field);\n}\n\nexport function isValidApiKeyLabel(label: string): boolean {\n return LABEL_RE.test(label) && !RESERVED_LABELS.has(label);\n}\n\nexport function assertValidApiKeyLabel(label: string): void {\n if (!isValidApiKeyLabel(label)) {\n throw new YoooclawError(\n ErrorCode.APIKEY_LABEL_INVALID,\n \"label 不合法:仅允许 [a-z0-9-]{1,32},且不能使用保留字 all/legacy/env/keychain/local\",\n { label },\n );\n }\n}\n\nfunction storedEntriesFromFile(data: Record<string, unknown>): StoredApiKeyEntry[] {\n const warnings: string[] = [];\n return normalizeStoredEntries(data[API_KEYS_FIELD], warnings);\n}\n\nfunction writeApiKeys(entries: StoredApiKeyEntry[], extra?: Record<string, unknown>): ApiKeyResolution {\n const data = { ...readSharedCredentials(), ...(extra ?? {}) };\n data[API_KEYS_FIELD] = entries.map((entry) => ({\n label: entry.label,\n key: entry.key,\n ...(entry.default ? { default: true } : {}),\n ...(entry.createdAt ? { createdAt: entry.createdAt } : {}),\n }));\n delete data[API_KEY_FIELD];\n writeSharedCredentials(data);\n const runtime = toRuntimeEntries(entries);\n const chosen = defaultEntry(runtime);\n return { value: chosen?.key, source: chosen?.source ?? \"none\", location: sharedCredentialsPath(), label: chosen?.label };\n}\n\nexport function resolveApiKeyEntries(): CredentialSet {\n const env = process.env[API_KEY_ENV]?.trim();\n if (env) {\n const entry: ApiKeyEntry = { label: \"env\", key: env, default: true, source: \"env\" };\n return {\n mode: \"env-single\",\n entries: [entry],\n defaultEntry: entry,\n location: API_KEY_ENV,\n legacyApiKeyPresent: false,\n shadowedKeychainPresent: false,\n warnings: [],\n };\n }\n\n const file = sharedCredentialsPath();\n const data = readSharedCredentials();\n const legacy = typeof data[API_KEY_FIELD] === \"string\" && Boolean((data[API_KEY_FIELD] as string).trim());\n const kc = keychainValue();\n\n if (hasOwn(data, API_KEYS_FIELD)) {\n const warnings: string[] = [];\n const stored = normalizeStoredEntries(data[API_KEYS_FIELD], warnings);\n if (stored.length > 0 && !stored.some((entry) => entry.default)) {\n warnings.push(`apiKeys[] 未标记 default,运行时使用第一条 label=${stored[0].label}`);\n }\n const entries = toRuntimeEntries(stored);\n return {\n mode: \"file-multi\",\n entries,\n defaultEntry: defaultEntry(entries),\n location: file,\n legacyApiKeyPresent: legacy,\n shadowedKeychainPresent: Boolean(kc),\n warnings,\n };\n }\n\n if (kc) {\n const entry: ApiKeyEntry = { label: \"keychain\", key: kc, default: true, source: \"keychain\" };\n return {\n mode: \"keychain-single\",\n entries: [entry],\n defaultEntry: entry,\n location: `${KEYCHAIN_SERVICE}/${KEYCHAIN_API_KEY_ACCOUNT}`,\n legacyApiKeyPresent: legacy,\n shadowedKeychainPresent: false,\n warnings: [],\n };\n }\n\n const value = legacy ? (data[API_KEY_FIELD] as string).trim() : \"\";\n if (value) {\n const entry: ApiKeyEntry = { label: \"default\", key: value, default: true, source: \"file\" };\n return {\n mode: \"legacy-file-single\",\n entries: [entry],\n defaultEntry: entry,\n location: file,\n legacyApiKeyPresent: true,\n shadowedKeychainPresent: false,\n warnings: [],\n };\n }\n\n return {\n mode: \"none\",\n entries: [],\n location: file,\n legacyApiKeyPresent: false,\n shadowedKeychainPresent: false,\n warnings: [],\n };\n}\n\n/** 按分层顺序解析 account 级 api-key。 */\nexport function resolveApiKey(): ApiKeyResolution {\n const set = resolveApiKeyEntries();\n const entry = set.defaultEntry;\n if (!entry) return { source: \"none\", location: set.location };\n return { value: entry.key, source: entry.source, location: set.location, label: entry.label };\n}\n\n/** 写入 account 级 api-key。默认写共享文件;--keychain 时写 OS keychain。 */\nexport function setApiKey(key: string, useKeychain: boolean): ApiKeyResolution {\n const trimmed = key.trim();\n if (!trimmed) {\n throw new YoooclawError(ErrorCode.INVALID_ARGUMENT, \"api-key 不能为空\");\n }\n if (useKeychain) {\n const data = readSharedCredentials();\n if (hasOwn(data, API_KEYS_FIELD)) {\n throw new YoooclawError(\n ErrorCode.KEYCHAIN_MULTI_UNSUPPORTED,\n \"multi-key 模式不支持 --keychain;请使用文件 apiKeys[] 管理多 key\",\n );\n }\n if (!keychainSet(KEYCHAIN_SERVICE, KEYCHAIN_API_KEY_ACCOUNT, trimmed)) {\n throw new YoooclawError(\n ErrorCode.KEYCHAIN_UNAVAILABLE,\n \"当前平台无法写入 keychain,请去掉 --keychain 改写共享文件\",\n );\n }\n return { value: trimmed, source: \"keychain\", location: `${KEYCHAIN_SERVICE}/${KEYCHAIN_API_KEY_ACCOUNT}`, label: \"keychain\" };\n }\n const file = sharedCredentialsPath();\n const data = readSharedCredentials();\n if (hasOwn(data, API_KEYS_FIELD)) {\n const entries = storedEntriesFromFile(data);\n if (entries.length === 0) {\n return writeApiKeys([{ label: \"default\", key: trimmed, default: true, createdAt: new Date().toISOString() }]);\n }\n const idx = entries.findIndex((entry) => entry.default) >= 0\n ? entries.findIndex((entry) => entry.default)\n : 0;\n const next = entries.map((entry, entryIdx) => ({\n ...entry,\n key: entryIdx === idx ? trimmed : entry.key,\n default: entryIdx === idx,\n }));\n return writeApiKeys(next);\n }\n data[API_KEY_FIELD] = trimmed;\n writeJsonFile(file, data, SECRET_FILE_MODE);\n return { value: trimmed, source: \"file\", location: file, label: \"default\" };\n}\n\nexport function addApiKey(\n key: string,\n label: string,\n opts: { makeDefault?: boolean; force?: boolean } = {},\n): ApiKeyResolution {\n const trimmed = key.trim();\n if (!trimmed) {\n throw new YoooclawError(ErrorCode.INVALID_ARGUMENT, \"api-key 不能为空\");\n }\n assertValidApiKeyLabel(label);\n const data = readSharedCredentials();\n let entries: StoredApiKeyEntry[];\n if (hasOwn(data, API_KEYS_FIELD)) {\n entries = storedEntriesFromFile(data);\n } else {\n const legacy = typeof data[API_KEY_FIELD] === \"string\" ? data[API_KEY_FIELD].trim() : \"\";\n entries = legacy\n ? [{ label: \"default\", key: legacy, default: true, createdAt: new Date().toISOString() }]\n : [];\n }\n\n const existingIdx = entries.findIndex((entry) => entry.label === label);\n if (existingIdx >= 0 && !opts.force) {\n throw new YoooclawError(\n ErrorCode.APIKEY_LABEL_DUPLICATE,\n `api-key label 已存在:${label}`,\n { hint: \"如需覆盖,追加 --force\", label },\n );\n }\n\n const shouldDefault = opts.makeDefault || entries.length === 0;\n const nextEntry: StoredApiKeyEntry = {\n label,\n key: trimmed,\n default: shouldDefault,\n createdAt: existingIdx >= 0 ? entries[existingIdx].createdAt : new Date().toISOString(),\n };\n if (existingIdx >= 0) entries[existingIdx] = nextEntry;\n else entries.push(nextEntry);\n if (shouldDefault) {\n entries = entries.map((entry) => ({ ...entry, default: entry.label === label }));\n } else if (!entries.some((entry) => entry.default)) {\n entries[0] = { ...entries[0], default: true };\n }\n\n return writeApiKeys(entries);\n}\n\nexport function removeApiKey(label: string): { result: ApiKeyResolution; removed: string; newDefault?: string } {\n assertValidApiKeyLabel(label);\n const data = readSharedCredentials();\n const entries = hasOwn(data, API_KEYS_FIELD)\n ? storedEntriesFromFile(data)\n : (() => {\n const legacy = typeof data[API_KEY_FIELD] === \"string\" ? data[API_KEY_FIELD].trim() : \"\";\n return legacy ? [{ label: \"default\", key: legacy, default: true, createdAt: new Date().toISOString() }] : [];\n })();\n const idx = entries.findIndex((entry) => entry.label === label);\n if (idx < 0) {\n throw new YoooclawError(ErrorCode.APIKEY_LABEL_NOT_FOUND, `api-key label 不存在:${label}`, { label });\n }\n const removedDefault = entries[idx].default === true;\n let next = entries.filter((entry) => entry.label !== label);\n if (next.length > 0 && (removedDefault || !next.some((entry) => entry.default))) {\n next = next.map((entry, entryIdx) => ({ ...entry, default: entryIdx === 0 }));\n }\n const result = writeApiKeys(next);\n return { result, removed: label, newDefault: result.label };\n}\n\nexport function setDefaultApiKey(label: string): ApiKeyResolution {\n assertValidApiKeyLabel(label);\n const data = readSharedCredentials();\n const entries = hasOwn(data, API_KEYS_FIELD) ? storedEntriesFromFile(data) : [];\n const idx = entries.findIndex((entry) => entry.label === label);\n if (idx < 0) {\n throw new YoooclawError(ErrorCode.APIKEY_LABEL_NOT_FOUND, `api-key label 不存在:${label}`, { label });\n }\n return writeApiKeys(entries.map((entry) => ({ ...entry, default: entry.label === label })));\n}\n\nexport function maskSecret(value: string | undefined): string | undefined {\n if (!value) return undefined;\n if (value.length <= 8) return \"***\";\n return `${value.slice(0, 4)}***${value.slice(-4)}`;\n}\n\n/** 解析当前 profile 的 gateway token(按 config.auth.tokenRef)。 */\nexport function resolveGatewayToken(config: YoooclawConfig): ResolvedRef {\n return resolveRef(config.auth.tokenRef);\n}\n\n/** 写入/轮换 gateway token(按 config.auth.tokenRef 的 scheme)。 */\nexport function writeGatewayToken(config: YoooclawConfig, value: string): ResolvedRef {\n return writeRef(config.auth.tokenRef, value);\n}\n\n/** 生成一个随机 token(hex)。 */\nexport function generateToken(bytes = 32): string {\n return randomBytes(bytes).toString(\"hex\");\n}\n",
|
|
47
39
|
"/**\n * OS keychain 适配(可选加固,默认不强制)。\n *\n * - macOS:`security`(generic password)\n * - Linux:`secret-tool`(libsecret / Secret Service)\n * - Windows:暂无可明文取回的内置 CLI → 视为不可用,调用方降级到文件\n *\n * 任何工具缺失 / 调用失败都返回 `unavailable`,绝不抛崩溃,保证 CI 无 keychain 时的确定性。\n */\nimport { spawnSync } from \"node:child_process\";\nimport { platform } from \"node:os\";\n\nexport interface KeychainResult {\n available: boolean;\n value?: string;\n}\n\nfunction hasCommand(cmd: string): boolean {\n const probe = spawnSync(process.platform === \"win32\" ? \"where\" : \"which\", [cmd], {\n encoding: \"utf-8\",\n });\n return probe.status === 0;\n}\n\n/** keychain 在当前平台是否可用(工具存在)。 */\nexport function keychainAvailable(): boolean {\n switch (platform()) {\n case \"darwin\":\n return hasCommand(\"security\");\n case \"linux\":\n return hasCommand(\"secret-tool\");\n default:\n return false;\n }\n}\n\n/** 读取 keychain 条目;不可用或未命中返回 { available, value: undefined }。 */\nexport function keychainGet(service: string, account: string): KeychainResult {\n switch (platform()) {\n case \"darwin\": {\n if (!hasCommand(\"security\")) return { available: false };\n const r = spawnSync(\n \"security\",\n [\"find-generic-password\", \"-s\", service, \"-a\", account, \"-w\"],\n { encoding: \"utf-8\" },\n );\n if (r.status !== 0) return { available: true, value: undefined };\n return { available: true, value: r.stdout.replace(/\\n$/, \"\") };\n }\n case \"linux\": {\n if (!hasCommand(\"secret-tool\")) return { available: false };\n const r = spawnSync(\n \"secret-tool\",\n [\"lookup\", \"service\", service, \"account\", account],\n { encoding: \"utf-8\" },\n );\n if (r.status !== 0) return { available: true, value: undefined };\n return { available: true, value: r.stdout.replace(/\\n$/, \"\") };\n }\n default:\n return { available: false };\n }\n}\n\n/** 写入 keychain 条目;返回是否成功。 */\nexport function keychainSet(\n service: string,\n account: string,\n value: string,\n): boolean {\n switch (platform()) {\n case \"darwin\": {\n if (!hasCommand(\"security\")) return false;\n const r = spawnSync(\n \"security\",\n [\"add-generic-password\", \"-U\", \"-s\", service, \"-a\", account, \"-w\", value],\n { encoding: \"utf-8\" },\n );\n return r.status === 0;\n }\n case \"linux\": {\n if (!hasCommand(\"secret-tool\")) return false;\n const r = spawnSync(\n \"secret-tool\",\n [\"store\", \"--label\", `${service}:${account}`, \"service\", service, \"account\", account],\n { encoding: \"utf-8\", input: value },\n );\n return r.status === 0;\n }\n default:\n return false;\n }\n}\n",
|
|
48
40
|
"/**\n * 凭据抽象引用(`*Ref`)解析与写入。\n *\n * 支持 scheme(PRD「config.json 结构」):\n * - env:<VAR> 从环境变量读(最高优先级覆盖)\n * - file:<path>#<jsonField> 从 JSON 文件某字段读/写(默认落点,0600)\n * - keychain:<service>/<acct> 从 OS keychain 读/写(可选加固)\n * - inline:<base64> 直接内嵌(既不支持 keychain 也不便用文件时)\n */\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readJsonFile, writeJsonFile, SECRET_FILE_MODE } from \"../fs-utils.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { keychainGet, keychainSet } from \"./keychain.js\";\n\nexport type RefSource = \"env\" | \"file\" | \"keychain\" | \"inline\";\n\nexport interface ResolvedRef {\n value?: string;\n source: RefSource;\n /** file: scheme 时的具体路径,用于错误诊断。 */\n location?: string;\n}\n\nfunction expandHome(path: string): string {\n if (path === \"~\") return homedir();\n if (path.startsWith(\"~/\")) return join(homedir(), path.slice(2));\n return path;\n}\n\ninterface ParsedFileRef {\n path: string;\n field: string;\n}\ninterface ParsedKeychainRef {\n service: string;\n account: string;\n}\n\nfunction parseFileRef(rest: string): ParsedFileRef {\n const hashIdx = rest.lastIndexOf(\"#\");\n if (hashIdx < 0) {\n throw new YoooclawError(\n \"YOOOCLAW_CONFIG_INVALID\",\n `file: 引用缺少 #字段:${rest}`,\n { hint: \"格式应为 file:<path>#<jsonField>\" },\n );\n }\n return {\n path: expandHome(rest.slice(0, hashIdx)),\n field: rest.slice(hashIdx + 1),\n };\n}\n\nfunction parseKeychainRef(rest: string): ParsedKeychainRef {\n const slashIdx = rest.indexOf(\"/\");\n if (slashIdx < 0) {\n throw new YoooclawError(\n \"YOOOCLAW_CONFIG_INVALID\",\n `keychain: 引用缺少 /account:${rest}`,\n { hint: \"格式应为 keychain:<service>/<account>\" },\n );\n }\n return {\n service: rest.slice(0, slashIdx),\n account: rest.slice(slashIdx + 1),\n };\n}\n\n/** 解析一个 ref,返回当前值(可能 undefined)与来源。 */\nexport function resolveRef(ref: string): ResolvedRef {\n const colonIdx = ref.indexOf(\":\");\n if (colonIdx < 0) {\n throw new YoooclawError(\n \"YOOOCLAW_CONFIG_INVALID\",\n `非法凭据引用:${ref}`,\n { hint: \"支持 env: / file: / keychain: / inline:\" },\n );\n }\n const scheme = ref.slice(0, colonIdx);\n const rest = ref.slice(colonIdx + 1);\n\n switch (scheme) {\n case \"env\": {\n const value = process.env[rest]?.trim();\n return { source: \"env\", value: value || undefined, location: rest };\n }\n case \"file\": {\n const { path, field } = parseFileRef(rest);\n const data = readJsonFile<Record<string, unknown>>(path);\n const value = data?.[field];\n return {\n source: \"file\",\n value: typeof value === \"string\" && value ? value : undefined,\n location: path,\n };\n }\n case \"keychain\": {\n const { service, account } = parseKeychainRef(rest);\n const r = keychainGet(service, account);\n return { source: \"keychain\", value: r.value, location: `${service}/${account}` };\n }\n case \"inline\": {\n const decoded = Buffer.from(rest, \"base64\").toString(\"utf-8\");\n return { source: \"inline\", value: decoded || undefined };\n }\n default:\n throw new YoooclawError(\n \"YOOOCLAW_CONFIG_INVALID\",\n `不支持的凭据引用 scheme:${scheme}`,\n { hint: \"支持 env: / file: / keychain: / inline:\" },\n );\n }\n}\n\n/** 把值写入 ref 指向的后端。env/inline 不可持久写入(抛错)。 */\nexport function writeRef(ref: string, value: string): ResolvedRef {\n const colonIdx = ref.indexOf(\":\");\n const scheme = ref.slice(0, colonIdx);\n const rest = ref.slice(colonIdx + 1);\n\n switch (scheme) {\n case \"file\": {\n const { path, field } = parseFileRef(rest);\n const data = readJsonFile<Record<string, unknown>>(path) ?? {};\n data[field] = value;\n writeJsonFile(path, data, SECRET_FILE_MODE);\n return { source: \"file\", value, location: path };\n }\n case \"keychain\": {\n const { service, account } = parseKeychainRef(rest);\n if (!keychainSet(service, account, value)) {\n throw new YoooclawError(\n \"YOOOCLAW_KEYCHAIN_UNAVAILABLE\",\n `keychain 写入失败:${service}/${account}`,\n { hint: \"当前平台可能没有可用的 keychain 工具,请改用 file: 引用\" },\n );\n }\n return { source: \"keychain\", value, location: `${service}/${account}` };\n }\n case \"env\":\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n \"env: 引用无法持久化写入;请改用 file: 或 keychain:\",\n );\n case \"inline\":\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n \"inline: 引用需直接写进 config,不通过 writeRef\",\n );\n default:\n throw new YoooclawError(\n \"YOOOCLAW_CONFIG_INVALID\",\n `不支持的凭据引用 scheme:${scheme}`,\n );\n }\n}\n",
|
|
49
41
|
"/**\n * config service —— init / show / set / unset。\n */\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { readJsonFile, ensureDir } from \"../fs-utils.js\";\nimport { readStdin, ask, confirm, isInteractive } from \"../prompt.js\";\nimport {\n configExists,\n loadConfig,\n saveConfig,\n coerceConfigValue,\n deepMerge,\n getByPath,\n setByPath,\n unsetByPath,\n maskConfig,\n} from \"../config/store.js\";\nimport { defaultConfig, defaultEvaluator, type YoooclawConfig } from \"../config/schema.js\";\nimport { writeGatewayToken, generateToken, resolveApiKey, setApiKey } from \"../credentials/store.js\";\n\ninterface InitOpts {\n nonInteractive?: boolean;\n fromFile?: string;\n force?: boolean;\n}\n\n/** 手机端配置摘要 + 关键路径,作为 init 的返回结果。 */\nfunction phoneSummary(ctx: CliContext, config: YoooclawConfig, token: string) {\n const apiKey = resolveApiKey();\n return {\n ok: true,\n profile: ctx.profile,\n daemon: {\n // bind/port 由 daemon 自管:默认绑回环,端口被占自动 +1,无需用户配置。\n bind: config.daemon.bind,\n port: config.daemon.port,\n localUrl: `http://${config.daemon.bind}:${config.daemon.port}`,\n },\n relay: {\n url: config.relay.url,\n enabled: config.relay.enabled,\n apiKeyPresent: Boolean(apiKey.value),\n },\n gatewayToken: token,\n configPath: ctx.paths.config,\n hint: apiKey.value\n ? \"已就绪:yc daemon start 后,daemon 会用 api-key 连上 Relay;手机 App 绑定同一账号即可收发\"\n : \"Relay 尚未设置 api-key:运行 yc auth set-api-key <ock_…> 后再 yc daemon start\",\n };\n}\n\nexport async function configInit(\n ctx: CliContext,\n _args: unknown[],\n opts: InitOpts,\n): Promise<unknown> {\n if (configExists(ctx.paths) && !opts.force) {\n throw new YoooclawError(\n \"YOOOCLAW_ALREADY_EXISTS\",\n `profile \\`${ctx.profile}\\` 已初始化`,\n { hint: \"加 --force 覆盖,或换一个 --profile\", checkedPaths: [ctx.paths.config] },\n );\n }\n\n ensureDir(ctx.paths.dir);\n let config = defaultConfig(ctx.paths.credentials);\n\n if (opts.nonInteractive || !isInteractive()) {\n if (!opts.fromFile) {\n throw new YoooclawError(\n \"YOOOCLAW_NOT_INTERACTIVE\",\n \"非交互模式必须提供 --from-file <config.json>(- 为 stdin)\",\n );\n }\n const raw = opts.fromFile === \"-\" ? await readStdin() : undefined;\n const imported = raw\n ? (JSON.parse(raw) as Partial<YoooclawConfig>)\n : readJsonFile<Partial<YoooclawConfig>>(opts.fromFile);\n if (!imported) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", `无法读取配置文件:${opts.fromFile}`);\n }\n config = deepMerge(config, imported);\n config.version = defaultConfig(ctx.paths.credentials).version;\n } else {\n // daemon 监听地址/端口不再让用户配置:默认绑回环,端口被占时 daemon 启动会自动 +1。\n // relay 复用插件那套托管服务(config.relay.url 已是生产地址),用户只需提供 api-key。\n const existing = resolveApiKey();\n if (existing.value) {\n console.error(`已检测到 Relay api-key(来源 ${existing.source}),跳过设置`);\n } else {\n const key = (await ask(\"Relay api-key(ock_… ,留空可稍后 yc auth set-api-key 设置)\")).trim();\n if (key) setApiKey(key, false);\n }\n const enableEval = await confirm(\"启用灯效 webhook 评估器?\", false);\n if (enableEval) {\n const evaluator = defaultEvaluator(ctx.paths.credentials);\n evaluator.webhookUrl = await ask(\"评估器 webhook URL\");\n config.lightRules.evaluator = evaluator;\n }\n }\n\n // 生成并落 gateway token(按 config.auth.tokenRef,默认 per-profile credentials.json)\n const token = generateToken();\n saveConfig(ctx.paths, config);\n writeGatewayToken(config, token);\n\n return phoneSummary(ctx, config, token);\n}\n\ninterface ShowOpts {\n showSecrets?: boolean;\n}\n\nexport async function configShow(\n ctx: CliContext,\n _args: unknown[],\n opts: ShowOpts,\n): Promise<unknown> {\n if (!configExists(ctx.paths)) {\n throw new YoooclawError(\n \"YOOOCLAW_CONFIG_INVALID\",\n `profile \\`${ctx.profile}\\` 尚未初始化`,\n { hint: \"先运行 yoooclaw config init\", checkedPaths: [ctx.paths.config] },\n );\n }\n const config = loadConfig(ctx.paths);\n if (opts.showSecrets) {\n if (!isInteractive()) {\n throw new YoooclawError(\n \"YOOOCLAW_NOT_INTERACTIVE\",\n \"--show-secrets 需要在 TTY 中运行\",\n );\n }\n if (!(await confirm(\"确认明文输出敏感字段?\", false))) {\n throw new YoooclawError(\"YOOOCLAW_CONFIRMATION_REQUIRED\", \"已取消\");\n }\n return config;\n }\n return maskConfig(config);\n}\n\nexport function configSet(\n ctx: CliContext,\n args: unknown[],\n _opts: unknown,\n): unknown {\n const [key, value] = args as [string, string];\n if (key === \"version\") {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"version 字段不可修改\");\n }\n const config = loadConfig(ctx.paths) as unknown as Record<string, unknown>;\n setByPath(config, key, coerceConfigValue(key, value));\n saveConfig(ctx.paths, config as unknown as YoooclawConfig);\n return { ok: true, key, value: getByPath(config, key) };\n}\n\nexport function configUnset(\n ctx: CliContext,\n args: unknown[],\n _opts: unknown,\n): unknown {\n const [key] = args as [string];\n const config = loadConfig(ctx.paths) as unknown as Record<string, unknown>;\n const removed = unsetByPath(config, key);\n if (removed) saveConfig(ctx.paths, config as unknown as YoooclawConfig);\n return { ok: true, key, removed };\n}\n",
|
|
50
42
|
"/**\n * profile service —— list / use / create / delete。\n */\nimport { existsSync, rmSync } from \"node:fs\";\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { writeFileAtomic } from \"../fs-utils.js\";\nimport { confirm } from \"../prompt.js\";\nimport {\n DEFAULT_PROFILE,\n activeProfilePath,\n listProfileNames,\n profilePaths,\n readActiveProfile,\n} from \"../paths.js\";\nimport { configExists } from \"../config/store.js\";\nimport { configInit } from \"./config.js\";\n\nexport function profileList(ctx: CliContext): unknown {\n const active = readActiveProfile() ?? DEFAULT_PROFILE;\n const names = listProfileNames();\n // active / default 即便目录还没建出来也列出来,避免空列表误导\n for (const implied of [active, DEFAULT_PROFILE]) {\n if (!names.includes(implied)) names.push(implied);\n }\n return names\n .sort((a, b) => a.localeCompare(b))\n .map((name) => ({\n name,\n active: name === active,\n initialized: configExists(profilePaths(name)),\n }));\n}\n\nexport function profileUse(_ctx: CliContext, args: unknown[]): unknown {\n const [name] = args as [string];\n const paths = profilePaths(name);\n if (!existsSync(paths.dir)) {\n throw new YoooclawError(\n \"YOOOCLAW_PROFILE_NOT_FOUND\",\n `profile \\`${name}\\` 不存在`,\n { hint: \"用 yoooclaw profile create 新建\", checkedPaths: [paths.dir] },\n );\n }\n writeFileAtomic(activeProfilePath(), `${name}\\n`);\n return { ok: true, active: name };\n}\n\nexport async function profileCreate(\n ctx: CliContext,\n args: unknown[],\n opts: Record<string, unknown>,\n): Promise<unknown> {\n const [name] = args as [string];\n const paths = profilePaths(name);\n if (configExists(paths)) {\n throw new YoooclawError(\n \"YOOOCLAW_ALREADY_EXISTS\",\n `profile \\`${name}\\` 已存在`,\n );\n }\n // 在目标 profile 的上下文里跑 init 向导\n const subCtx: CliContext = { ...ctx, profile: name, paths };\n return configInit(subCtx, [], opts as never);\n}\n\nexport async function profileDelete(\n ctx: CliContext,\n args: unknown[],\n opts: { yes?: boolean },\n): Promise<unknown> {\n const [name] = args as [string];\n const active = readActiveProfile() ?? DEFAULT_PROFILE;\n if (name === active) {\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n `不能删除当前 active profile \\`${name}\\``,\n { hint: \"先 yoooclaw profile use <其他 profile> 再删除\" },\n );\n }\n const paths = profilePaths(name);\n if (!existsSync(paths.dir)) {\n throw new YoooclawError(\"YOOOCLAW_PROFILE_NOT_FOUND\", `profile \\`${name}\\` 不存在`);\n }\n if (!opts.yes && !(await confirm(`确认删除 profile \\`${name}\\` 及其全部数据?`, false))) {\n throw new YoooclawError(\"YOOOCLAW_CONFIRMATION_REQUIRED\", \"已取消\");\n }\n rmSync(paths.dir, { recursive: true, force: true });\n return { ok: true, deleted: name };\n}\n",
|
|
51
43
|
"/**\n * daemon 进程锁(单实例保护)。\n *\n * daemon.lock 内容:{ pid, startedAt, bind, port, logLevel }。\n * 通过 `process.kill(pid, 0)` 探活;陈旧锁(进程已死)会被视为未运行。\n */\nimport { existsSync, rmSync } from \"node:fs\";\nimport type { ProfilePaths } from \"../paths.js\";\nimport { readJsonFile, writeJsonFile } from \"../fs-utils.js\";\n\nexport interface DaemonLock {\n pid: number;\n startedAt: string;\n bind: string;\n port: number;\n logLevel?: string;\n}\n\n/** 进程是否存活(signal 0 探测)。 */\nexport function isProcessAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n // EPERM = 存在但无权限(仍算存活);ESRCH = 不存在\n return (err as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\nexport function readLock(paths: ProfilePaths): DaemonLock | undefined {\n if (!existsSync(paths.daemonLock)) return undefined;\n return readJsonFile<DaemonLock>(paths.daemonLock);\n}\n\nexport interface DaemonRunningState {\n running: boolean;\n lock?: DaemonLock;\n /** 锁存在但进程已死。 */\n stale: boolean;\n}\n\nexport function daemonState(paths: ProfilePaths): DaemonRunningState {\n const lock = readLock(paths);\n if (!lock) return { running: false, stale: false };\n const alive = isProcessAlive(lock.pid);\n return { running: alive, lock, stale: !alive };\n}\n\nexport function writeLock(paths: ProfilePaths, lock: DaemonLock): void {\n writeJsonFile(paths.daemonLock, lock);\n}\n\nexport function removeLock(paths: ProfilePaths): void {\n rmSync(paths.daemonLock, { force: true });\n}\n",
|
|
52
44
|
"/**\n * daemon ↔ CLI 客户端的内部 RPC(localhost HTTP)。\n *\n * 鉴权:从 config.auth.tokenRef 解析 gateway token,加 `Authorization: Bearer`。\n * daemon 未运行(连接被拒)时统一抛 YOOOCLAW_DAEMON_NOT_RUNNING。\n */\nimport type { ProfilePaths } from \"../paths.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { loadConfig } from \"../config/store.js\";\nimport { resolveGatewayToken } from \"../credentials/store.js\";\nimport { daemonState } from \"./lock.js\";\n\nexport interface DaemonClientOptions {\n /** 覆盖 base URL(默认按 lock / config 推导)。 */\n baseUrl?: string;\n timeoutMs?: number;\n}\n\nexport class DaemonClient {\n readonly baseUrl: string;\n private readonly token?: string;\n private readonly timeoutMs: number;\n\n constructor(\n private readonly paths: ProfilePaths,\n opts: DaemonClientOptions = {},\n ) {\n const config = loadConfig(paths);\n const state = daemonState(paths);\n const bind = state.lock?.bind ?? config.daemon.bind;\n // 0.0.0.0 监听时,本机用 127.0.0.1 连接\n const host = bind === \"0.0.0.0\" ? \"127.0.0.1\" : bind;\n const port = state.lock?.port ?? config.daemon.port;\n this.baseUrl = opts.baseUrl ?? `http://${host}:${port}`;\n this.token = resolveGatewayToken(config).value;\n this.timeoutMs = opts.timeoutMs ?? 10_000;\n }\n\n async request<T = unknown>(\n method: string,\n path: string,\n body?: unknown,\n extraHeaders?: Record<string, string>,\n ): Promise<{ status: number; body: T }> {\n const headers: Record<string, string> = { ...extraHeaders };\n if (this.token) headers[\"Authorization\"] = `Bearer ${this.token}`;\n let payload: string | undefined;\n if (body !== undefined) {\n headers[\"Content-Type\"] ??= \"application/json\";\n payload = typeof body === \"string\" ? body : JSON.stringify(body);\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n let res: Response;\n try {\n res = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: payload,\n signal: controller.signal,\n });\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ECONNREFUSED\" || (err as Error).name === \"AbortError\") {\n throw new YoooclawError(\n \"YOOOCLAW_DAEMON_NOT_RUNNING\",\n \"daemon 未启动或无响应\",\n { hint: \"先执行 yoooclaw daemon start\", baseUrl: this.baseUrl },\n );\n }\n throw new YoooclawError(\"YOOOCLAW_NETWORK_ERROR\", `调用 daemon 失败:${(err as Error).message}`);\n } finally {\n clearTimeout(timer);\n }\n\n const text = await res.text();\n let parsed: unknown = text;\n if (text) {\n try {\n parsed = JSON.parse(text);\n } catch {\n /* 非 JSON 响应原样返回 */\n }\n }\n if (res.status === 401 || res.status === 403) {\n throw new YoooclawError(\"YOOOCLAW_UNAUTHORIZED\", \"daemon 拒绝鉴权(token 不一致)\", {\n status: res.status,\n });\n }\n return { status: res.status, body: parsed as T };\n }\n\n get<T = unknown>(path: string): Promise<{ status: number; body: T }> {\n return this.request<T>(\"GET\", path);\n }\n\n post<T = unknown>(path: string, body?: unknown): Promise<{ status: number; body: T }> {\n return this.request<T>(\"POST\", path, body);\n }\n}\n\n/** 确保 daemon 在运行,否则抛 DAEMON_NOT_RUNNING(用于 🟡 命令前置检查)。 */\nexport function assertDaemonRunning(paths: ProfilePaths): void {\n const state = daemonState(paths);\n if (!state.running) {\n throw new YoooclawError(\n \"YOOOCLAW_DAEMON_NOT_RUNNING\",\n \"daemon 未运行\",\n { hint: \"先执行 yoooclaw daemon start\", stale: state.stale },\n );\n }\n}\n",
|
|
53
|
-
"/**\n * auth service —— set-api-key / status / token-rotate / check。\n */\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { readStdin } from \"../prompt.js\";\nimport { loadConfig, configExists } from \"../config/store.js\";\nimport {\n resolveApiKey,\n setApiKey,\n resolveGatewayToken,\n writeGatewayToken,\n generateToken,\n} from \"../credentials/store.js\";\nimport { daemonState } from \"../daemon/lock.js\";\nimport { DaemonClient, assertDaemonRunning } from \"../daemon/client.js\";\n\
|
|
54
|
-
"/**\n * 通知查询 —— 复用 phone-notifications 共享的匹配/收集逻辑,CLI 侧负责参数解析与错误。\n */\nimport { existsSync } from \"node:fs\";\nimport type { ProfilePaths } from \"../paths.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport {\n collectMatchingNotifications,\n type NotificationQueryOptions,\n type StoredNotification,\n} from \"../shared.js\";\n\nconst ISO_RE =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,3})?)?(Z|[+-]\\d{2}:\\d{2})$/;\n\nfunction parseIso(value: string, name: string): number {\n if (!ISO_RE.test(value)) {\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n `${name} 必须是 ISO 8601 时间,例如 2026-03-01T09:00:00+08:00`,\n );\n }\n const ts = Date.parse(value);\n if (Number.isNaN(ts)) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", `${name} 不是合法时间`);\n }\n return ts;\n}\n\nfunction parseLimit(raw: string | undefined, fallback: number): number {\n if (raw === undefined) return fallback;\n if (!/^\\d+$/.test(raw) || Number(raw) <= 0) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--limit 必须是大于 0 的整数\");\n }\n return Number(raw);\n}\n\nexport interface RawQueryOpts {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n limit?: string;\n}\n\nexport function buildQueryOptions(\n opts: RawQueryOpts,\n defaultLimit = 100,\n): NotificationQueryOptions {\n if (\n opts.conversationType &&\n opts.conversationType !== \"group\" &&\n opts.conversationType !== \"private\"\n ) {\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n \"--conversation-type 只能是 group 或 private\",\n );\n }\n const fromTs = opts.from ? parseIso(opts.from, \"--from\") : null;\n const toTs = opts.to ? parseIso(opts.to, \"--to\") : null;\n if (fromTs !== null && toTs !== null && fromTs > toTs) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--from 不能晚于 --to\");\n }\n return {\n from: opts.from,\n to: opts.to,\n app: opts.app,\n sender: opts.sender,\n conversationType: opts.conversationType,\n keyword: opts.keyword,\n limit: parseLimit(opts.limit, defaultLimit),\n fromTs,\n toTs,\n fromDateKey: opts.from ? opts.from.slice(0, 10) : null,\n toDateKey: opts.to ? opts.to.slice(0, 10) : null,\n };\n}\n\n/** 收集匹配的通知;通知目录不存在时返回空数组(无 daemon / 尚无数据是正常态)。 */\nexport async function queryNotifications(\n paths: ProfilePaths,\n options: NotificationQueryOptions,\n): Promise<StoredNotification[]> {\n if (!existsSync(paths.notifications)) return [];\n return collectMatchingNotifications(paths.notifications, options);\n}\n",
|
|
55
|
-
"import { existsSync, readFileSync, readdirSync, mkdirSync } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { StoredNotification } from \"../notification/storage.js\";\n\n/**\n * Minimal Commander.js Command interface.\n * The real `Command` instance comes from the openclaw runtime at registration time;\n * we only declare the subset we use so that `commander` need not be a direct dep.\n */\nexport interface CliCommand {\n command(nameAndArgs: string): CliCommand;\n description(str: string): CliCommand;\n version(str: string, flags?: string, description?: string): CliCommand;\n option(flags: string, description: string, defaultValue?: string): CliCommand;\n requiredOption(flags: string, description: string): CliCommand;\n action(fn: (...args: any[]) => void | Promise<void>): CliCommand;\n}\n\nexport interface CliContext {\n workspaceDir?: string;\n stateDir?: string;\n}\n\n/** Resolve the notifications storage directory (stateDir → workspace fallback) */\nexport function resolveNotificationsDir(ctx: CliContext): string | null {\n if (ctx.stateDir) {\n const dir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n \"notifications\",\n );\n if (existsSync(dir)) return dir;\n }\n if (ctx.workspaceDir) {\n const dir = join(ctx.workspaceDir, \"notifications\");\n if (existsSync(dir)) return dir;\n }\n return null;\n}\n\n/** List available date keys (YYYY-MM-DD) sorted descending */\nexport function listDateKeys(dir: string): string[] {\n const pattern = /^(\\d{4}-\\d{2}-\\d{2})\\.json$/;\n const keys: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isFile()) continue;\n const m = pattern.exec(entry.name);\n if (m) keys.push(m[1]);\n }\n return keys.sort().reverse();\n}\n\n/** Read notifications for a specific date */\nexport function readDateFile(\n dir: string,\n dateKey: string,\n): StoredNotification[] {\n const filePath = join(dir, `${dateKey}.json`);\n if (!existsSync(filePath)) return [];\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch {\n return [];\n }\n}\n\n/** Format today as YYYY-MM-DD */\nexport function today(): string {\n return formatDate(new Date());\n}\n\n/** Format a Date as YYYY-MM-DD */\nexport function formatDate(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${day}`;\n}\n\n/** Get date N days ago as YYYY-MM-DD */\nexport function daysAgo(n: number): string {\n const d = new Date();\n d.setDate(d.getDate() - n);\n return formatDate(d);\n}\n\n/** Filter date keys to a [from, to] range (inclusive) */\nexport function filterDateRange(\n keys: string[],\n from: string,\n to: string,\n): string[] {\n return keys.filter((k) => k >= from && k <= to);\n}\n\n/** Parse an ISO 8601 timestamp and exit with a CLI error on invalid input */\nexport function parseIsoTime(\n value: string,\n optionName: \"--from\" | \"--to\",\n): number {\n const isoPattern =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,3})?)?(Z|[+-]\\d{2}:\\d{2})$/;\n if (!isoPattern.test(value)) {\n exitError(\n \"INVALID_TIME\",\n `${optionName} 必须是 ISO 8601 时间,例如 2026-03-01T09:00:00+08:00`,\n );\n }\n\n const ts = Date.parse(value);\n if (Number.isNaN(ts)) {\n exitError(\n \"INVALID_TIME\",\n `${optionName} 不是合法时间,例如 2026-03-01T09:00:00+08:00`,\n );\n }\n return ts;\n}\n\n/** Sort notifications by timestamp descending (newest first) */\nexport function sortNotificationsByTimestampDesc(\n items: StoredNotification[],\n): StoredNotification[] {\n return items.sort((a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp));\n}\n\nconst APP_ALIAS_GROUPS = [\n [\"微信\", \"wechat\", \"weixin\", \"com.tencent.mm\", \"com.tencent.xin\"],\n [\"企业微信\", \"wecom\", \"wxwork\", \"com.tencent.wework\"],\n [\"飞书\", \"feishu\", \"lark\", \"com.ss.android.lark\", \"com.bytedance.ee.lark\", \"com.larksuite.suite\"],\n [\"钉钉\", \"dingtalk\", \"com.alibaba.android.rimet\"],\n [\"qq\", \"腾讯qq\", \"com.tencent.mobileqq\"],\n];\n\nfunction normalizeLookupText(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction appAliasGroup(value: string): string[] | null {\n const normalized = normalizeLookupText(value);\n if (!normalized) return null;\n return APP_ALIAS_GROUPS.find((group) =>\n group.some((candidate) => normalizeLookupText(candidate) === normalized),\n ) ?? null;\n}\n\nexport function matchesNotificationAppFilter(\n item: StoredNotification,\n app: string,\n): boolean {\n const filter = normalizeLookupText(app);\n if (!filter) return true;\n\n const candidates = [item.appName, item.appDisplayName]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0);\n if (candidates.some((candidate) => normalizeLookupText(candidate) === filter)) {\n return true;\n }\n\n const filterGroup = appAliasGroup(app);\n if (!filterGroup) return false;\n return candidates.some((candidate) => appAliasGroup(candidate) === filterGroup);\n}\n\n/** Async version of listDateKeys */\nexport async function listDateKeysAsync(dir: string): Promise<string[]> {\n const pattern = /^(\\d{4}-\\d{2}-\\d{2})\\.json$/;\n const keys: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n const m = pattern.exec(entry.name);\n if (m) keys.push(m[1]);\n }\n return keys.sort().reverse();\n}\n\n/** Async version of readDateFile */\nexport async function readDateFileAsync(\n dir: string,\n dateKey: string,\n): Promise<StoredNotification[]> {\n const filePath = join(dir, `${dateKey}.json`);\n if (!existsSync(filePath)) return [];\n try {\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return [];\n }\n}\n\n/** Write progress message to stderr (visible to caller, won't pollute JSON stdout) */\nexport function progress(message: string): void {\n process.stderr.write(message + \"\\n\");\n}\n\n/** Print JSON result to stdout */\nexport function output(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\n/** Print error JSON and exit with code 1 */\nexport function exitError(code: string, message: string): never {\n output({ ok: false, error: { code, message } });\n process.exit(1);\n}\n\n/** Resolve the recordings storage directory (stateDir → workspace fallback) */\nexport function resolveRecordingsDir(ctx: CliContext): string | null {\n if (ctx.stateDir) {\n const dir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n \"recordings\",\n );\n if (existsSync(dir)) return dir;\n }\n if (ctx.workspaceDir) {\n const dir = join(ctx.workspaceDir, \"recordings\");\n if (existsSync(dir)) return dir;\n }\n return null;\n}\n\n/** Recording index entry (mirrors RecordingIndexEntry from storage.ts) */\nexport interface CliRecordingEntry {\n id: string;\n metadata: {\n name: string;\n duration_sec: number;\n file_size_bytes: number;\n created_at: string;\n transfer_status: string;\n [key: string]: unknown;\n };\n status: string;\n audioFile?: string;\n srtFile?: string;\n transcriptDataFile?: string;\n transcriptFile?: string;\n summaryFile?: string;\n title?: string;\n lastError?: string;\n ingestedAt: string;\n updatedAt: string;\n}\n\n/** Resolve the asr-config.json path; creates parent dirs if needed */\nexport function resolveAsrConfigPath(ctx: CliContext): string {\n let base: string;\n if (ctx.stateDir) {\n base = join(ctx.stateDir, \"plugins\", \"phone-notifications\", \"recordings\");\n } else if (ctx.workspaceDir) {\n base = join(ctx.workspaceDir, \"recordings\");\n } else {\n exitError(\n \"STORAGE_UNAVAILABLE\",\n \"无法确定录音存储目录:stateDir 和 workspaceDir 均未设置\",\n );\n }\n mkdirSync(base, { recursive: true });\n return join(base, \"asr-config.json\");\n}\n\n/** Mask an API key, keeping first 4 and last 4 chars */\nexport function maskApiKey(key: string): string {\n if (key.length <= 8) return \"***\";\n return `${key.slice(0, 4)}***${key.slice(-4)}`;\n}\n\n/** Read recording index.json */\nexport function readRecordingIndex(\n dir: string,\n): CliRecordingEntry[] {\n const indexPath = join(dir, \"index.json\");\n if (!existsSync(indexPath)) return [];\n try {\n const raw = JSON.parse(readFileSync(indexPath, \"utf-8\"));\n return Array.isArray(raw?.recordings) ? raw.recordings : [];\n } catch {\n return [];\n }\n}\n",
|
|
56
|
-
"import type { StoredNotification } from \"../notification/storage.js\";\nimport {\n exitError,\n listDateKeysAsync,\n parseIsoTime,\n readDateFileAsync,\n sortNotificationsByTimestampDesc,\n matchesNotificationAppFilter,\n} from \"./helpers.js\";\n\nexport interface RawNotificationQueryOptions {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n limit?: string;\n}\n\nexport interface NotificationQueryOptions {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n limit: number;\n fromTs: number | null;\n toTs: number | null;\n fromDateKey: string | null;\n toDateKey: string | null;\n}\n\nexport function parsePositiveIntegerOption(\n rawValue: string | undefined,\n defaultValue: number,\n optionName: string,\n errorCode: string,\n): number {\n const value = rawValue && rawValue.length > 0 ? rawValue : String(defaultValue);\n if (!/^\\d+$/.test(value)) {\n exitError(errorCode, `${optionName} 必须是大于 0 的整数`);\n }\n\n const parsed = Number.parseInt(value, 10);\n if (parsed <= 0) {\n exitError(errorCode, `${optionName} 必须是大于 0 的整数`);\n }\n return parsed;\n}\n\nexport function parseNotificationQueryOptions(\n opts: RawNotificationQueryOptions,\n defaultLimit = 100,\n): NotificationQueryOptions {\n const limit = parsePositiveIntegerOption(\n opts.limit,\n defaultLimit,\n \"--limit\",\n \"INVALID_LIMIT\",\n );\n\n if (\n opts.conversationType\n && opts.conversationType !== \"group\"\n && opts.conversationType !== \"private\"\n ) {\n exitError(\n \"INVALID_CONVERSATION_TYPE\",\n \"--conversation-type 只能是 group 或 private\",\n );\n }\n\n const hasFrom = typeof opts.from === \"string\" && opts.from.length > 0;\n const hasTo = typeof opts.to === \"string\" && opts.to.length > 0;\n const fromTs = hasFrom ? parseIsoTime(opts.from!, \"--from\") : null;\n const toTs = hasTo ? parseIsoTime(opts.to!, \"--to\") : null;\n\n if (fromTs !== null && toTs !== null && fromTs > toTs) {\n exitError(\"INVALID_TIME_RANGE\", \"--from 不能晚于 --to\");\n }\n\n return {\n from: opts.from,\n to: opts.to,\n app: opts.app,\n sender: opts.sender,\n conversationType: opts.conversationType,\n keyword: opts.keyword,\n limit,\n fromTs,\n toTs,\n fromDateKey: hasFrom ? opts.from!.slice(0, 10) : null,\n toDateKey: hasTo ? opts.to!.slice(0, 10) : null,\n };\n}\n\nexport function matchesNotificationQuery(\n item: StoredNotification,\n opts: NotificationQueryOptions,\n): boolean {\n if (opts.app && !matchesNotificationAppFilter(item, opts.app)) return false;\n if (\n opts.conversationType\n && item.conversationType !== opts.conversationType\n ) {\n return false;\n }\n\n const senderHaystack = [item.senderName, item.title]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\");\n if (opts.sender && !senderHaystack.includes(opts.sender)) return false;\n\n const keywordHaystack = [\n item.title,\n item.content,\n item.senderName,\n item.conversationName,\n ]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\");\n if (opts.keyword && !keywordHaystack.includes(opts.keyword)) return false;\n\n const itemTs = Date.parse(item.timestamp);\n if (Number.isNaN(itemTs)) return false;\n if (opts.fromTs !== null && itemTs < opts.fromTs) return false;\n if (opts.toTs !== null && itemTs > opts.toTs) return false;\n\n return true;\n}\n\nexport async function collectMatchingNotifications(\n dir: string,\n opts: NotificationQueryOptions,\n): Promise<StoredNotification[]> {\n const keys = await listDateKeysAsync(dir);\n const results: StoredNotification[] = [];\n const canStopAfterLimit = opts.fromTs === null && opts.toTs === null;\n\n for (const dateKey of keys) {\n if (opts.fromDateKey && dateKey < opts.fromDateKey) continue;\n if (opts.toDateKey && dateKey > opts.toDateKey) continue;\n\n const items = sortNotificationsByTimestampDesc([\n ...(await readDateFileAsync(dir, dateKey)),\n ]);\n for (const item of items) {\n if (!matchesNotificationQuery(item, opts)) continue;\n results.push(item);\n if (canStopAfterLimit && results.length >= opts.limit) {\n return results;\n }\n }\n }\n\n return sortNotificationsByTimestampDesc(results).slice(0, opts.limit);\n}\n",
|
|
57
|
-
"import {\n accessSync,\n mkdirSync,\n appendFileSync,\n readdirSync,\n readFileSync,\n writeFileSync,\n existsSync,\n rmSync,\n constants,\n} from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport type { PluginConfig, RawNotification } from \"../types.js\";\nimport { normalizeFeishuFields } from \"./feishu-normalize.js\";\n\ninterface Logger {\n info: (message: string) => void;\n warn: (message: string) => void;\n}\n\nexport type NotificationConversationType = \"private\" | \"group\";\n\nexport interface StorageContext {\n stateDir: string;\n workspaceDir?: string;\n}\n\n/** Stored notification entry (JSON format, append-only) */\nexport interface StoredNotification {\n /** 包名 */\n appName: string;\n /** 应用显示名(由映射补全),缺省时与 appName 一致 */\n appDisplayName?: string;\n title: string;\n content: string;\n /** ISO 8601 with timezone, e.g. \"2026-03-02T08:30:00+08:00\" */\n timestamp: string;\n /**\n * 结构化发送人。当前主要用于飞书消息:\n * iOS 通知里 title 通常是发送人,subtitle 用来区分群聊名。\n */\n senderName?: string;\n /** 结构化会话类型。当前主要用于飞书消息区分群聊/私聊。 */\n conversationType?: NotificationConversationType;\n /** 结构化会话名。当前主要用于飞书群聊名(通常来自 subtitle)。 */\n conversationName?: string;\n}\n\nconst NOTIFICATION_DIR_NAME = \"notifications\";\nconst ID_INDEX_DIR_NAME = \".ids\";\nconst CONTENT_KEY_INDEX_DIR_NAME = \".keys\";\n\nexport interface NotificationIngestResult {\n received: number;\n ingested: number;\n dedupedById: number;\n dedupedByContent: number;\n invalid: number;\n /**\n * 本次 ingest 实际新写入的条目(去重 / 非法之后的产物)。\n * 用于后续事件驱动链路(如 light-rule agent 评估)拿到本次新增的通知列表,\n * 不需要重新读盘。\n */\n inserted: StoredNotification[];\n}\n\ntype WriteOutcome =\n | { kind: \"ingested\"; entry: StoredNotification }\n | { kind: \"dedupedById\" }\n | { kind: \"dedupedByContent\" }\n | { kind: \"invalid\" };\n\nexport function getStateFallbackNotificationDir(stateDir: string): string {\n return join(stateDir, \"plugins\", \"phone-notifications\", NOTIFICATION_DIR_NAME);\n}\n\nfunction computeLagMs(timestamp: string | undefined): number | null {\n if (!timestamp) return null;\n const t = new Date(timestamp).getTime();\n if (Number.isNaN(t)) return null;\n return Date.now() - t;\n}\n\nfunction buildFallbackContent(n: RawNotification): string {\n const body = n.body?.trim();\n if (body) {\n return body;\n }\n\n const fallback: string[] = [];\n if (n.category) {\n fallback.push(`category:${n.category}`);\n }\n if (n.metadata && Object.keys(n.metadata).length > 0) {\n fallback.push(`metadata:${JSON.stringify(n.metadata)}`);\n }\n return fallback.join(\" ; \") || \"-\";\n}\n\nfunction ensureWritableDirectory(dir: string): boolean {\n try {\n mkdirSync(dir, { recursive: true });\n accessSync(dir, constants.R_OK | constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function resolveNotificationStorageDir(\n ctx: StorageContext,\n logger: Pick<Logger, \"info\" | \"warn\">,\n): string {\n // 优先使用 stateDir(插件私有稳定路径),避免通知随 workspace 切换而分散\n const stateNotifDir = getStateFallbackNotificationDir(ctx.stateDir);\n\n if (ensureWritableDirectory(stateNotifDir)) {\n logger.info(`通知将写入 stateDir 路径: ${stateNotifDir}`);\n return stateNotifDir;\n }\n\n // stateDir 不可用时回退到 workspaceDir\n if (ctx.workspaceDir) {\n const workspaceDir = join(ctx.workspaceDir, NOTIFICATION_DIR_NAME);\n if (ensureWritableDirectory(workspaceDir)) {\n logger.warn(\n `stateDir 不可用,通知已回退到 workspace 路径: ${workspaceDir}`,\n );\n return workspaceDir;\n }\n }\n\n throw new Error(`通知存储目录不可用: ${stateNotifDir}`);\n}\n\n/** 包名 → 应用显示名(异步,未命中时内部可拉取后返回);不提供则落库仅用 appName */\nexport type ResolveDisplayName = (packageName: string) => Promise<string>;\n\nexport class NotificationStorage {\n private dir: string;\n private idIndexDir: string;\n private contentKeyIndexDir: string;\n private idCache = new Map<string, Set<string>>();\n private contentKeyCache = new Map<string, Set<string>>();\n private dateWriteChains = new Map<string, Promise<void>>();\n private resolveDisplayName: ResolveDisplayName | undefined;\n\n constructor(\n dir: string,\n private config: PluginConfig,\n private logger: Logger,\n resolveDisplayName?: ResolveDisplayName,\n ) {\n this.dir = dir;\n this.idIndexDir = join(dir, ID_INDEX_DIR_NAME);\n this.contentKeyIndexDir = join(dir, CONTENT_KEY_INDEX_DIR_NAME);\n this.resolveDisplayName = resolveDisplayName;\n }\n\n async init() {\n mkdirSync(this.dir, { recursive: true });\n mkdirSync(this.idIndexDir, { recursive: true });\n rmSync(this.contentKeyIndexDir, { recursive: true, force: true });\n mkdirSync(this.contentKeyIndexDir, { recursive: true });\n }\n\n async ingest(\n items: RawNotification[],\n ingestId?: string,\n ): Promise<NotificationIngestResult> {\n const result: NotificationIngestResult = {\n received: items.length,\n ingested: 0,\n dedupedById: 0,\n dedupedByContent: 0,\n invalid: 0,\n inserted: [],\n };\n\n const traceTag = ingestId ? `[${ingestId}]` : \"\";\n for (const n of items) {\n const outcome = await this.writeNotification(n);\n const lagMs = computeLagMs(n.timestamp);\n const lagPart = lagMs === null ? \"lag=?\" : `lag=${lagMs}ms`;\n this.logger.info(\n `ingest${traceTag}: app=${n.app ?? \"Unknown\"} id=${n.id ?? \"-\"} ts=${n.timestamp} ${lagPart} outcome=${outcome.kind}`,\n );\n switch (outcome.kind) {\n case \"ingested\":\n result.ingested += 1;\n result.inserted.push(outcome.entry);\n break;\n case \"dedupedById\":\n result.dedupedById += 1;\n break;\n case \"dedupedByContent\":\n result.dedupedByContent += 1;\n break;\n case \"invalid\":\n result.invalid += 1;\n break;\n }\n }\n this.prune();\n return result;\n }\n\n private async writeNotification(n: RawNotification): Promise<WriteOutcome> {\n const ts = new Date(n.timestamp);\n if (Number.isNaN(ts.getTime())) {\n this.logger.warn(`忽略非法 timestamp 的通知: ${n.id}`);\n return { kind: \"invalid\" };\n }\n\n const dateKey = this.formatDate(ts);\n const filePath = join(this.dir, `${dateKey}.json`);\n const normalizedId = typeof n.id === \"string\" ? n.id.trim() : \"\";\n const entry = this.buildStoredNotification(n);\n\n return this.withDateWriteLock(dateKey, async () => {\n if (normalizedId && this.hasNotificationId(dateKey, normalizedId)) {\n return { kind: \"dedupedById\" };\n }\n\n if (this.hasNotificationContentKey(dateKey, filePath, entry)) {\n return { kind: \"dedupedByContent\" };\n }\n\n const appDisplayName = this.resolveDisplayName\n ? await this.resolveDisplayName(entry.appName)\n : entry.appName;\n\n const storedEntry: StoredNotification = {\n ...entry,\n appDisplayName,\n };\n\n const arr = this.readStoredNotifications(filePath);\n arr.push(storedEntry);\n writeFileSync(filePath, JSON.stringify(arr, null, 2), \"utf-8\");\n\n if (normalizedId) {\n this.recordNotificationId(dateKey, normalizedId);\n }\n this.recordNotificationContentKey(dateKey, filePath, storedEntry);\n return { kind: \"ingested\", entry: storedEntry };\n });\n }\n\n private buildStoredNotification(n: RawNotification): StoredNotification {\n const appName = typeof n.app === \"string\" && n.app ? n.app : \"Unknown\";\n const feishu = normalizeFeishuFields(n);\n if (feishu) {\n return {\n appName,\n title: feishu.title,\n content: feishu.content || buildFallbackContent(n),\n timestamp: n.timestamp,\n ...feishu.structured,\n };\n }\n return {\n appName,\n title: typeof n.title === \"string\" ? n.title : \"\",\n content: buildFallbackContent(n),\n timestamp: n.timestamp,\n };\n }\n\n private formatDate(d: Date): string {\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n }\n\n private getIdIndexPath(dateKey: string): string {\n return join(this.idIndexDir, `${dateKey}.ids`);\n }\n\n private getIdSet(dateKey: string): Set<string> {\n const cached = this.idCache.get(dateKey);\n if (cached) {\n return cached;\n }\n\n const idPath = this.getIdIndexPath(dateKey);\n const ids = new Set<string>();\n if (existsSync(idPath)) {\n const lines = readFileSync(idPath, \"utf-8\").split(/\\r?\\n/);\n for (const line of lines) {\n const id = line.trim();\n if (id) {\n ids.add(id);\n }\n }\n }\n\n this.idCache.set(dateKey, ids);\n return ids;\n }\n\n private hasNotificationId(dateKey: string, id: string): boolean {\n return this.getIdSet(dateKey).has(id);\n }\n\n private getContentKeyIndexPath(dateKey: string): string {\n return join(this.contentKeyIndexDir, `${dateKey}.keys`);\n }\n\n private getContentKeySet(dateKey: string, filePath: string): Set<string> {\n const cached = this.contentKeyCache.get(dateKey);\n if (cached) {\n return cached;\n }\n\n const keyPath = this.getContentKeyIndexPath(dateKey);\n const keys = new Set<string>();\n\n if (existsSync(filePath)) {\n for (const item of this.readStoredNotifications(filePath)) {\n keys.add(this.buildNotificationContentKey(item));\n }\n }\n\n if (keys.size > 0) {\n writeFileSync(keyPath, `${Array.from(keys).join(\"\\n\")}\\n`, \"utf-8\");\n } else if (existsSync(keyPath)) {\n rmSync(keyPath, { force: true });\n }\n\n this.contentKeyCache.set(dateKey, keys);\n return keys;\n }\n\n private hasNotificationContentKey(\n dateKey: string,\n filePath: string,\n entry: Pick<StoredNotification, \"appName\" | \"title\" | \"content\" | \"timestamp\">,\n ): boolean {\n return this.getContentKeySet(dateKey, filePath).has(\n this.buildNotificationContentKey(entry),\n );\n }\n\n private recordNotificationId(dateKey: string, id: string) {\n const ids = this.getIdSet(dateKey);\n if (ids.has(id)) {\n return;\n }\n\n appendFileSync(this.getIdIndexPath(dateKey), `${id}\\n`, \"utf-8\");\n ids.add(id);\n }\n\n private recordNotificationContentKey(\n dateKey: string,\n filePath: string,\n entry: Pick<StoredNotification, \"appName\" | \"title\" | \"content\" | \"timestamp\">,\n ) {\n const keys = this.getContentKeySet(dateKey, filePath);\n const key = this.buildNotificationContentKey(entry);\n\n if (keys.has(key)) {\n return;\n }\n\n appendFileSync(this.getContentKeyIndexPath(dateKey), `${key}\\n`, \"utf-8\");\n keys.add(key);\n }\n\n private buildNotificationContentKey(\n entry: Pick<StoredNotification, \"appName\" | \"title\" | \"content\" | \"timestamp\">,\n ): string {\n return createHash(\"sha256\")\n .update(entry.appName)\n .update(\"\\x1f\")\n .update(entry.title)\n .update(\"\\x1f\")\n .update(entry.content)\n .update(\"\\x1f\")\n .update(entry.timestamp)\n .digest(\"hex\");\n }\n\n private readStoredNotifications(filePath: string): StoredNotification[] {\n if (!existsSync(filePath)) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n private async withDateWriteLock<T>(\n dateKey: string,\n task: () => Promise<T>,\n ): Promise<T> {\n const previous = this.dateWriteChains.get(dateKey) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const chain = previous.then(() => current);\n this.dateWriteChains.set(dateKey, chain);\n\n await previous;\n try {\n return await task();\n } finally {\n release();\n if (this.dateWriteChains.get(dateKey) === chain) {\n this.dateWriteChains.delete(dateKey);\n }\n }\n }\n\n private prune() {\n const retentionDays = this.config.retentionDays;\n if (retentionDays === undefined) {\n return;\n }\n\n const cutoffMs = Date.now() - retentionDays * 24 * 60 * 60 * 1000;\n const cutoffDate = this.formatDate(new Date(cutoffMs));\n\n this.pruneDataFiles(cutoffDate);\n this.pruneIdIndex(cutoffDate);\n this.pruneContentKeyIndex(cutoffDate);\n }\n\n /** Remove expired .json, legacy .md files, and legacy date directories */\n private pruneDataFiles(cutoffDate: string) {\n const dateFilePattern = /^(\\d{4}-\\d{2}-\\d{2})\\.(json|md)$/;\n const dateDirPattern = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n try {\n for (const entry of readdirSync(this.dir, { withFileTypes: true })) {\n if (entry.isFile()) {\n const match = dateFilePattern.exec(entry.name);\n if (match && match[1] < cutoffDate) {\n rmSync(join(this.dir, entry.name), { force: true });\n }\n } else if (entry.isDirectory() && dateDirPattern.test(entry.name) && entry.name < cutoffDate) {\n rmSync(join(this.dir, entry.name), { recursive: true, force: true });\n }\n }\n } catch {\n // ignore\n }\n }\n\n /** Remove expired .ids index files */\n private pruneIdIndex(cutoffDate: string) {\n try {\n for (const entry of readdirSync(this.idIndexDir, { withFileTypes: true })) {\n if (!entry.isFile()) continue;\n const match = /^(\\d{4}-\\d{2}-\\d{2})\\.ids$/.exec(entry.name);\n if (match && match[1] < cutoffDate) {\n rmSync(join(this.idIndexDir, entry.name), { force: true });\n this.idCache.delete(match[1]);\n }\n }\n } catch {\n // ignore\n }\n }\n\n private pruneContentKeyIndex(cutoffDate: string) {\n try {\n for (const entry of readdirSync(this.contentKeyIndexDir, { withFileTypes: true })) {\n if (!entry.isFile()) continue;\n const match = /^(\\d{4}-\\d{2}-\\d{2})\\.keys$/.exec(entry.name);\n if (match && match[1] < cutoffDate) {\n rmSync(join(this.contentKeyIndexDir, entry.name), { force: true });\n this.contentKeyCache.delete(match[1]);\n }\n }\n } catch {\n // ignore\n }\n }\n\n async close() {\n this.idCache.clear();\n this.contentKeyCache.clear();\n this.dateWriteChains.clear();\n }\n}\n",
|
|
45
|
+
"/**\n * auth service —— set-api-key / status / token-rotate / check。\n */\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { readStdin } from \"../prompt.js\";\nimport { loadConfig, configExists } from \"../config/store.js\";\nimport {\n addApiKey,\n maskSecret,\n removeApiKey,\n resolveApiKey,\n resolveApiKeyEntries,\n setDefaultApiKey,\n setApiKey,\n resolveGatewayToken,\n writeGatewayToken,\n generateToken,\n} from \"../credentials/store.js\";\nimport { daemonState } from \"../daemon/lock.js\";\nimport { DaemonClient, assertDaemonRunning } from \"../daemon/client.js\";\n\nexport async function authSetApiKey(\n ctx: CliContext,\n args: unknown[],\n opts: { keychain?: boolean },\n): Promise<unknown> {\n let [key] = args as [string];\n if (key === \"-\") {\n key = (await readStdin()).trim();\n }\n if (!key) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"api-key 不能为空\");\n }\n const result = setApiKey(key, Boolean(opts.keychain));\n return {\n ok: true,\n source: result.source,\n location: result.location,\n label: result.label,\n masked: maskSecret(result.value),\n hint: \"插件 / CLI / daemon 共用同一份;daemon 在跑时会经文件 watch 热生效\",\n };\n}\n\ninterface ApiKeyCommandOpts {\n label?: string;\n default?: boolean;\n force?: boolean;\n}\n\nexport async function authAddApiKey(\n _ctx: CliContext,\n args: unknown[],\n opts: ApiKeyCommandOpts,\n): Promise<unknown> {\n let [key] = args as [string];\n if (key === \"-\") {\n key = (await readStdin()).trim();\n }\n if (!key) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"api-key 不能为空\");\n }\n if (!opts.label) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--label 必填\");\n }\n const before = resolveApiKeyEntries();\n const result = addApiKey(key, opts.label, {\n makeDefault: Boolean(opts.default),\n force: Boolean(opts.force),\n });\n const after = resolveApiKeyEntries();\n return {\n ok: true,\n mode: after.mode,\n label: opts.label,\n default: after.defaultEntry?.label === opts.label,\n source: result.source,\n location: result.location,\n masked: maskSecret(key),\n shadowedKeychainPresent: after.shadowedKeychainPresent,\n migratedLegacyApiKey: before.mode === \"legacy-file-single\",\n hint: \"daemon 在跑时会经文件 watch 热生效;watch 不可靠时执行 yc daemon reload\",\n };\n}\n\nfunction entryToItem(entry: ReturnType<typeof resolveApiKeyEntries>[\"entries\"][number]) {\n return {\n label: entry.label,\n default: entry.default,\n source: entry.source,\n masked: maskSecret(entry.key),\n };\n}\n\nexport function authListApiKeys(): unknown {\n const set = resolveApiKeyEntries();\n return {\n ok: true,\n mode: set.mode,\n defaultLabel: set.defaultEntry?.label ?? null,\n location: set.location,\n legacyApiKeyPresent: set.legacyApiKeyPresent,\n shadowedKeychainPresent: set.shadowedKeychainPresent,\n warnings: set.warnings,\n items: set.entries.map(entryToItem),\n };\n}\n\nexport function authRemoveApiKey(\n _ctx: CliContext,\n args: unknown[],\n): unknown {\n const [label] = args as [string];\n if (!label) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"label 不能为空\");\n }\n const outcome = removeApiKey(label);\n const set = resolveApiKeyEntries();\n return {\n ok: true,\n removed: outcome.removed,\n mode: set.mode,\n defaultLabel: set.defaultEntry?.label ?? null,\n newDefault: outcome.newDefault ?? null,\n remaining: set.entries.length,\n };\n}\n\nexport function authSetDefaultApiKey(\n _ctx: CliContext,\n args: unknown[],\n): unknown {\n const [label] = args as [string];\n if (!label) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"label 不能为空\");\n }\n const result = setDefaultApiKey(label);\n const set = resolveApiKeyEntries();\n return {\n ok: true,\n mode: set.mode,\n defaultLabel: set.defaultEntry?.label ?? null,\n source: result.source,\n location: result.location,\n };\n}\n\nexport function authStatus(ctx: CliContext): unknown {\n const apiKey = resolveApiKey();\n const apiKeys = resolveApiKeyEntries();\n const config = configExists(ctx.paths) ? loadConfig(ctx.paths) : undefined;\n const token = config ? resolveGatewayToken(config) : undefined;\n const state = daemonState(ctx.paths);\n return {\n ok: true,\n profile: ctx.profile,\n mode: apiKeys.mode,\n defaultLabel: apiKeys.defaultEntry?.label ?? null,\n apiKeys: apiKeys.entries.map(entryToItem),\n legacyApiKeyPresent: apiKeys.legacyApiKeyPresent,\n shadowedKeychainPresent: apiKeys.shadowedKeychainPresent,\n warnings: apiKeys.warnings,\n apiKey: {\n present: Boolean(apiKey.value),\n source: apiKey.source,\n location: apiKey.location,\n label: apiKey.label,\n masked: maskSecret(apiKey.value),\n },\n gatewayToken: {\n present: Boolean(token?.value),\n source: token?.source,\n location: token?.location,\n masked: maskSecret(token?.value),\n },\n daemon: {\n running: state.running,\n pid: state.lock?.pid,\n stale: state.stale,\n },\n };\n}\n\nexport function authTokenRotate(\n ctx: CliContext,\n _args: unknown[],\n opts: { length?: string },\n): unknown {\n if (!configExists(ctx.paths)) {\n throw new YoooclawError(\"YOOOCLAW_CONFIG_INVALID\", `profile \\`${ctx.profile}\\` 尚未初始化`, {\n hint: \"先运行 yoooclaw config init\",\n });\n }\n const config = loadConfig(ctx.paths);\n const bytes = opts.length ? Number(opts.length) : 32;\n if (!Number.isInteger(bytes) || bytes < 16) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--length 至少 16 字节\");\n }\n const token = generateToken(bytes);\n const written = writeGatewayToken(config, token);\n const state = daemonState(ctx.paths);\n // daemon 在跑时尝试热重载(best-effort,失败不影响 token 已写入)\n let hotReload: string;\n if (state.running) {\n hotReload = \"daemon 在运行:请执行 yoooclaw daemon restart 使新 token 生效\";\n } else {\n hotReload = \"daemon 未运行:下次启动即用新 token\";\n }\n return {\n ok: true,\n token,\n source: written.source,\n location: written.location,\n hint: hotReload,\n };\n}\n\nexport async function authCheck(ctx: CliContext): Promise<unknown> {\n assertDaemonRunning(ctx.paths);\n const client = new DaemonClient(ctx.paths);\n const res = await client.get(\"/daemon/status\");\n return {\n ok: res.status >= 200 && res.status < 300,\n profile: ctx.profile,\n daemonReachable: true,\n status: res.status,\n daemon: res.body,\n };\n}\n",
|
|
46
|
+
"/**\n * 通知查询 —— 复用 phone-notifications 共享的匹配/收集逻辑,CLI 侧负责参数解析与错误。\n */\nimport { existsSync } from \"node:fs\";\nimport type { ProfilePaths } from \"../paths.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport {\n collectMatchingNotifications,\n type NotificationQueryOptions,\n type StoredNotification,\n} from \"../shared.js\";\n\nconst ISO_RE =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,3})?)?(Z|[+-]\\d{2}:\\d{2})$/;\n\nfunction parseIso(value: string, name: string): number {\n if (!ISO_RE.test(value)) {\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n `${name} 必须是 ISO 8601 时间,例如 2026-03-01T09:00:00+08:00`,\n );\n }\n const ts = Date.parse(value);\n if (Number.isNaN(ts)) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", `${name} 不是合法时间`);\n }\n return ts;\n}\n\nfunction parseLimit(raw: string | undefined, fallback: number): number {\n if (raw === undefined) return fallback;\n if (!/^\\d+$/.test(raw) || Number(raw) <= 0) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--limit 必须是大于 0 的整数\");\n }\n return Number(raw);\n}\n\nexport interface RawQueryOpts {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n client?: string;\n limit?: string;\n}\n\nexport function buildQueryOptions(\n opts: RawQueryOpts,\n defaultLimit = 100,\n): NotificationQueryOptions {\n if (\n opts.conversationType &&\n opts.conversationType !== \"group\" &&\n opts.conversationType !== \"private\"\n ) {\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n \"--conversation-type 只能是 group 或 private\",\n );\n }\n const fromTs = opts.from ? parseIso(opts.from, \"--from\") : null;\n const toTs = opts.to ? parseIso(opts.to, \"--to\") : null;\n if (fromTs !== null && toTs !== null && fromTs > toTs) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--from 不能晚于 --to\");\n }\n return {\n from: opts.from,\n to: opts.to,\n app: opts.app,\n sender: opts.sender,\n conversationType: opts.conversationType,\n keyword: opts.keyword,\n client: opts.client,\n limit: parseLimit(opts.limit, defaultLimit),\n fromTs,\n toTs,\n fromDateKey: opts.from ? opts.from.slice(0, 10) : null,\n toDateKey: opts.to ? opts.to.slice(0, 10) : null,\n };\n}\n\n/** 收集匹配的通知;通知目录不存在时返回空数组(无 daemon / 尚无数据是正常态)。 */\nexport async function queryNotifications(\n paths: ProfilePaths,\n options: NotificationQueryOptions,\n): Promise<StoredNotification[]> {\n if (!existsSync(paths.notifications)) return [];\n return collectMatchingNotifications(paths.notifications, options);\n}\n",
|
|
47
|
+
"import { existsSync, readFileSync, readdirSync, mkdirSync } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { StoredNotification } from \"../notification/storage.js\";\n\n/**\n * Minimal Commander.js Command interface.\n * The real `Command` instance comes from the openclaw runtime at registration time;\n * we only declare the subset we use so that `commander` need not be a direct dep.\n */\nexport interface CliCommand {\n command(nameAndArgs: string): CliCommand;\n description(str: string): CliCommand;\n version(str: string, flags?: string, description?: string): CliCommand;\n option(flags: string, description: string, defaultValue?: string): CliCommand;\n requiredOption(flags: string, description: string): CliCommand;\n action(fn: (...args: any[]) => void | Promise<void>): CliCommand;\n}\n\nexport interface CliContext {\n workspaceDir?: string;\n stateDir?: string;\n}\n\n/** Resolve the notifications storage directory (stateDir → workspace fallback) */\nexport function resolveNotificationsDir(ctx: CliContext): string | null {\n if (ctx.stateDir) {\n const dir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n \"notifications\",\n );\n if (existsSync(dir)) return dir;\n }\n if (ctx.workspaceDir) {\n const dir = join(ctx.workspaceDir, \"notifications\");\n if (existsSync(dir)) return dir;\n }\n return null;\n}\n\n/** List available date keys (YYYY-MM-DD) sorted descending */\nexport function listDateKeys(dir: string): string[] {\n const pattern = /^(\\d{4}-\\d{2}-\\d{2})\\.json$/;\n const keys: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isFile()) continue;\n const m = pattern.exec(entry.name);\n if (m) keys.push(m[1]);\n }\n return keys.sort().reverse();\n}\n\n/** Read notifications for a specific date */\nexport function readDateFile(\n dir: string,\n dateKey: string,\n): StoredNotification[] {\n const filePath = join(dir, `${dateKey}.json`);\n if (!existsSync(filePath)) return [];\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch {\n return [];\n }\n}\n\n/** Format today as YYYY-MM-DD */\nexport function today(): string {\n return formatDate(new Date());\n}\n\n/** Format a Date as YYYY-MM-DD */\nexport function formatDate(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${day}`;\n}\n\n/** Get date N days ago as YYYY-MM-DD */\nexport function daysAgo(n: number): string {\n const d = new Date();\n d.setDate(d.getDate() - n);\n return formatDate(d);\n}\n\n/** Filter date keys to a [from, to] range (inclusive) */\nexport function filterDateRange(\n keys: string[],\n from: string,\n to: string,\n): string[] {\n return keys.filter((k) => k >= from && k <= to);\n}\n\n/** Parse an ISO 8601 timestamp and exit with a CLI error on invalid input */\nexport function parseIsoTime(\n value: string,\n optionName: \"--from\" | \"--to\",\n): number {\n const isoPattern =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,3})?)?(Z|[+-]\\d{2}:\\d{2})$/;\n if (!isoPattern.test(value)) {\n exitError(\n \"INVALID_TIME\",\n `${optionName} 必须是 ISO 8601 时间,例如 2026-03-01T09:00:00+08:00`,\n );\n }\n\n const ts = Date.parse(value);\n if (Number.isNaN(ts)) {\n exitError(\n \"INVALID_TIME\",\n `${optionName} 不是合法时间,例如 2026-03-01T09:00:00+08:00`,\n );\n }\n return ts;\n}\n\n/** Sort notifications by timestamp descending (newest first) */\nexport function sortNotificationsByTimestampDesc(\n items: StoredNotification[],\n): StoredNotification[] {\n return items.sort((a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp));\n}\n\nconst APP_ALIAS_GROUPS = [\n [\"微信\", \"wechat\", \"weixin\", \"com.tencent.mm\", \"com.tencent.xin\"],\n [\"企业微信\", \"wecom\", \"wxwork\", \"com.tencent.wework\"],\n [\"飞书\", \"feishu\", \"lark\", \"com.ss.android.lark\", \"com.bytedance.ee.lark\", \"com.larksuite.suite\"],\n [\"钉钉\", \"dingtalk\", \"com.alibaba.android.rimet\"],\n [\"qq\", \"腾讯qq\", \"com.tencent.mobileqq\"],\n];\n\nfunction normalizeLookupText(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction appAliasGroup(value: string): string[] | null {\n const normalized = normalizeLookupText(value);\n if (!normalized) return null;\n return APP_ALIAS_GROUPS.find((group) =>\n group.some((candidate) => normalizeLookupText(candidate) === normalized),\n ) ?? null;\n}\n\nexport function matchesNotificationAppFilter(\n item: StoredNotification,\n app: string,\n): boolean {\n const filter = normalizeLookupText(app);\n if (!filter) return true;\n\n const candidates = [item.appName, item.appDisplayName]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0);\n if (candidates.some((candidate) => normalizeLookupText(candidate) === filter)) {\n return true;\n }\n\n const filterGroup = appAliasGroup(app);\n if (!filterGroup) return false;\n return candidates.some((candidate) => appAliasGroup(candidate) === filterGroup);\n}\n\n/** Async version of listDateKeys */\nexport async function listDateKeysAsync(dir: string): Promise<string[]> {\n const pattern = /^(\\d{4}-\\d{2}-\\d{2})\\.json$/;\n const keys: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n const m = pattern.exec(entry.name);\n if (m) keys.push(m[1]);\n }\n return keys.sort().reverse();\n}\n\n/** Async version of readDateFile */\nexport async function readDateFileAsync(\n dir: string,\n dateKey: string,\n): Promise<StoredNotification[]> {\n const filePath = join(dir, `${dateKey}.json`);\n if (!existsSync(filePath)) return [];\n try {\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return [];\n }\n}\n\n/** Write progress message to stderr (visible to caller, won't pollute JSON stdout) */\nexport function progress(message: string): void {\n process.stderr.write(message + \"\\n\");\n}\n\n/** Print JSON result to stdout */\nexport function output(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\n/** Print error JSON and exit with code 1 */\nexport function exitError(code: string, message: string): never {\n output({ ok: false, error: { code, message } });\n process.exit(1);\n}\n\n/** Resolve the recordings storage directory (stateDir → workspace fallback) */\nexport function resolveRecordingsDir(ctx: CliContext): string | null {\n if (ctx.stateDir) {\n const dir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n \"recordings\",\n );\n if (existsSync(dir)) return dir;\n }\n if (ctx.workspaceDir) {\n const dir = join(ctx.workspaceDir, \"recordings\");\n if (existsSync(dir)) return dir;\n }\n return null;\n}\n\n/** Recording index entry (mirrors RecordingIndexEntry from storage.ts) */\nexport interface CliRecordingEntry {\n id: string;\n clientLabel?: string;\n metadata: {\n name: string;\n duration_sec: number;\n file_size_bytes: number;\n created_at: string;\n transfer_status: string;\n [key: string]: unknown;\n };\n status: string;\n audioFile?: string;\n srtFile?: string;\n transcriptDataFile?: string;\n transcriptFile?: string;\n summaryFile?: string;\n title?: string;\n lastError?: string;\n ingestedAt: string;\n updatedAt: string;\n}\n\n/** Resolve the asr-config.json path; creates parent dirs if needed */\nexport function resolveAsrConfigPath(ctx: CliContext): string {\n let base: string;\n if (ctx.stateDir) {\n base = join(ctx.stateDir, \"plugins\", \"phone-notifications\", \"recordings\");\n } else if (ctx.workspaceDir) {\n base = join(ctx.workspaceDir, \"recordings\");\n } else {\n exitError(\n \"STORAGE_UNAVAILABLE\",\n \"无法确定录音存储目录:stateDir 和 workspaceDir 均未设置\",\n );\n }\n mkdirSync(base, { recursive: true });\n return join(base, \"asr-config.json\");\n}\n\n/** Mask an API key, keeping first 4 and last 4 chars */\nexport function maskApiKey(key: string): string {\n if (key.length <= 8) return \"***\";\n return `${key.slice(0, 4)}***${key.slice(-4)}`;\n}\n\n/** Read recording index.json */\nexport function readRecordingIndex(\n dir: string,\n): CliRecordingEntry[] {\n const indexPath = join(dir, \"index.json\");\n if (!existsSync(indexPath)) return [];\n try {\n const raw = JSON.parse(readFileSync(indexPath, \"utf-8\"));\n return Array.isArray(raw?.recordings) ? raw.recordings : [];\n } catch {\n return [];\n }\n}\n",
|
|
48
|
+
"import type { StoredNotification } from \"../notification/storage.js\";\nimport {\n exitError,\n listDateKeysAsync,\n parseIsoTime,\n readDateFileAsync,\n sortNotificationsByTimestampDesc,\n matchesNotificationAppFilter,\n} from \"./helpers.js\";\n\nexport interface RawNotificationQueryOptions {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n limit?: string;\n client?: string;\n}\n\nexport interface NotificationQueryOptions {\n from?: string;\n to?: string;\n app?: string;\n sender?: string;\n conversationType?: string;\n keyword?: string;\n client?: string;\n limit: number;\n fromTs: number | null;\n toTs: number | null;\n fromDateKey: string | null;\n toDateKey: string | null;\n}\n\nexport function parsePositiveIntegerOption(\n rawValue: string | undefined,\n defaultValue: number,\n optionName: string,\n errorCode: string,\n): number {\n const value = rawValue && rawValue.length > 0 ? rawValue : String(defaultValue);\n if (!/^\\d+$/.test(value)) {\n exitError(errorCode, `${optionName} 必须是大于 0 的整数`);\n }\n\n const parsed = Number.parseInt(value, 10);\n if (parsed <= 0) {\n exitError(errorCode, `${optionName} 必须是大于 0 的整数`);\n }\n return parsed;\n}\n\nexport function parseNotificationQueryOptions(\n opts: RawNotificationQueryOptions,\n defaultLimit = 100,\n): NotificationQueryOptions {\n const limit = parsePositiveIntegerOption(\n opts.limit,\n defaultLimit,\n \"--limit\",\n \"INVALID_LIMIT\",\n );\n\n if (\n opts.conversationType\n && opts.conversationType !== \"group\"\n && opts.conversationType !== \"private\"\n ) {\n exitError(\n \"INVALID_CONVERSATION_TYPE\",\n \"--conversation-type 只能是 group 或 private\",\n );\n }\n\n const hasFrom = typeof opts.from === \"string\" && opts.from.length > 0;\n const hasTo = typeof opts.to === \"string\" && opts.to.length > 0;\n const fromTs = hasFrom ? parseIsoTime(opts.from!, \"--from\") : null;\n const toTs = hasTo ? parseIsoTime(opts.to!, \"--to\") : null;\n\n if (fromTs !== null && toTs !== null && fromTs > toTs) {\n exitError(\"INVALID_TIME_RANGE\", \"--from 不能晚于 --to\");\n }\n\n return {\n from: opts.from,\n to: opts.to,\n app: opts.app,\n sender: opts.sender,\n conversationType: opts.conversationType,\n keyword: opts.keyword,\n client: opts.client,\n limit,\n fromTs,\n toTs,\n fromDateKey: hasFrom ? opts.from!.slice(0, 10) : null,\n toDateKey: hasTo ? opts.to!.slice(0, 10) : null,\n };\n}\n\nexport function matchesNotificationQuery(\n item: StoredNotification,\n opts: NotificationQueryOptions,\n): boolean {\n if (opts.client && opts.client !== \"all\") {\n const label = item.clientLabel ?? \"legacy\";\n if (label !== opts.client) return false;\n }\n if (opts.app && !matchesNotificationAppFilter(item, opts.app)) return false;\n if (\n opts.conversationType\n && item.conversationType !== opts.conversationType\n ) {\n return false;\n }\n\n const senderHaystack = [item.senderName, item.title]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\");\n if (opts.sender && !senderHaystack.includes(opts.sender)) return false;\n\n const keywordHaystack = [\n item.title,\n item.content,\n item.senderName,\n item.conversationName,\n ]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\");\n if (opts.keyword && !keywordHaystack.includes(opts.keyword)) return false;\n\n const itemTs = Date.parse(item.timestamp);\n if (Number.isNaN(itemTs)) return false;\n if (opts.fromTs !== null && itemTs < opts.fromTs) return false;\n if (opts.toTs !== null && itemTs > opts.toTs) return false;\n\n return true;\n}\n\nexport async function collectMatchingNotifications(\n dir: string,\n opts: NotificationQueryOptions,\n): Promise<StoredNotification[]> {\n const keys = await listDateKeysAsync(dir);\n const results: StoredNotification[] = [];\n const canStopAfterLimit = opts.fromTs === null && opts.toTs === null;\n\n for (const dateKey of keys) {\n if (opts.fromDateKey && dateKey < opts.fromDateKey) continue;\n if (opts.toDateKey && dateKey > opts.toDateKey) continue;\n\n const items = sortNotificationsByTimestampDesc([\n ...(await readDateFileAsync(dir, dateKey)),\n ]);\n for (const item of items) {\n if (!matchesNotificationQuery(item, opts)) continue;\n results.push(item);\n if (canStopAfterLimit && results.length >= opts.limit) {\n return results;\n }\n }\n }\n\n return sortNotificationsByTimestampDesc(results).slice(0, opts.limit);\n}\n",
|
|
49
|
+
"import {\n accessSync,\n mkdirSync,\n appendFileSync,\n readdirSync,\n readFileSync,\n writeFileSync,\n existsSync,\n rmSync,\n constants,\n} from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport type { PluginConfig, RawNotification } from \"../types.js\";\nimport { normalizeFeishuFields } from \"./feishu-normalize.js\";\nimport { currentClientLabel } from \"../ingest-context.js\";\n\ninterface Logger {\n info: (message: string) => void;\n warn: (message: string) => void;\n}\n\nexport type NotificationConversationType = \"private\" | \"group\";\n\nexport interface StorageContext {\n stateDir: string;\n workspaceDir?: string;\n}\n\n/** Stored notification entry (JSON format, append-only) */\nexport interface StoredNotification {\n /** 来源客户端 label;旧数据无该字段,查询时视为 legacy */\n clientLabel?: string;\n /** 包名 */\n appName: string;\n /** 应用显示名(由映射补全),缺省时与 appName 一致 */\n appDisplayName?: string;\n title: string;\n content: string;\n /** ISO 8601 with timezone, e.g. \"2026-03-02T08:30:00+08:00\" */\n timestamp: string;\n /**\n * 结构化发送人。当前主要用于飞书消息:\n * iOS 通知里 title 通常是发送人,subtitle 用来区分群聊名。\n */\n senderName?: string;\n /** 结构化会话类型。当前主要用于飞书消息区分群聊/私聊。 */\n conversationType?: NotificationConversationType;\n /** 结构化会话名。当前主要用于飞书群聊名(通常来自 subtitle)。 */\n conversationName?: string;\n}\n\nconst NOTIFICATION_DIR_NAME = \"notifications\";\nconst ID_INDEX_DIR_NAME = \".ids\";\nconst CONTENT_KEY_INDEX_DIR_NAME = \".keys\";\n\nexport interface NotificationIngestResult {\n received: number;\n ingested: number;\n dedupedById: number;\n dedupedByContent: number;\n invalid: number;\n /**\n * 本次 ingest 实际新写入的条目(去重 / 非法之后的产物)。\n * 用于后续事件驱动链路(如 light-rule agent 评估)拿到本次新增的通知列表,\n * 不需要重新读盘。\n */\n inserted: StoredNotification[];\n}\n\ntype WriteOutcome =\n | { kind: \"ingested\"; entry: StoredNotification }\n | { kind: \"dedupedById\" }\n | { kind: \"dedupedByContent\" }\n | { kind: \"invalid\" };\n\nexport function getStateFallbackNotificationDir(stateDir: string): string {\n return join(stateDir, \"plugins\", \"phone-notifications\", NOTIFICATION_DIR_NAME);\n}\n\nfunction computeLagMs(timestamp: string | undefined): number | null {\n if (!timestamp) return null;\n const t = new Date(timestamp).getTime();\n if (Number.isNaN(t)) return null;\n return Date.now() - t;\n}\n\nfunction buildFallbackContent(n: RawNotification): string {\n const body = n.body?.trim();\n if (body) {\n return body;\n }\n\n const fallback: string[] = [];\n if (n.category) {\n fallback.push(`category:${n.category}`);\n }\n if (n.metadata && Object.keys(n.metadata).length > 0) {\n fallback.push(`metadata:${JSON.stringify(n.metadata)}`);\n }\n return fallback.join(\" ; \") || \"-\";\n}\n\nfunction ensureWritableDirectory(dir: string): boolean {\n try {\n mkdirSync(dir, { recursive: true });\n accessSync(dir, constants.R_OK | constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function resolveNotificationStorageDir(\n ctx: StorageContext,\n logger: Pick<Logger, \"info\" | \"warn\">,\n): string {\n // 优先使用 stateDir(插件私有稳定路径),避免通知随 workspace 切换而分散\n const stateNotifDir = getStateFallbackNotificationDir(ctx.stateDir);\n\n if (ensureWritableDirectory(stateNotifDir)) {\n logger.info(`通知将写入 stateDir 路径: ${stateNotifDir}`);\n return stateNotifDir;\n }\n\n // stateDir 不可用时回退到 workspaceDir\n if (ctx.workspaceDir) {\n const workspaceDir = join(ctx.workspaceDir, NOTIFICATION_DIR_NAME);\n if (ensureWritableDirectory(workspaceDir)) {\n logger.warn(\n `stateDir 不可用,通知已回退到 workspace 路径: ${workspaceDir}`,\n );\n return workspaceDir;\n }\n }\n\n throw new Error(`通知存储目录不可用: ${stateNotifDir}`);\n}\n\n/** 包名 → 应用显示名(异步,未命中时内部可拉取后返回);不提供则落库仅用 appName */\nexport type ResolveDisplayName = (packageName: string) => Promise<string>;\n\nexport class NotificationStorage {\n private dir: string;\n private idIndexDir: string;\n private contentKeyIndexDir: string;\n private idCache = new Map<string, Set<string>>();\n private contentKeyCache = new Map<string, Set<string>>();\n private dateWriteChains = new Map<string, Promise<void>>();\n private resolveDisplayName: ResolveDisplayName | undefined;\n\n constructor(\n dir: string,\n private config: PluginConfig,\n private logger: Logger,\n resolveDisplayName?: ResolveDisplayName,\n ) {\n this.dir = dir;\n this.idIndexDir = join(dir, ID_INDEX_DIR_NAME);\n this.contentKeyIndexDir = join(dir, CONTENT_KEY_INDEX_DIR_NAME);\n this.resolveDisplayName = resolveDisplayName;\n }\n\n async init() {\n mkdirSync(this.dir, { recursive: true });\n mkdirSync(this.idIndexDir, { recursive: true });\n rmSync(this.contentKeyIndexDir, { recursive: true, force: true });\n mkdirSync(this.contentKeyIndexDir, { recursive: true });\n }\n\n async ingest(\n items: RawNotification[],\n ingestId?: string,\n ): Promise<NotificationIngestResult> {\n const result: NotificationIngestResult = {\n received: items.length,\n ingested: 0,\n dedupedById: 0,\n dedupedByContent: 0,\n invalid: 0,\n inserted: [],\n };\n\n const traceTag = ingestId ? `[${ingestId}]` : \"\";\n for (const n of items) {\n const outcome = await this.writeNotification(n);\n const lagMs = computeLagMs(n.timestamp);\n const lagPart = lagMs === null ? \"lag=?\" : `lag=${lagMs}ms`;\n this.logger.info(\n `ingest${traceTag}: app=${n.app ?? \"Unknown\"} id=${n.id ?? \"-\"} ts=${n.timestamp} ${lagPart} outcome=${outcome.kind}`,\n );\n switch (outcome.kind) {\n case \"ingested\":\n result.ingested += 1;\n result.inserted.push(outcome.entry);\n break;\n case \"dedupedById\":\n result.dedupedById += 1;\n break;\n case \"dedupedByContent\":\n result.dedupedByContent += 1;\n break;\n case \"invalid\":\n result.invalid += 1;\n break;\n }\n }\n this.prune();\n return result;\n }\n\n private async writeNotification(n: RawNotification): Promise<WriteOutcome> {\n const ts = new Date(n.timestamp);\n if (Number.isNaN(ts.getTime())) {\n this.logger.warn(`忽略非法 timestamp 的通知: ${n.id}`);\n return { kind: \"invalid\" };\n }\n\n const dateKey = this.formatDate(ts);\n const filePath = join(this.dir, `${dateKey}.json`);\n const normalizedId = typeof n.id === \"string\" ? n.id.trim() : \"\";\n const entry = this.buildStoredNotification(n);\n\n return this.withDateWriteLock(dateKey, async () => {\n if (normalizedId && this.hasNotificationId(dateKey, entry.clientLabel ?? \"legacy\", normalizedId)) {\n return { kind: \"dedupedById\" };\n }\n\n if (this.hasNotificationContentKey(dateKey, filePath, entry)) {\n return { kind: \"dedupedByContent\" };\n }\n\n const appDisplayName = this.resolveDisplayName\n ? await this.resolveDisplayName(entry.appName)\n : entry.appName;\n\n const storedEntry: StoredNotification = {\n ...entry,\n appDisplayName,\n };\n\n const arr = this.readStoredNotifications(filePath);\n arr.push(storedEntry);\n writeFileSync(filePath, JSON.stringify(arr, null, 2), \"utf-8\");\n\n if (normalizedId) {\n this.recordNotificationId(dateKey, storedEntry.clientLabel ?? \"legacy\", normalizedId);\n }\n this.recordNotificationContentKey(dateKey, filePath, storedEntry);\n return { kind: \"ingested\", entry: storedEntry };\n });\n }\n\n private buildStoredNotification(n: RawNotification): StoredNotification {\n const appName = typeof n.app === \"string\" && n.app ? n.app : \"Unknown\";\n const clientLabel = currentClientLabel(\"default\");\n const feishu = normalizeFeishuFields(n);\n if (feishu) {\n return {\n clientLabel,\n appName,\n title: feishu.title,\n content: feishu.content || buildFallbackContent(n),\n timestamp: n.timestamp,\n ...feishu.structured,\n };\n }\n return {\n clientLabel,\n appName,\n title: typeof n.title === \"string\" ? n.title : \"\",\n content: buildFallbackContent(n),\n timestamp: n.timestamp,\n };\n }\n\n private formatDate(d: Date): string {\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n }\n\n private getIdIndexPath(dateKey: string): string {\n return join(this.idIndexDir, `${dateKey}.ids`);\n }\n\n private getIdSet(dateKey: string): Set<string> {\n const cached = this.idCache.get(dateKey);\n if (cached) {\n return cached;\n }\n\n const idPath = this.getIdIndexPath(dateKey);\n const ids = new Set<string>();\n if (existsSync(idPath)) {\n const lines = readFileSync(idPath, \"utf-8\").split(/\\r?\\n/);\n for (const line of lines) {\n const id = line.trim();\n if (id) {\n ids.add(id);\n }\n }\n }\n\n this.idCache.set(dateKey, ids);\n return ids;\n }\n\n private buildNotificationIdKey(clientLabel: string, id: string): string {\n if (this.usesLegacyIdKey(clientLabel)) {\n return id;\n }\n return `${clientLabel}\\x1f${id}`;\n }\n\n private usesLegacyIdKey(clientLabel: string): boolean {\n return clientLabel === \"legacy\" || clientLabel === \"default\";\n }\n\n private hasNotificationId(dateKey: string, clientLabel: string, id: string): boolean {\n const ids = this.getIdSet(dateKey);\n return ids.has(this.buildNotificationIdKey(clientLabel, id))\n || (this.usesLegacyIdKey(clientLabel) && ids.has(id));\n }\n\n private getContentKeyIndexPath(dateKey: string): string {\n return join(this.contentKeyIndexDir, `${dateKey}.keys`);\n }\n\n private getContentKeySet(dateKey: string, filePath: string): Set<string> {\n const cached = this.contentKeyCache.get(dateKey);\n if (cached) {\n return cached;\n }\n\n const keyPath = this.getContentKeyIndexPath(dateKey);\n const keys = new Set<string>();\n\n if (existsSync(filePath)) {\n for (const item of this.readStoredNotifications(filePath)) {\n keys.add(this.buildNotificationContentKey(item));\n }\n }\n\n if (keys.size > 0) {\n writeFileSync(keyPath, `${Array.from(keys).join(\"\\n\")}\\n`, \"utf-8\");\n } else if (existsSync(keyPath)) {\n rmSync(keyPath, { force: true });\n }\n\n this.contentKeyCache.set(dateKey, keys);\n return keys;\n }\n\n private hasNotificationContentKey(\n dateKey: string,\n filePath: string,\n entry: Pick<StoredNotification, \"appName\" | \"title\" | \"content\" | \"timestamp\" | \"clientLabel\">,\n ): boolean {\n const keys = this.getContentKeySet(dateKey, filePath);\n return this.contentKeyLabels(entry.clientLabel).some((clientLabel) =>\n keys.has(this.buildNotificationContentKey({ ...entry, clientLabel })),\n );\n }\n\n private recordNotificationId(dateKey: string, clientLabel: string, id: string) {\n const ids = this.getIdSet(dateKey);\n const key = this.buildNotificationIdKey(clientLabel, id);\n if (ids.has(key)) {\n return;\n }\n\n appendFileSync(this.getIdIndexPath(dateKey), `${key}\\n`, \"utf-8\");\n ids.add(key);\n }\n\n private recordNotificationContentKey(\n dateKey: string,\n filePath: string,\n entry: Pick<StoredNotification, \"appName\" | \"title\" | \"content\" | \"timestamp\" | \"clientLabel\">,\n ) {\n const keys = this.getContentKeySet(dateKey, filePath);\n const key = this.buildNotificationContentKey(entry);\n\n if (keys.has(key)) {\n return;\n }\n\n appendFileSync(this.getContentKeyIndexPath(dateKey), `${key}\\n`, \"utf-8\");\n keys.add(key);\n }\n\n private buildNotificationContentKey(\n entry: Pick<StoredNotification, \"appName\" | \"title\" | \"content\" | \"timestamp\" | \"clientLabel\">,\n ): string {\n return createHash(\"sha256\")\n .update(entry.clientLabel ?? \"legacy\")\n .update(\"\\x1f\")\n .update(entry.appName)\n .update(\"\\x1f\")\n .update(entry.title)\n .update(\"\\x1f\")\n .update(entry.content)\n .update(\"\\x1f\")\n .update(entry.timestamp)\n .digest(\"hex\");\n }\n\n private contentKeyLabels(clientLabel: string | undefined): string[] {\n const label = clientLabel ?? \"legacy\";\n return label === \"default\" ? [\"default\", \"legacy\"] : [label];\n }\n\n private readStoredNotifications(filePath: string): StoredNotification[] {\n if (!existsSync(filePath)) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n private async withDateWriteLock<T>(\n dateKey: string,\n task: () => Promise<T>,\n ): Promise<T> {\n const previous = this.dateWriteChains.get(dateKey) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const chain = previous.then(() => current);\n this.dateWriteChains.set(dateKey, chain);\n\n await previous;\n try {\n return await task();\n } finally {\n release();\n if (this.dateWriteChains.get(dateKey) === chain) {\n this.dateWriteChains.delete(dateKey);\n }\n }\n }\n\n private prune() {\n const retentionDays = this.config.retentionDays;\n if (retentionDays === undefined) {\n return;\n }\n\n const cutoffMs = Date.now() - retentionDays * 24 * 60 * 60 * 1000;\n const cutoffDate = this.formatDate(new Date(cutoffMs));\n\n this.pruneDataFiles(cutoffDate);\n this.pruneIdIndex(cutoffDate);\n this.pruneContentKeyIndex(cutoffDate);\n }\n\n /** Remove expired .json, legacy .md files, and legacy date directories */\n private pruneDataFiles(cutoffDate: string) {\n const dateFilePattern = /^(\\d{4}-\\d{2}-\\d{2})\\.(json|md)$/;\n const dateDirPattern = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n try {\n for (const entry of readdirSync(this.dir, { withFileTypes: true })) {\n if (entry.isFile()) {\n const match = dateFilePattern.exec(entry.name);\n if (match && match[1] < cutoffDate) {\n rmSync(join(this.dir, entry.name), { force: true });\n }\n } else if (entry.isDirectory() && dateDirPattern.test(entry.name) && entry.name < cutoffDate) {\n rmSync(join(this.dir, entry.name), { recursive: true, force: true });\n }\n }\n } catch {\n // ignore\n }\n }\n\n /** Remove expired .ids index files */\n private pruneIdIndex(cutoffDate: string) {\n try {\n for (const entry of readdirSync(this.idIndexDir, { withFileTypes: true })) {\n if (!entry.isFile()) continue;\n const match = /^(\\d{4}-\\d{2}-\\d{2})\\.ids$/.exec(entry.name);\n if (match && match[1] < cutoffDate) {\n rmSync(join(this.idIndexDir, entry.name), { force: true });\n this.idCache.delete(match[1]);\n }\n }\n } catch {\n // ignore\n }\n }\n\n private pruneContentKeyIndex(cutoffDate: string) {\n try {\n for (const entry of readdirSync(this.contentKeyIndexDir, { withFileTypes: true })) {\n if (!entry.isFile()) continue;\n const match = /^(\\d{4}-\\d{2}-\\d{2})\\.keys$/.exec(entry.name);\n if (match && match[1] < cutoffDate) {\n rmSync(join(this.contentKeyIndexDir, entry.name), { force: true });\n this.contentKeyCache.delete(match[1]);\n }\n }\n } catch {\n // ignore\n }\n }\n\n async close() {\n this.idCache.clear();\n this.contentKeyCache.clear();\n this.dateWriteChains.clear();\n }\n}\n",
|
|
58
50
|
"import type { RawNotification } from \"../types.js\";\nimport type { NotificationConversationType } from \"./storage.js\";\n\nexport interface FeishuStructuredFields {\n senderName?: string;\n conversationType?: NotificationConversationType;\n conversationName?: string;\n}\n\nexport interface FeishuNormalizedNotification {\n title: string;\n content: string;\n structured: FeishuStructuredFields;\n}\n\nfunction normalizeOptionalText(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction isFeishuApp(appName: string): boolean {\n const normalized = appName.trim().toLowerCase();\n if (!normalized) {\n return false;\n }\n return (\n normalized === \"飞书\"\n || normalized === \"feishu\"\n || normalized === \"lark\"\n || normalized === \"com.ss.android.lark\"\n || normalized === \"com.bytedance.ee.lark\"\n || normalized === \"com.larksuite.suite\"\n || normalized.includes(\"feishu\")\n || normalized.includes(\"lark\")\n || normalized.includes(\"飞书\")\n );\n}\n\nfunction isFeishuAppLabel(text: string): boolean {\n const t = text.trim().toLowerCase();\n return t === \"飞书\" || t === \"lark\" || t === \"feishu\";\n}\n\nfunction extractColonSender(body: string): string | undefined {\n if (!body) return undefined;\n const candidates = [body.indexOf(\":\"), body.indexOf(\":\")].filter((i) => i > 0);\n if (candidates.length === 0) return undefined;\n const idx = Math.min(...candidates);\n const senderName = body.slice(0, idx).trim();\n return senderName || undefined;\n}\n\nfunction findMetadataTextByKey(\n value: unknown,\n targetKey: string,\n depth = 0,\n): { found: boolean; value?: string } {\n if (!value || typeof value !== \"object\" || depth > 4) {\n return { found: false };\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const match = findMetadataTextByKey(item, targetKey, depth + 1);\n if (match.found) {\n return match;\n }\n }\n return { found: false };\n }\n\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n if (key.trim().toLowerCase() === targetKey) {\n return { found: true, value: normalizeOptionalText(child) };\n }\n }\n\n for (const child of Object.values(value as Record<string, unknown>)) {\n const match = findMetadataTextByKey(child, targetKey, depth + 1);\n if (match.found) {\n return match;\n }\n }\n\n return { found: false };\n}\n\nfunction deriveStructured(n: RawNotification): FeishuStructuredFields {\n const subtitle = findMetadataTextByKey(n.metadata, \"subtitle\");\n\n // iOS 路径:通知元数据带 subtitle key(群聊为群名,私聊为空)。\n if (subtitle.found) {\n const senderName = normalizeOptionalText(n.title);\n const structured: FeishuStructuredFields = {\n conversationType: subtitle.value ? \"group\" : \"private\",\n };\n if (senderName) {\n structured.senderName = senderName;\n }\n if (subtitle.value) {\n structured.conversationName = subtitle.value;\n }\n return structured;\n }\n\n // Android 路径:title 退化为 app 名(如 \"飞书\"),实际发送人在 body 里以 \"name: content\" 形式出现。\n const rawTitle = typeof n.title === \"string\" ? n.title : \"\";\n if (isFeishuAppLabel(rawTitle)) {\n const senderName = extractColonSender(n.body ?? \"\");\n if (senderName) {\n return {\n senderName,\n conversationType: \"private\",\n };\n }\n }\n\n return {};\n}\n\nfunction buildTitle(n: RawNotification, structured: FeishuStructuredFields): string {\n if (structured.conversationType === \"group\" && structured.conversationName) {\n return structured.conversationName;\n }\n // Android 私聊 title 是 app 名,用 body 解析出的 senderName 顶上去,跟 iOS 对齐。\n if (structured.conversationType === \"private\" && structured.senderName) {\n return structured.senderName;\n }\n return typeof n.title === \"string\" ? n.title : \"\";\n}\n\nfunction buildContent(n: RawNotification, structured: FeishuStructuredFields): string {\n const body = n.body?.trim();\n\n if (structured.conversationType === \"group\" && structured.senderName && body) {\n const half = `${structured.senderName}:`;\n const full = `${structured.senderName}:`;\n return body.startsWith(half) || body.startsWith(full)\n ? body\n : `${structured.senderName}: ${body}`;\n }\n\n if (structured.conversationType === \"private\" && structured.senderName && body) {\n const half = `${structured.senderName}:`;\n const full = `${structured.senderName}:`;\n if (body.startsWith(half)) return body.slice(half.length).trimStart();\n if (body.startsWith(full)) return body.slice(full.length).trimStart();\n return body;\n }\n\n return body ?? \"\";\n}\n\nexport function normalizeFeishuFields(\n n: RawNotification,\n): FeishuNormalizedNotification | undefined {\n const appName = typeof n.app === \"string\" ? n.app : \"\";\n if (!isFeishuApp(appName)) {\n return undefined;\n }\n\n const structured = deriveStructured(n);\n\n // Feishu 通知但任何规则都没命中:让 caller 走默认归一化路径,避免与非 Feishu 通知行为分裂。\n if (\n structured.senderName === undefined\n && structured.conversationType === undefined\n && structured.conversationName === undefined\n ) {\n return undefined;\n }\n\n return {\n title: buildTitle(n, structured),\n content: buildContent(n, structured),\n structured,\n };\n}\n",
|
|
51
|
+
"import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport interface IngestContext {\n clientLabel?: string;\n authKind?: \"relay-api-key\" | \"http-api-key\" | \"gateway-token\" | \"local\" | string;\n}\n\nconst storage = new AsyncLocalStorage<IngestContext>();\n\nexport function runWithIngestContext<T>(context: IngestContext | undefined, fn: () => T): T {\n return storage.run(context ?? {}, fn);\n}\n\nexport function getIngestContext(): IngestContext {\n return storage.getStore() ?? {};\n}\n\nexport function currentClientLabel(fallback = \"legacy\"): string {\n return getIngestContext().clientLabel?.trim() || fallback;\n}\n",
|
|
59
52
|
"import { randomBytes } from \"node:crypto\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport {\n type NotificationIngestResult,\n NotificationStorage,\n type StoredNotification,\n} from \"../notification/storage.js\";\nimport { RELAY_INTERNAL_HTTP_HEADER } from \"../tunnel/http-proxy.js\";\nimport type { RelayTunnelService } from \"../tunnel/service.js\";\nimport type {\n HttpNotificationBody,\n NotificationPushParams,\n RawNotification,\n} from \"../types.js\";\nimport {\n readBody,\n type GatewayMethodRegistrar,\n} from \"./shared.js\";\n\nfunction newIngestId(): string {\n return `ing_${randomBytes(4).toString(\"hex\")}`;\n}\n\nfunction summarizeIncomingBatch(items: RawNotification[]): string {\n const total = items.length;\n if (total === 0) return \"items=0\";\n const now = Date.now();\n let earliest = Number.POSITIVE_INFINITY;\n let latest = Number.NEGATIVE_INFINITY;\n for (const n of items) {\n const t = new Date(n.timestamp).getTime();\n if (Number.isNaN(t)) continue;\n if (t < earliest) earliest = t;\n if (t > latest) latest = t;\n }\n if (!Number.isFinite(earliest)) {\n return `items=${total} (all ts invalid)`;\n }\n const maxLag = now - earliest;\n const minLag = now - latest;\n return `items=${total} earliestTs=${new Date(earliest).toISOString()} lag=${minLag}..${maxLag}ms`;\n}\n\nfunction createEmptyIngestResult(): NotificationIngestResult {\n return {\n received: 0,\n ingested: 0,\n dedupedById: 0,\n dedupedByContent: 0,\n invalid: 0,\n inserted: [],\n };\n}\n\nfunction isRelayInternalHttpRequest(req: IncomingMessage): boolean {\n const header = req.headers?.[RELAY_INTERNAL_HTTP_HEADER];\n if (Array.isArray(header)) {\n return header.includes(\"1\");\n }\n return header === \"1\";\n}\n\n/**\n * 将 ingest 内部结果转成对外响应:丢弃 `inserted` 字段,\n * 它只供插件内部下游链路(如 light-rule agent 评估)使用,\n * 不应该出现在 gateway / HTTP 响应里。\n */\nfunction toIngestResponse(\n result: NotificationIngestResult,\n): Omit<NotificationIngestResult, \"inserted\"> {\n const { inserted: _inserted, ...rest } = result;\n return rest;\n}\n\ninterface NotificationInterfaceDeps {\n api: OpenClawPluginApi;\n logger: Logger;\n getStorage: () => NotificationStorage | null;\n filterNotifications: (items: RawNotification[]) => RawNotification[];\n registerGatewayMethod: GatewayMethodRegistrar;\n tunnelService?: RelayTunnelService | null;\n /** 通知落盘后的钩子,用于触发灯效规则评估。 */\n onAfterIngest?: (\n inserted: StoredNotification[],\n ingestId: string,\n ) => void | Promise<void>;\n}\n\nexport function registerNotificationInterfaces(\n deps: NotificationInterfaceDeps,\n): void {\n const {\n api,\n logger,\n getStorage,\n filterNotifications,\n registerGatewayMethod,\n tunnelService,\n onAfterIngest,\n } = deps;\n\n function triggerAfterIngest(\n inserted: StoredNotification[],\n ingestId: string,\n ): void {\n if (inserted.length === 0 || !onAfterIngest) return;\n logger.info(\n `notifications[${ingestId}]: enqueue ${inserted.length} for light-rule evaluation`,\n );\n void Promise.resolve()\n .then(() => onAfterIngest(inserted, ingestId))\n .catch((err) =>\n logger.warn(\n `notifications[${ingestId}]: onAfterIngest failed: ${err?.message ?? err}`,\n ),\n );\n }\n\n registerGatewayMethod(\n \"notifications.push\",\n async ({ params, respond }) => {\n const storage = getStorage();\n if (!storage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Storage service not ready\",\n });\n return;\n }\n\n const { items } = params as unknown as NotificationPushParams;\n if (!Array.isArray(items)) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"items must be an array\",\n });\n return;\n }\n\n const ingestId = newIngestId();\n const startMs = Date.now();\n logger.info(\n `notifications[${ingestId}]: gateway notifications.push received ${summarizeIncomingBatch(items)}`,\n );\n\n const filtered = filterNotifications(items);\n if (filtered.length !== items.length) {\n logger.info(\n `notifications[${ingestId}]: filtered ${items.length - filtered.length} ignored-app item(s), kept=${filtered.length}`,\n );\n }\n const result = filtered.length\n ? await storage.ingest(filtered, ingestId)\n : createEmptyIngestResult();\n\n logger.info(\n `notifications[${ingestId}]: ingest done in ${Date.now() - startMs}ms ` +\n `(received=${result.received} ingested=${result.ingested} ` +\n `dedupedById=${result.dedupedById} dedupedByContent=${result.dedupedByContent} invalid=${result.invalid})`,\n );\n\n // 主响应先返回,不阻塞灯效评估\n respond(true, toIngestResponse(result));\n\n // 落盘后异步触发灯效评估(fire-and-forget)\n triggerAfterIngest(result.inserted, ingestId);\n },\n );\n\n api.registerHttpRoute({\n path: \"/notifications\",\n auth: \"gateway\",\n async handler(req: IncomingMessage, res: ServerResponse) {\n if (req.method !== \"POST\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Method Not Allowed\" }));\n return;\n }\n\n if (!isRelayInternalHttpRequest(req)) {\n await tunnelService?.deactivateForExternalTunnel(\"POST /notifications\");\n }\n\n const storage = getStorage();\n if (!storage) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Service Not Ready\" }));\n return;\n }\n\n let body: HttpNotificationBody;\n try {\n const raw = await readBody(req);\n body = JSON.parse(raw);\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Invalid JSON\" }));\n return;\n }\n\n if (!Array.isArray(body.notifications)) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n ok: false,\n error: \"notifications must be an array\",\n }),\n );\n return;\n }\n\n const ingestId = newIngestId();\n const startMs = Date.now();\n logger.info(\n `notifications[${ingestId}]: HTTP POST /notifications received ${summarizeIncomingBatch(body.notifications)}`,\n );\n\n const filtered = filterNotifications(body.notifications);\n if (filtered.length !== body.notifications.length) {\n logger.info(\n `notifications[${ingestId}]: filtered ${body.notifications.length - filtered.length} ignored-app item(s), kept=${filtered.length}`,\n );\n }\n const result = filtered.length\n ? await storage.ingest(filtered, ingestId)\n : createEmptyIngestResult();\n\n logger.info(\n `notifications[${ingestId}]: ingest done in ${Date.now() - startMs}ms ` +\n `(received=${result.received} ingested=${result.ingested} ` +\n `dedupedById=${result.dedupedById} dedupedByContent=${result.dedupedByContent} invalid=${result.invalid})`,\n );\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true, ...toIngestResponse(result) }));\n\n // Relay tunnel 会把手机通知转发到 HTTP 端点;这里也要触发事件驱动灯效评估。\n triggerAfterIngest(result.inserted, ingestId);\n },\n });\n\n logger.info(\"Gateway 通知方法已注册: notifications.push\");\n logger.info(\"HTTP 通知端点已注册: POST /notifications\");\n}\n",
|
|
60
53
|
"export function previewText(text: string | undefined, max = 200): string {\n if (!text) return \"\";\n return text.length <= max ? text : `${text.substring(0, max)}…`;\n}\n\nexport function maskSecret(value: string | undefined): string {\n if (!value) return \"empty\";\n if (value.length <= 8) {\n return `${value.slice(0, 2)}...${value.slice(-2)}`;\n }\n return `${value.slice(0, 4)}...${value.slice(-4)}`;\n}\n\nexport function redactUrlSecrets(rawUrl: string): string {\n try {\n const url = new URL(rawUrl);\n for (const key of [\"apiKey\", \"token\", \"access_token\"]) {\n const value = url.searchParams.get(key);\n if (value) {\n url.searchParams.set(key, maskSecret(value));\n }\n }\n return url.toString();\n } catch {\n return rawUrl.replace(\n /([?&](?:apiKey|token|access_token)=)([^&]+)/gi,\n (_match, prefix: string, value: string) => {\n let decoded = value;\n try {\n decoded = decodeURIComponent(value);\n } catch {\n // Keep the original value when the URL is malformed.\n }\n return `${prefix}${maskSecret(decoded)}`;\n },\n );\n }\n}\n\nexport function findHeaderValue(\n headers: Record<string, string> | undefined,\n key: string,\n): string | undefined {\n if (!headers) return undefined;\n const lowerKey = key.toLowerCase();\n for (const [headerKey, headerValue] of Object.entries(headers)) {\n if (headerKey.toLowerCase() === lowerKey) {\n return headerValue;\n }\n }\n return undefined;\n}\n\nexport function summarizeRequestHeaders(headers: Record<string, string> | undefined): string {\n const contentType = findHeaderValue(headers, \"content-type\");\n const requestId = findHeaderValue(headers, \"x-request-id\");\n const parts: string[] = [];\n if (contentType) {\n parts.push(`contentType=${contentType}`);\n }\n if (requestId) {\n parts.push(`xRequestId=${previewText(requestId, 120)}`);\n }\n return parts.length ? `, ${parts.join(\", \")}` : \"\";\n}\n",
|
|
61
54
|
"import type { RelayClient } from \"./relay-client.js\";\nimport type { RequestFrame } from \"./types.js\";\nimport { previewText, summarizeRequestHeaders } from \"./utils.js\";\n\nexport const RELAY_INTERNAL_HTTP_HEADER = \"x-openclaw-relay-internal\";\n\nexport interface HttpProxyOptions {\n gatewayBaseUrl: string;\n gatewayAuthMode?: \"token\" | \"password\";\n gatewayToken?: string;\n gatewayPassword?: string;\n abortSignal?: AbortSignal;\n client: RelayClient;\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n}\n\n// ─── 路径映射 ───\n\nconst PATH_MAP: Record<string, string> = {\n \"/api/message/messageBridge/send\": \"/notifications\",\n};\n\nexport function mapPath(p: string): string {\n return PATH_MAP[p] ?? p;\n}\n\n// ─── Auth helpers ───\n\nfunction resolveGatewayConnectAuth(opts: HttpProxyOptions):\n | { token?: string; password?: string }\n | undefined {\n const token = opts.gatewayToken?.trim() || undefined;\n const password = opts.gatewayPassword?.trim() || undefined;\n if (!token && !password) return undefined;\n return { token, password };\n}\n\nexport function buildLocalGatewayAuthAttempts(\n opts: HttpProxyOptions,\n baseHeaders: Record<string, string>,\n): Array<{ label: string; headers: Record<string, string> }> {\n const auth = resolveGatewayConnectAuth(opts);\n const attempts: Array<{ label: string; headers: Record<string, string> }> = [];\n const seen = new Set<string>();\n const authMode = opts.gatewayAuthMode;\n\n const addAttempt = (kind: \"token\" | \"password\", secret?: string): void => {\n if (!secret) return;\n\n const dedupeKey = `${kind}:${secret}`;\n if (seen.has(dedupeKey)) return;\n seen.add(dedupeKey);\n\n const headers = { ...baseHeaders };\n headers.authorization = `Bearer ${secret}`;\n\n if (kind === \"password\") {\n headers[\"x-openclaw-password\"] = secret;\n } else {\n delete headers[\"x-openclaw-password\"];\n }\n\n attempts.push({\n label: kind === \"token\" ? \"gateway-token\" : \"gateway-password\",\n headers,\n });\n };\n\n if (authMode === \"password\") {\n addAttempt(\"password\", auth?.password);\n addAttempt(\"token\", auth?.token);\n } else {\n addAttempt(\"token\", auth?.token);\n addAttempt(\"password\", auth?.password);\n }\n\n if (attempts.length === 0) {\n attempts.push({\n label: \"no-auth\",\n headers: { ...baseHeaders },\n });\n }\n\n return attempts;\n}\n\n// ─── HTTP request proxy ───\n\nexport async function handleHttpRequest(\n opts: HttpProxyOptions,\n frame: RequestFrame,\n): Promise<void> {\n const mappedPath = mapPath(frame.path);\n const url = new URL(mappedPath, opts.gatewayBaseUrl);\n const startedAtMs = Date.now();\n\n // 代理到本地 gateway 时,替换外部鉴权头为本地 gateway token/password。\n const localHeaders: Record<string, string> = {};\n for (const [k, v] of Object.entries(frame.headers ?? {})) {\n const lower = k.toLowerCase();\n if (lower !== \"authorization\" && lower !== \"x-openclaw-password\") {\n localHeaders[k] = v;\n }\n }\n localHeaders[RELAY_INTERNAL_HTTP_HEADER] = \"1\";\n\n const authAttempts = buildLocalGatewayAuthAttempts(opts, localHeaders);\n opts.logger.info(\n `TunnelProxy: HTTP id=${frame.id} ${frame.method} ${frame.path} → ${url.toString()}${summarizeRequestHeaders(frame.headers)}, authAttempts=${authAttempts.map((a) => a.label).join(\" -> \")}, body=${previewText(frame.body)}`,\n );\n\n try {\n for (let attemptIndex = 0; attemptIndex < authAttempts.length; attemptIndex++) {\n const attempt = authAttempts[attemptIndex];\n opts.logger.info(\n `TunnelProxy: HTTP id=${frame.id} attempt ${attemptIndex + 1}/${authAttempts.length} auth=${attempt.label}`,\n );\n const res = await fetch(url.toString(), {\n method: frame.method,\n headers: attempt.headers,\n signal: opts.abortSignal,\n body:\n frame.method !== \"GET\" && frame.method !== \"HEAD\"\n ? frame.body\n : undefined,\n });\n\n const hasFallback = attemptIndex < authAttempts.length - 1;\n if (res.status === 401 && hasFallback) {\n const body = await res.text();\n opts.logger.warn(\n `TunnelProxy: HTTP id=${frame.id} local gateway auth via ${attempt.label} returned 401 after ${Date.now() - startedAtMs}ms, retrying next credential${body ? `, body=${previewText(body)}` : \"\"}`,\n );\n continue;\n }\n\n await sendHttpResponse(opts, {\n frameId: frame.id,\n method: frame.method,\n path: mappedPath,\n authLabel: attempt.label,\n startedAtMs,\n res,\n });\n return;\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n opts.logger.error(\n `TunnelProxy: HTTP id=${frame.id} ${frame.method} ${mappedPath} failed after ${Date.now() - startedAtMs}ms: ${message}`,\n );\n opts.client.send({\n type: \"proxy_error\",\n id: frame.id,\n status: 502,\n message: `gateway unreachable: ${message}`,\n });\n }\n}\n\n// ─── Response helpers ───\n\nasync function sendHttpResponse(\n opts: HttpProxyOptions,\n params: {\n frameId: string;\n method: string;\n path: string;\n authLabel: string;\n startedAtMs: number;\n res: Response;\n },\n): Promise<void> {\n const { frameId, method, path, authLabel, startedAtMs, res } = params;\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n const isStreaming = contentType.includes(\"text/event-stream\");\n const elapsedMs = Date.now() - startedAtMs;\n\n opts.logger.info(\n `TunnelProxy: HTTP id=${frameId} ${method} ${path} <= ${res.status} (${elapsedMs}ms, auth=${authLabel}, content-type=${contentType}, streaming=${isStreaming})`,\n );\n\n if (isStreaming && res.body) {\n await streamResponse(opts, frameId, res, startedAtMs);\n return;\n }\n\n const body = await res.text();\n opts.logger.info(\n `TunnelProxy: HTTP id=${frameId} response body=${previewText(body)}`,\n );\n const headers: Record<string, string> = {};\n res.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n opts.client.send({\n type: \"proxy_response\",\n id: frameId,\n status: res.status,\n headers,\n body,\n });\n}\n\nasync function streamResponse(\n opts: HttpProxyOptions,\n requestId: string,\n res: Response,\n startedAtMs: number,\n): Promise<void> {\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let chunkCount = 0;\n\n opts.logger.info(`TunnelProxy: stream start id=${requestId}`);\n\n try {\n while (true) {\n if (opts.abortSignal?.aborted) {\n throw new DOMException(\"relay tunnel disconnected\", \"AbortError\");\n }\n const { done, value } = await reader.read();\n if (done) break;\n\n chunkCount++;\n const chunk = decoder.decode(value, { stream: true });\n opts.logger.info(\n `TunnelProxy: stream delta id=${requestId} chunk#${chunkCount} (${chunk.length} chars)`,\n );\n opts.client.send({\n type: \"stream\",\n id: requestId,\n state: \"delta\",\n data: chunk,\n });\n }\n\n opts.logger.info(\n `TunnelProxy: stream end id=${requestId}, total chunks=${chunkCount}, totalElapsedMs=${Date.now() - startedAtMs}`,\n );\n opts.client.send({\n type: \"stream\",\n id: requestId,\n state: \"end\",\n data: \"\",\n });\n } catch (err) {\n opts.logger.error(\n `TunnelProxy: stream error id=${requestId} after ${chunkCount} chunks and ${Date.now() - startedAtMs}ms: ${err instanceof Error ? err.message : String(err)}`,\n );\n opts.client.send({\n type: \"proxy_error\",\n id: requestId,\n status: 502,\n message: `stream error: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n}\n",
|
|
62
55
|
"import type { IncomingMessage } from \"node:http\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\n\nexport type GatewayHandler = Parameters<OpenClawPluginApi[\"registerGatewayMethod\"]>[1];\n\nexport type GatewayMethodRegistrar = (\n method: string,\n handler: GatewayHandler,\n) => void;\n\nexport function readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString()));\n req.on(\"error\", reject);\n });\n}\n\nexport function trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n",
|
|
63
|
-
"/**\n * 录音本地存储管理(§5.2)\n *\n * 目录结构:\n * <storageDir>/recordings/\n * ├── audio/ # 原始音频 + 打点文件\n * │ ├── 2026-03-23_14-32.ogg\n * │ └── 2026-03-23_14-32.srt\n * ├── transcript-data/ # 转写 JSON(主存储)\n * │ └── 2026-03-23_14-32.json\n * ├── transcripts/ # 转写文本\n * │ └── 2026-03-23_14-32_与王总沟通产品方向.md\n * ├── summaries/ # 转写摘要\n * │ └── 2026-03-23_14-32.md\n * └── index.json # 元数据索引\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n rmSync,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport type {\n RecordingMetadata,\n RecordingTransferStatus,\n} from \"../types.js\";\nimport { transition } from \"./state-machine.js\";\nimport type { Logger } from \"../logger.js\";\nimport {\n buildTranscriptDataFilename as buildTranscriptDataJsonFilename,\n buildTranscriptDocument,\n extractTranscriptSummaryFromDocument,\n extractTranscriptTextFromDocument,\n extractTranscriptTitleFromDocument,\n parseTranscriptDocument,\n} from \"./transcript-document.js\";\n\n/**\n * 从 OSS URL 中提取音频文件扩展名(含点号,如 \".ogg\")\n * 默认返回 \".ogg\"(小硬件录音为 Opus/OGG 格式)\n */\nfunction extractAudioExt(ossUrl: string): string {\n try {\n const pathname = new URL(ossUrl).pathname;\n const m = pathname.match(/(\\.[a-z0-9]+)(?:\\?|$)/i);\n if (m) return m[1].toLowerCase();\n } catch {\n const m = ossUrl.match(/(\\.[a-z0-9]+)(?:\\?|$)/i);\n if (m) return m[1].toLowerCase();\n }\n return \".ogg\"; // 硬件默认录音格式(Opus/OGG)\n}\n\n// ─── Types ───\n\n/** 持久化到 index.json 的单条录音记录 */\nexport interface RecordingIndexEntry {\n /** 录音 ID,基于文件名(如 \"2026-03-23_14-32\") */\n id: string;\n /** 原始元数据 */\n metadata: RecordingMetadata;\n /** 当前插件侧状态 */\n status: RecordingTransferStatus;\n /** 本地音频文件相对路径 */\n audioFile?: string;\n /** 本地打点文件相对路径 */\n srtFile?: string;\n /** 本地转写文件相对路径 */\n transcriptFile?: string;\n /** 本地转写 JSON 文件相对路径 */\n transcriptDataFile?: string;\n /** 本地摘要文件相对路径 */\n summaryFile?: string;\n /** 转写标题 */\n title?: string;\n /** 最近一次失败原因(同步失败 / 转写失败) */\n lastError?: string;\n /** 入库时间 ISO 8601 */\n ingestedAt: string;\n /** 最后更新时间 ISO 8601 */\n updatedAt: string;\n}\n\n/** 录音存储索引(整个 index.json) */\ninterface RecordingIndex {\n recordings: RecordingIndexEntry[];\n}\n\nexport interface RecordingStorageContext {\n stateDir: string;\n workspaceDir?: string;\n}\n\n// ─── Constants ───\n\nconst RECORDINGS_DIR = \"recordings\";\nconst AUDIO_DIR = \"audio\";\nconst TRANSCRIPT_DATA_DIR = \"transcript-data\";\nconst TRANSCRIPTS_DIR = \"transcripts\";\nconst SUMMARIES_DIR = \"summaries\";\nconst INDEX_FILE = \"index.json\";\n\nfunction stripMarkdownFence(markdown: string): string {\n return markdown.replace(/\\r\\n/g, \"\\n\");\n}\n\nfunction deriveTitleFromTranscriptPath(\n transcriptFile: string | undefined,\n recordingId: string,\n): string | undefined {\n if (!transcriptFile) return undefined;\n const name = basename(transcriptFile, \".md\");\n const prefix = `${recordingId}_`;\n if (name.startsWith(prefix)) {\n const derived = name.slice(prefix.length).trim();\n return derived || undefined;\n }\n return undefined;\n}\n\nfunction extractTranscriptContent(markdown: string): string {\n const normalized = stripMarkdownFence(markdown);\n const firstDivider = normalized.indexOf(\"\\n---\\n\");\n let body = firstDivider >= 0\n ? normalized.slice(firstDivider + \"\\n---\\n\".length)\n : normalized;\n\n if (body.startsWith(\"\\n\")) {\n body = body.slice(1);\n }\n\n if (body.startsWith(\"### 关键点\")) {\n const secondDivider = body.indexOf(\"\\n---\\n\");\n if (secondDivider >= 0) {\n body = body.slice(secondDivider + \"\\n---\\n\".length);\n if (body.startsWith(\"\\n\")) {\n body = body.slice(1);\n }\n }\n }\n\n const lines = body\n .split(\"\\n\")\n .filter((line) => !/^\\*\\*\\[关键点 .+\\]\\*\\*$/.test(line.trim()))\n .filter((line) => !/^- \\*\\*\\[关键点 .+\\]\\*\\*$/.test(line.trim()));\n\n return lines.join(\"\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n}\n\n// ─── Public Functions ───\n\n/**\n * 解析录音存储根目录(复用通知同级的 stateDir 路径)\n */\nexport function resolveRecordingStorageDir(\n ctx: RecordingStorageContext,\n logger: Pick<Logger, \"info\" | \"warn\">,\n): string {\n const stateRecDir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n RECORDINGS_DIR,\n );\n\n try {\n mkdirSync(stateRecDir, { recursive: true });\n logger.info(`录音将写入 stateDir 路径: ${stateRecDir}`);\n return stateRecDir;\n } catch {\n // fallback\n }\n\n if (ctx.workspaceDir) {\n const wsRecDir = join(ctx.workspaceDir, RECORDINGS_DIR);\n try {\n mkdirSync(wsRecDir, { recursive: true });\n logger.warn(`stateDir 不可用,录音已回退到 workspace 路径: ${wsRecDir}`);\n return wsRecDir;\n } catch {\n // fallthrough\n }\n }\n\n throw new Error(`录音存储目录不可用: ${stateRecDir}`);\n}\n\n// ─── RecordingStorage Class ───\n\nexport class RecordingStorage {\n private readonly dir: string;\n private readonly audioDir: string;\n private readonly transcriptDataDir: string;\n private readonly transcriptsDir: string;\n private readonly summariesDir: string;\n private readonly indexPath: string;\n private index: RecordingIndex = { recordings: [] };\n\n constructor(\n dir: string,\n private readonly logger: Logger,\n ) {\n this.dir = dir;\n this.audioDir = join(dir, AUDIO_DIR);\n this.transcriptDataDir = join(dir, TRANSCRIPT_DATA_DIR);\n this.transcriptsDir = join(dir, TRANSCRIPTS_DIR);\n this.summariesDir = join(dir, SUMMARIES_DIR);\n this.indexPath = join(dir, INDEX_FILE);\n }\n\n /** 初始化目录结构并加载索引 */\n async init(): Promise<void> {\n mkdirSync(this.audioDir, { recursive: true });\n mkdirSync(this.transcriptDataDir, { recursive: true });\n mkdirSync(this.transcriptsDir, { recursive: true });\n mkdirSync(this.summariesDir, { recursive: true });\n this.loadIndex();\n this.logger.info(\n `录音存储已初始化: ${this.dir}(共 ${this.index.recordings.length} 条记录)`,\n );\n }\n\n /** 获取音频目录路径 */\n getAudioDir(): string {\n return this.audioDir;\n }\n\n /** 获取转写 JSON 目录路径 */\n getTranscriptDataDir(): string {\n return this.transcriptDataDir;\n }\n\n /** 获取转写目录路径 */\n getTranscriptsDir(): string {\n return this.transcriptsDir;\n }\n\n /** 获取摘要目录路径 */\n getSummariesDir(): string {\n return this.summariesDir;\n }\n\n // ─── 录音入库 ───\n\n /**\n * 收到 recordings.sync 后,将元数据写入索引。\n * 如果同 ID 录音已存在则更新,否则新建。\n * 返回录音 ID。\n */\n ingest(recordingId: string, metadata: RecordingMetadata): string {\n const id = recordingId;\n const existing = this.findById(id);\n\n if (existing) {\n const sameAudioUrl = existing.metadata.oss_audio_url === metadata.oss_audio_url;\n const canPreserveSyncState =\n sameAudioUrl\n && !!existing.audioFile\n && existing.status !== \"syncing_openclaw\"\n && existing.status !== \"sync_failed\";\n\n if (canPreserveSyncState) {\n existing.metadata = metadata;\n existing.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(\n `录音元数据已更新: ${id}(同音频,保留状态 ${existing.status})`,\n );\n return id;\n }\n\n // 更新已有记录(覆盖上传/本地文件缺失场景)\n if (existing.transcriptDataFile) {\n rmSync(join(this.dir, existing.transcriptDataFile), { force: true });\n }\n if (existing.transcriptFile) {\n rmSync(join(this.dir, existing.transcriptFile), { force: true });\n }\n if (existing.summaryFile) {\n rmSync(join(this.dir, existing.summaryFile), { force: true });\n }\n existing.metadata = metadata;\n existing.status = \"syncing_openclaw\";\n existing.transcriptDataFile = undefined;\n existing.transcriptFile = undefined;\n existing.summaryFile = undefined;\n existing.title = undefined;\n existing.lastError = undefined;\n existing.updatedAt = new Date().toISOString();\n this.logger.info(`录音元数据已更新: ${id}`);\n } else {\n const entry: RecordingIndexEntry = {\n id,\n metadata,\n status: \"syncing_openclaw\",\n ingestedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n this.index.recordings.push(entry);\n this.logger.info(`录音元数据已入库: ${id}`);\n }\n\n this.saveIndex();\n return id;\n }\n\n // ─── 状态管理 ───\n\n /**\n * 更新录音传输状态(严格状态机校验)\n */\n updateStatus(\n recordingId: string,\n newStatus: RecordingTransferStatus,\n ): RecordingIndexEntry {\n const entry = this.findById(recordingId);\n if (!entry) {\n throw new Error(`录音不存在: ${recordingId}`);\n }\n\n const validatedStatus = transition(entry.status, newStatus);\n entry.status = validatedStatus;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音状态更新: ${recordingId} → ${newStatus}`);\n return entry;\n }\n\n /**\n * 记录本地音频文件已下载\n */\n setAudioFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.audioFile = `${AUDIO_DIR}/${filename}`;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录本地打点文件已下载\n */\n setSrtFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.srtFile = `${AUDIO_DIR}/${filename}`;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录转写 JSON 文件路径\n */\n setTranscriptDataFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextTranscriptDataFile = `${TRANSCRIPT_DATA_DIR}/${filename}`;\n if (entry.transcriptDataFile && entry.transcriptDataFile !== nextTranscriptDataFile) {\n rmSync(join(this.dir, entry.transcriptDataFile), { force: true });\n }\n entry.transcriptDataFile = nextTranscriptDataFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录转写文件路径\n */\n setTranscriptFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextTranscriptFile = `${TRANSCRIPTS_DIR}/${filename}`;\n if (entry.transcriptFile && entry.transcriptFile !== nextTranscriptFile) {\n rmSync(join(this.dir, entry.transcriptFile), { force: true });\n }\n entry.transcriptFile = nextTranscriptFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录摘要文件路径\n */\n setSummaryFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextSummaryFile = `${SUMMARIES_DIR}/${filename}`;\n if (entry.summaryFile && entry.summaryFile !== nextSummaryFile) {\n rmSync(join(this.dir, entry.summaryFile), { force: true });\n }\n entry.summaryFile = nextSummaryFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录转写标题\n */\n setTitle(recordingId: string, title?: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.title = title?.trim() || undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录最近一次失败原因;传 undefined 表示清除错误\n */\n setLastError(recordingId: string, error?: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.lastError = error?.trim() || undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 读取摘要文本\n */\n readSummary(recordingId: string): string | undefined {\n const entry = this.findById(recordingId);\n if (!entry) return undefined;\n\n if (entry.summaryFile) {\n const summary = this.readRelativeTextFile(entry.summaryFile);\n if (summary?.trim()) {\n return summary.trim();\n }\n }\n\n const transcriptDoc = entry.transcriptDataFile\n ? this.readRelativeTranscriptDocument(entry.transcriptDataFile)\n : undefined;\n return extractTranscriptSummaryFromDocument(transcriptDoc);\n }\n\n /**\n * 优先从 transcript JSON 中读取正文,旧数据回退读取 Markdown。\n */\n readTranscript(recordingId: string): string | undefined {\n const entry = this.findById(recordingId);\n if (!entry) return undefined;\n\n if (entry.transcriptDataFile) {\n const transcriptDoc = this.readRelativeTranscriptDocument(entry.transcriptDataFile);\n const transcriptFromJson = extractTranscriptTextFromDocument(transcriptDoc);\n if (transcriptFromJson !== undefined) {\n return transcriptFromJson;\n }\n }\n\n if (!entry.transcriptFile) return undefined;\n const markdown = this.readRelativeTextFile(entry.transcriptFile);\n if (!markdown) return undefined;\n const transcript = extractTranscriptContent(markdown);\n return transcript || undefined;\n }\n\n /**\n * 读取结构化 transcript JSON。\n */\n readTranscriptDocument(recordingId: string) {\n const entry = this.findById(recordingId);\n if (!entry?.transcriptDataFile) {\n return undefined;\n }\n return this.readRelativeTranscriptDocument(entry.transcriptDataFile);\n }\n\n // ─── 查询 ───\n\n findById(id: string): RecordingIndexEntry | undefined {\n return this.index.recordings.find((r) => r.id === id);\n }\n\n listAll(): RecordingIndexEntry[] {\n return [...this.index.recordings].sort(\n (a, b) => b.metadata.created_at.localeCompare(a.metadata.created_at),\n );\n }\n\n listByStatus(status: RecordingTransferStatus): RecordingIndexEntry[] {\n return this.listAll().filter((r) => r.status === status);\n }\n\n rename(recordingId: string, name: string): RecordingIndexEntry {\n const entry = this.findById(recordingId);\n if (!entry) {\n throw new Error(`录音不存在: ${recordingId}`);\n }\n\n entry.metadata = {\n ...entry.metadata,\n name,\n };\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音名称已更新: ${recordingId} → ${name}`);\n return entry;\n }\n\n // ─── 删除 ───\n\n /**\n * 删除录音及其本地文件(约束 R-4 安全删除)\n *\n * @param opts.localOnly 仅删除本地文件(音频/打点/转写),保留索引条目。\n * App 端\"仅删除本地\"时使用此模式,插件侧保留元数据记录。\n * 默认 false — 完整删除(文件 + 索引)。\n */\n delete(\n recordingId: string,\n opts?: { localOnly?: boolean },\n ): boolean {\n const entry = this.findById(recordingId);\n if (!entry) return false;\n\n // 删除本地文件\n if (entry.audioFile) {\n const audioPath = join(this.dir, entry.audioFile);\n rmSync(audioPath, { force: true });\n }\n if (entry.srtFile) {\n const srtPath = join(this.dir, entry.srtFile);\n rmSync(srtPath, { force: true });\n }\n if (entry.transcriptDataFile) {\n const transcriptDataPath = join(this.dir, entry.transcriptDataFile);\n rmSync(transcriptDataPath, { force: true });\n }\n if (entry.transcriptFile) {\n const transcriptPath = join(this.dir, entry.transcriptFile);\n rmSync(transcriptPath, { force: true });\n }\n if (entry.summaryFile) {\n const summaryPath = join(this.dir, entry.summaryFile);\n rmSync(summaryPath, { force: true });\n }\n\n if (opts?.localOnly) {\n // 保留索引条目,清除文件引用\n entry.audioFile = undefined;\n entry.srtFile = undefined;\n entry.transcriptDataFile = undefined;\n entry.transcriptFile = undefined;\n entry.summaryFile = undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音本地文件已删除(保留索引): ${recordingId}`);\n } else {\n // 从索引中移除\n this.index.recordings = this.index.recordings.filter(\n (r) => r.id !== recordingId,\n );\n this.saveIndex();\n this.logger.info(`录音已完整删除: ${recordingId}`);\n }\n return true;\n }\n\n // ─── Helpers ───\n\n /**\n * 生成音频文件名。扩展名从 OSS URL 中提取,未提供时默认 .ogg(硬件录音格式)\n */\n buildAudioFilename(recordingId: string, ossUrl?: string): string {\n const ext = ossUrl ? extractAudioExt(ossUrl) : \".ogg\";\n return `${recordingId}${ext}`;\n }\n\n /**\n * 生成打点文件名\n */\n buildSrtFilename(recordingId: string): string {\n return `${recordingId}.srt`;\n }\n\n /**\n * 生成转写 JSON 文件名\n */\n buildTranscriptDataFilename(recordingId: string): string {\n return buildTranscriptDataJsonFilename(recordingId);\n }\n\n /**\n * 生成转写文件名\n * @param summary 摘要标题(≤ 10 字)\n */\n buildTranscriptFilename(recordingId: string, summary: string): string {\n // 清理文件名中的非法字符\n const safeSummary = summary\n .replace(/[/\\\\:*?\"<>|]/g, \"\")\n .trim()\n .slice(0, 20);\n return safeSummary\n ? `${recordingId}_${safeSummary}.md`\n : `${recordingId}.md`;\n }\n\n /**\n * 生成摘要文件名\n */\n buildSummaryFilename(recordingId: string): string {\n return `${recordingId}.md`;\n }\n\n /**\n * 获取音频文件的绝对路径。ossUrl 用于推断文件扩展名\n */\n getAudioFilePath(recordingId: string, ossUrl?: string): string {\n return join(this.audioDir, this.buildAudioFilename(recordingId, ossUrl));\n }\n\n /**\n * 获取打点文件的绝对路径\n */\n getSrtFilePath(recordingId: string): string {\n return join(this.audioDir, this.buildSrtFilename(recordingId));\n }\n\n /**\n * 获取转写 JSON 文件的绝对路径\n */\n getTranscriptDataFilePath(recordingId: string): string {\n return join(this.transcriptDataDir, this.buildTranscriptDataFilename(recordingId));\n }\n\n /**\n * 获取摘要文件的绝对路径\n */\n getSummaryFilePath(recordingId: string): string {\n return join(this.summariesDir, this.buildSummaryFilename(recordingId));\n }\n\n // ─── Persistence ───\n\n private loadIndex(): void {\n if (!existsSync(this.indexPath)) {\n this.index = { recordings: [] };\n return;\n }\n try {\n const raw = JSON.parse(readFileSync(this.indexPath, \"utf-8\"));\n if (raw && Array.isArray(raw.recordings)) {\n let needsRewrite = false;\n const normalized = raw.recordings\n .filter((entry: unknown) => entry && typeof entry === \"object\")\n .map((entry: any) => {\n const compacted: RecordingIndexEntry = {\n id: entry.id,\n metadata: entry.metadata,\n status: entry.status,\n ingestedAt: entry.ingestedAt,\n updatedAt: entry.updatedAt,\n };\n if (typeof entry.audioFile === \"string\") compacted.audioFile = entry.audioFile;\n if (typeof entry.srtFile === \"string\") compacted.srtFile = entry.srtFile;\n if (typeof entry.transcriptFile === \"string\") {\n compacted.transcriptFile = entry.transcriptFile;\n }\n let transcriptDoc = typeof entry.transcriptDataFile === \"string\"\n ? this.readRelativeTranscriptDocument(entry.transcriptDataFile)\n : undefined;\n if (typeof entry.transcriptDataFile === \"string\" && transcriptDoc) {\n compacted.transcriptDataFile = entry.transcriptDataFile;\n } else {\n const legacyTranscriptText = typeof entry.transcript === \"string\" && entry.transcript.trim()\n ? entry.transcript.trim()\n : compacted.transcriptFile\n ? extractTranscriptContent(\n this.readRelativeTextFile(compacted.transcriptFile) ?? \"\",\n ) || undefined\n : undefined;\n const legacyTitle = typeof entry.title === \"string\" && entry.title.trim()\n ? entry.title.trim()\n : deriveTitleFromTranscriptPath(compacted.transcriptFile, compacted.id);\n const legacySummary = typeof entry.summary === \"string\" && entry.summary.trim()\n ? entry.summary.trim()\n : undefined;\n\n if (legacyTranscriptText) {\n transcriptDoc = buildTranscriptDocument({\n recordingId: compacted.id,\n generatedAt: compacted.updatedAt,\n source: {\n provider: \"legacy-markdown\",\n },\n title: legacyTitle,\n summary: legacySummary,\n text: legacyTranscriptText,\n segments: [],\n });\n const transcriptDataFilename = this.buildTranscriptDataFilename(compacted.id);\n writeFileSync(\n join(this.transcriptDataDir, transcriptDataFilename),\n JSON.stringify(transcriptDoc, null, 2),\n \"utf-8\",\n );\n compacted.transcriptDataFile = `${TRANSCRIPT_DATA_DIR}/${transcriptDataFilename}`;\n needsRewrite = true;\n }\n }\n\n if (typeof entry.summaryFile === \"string\") {\n compacted.summaryFile = entry.summaryFile;\n } else if (typeof entry.summary === \"string\" && entry.summary.trim()) {\n const summaryFilename = this.buildSummaryFilename(entry.id);\n writeFileSync(\n join(this.summariesDir, summaryFilename),\n entry.summary.trim(),\n \"utf-8\",\n );\n compacted.summaryFile = `${SUMMARIES_DIR}/${summaryFilename}`;\n needsRewrite = true;\n } else {\n const summaryFromDocument = extractTranscriptSummaryFromDocument(transcriptDoc);\n if (summaryFromDocument) {\n const summaryFilename = this.buildSummaryFilename(entry.id);\n writeFileSync(\n join(this.summariesDir, summaryFilename),\n summaryFromDocument,\n \"utf-8\",\n );\n compacted.summaryFile = `${SUMMARIES_DIR}/${summaryFilename}`;\n needsRewrite = true;\n }\n }\n if (typeof entry.title === \"string\" && entry.title.trim()) {\n compacted.title = entry.title.trim();\n } else {\n const titleFromDocument = extractTranscriptTitleFromDocument(transcriptDoc);\n const derivedTitle = titleFromDocument ?? deriveTitleFromTranscriptPath(\n compacted.transcriptFile,\n compacted.id,\n );\n if (derivedTitle) {\n compacted.title = derivedTitle;\n needsRewrite = true;\n }\n }\n if (typeof entry.lastError === \"string\" && entry.lastError.trim()) {\n compacted.lastError = entry.lastError.trim();\n }\n if (compacted.status === \"transcribing\") {\n compacted.status = \"transcribe_failed\";\n compacted.lastError = compacted.lastError\n ?? \"转写任务已中断,请重新发起转写\";\n compacted.updatedAt = new Date().toISOString();\n needsRewrite = true;\n }\n return compacted;\n });\n const hadLargeFields = raw.recordings.some(\n (entry: any) => entry && typeof entry === \"object\" && (\"transcript\" in entry || \"summary\" in entry),\n );\n this.index = { recordings: normalized };\n if (hadLargeFields || needsRewrite) {\n this.saveIndex();\n }\n } else {\n this.index = { recordings: [] };\n }\n } catch {\n this.logger.warn(`录音索引文件损坏,已重建: ${this.indexPath}`);\n this.index = { recordings: [] };\n }\n }\n\n private readRelativeTextFile(relativePath: string): string | undefined {\n try {\n return readFileSync(join(this.dir, relativePath), \"utf-8\");\n } catch {\n return undefined;\n }\n }\n\n private readRelativeTranscriptDocument(relativePath: string) {\n const raw = this.readRelativeTextFile(relativePath);\n if (!raw) {\n return undefined;\n }\n return parseTranscriptDocument(raw);\n }\n\n private saveIndex(): void {\n writeFileSync(\n this.indexPath,\n JSON.stringify(this.index, null, 2),\n \"utf-8\",\n );\n }\n\n async close(): Promise<void> {\n // 当前无需额外清理\n }\n}\n",
|
|
56
|
+
"/**\n * 录音本地存储管理(§5.2)\n *\n * 目录结构:\n * <storageDir>/recordings/\n * ├── audio/ # 原始音频 + 打点文件\n * │ ├── 2026-03-23_14-32.ogg\n * │ └── 2026-03-23_14-32.srt\n * ├── transcript-data/ # 转写 JSON(主存储)\n * │ └── 2026-03-23_14-32.json\n * ├── transcripts/ # 转写文本\n * │ └── 2026-03-23_14-32_与王总沟通产品方向.md\n * ├── summaries/ # 转写摘要\n * │ └── 2026-03-23_14-32.md\n * └── index.json # 元数据索引\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n rmSync,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport type {\n RecordingMetadata,\n RecordingTransferStatus,\n} from \"../types.js\";\nimport { transition } from \"./state-machine.js\";\nimport type { Logger } from \"../logger.js\";\nimport { currentClientLabel } from \"../ingest-context.js\";\nimport {\n buildTranscriptDataFilename as buildTranscriptDataJsonFilename,\n buildTranscriptDocument,\n extractTranscriptSummaryFromDocument,\n extractTranscriptTextFromDocument,\n extractTranscriptTitleFromDocument,\n parseTranscriptDocument,\n} from \"./transcript-document.js\";\n\n/**\n * 从 OSS URL 中提取音频文件扩展名(含点号,如 \".ogg\")\n * 默认返回 \".ogg\"(小硬件录音为 Opus/OGG 格式)\n */\nfunction extractAudioExt(ossUrl: string): string {\n try {\n const pathname = new URL(ossUrl).pathname;\n const m = pathname.match(/(\\.[a-z0-9]+)(?:\\?|$)/i);\n if (m) return m[1].toLowerCase();\n } catch {\n const m = ossUrl.match(/(\\.[a-z0-9]+)(?:\\?|$)/i);\n if (m) return m[1].toLowerCase();\n }\n return \".ogg\"; // 硬件默认录音格式(Opus/OGG)\n}\n\n// ─── Types ───\n\n/** 持久化到 index.json 的单条录音记录 */\nexport interface RecordingIndexEntry {\n /** 录音 ID,基于文件名(如 \"2026-03-23_14-32\") */\n id: string;\n /** 原始元数据 */\n metadata: RecordingMetadata;\n /** 来源客户端 label;旧数据无该字段,查询时视为 legacy */\n clientLabel?: string;\n /** 当前插件侧状态 */\n status: RecordingTransferStatus;\n /** 本地音频文件相对路径 */\n audioFile?: string;\n /** 本地打点文件相对路径 */\n srtFile?: string;\n /** 本地转写文件相对路径 */\n transcriptFile?: string;\n /** 本地转写 JSON 文件相对路径 */\n transcriptDataFile?: string;\n /** 本地摘要文件相对路径 */\n summaryFile?: string;\n /** 转写标题 */\n title?: string;\n /** 最近一次失败原因(同步失败 / 转写失败) */\n lastError?: string;\n /** 入库时间 ISO 8601 */\n ingestedAt: string;\n /** 最后更新时间 ISO 8601 */\n updatedAt: string;\n}\n\n/** 录音存储索引(整个 index.json) */\ninterface RecordingIndex {\n recordings: RecordingIndexEntry[];\n}\n\nexport interface RecordingStorageContext {\n stateDir: string;\n workspaceDir?: string;\n}\n\n// ─── Constants ───\n\nconst RECORDINGS_DIR = \"recordings\";\nconst AUDIO_DIR = \"audio\";\nconst TRANSCRIPT_DATA_DIR = \"transcript-data\";\nconst TRANSCRIPTS_DIR = \"transcripts\";\nconst SUMMARIES_DIR = \"summaries\";\nconst INDEX_FILE = \"index.json\";\n\nfunction stripMarkdownFence(markdown: string): string {\n return markdown.replace(/\\r\\n/g, \"\\n\");\n}\n\nfunction deriveTitleFromTranscriptPath(\n transcriptFile: string | undefined,\n recordingId: string,\n): string | undefined {\n if (!transcriptFile) return undefined;\n const name = basename(transcriptFile, \".md\");\n const prefix = `${recordingId}_`;\n if (name.startsWith(prefix)) {\n const derived = name.slice(prefix.length).trim();\n return derived || undefined;\n }\n return undefined;\n}\n\nfunction extractTranscriptContent(markdown: string): string {\n const normalized = stripMarkdownFence(markdown);\n const firstDivider = normalized.indexOf(\"\\n---\\n\");\n let body = firstDivider >= 0\n ? normalized.slice(firstDivider + \"\\n---\\n\".length)\n : normalized;\n\n if (body.startsWith(\"\\n\")) {\n body = body.slice(1);\n }\n\n if (body.startsWith(\"### 关键点\")) {\n const secondDivider = body.indexOf(\"\\n---\\n\");\n if (secondDivider >= 0) {\n body = body.slice(secondDivider + \"\\n---\\n\".length);\n if (body.startsWith(\"\\n\")) {\n body = body.slice(1);\n }\n }\n }\n\n const lines = body\n .split(\"\\n\")\n .filter((line) => !/^\\*\\*\\[关键点 .+\\]\\*\\*$/.test(line.trim()))\n .filter((line) => !/^- \\*\\*\\[关键点 .+\\]\\*\\*$/.test(line.trim()));\n\n return lines.join(\"\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n}\n\n// ─── Public Functions ───\n\n/**\n * 解析录音存储根目录(复用通知同级的 stateDir 路径)\n */\nexport function resolveRecordingStorageDir(\n ctx: RecordingStorageContext,\n logger: Pick<Logger, \"info\" | \"warn\">,\n): string {\n const stateRecDir = join(\n ctx.stateDir,\n \"plugins\",\n \"phone-notifications\",\n RECORDINGS_DIR,\n );\n\n try {\n mkdirSync(stateRecDir, { recursive: true });\n logger.info(`录音将写入 stateDir 路径: ${stateRecDir}`);\n return stateRecDir;\n } catch {\n // fallback\n }\n\n if (ctx.workspaceDir) {\n const wsRecDir = join(ctx.workspaceDir, RECORDINGS_DIR);\n try {\n mkdirSync(wsRecDir, { recursive: true });\n logger.warn(`stateDir 不可用,录音已回退到 workspace 路径: ${wsRecDir}`);\n return wsRecDir;\n } catch {\n // fallthrough\n }\n }\n\n throw new Error(`录音存储目录不可用: ${stateRecDir}`);\n}\n\n// ─── RecordingStorage Class ───\n\nexport class RecordingStorage {\n private readonly dir: string;\n private readonly audioDir: string;\n private readonly transcriptDataDir: string;\n private readonly transcriptsDir: string;\n private readonly summariesDir: string;\n private readonly indexPath: string;\n private index: RecordingIndex = { recordings: [] };\n\n constructor(\n dir: string,\n private readonly logger: Logger,\n ) {\n this.dir = dir;\n this.audioDir = join(dir, AUDIO_DIR);\n this.transcriptDataDir = join(dir, TRANSCRIPT_DATA_DIR);\n this.transcriptsDir = join(dir, TRANSCRIPTS_DIR);\n this.summariesDir = join(dir, SUMMARIES_DIR);\n this.indexPath = join(dir, INDEX_FILE);\n }\n\n /** 初始化目录结构并加载索引 */\n async init(): Promise<void> {\n mkdirSync(this.audioDir, { recursive: true });\n mkdirSync(this.transcriptDataDir, { recursive: true });\n mkdirSync(this.transcriptsDir, { recursive: true });\n mkdirSync(this.summariesDir, { recursive: true });\n this.loadIndex();\n this.logger.info(\n `录音存储已初始化: ${this.dir}(共 ${this.index.recordings.length} 条记录)`,\n );\n }\n\n /** 获取音频目录路径 */\n getAudioDir(): string {\n return this.audioDir;\n }\n\n /** 获取转写 JSON 目录路径 */\n getTranscriptDataDir(): string {\n return this.transcriptDataDir;\n }\n\n /** 获取转写目录路径 */\n getTranscriptsDir(): string {\n return this.transcriptsDir;\n }\n\n /** 获取摘要目录路径 */\n getSummariesDir(): string {\n return this.summariesDir;\n }\n\n // ─── 录音入库 ───\n\n /**\n * 收到 recordings.sync 后,将元数据写入索引。\n * 如果同 ID 录音已存在则更新,否则新建。\n * 返回录音 ID。\n */\n ingest(recordingId: string, metadata: RecordingMetadata): string {\n const id = recordingId;\n const clientLabel = currentClientLabel(\"default\");\n const existing = this.findById(id);\n\n if (existing) {\n const sameAudioUrl = existing.metadata.oss_audio_url === metadata.oss_audio_url;\n const canPreserveSyncState =\n sameAudioUrl\n && !!existing.audioFile\n && existing.status !== \"syncing_openclaw\"\n && existing.status !== \"sync_failed\";\n\n if (canPreserveSyncState) {\n existing.metadata = metadata;\n existing.clientLabel = clientLabel;\n existing.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(\n `录音元数据已更新: ${id}(同音频,保留状态 ${existing.status})`,\n );\n return id;\n }\n\n // 更新已有记录(覆盖上传/本地文件缺失场景)\n if (existing.transcriptDataFile) {\n rmSync(join(this.dir, existing.transcriptDataFile), { force: true });\n }\n if (existing.transcriptFile) {\n rmSync(join(this.dir, existing.transcriptFile), { force: true });\n }\n if (existing.summaryFile) {\n rmSync(join(this.dir, existing.summaryFile), { force: true });\n }\n existing.metadata = metadata;\n existing.clientLabel = clientLabel;\n existing.status = \"syncing_openclaw\";\n existing.transcriptDataFile = undefined;\n existing.transcriptFile = undefined;\n existing.summaryFile = undefined;\n existing.title = undefined;\n existing.lastError = undefined;\n existing.updatedAt = new Date().toISOString();\n this.logger.info(`录音元数据已更新: ${id}`);\n } else {\n const entry: RecordingIndexEntry = {\n id,\n metadata,\n clientLabel,\n status: \"syncing_openclaw\",\n ingestedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n this.index.recordings.push(entry);\n this.logger.info(`录音元数据已入库: ${id}`);\n }\n\n this.saveIndex();\n return id;\n }\n\n // ─── 状态管理 ───\n\n /**\n * 更新录音传输状态(严格状态机校验)\n */\n updateStatus(\n recordingId: string,\n newStatus: RecordingTransferStatus,\n ): RecordingIndexEntry {\n const entry = this.findById(recordingId);\n if (!entry) {\n throw new Error(`录音不存在: ${recordingId}`);\n }\n\n const validatedStatus = transition(entry.status, newStatus);\n entry.status = validatedStatus;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音状态更新: ${recordingId} → ${newStatus}`);\n return entry;\n }\n\n /**\n * 记录本地音频文件已下载\n */\n setAudioFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.audioFile = `${AUDIO_DIR}/${filename}`;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录本地打点文件已下载\n */\n setSrtFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.srtFile = `${AUDIO_DIR}/${filename}`;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录转写 JSON 文件路径\n */\n setTranscriptDataFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextTranscriptDataFile = `${TRANSCRIPT_DATA_DIR}/${filename}`;\n if (entry.transcriptDataFile && entry.transcriptDataFile !== nextTranscriptDataFile) {\n rmSync(join(this.dir, entry.transcriptDataFile), { force: true });\n }\n entry.transcriptDataFile = nextTranscriptDataFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录转写文件路径\n */\n setTranscriptFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextTranscriptFile = `${TRANSCRIPTS_DIR}/${filename}`;\n if (entry.transcriptFile && entry.transcriptFile !== nextTranscriptFile) {\n rmSync(join(this.dir, entry.transcriptFile), { force: true });\n }\n entry.transcriptFile = nextTranscriptFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录摘要文件路径\n */\n setSummaryFile(recordingId: string, filename: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n const nextSummaryFile = `${SUMMARIES_DIR}/${filename}`;\n if (entry.summaryFile && entry.summaryFile !== nextSummaryFile) {\n rmSync(join(this.dir, entry.summaryFile), { force: true });\n }\n entry.summaryFile = nextSummaryFile;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录转写标题\n */\n setTitle(recordingId: string, title?: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.title = title?.trim() || undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 记录最近一次失败原因;传 undefined 表示清除错误\n */\n setLastError(recordingId: string, error?: string): void {\n const entry = this.findById(recordingId);\n if (!entry) return;\n entry.lastError = error?.trim() || undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n }\n\n /**\n * 读取摘要文本\n */\n readSummary(recordingId: string): string | undefined {\n const entry = this.findById(recordingId);\n if (!entry) return undefined;\n\n if (entry.summaryFile) {\n const summary = this.readRelativeTextFile(entry.summaryFile);\n if (summary?.trim()) {\n return summary.trim();\n }\n }\n\n const transcriptDoc = entry.transcriptDataFile\n ? this.readRelativeTranscriptDocument(entry.transcriptDataFile)\n : undefined;\n return extractTranscriptSummaryFromDocument(transcriptDoc);\n }\n\n /**\n * 优先从 transcript JSON 中读取正文,旧数据回退读取 Markdown。\n */\n readTranscript(recordingId: string): string | undefined {\n const entry = this.findById(recordingId);\n if (!entry) return undefined;\n\n if (entry.transcriptDataFile) {\n const transcriptDoc = this.readRelativeTranscriptDocument(entry.transcriptDataFile);\n const transcriptFromJson = extractTranscriptTextFromDocument(transcriptDoc);\n if (transcriptFromJson !== undefined) {\n return transcriptFromJson;\n }\n }\n\n if (!entry.transcriptFile) return undefined;\n const markdown = this.readRelativeTextFile(entry.transcriptFile);\n if (!markdown) return undefined;\n const transcript = extractTranscriptContent(markdown);\n return transcript || undefined;\n }\n\n /**\n * 读取结构化 transcript JSON。\n */\n readTranscriptDocument(recordingId: string) {\n const entry = this.findById(recordingId);\n if (!entry?.transcriptDataFile) {\n return undefined;\n }\n return this.readRelativeTranscriptDocument(entry.transcriptDataFile);\n }\n\n // ─── 查询 ───\n\n findById(id: string): RecordingIndexEntry | undefined {\n return this.index.recordings.find((r) => r.id === id);\n }\n\n listAll(): RecordingIndexEntry[] {\n return [...this.index.recordings].sort(\n (a, b) => b.metadata.created_at.localeCompare(a.metadata.created_at),\n );\n }\n\n listByStatus(status: RecordingTransferStatus): RecordingIndexEntry[] {\n return this.listAll().filter((r) => r.status === status);\n }\n\n rename(recordingId: string, name: string): RecordingIndexEntry {\n const entry = this.findById(recordingId);\n if (!entry) {\n throw new Error(`录音不存在: ${recordingId}`);\n }\n\n entry.metadata = {\n ...entry.metadata,\n name,\n };\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音名称已更新: ${recordingId} → ${name}`);\n return entry;\n }\n\n // ─── 删除 ───\n\n /**\n * 删除录音及其本地文件(约束 R-4 安全删除)\n *\n * @param opts.localOnly 仅删除本地文件(音频/打点/转写),保留索引条目。\n * App 端\"仅删除本地\"时使用此模式,插件侧保留元数据记录。\n * 默认 false — 完整删除(文件 + 索引)。\n */\n delete(\n recordingId: string,\n opts?: { localOnly?: boolean },\n ): boolean {\n const entry = this.findById(recordingId);\n if (!entry) return false;\n\n // 删除本地文件\n if (entry.audioFile) {\n const audioPath = join(this.dir, entry.audioFile);\n rmSync(audioPath, { force: true });\n }\n if (entry.srtFile) {\n const srtPath = join(this.dir, entry.srtFile);\n rmSync(srtPath, { force: true });\n }\n if (entry.transcriptDataFile) {\n const transcriptDataPath = join(this.dir, entry.transcriptDataFile);\n rmSync(transcriptDataPath, { force: true });\n }\n if (entry.transcriptFile) {\n const transcriptPath = join(this.dir, entry.transcriptFile);\n rmSync(transcriptPath, { force: true });\n }\n if (entry.summaryFile) {\n const summaryPath = join(this.dir, entry.summaryFile);\n rmSync(summaryPath, { force: true });\n }\n\n if (opts?.localOnly) {\n // 保留索引条目,清除文件引用\n entry.audioFile = undefined;\n entry.srtFile = undefined;\n entry.transcriptDataFile = undefined;\n entry.transcriptFile = undefined;\n entry.summaryFile = undefined;\n entry.updatedAt = new Date().toISOString();\n this.saveIndex();\n this.logger.info(`录音本地文件已删除(保留索引): ${recordingId}`);\n } else {\n // 从索引中移除\n this.index.recordings = this.index.recordings.filter(\n (r) => r.id !== recordingId,\n );\n this.saveIndex();\n this.logger.info(`录音已完整删除: ${recordingId}`);\n }\n return true;\n }\n\n // ─── Helpers ───\n\n /**\n * 生成音频文件名。扩展名从 OSS URL 中提取,未提供时默认 .ogg(硬件录音格式)\n */\n buildAudioFilename(recordingId: string, ossUrl?: string): string {\n const ext = ossUrl ? extractAudioExt(ossUrl) : \".ogg\";\n return `${recordingId}${ext}`;\n }\n\n /**\n * 生成打点文件名\n */\n buildSrtFilename(recordingId: string): string {\n return `${recordingId}.srt`;\n }\n\n /**\n * 生成转写 JSON 文件名\n */\n buildTranscriptDataFilename(recordingId: string): string {\n return buildTranscriptDataJsonFilename(recordingId);\n }\n\n /**\n * 生成转写文件名\n * @param summary 摘要标题(≤ 10 字)\n */\n buildTranscriptFilename(recordingId: string, summary: string): string {\n // 清理文件名中的非法字符\n const safeSummary = summary\n .replace(/[/\\\\:*?\"<>|]/g, \"\")\n .trim()\n .slice(0, 20);\n return safeSummary\n ? `${recordingId}_${safeSummary}.md`\n : `${recordingId}.md`;\n }\n\n /**\n * 生成摘要文件名\n */\n buildSummaryFilename(recordingId: string): string {\n return `${recordingId}.md`;\n }\n\n /**\n * 获取音频文件的绝对路径。ossUrl 用于推断文件扩展名\n */\n getAudioFilePath(recordingId: string, ossUrl?: string): string {\n return join(this.audioDir, this.buildAudioFilename(recordingId, ossUrl));\n }\n\n /**\n * 获取打点文件的绝对路径\n */\n getSrtFilePath(recordingId: string): string {\n return join(this.audioDir, this.buildSrtFilename(recordingId));\n }\n\n /**\n * 获取转写 JSON 文件的绝对路径\n */\n getTranscriptDataFilePath(recordingId: string): string {\n return join(this.transcriptDataDir, this.buildTranscriptDataFilename(recordingId));\n }\n\n /**\n * 获取摘要文件的绝对路径\n */\n getSummaryFilePath(recordingId: string): string {\n return join(this.summariesDir, this.buildSummaryFilename(recordingId));\n }\n\n // ─── Persistence ───\n\n private loadIndex(): void {\n if (!existsSync(this.indexPath)) {\n this.index = { recordings: [] };\n return;\n }\n try {\n const raw = JSON.parse(readFileSync(this.indexPath, \"utf-8\"));\n if (raw && Array.isArray(raw.recordings)) {\n let needsRewrite = false;\n const normalized = raw.recordings\n .filter((entry: unknown) => entry && typeof entry === \"object\")\n .map((entry: any) => {\n const compacted: RecordingIndexEntry = {\n id: entry.id,\n metadata: entry.metadata,\n status: entry.status,\n ingestedAt: entry.ingestedAt,\n updatedAt: entry.updatedAt,\n };\n if (typeof entry.audioFile === \"string\") compacted.audioFile = entry.audioFile;\n if (typeof entry.srtFile === \"string\") compacted.srtFile = entry.srtFile;\n if (typeof entry.transcriptFile === \"string\") {\n compacted.transcriptFile = entry.transcriptFile;\n }\n let transcriptDoc = typeof entry.transcriptDataFile === \"string\"\n ? this.readRelativeTranscriptDocument(entry.transcriptDataFile)\n : undefined;\n if (typeof entry.transcriptDataFile === \"string\" && transcriptDoc) {\n compacted.transcriptDataFile = entry.transcriptDataFile;\n } else {\n const legacyTranscriptText = typeof entry.transcript === \"string\" && entry.transcript.trim()\n ? entry.transcript.trim()\n : compacted.transcriptFile\n ? extractTranscriptContent(\n this.readRelativeTextFile(compacted.transcriptFile) ?? \"\",\n ) || undefined\n : undefined;\n const legacyTitle = typeof entry.title === \"string\" && entry.title.trim()\n ? entry.title.trim()\n : deriveTitleFromTranscriptPath(compacted.transcriptFile, compacted.id);\n const legacySummary = typeof entry.summary === \"string\" && entry.summary.trim()\n ? entry.summary.trim()\n : undefined;\n\n if (legacyTranscriptText) {\n transcriptDoc = buildTranscriptDocument({\n recordingId: compacted.id,\n generatedAt: compacted.updatedAt,\n source: {\n provider: \"legacy-markdown\",\n },\n title: legacyTitle,\n summary: legacySummary,\n text: legacyTranscriptText,\n segments: [],\n });\n const transcriptDataFilename = this.buildTranscriptDataFilename(compacted.id);\n writeFileSync(\n join(this.transcriptDataDir, transcriptDataFilename),\n JSON.stringify(transcriptDoc, null, 2),\n \"utf-8\",\n );\n compacted.transcriptDataFile = `${TRANSCRIPT_DATA_DIR}/${transcriptDataFilename}`;\n needsRewrite = true;\n }\n }\n\n if (typeof entry.summaryFile === \"string\") {\n compacted.summaryFile = entry.summaryFile;\n } else if (typeof entry.summary === \"string\" && entry.summary.trim()) {\n const summaryFilename = this.buildSummaryFilename(entry.id);\n writeFileSync(\n join(this.summariesDir, summaryFilename),\n entry.summary.trim(),\n \"utf-8\",\n );\n compacted.summaryFile = `${SUMMARIES_DIR}/${summaryFilename}`;\n needsRewrite = true;\n } else {\n const summaryFromDocument = extractTranscriptSummaryFromDocument(transcriptDoc);\n if (summaryFromDocument) {\n const summaryFilename = this.buildSummaryFilename(entry.id);\n writeFileSync(\n join(this.summariesDir, summaryFilename),\n summaryFromDocument,\n \"utf-8\",\n );\n compacted.summaryFile = `${SUMMARIES_DIR}/${summaryFilename}`;\n needsRewrite = true;\n }\n }\n if (typeof entry.title === \"string\" && entry.title.trim()) {\n compacted.title = entry.title.trim();\n } else {\n const titleFromDocument = extractTranscriptTitleFromDocument(transcriptDoc);\n const derivedTitle = titleFromDocument ?? deriveTitleFromTranscriptPath(\n compacted.transcriptFile,\n compacted.id,\n );\n if (derivedTitle) {\n compacted.title = derivedTitle;\n needsRewrite = true;\n }\n }\n if (typeof entry.lastError === \"string\" && entry.lastError.trim()) {\n compacted.lastError = entry.lastError.trim();\n }\n if (compacted.status === \"transcribing\") {\n compacted.status = \"transcribe_failed\";\n compacted.lastError = compacted.lastError\n ?? \"转写任务已中断,请重新发起转写\";\n compacted.updatedAt = new Date().toISOString();\n needsRewrite = true;\n }\n return compacted;\n });\n const hadLargeFields = raw.recordings.some(\n (entry: any) => entry && typeof entry === \"object\" && (\"transcript\" in entry || \"summary\" in entry),\n );\n this.index = { recordings: normalized };\n if (hadLargeFields || needsRewrite) {\n this.saveIndex();\n }\n } else {\n this.index = { recordings: [] };\n }\n } catch {\n this.logger.warn(`录音索引文件损坏,已重建: ${this.indexPath}`);\n this.index = { recordings: [] };\n }\n }\n\n private readRelativeTextFile(relativePath: string): string | undefined {\n try {\n return readFileSync(join(this.dir, relativePath), \"utf-8\");\n } catch {\n return undefined;\n }\n }\n\n private readRelativeTranscriptDocument(relativePath: string) {\n const raw = this.readRelativeTextFile(relativePath);\n if (!raw) {\n return undefined;\n }\n return parseTranscriptDocument(raw);\n }\n\n private saveIndex(): void {\n writeFileSync(\n this.indexPath,\n JSON.stringify(this.index, null, 2),\n \"utf-8\",\n );\n }\n\n async close(): Promise<void> {\n // 当前无需额外清理\n }\n}\n",
|
|
64
57
|
"/**\n * 录音传输状态机(约束 R-3)\n *\n * 状态流转严格不可跳跃:\n * receiving_failed → receiving\n * receiving → pending_oss_upload\n * pending_oss_upload → uploading_oss\n * uploading_oss → oss_uploaded\n * oss_uploaded → syncing_openclaw\n * syncing_openclaw → synced | sync_failed\n * sync_failed → syncing_openclaw\n * synced → transcribing(仅当已配置 ASR)\n * transcribing → transcribed | transcribe_failed\n * transcribe_failed → transcribing\n * transcribed → transcribing(手动强制重新转写)\n */\n\nimport type { RecordingTransferStatus } from \"../types.js\";\n\n/** 合法的状态转换表:from → Set<to> */\nconst VALID_TRANSITIONS: ReadonlyMap<\n RecordingTransferStatus,\n ReadonlySet<RecordingTransferStatus>\n> = new Map<RecordingTransferStatus, ReadonlySet<RecordingTransferStatus>>([\n [\"receiving_failed\", new Set([\"receiving\"])],\n [\"receiving\", new Set([\"pending_oss_upload\"])],\n [\"pending_oss_upload\", new Set([\"uploading_oss\"])],\n [\"uploading_oss\", new Set([\"oss_uploaded\"])],\n [\"oss_uploaded\", new Set([\"syncing_openclaw\"])],\n [\"syncing_openclaw\", new Set([\"synced\", \"sync_failed\"])],\n [\"sync_failed\", new Set([\"syncing_openclaw\"])],\n [\"synced\", new Set([\"transcribing\"])],\n [\"transcribing\", new Set([\"transcribed\", \"transcribe_failed\"])],\n [\"transcribe_failed\", new Set([\"transcribing\"])],\n [\"transcribed\", new Set([\"transcribing\"])],\n]);\n\n/** 插件侧关注的状态:从 syncing_openclaw 开始 */\nexport type PluginSideStatus = Extract<\n RecordingTransferStatus,\n | \"syncing_openclaw\"\n | \"sync_failed\"\n | \"synced\"\n | \"transcribing\"\n | \"transcribe_failed\"\n | \"transcribed\"\n>;\n\n/**\n * 校验状态转换是否合法\n */\nexport function isValidTransition(\n from: RecordingTransferStatus,\n to: RecordingTransferStatus,\n): boolean {\n const allowed = VALID_TRANSITIONS.get(from);\n return allowed ? allowed.has(to) : false;\n}\n\n/**\n * 尝试执行状态转换,非法转换抛出 Error\n */\nexport function transition(\n from: RecordingTransferStatus,\n to: RecordingTransferStatus,\n): RecordingTransferStatus {\n if (!isValidTransition(from, to)) {\n throw new TransitionError(from, to);\n }\n return to;\n}\n\n/**\n * 状态是否为终态(没有后续合法转换)\n */\nexport function isTerminalStatus(status: RecordingTransferStatus): boolean {\n const allowed = VALID_TRANSITIONS.get(status);\n return !allowed || allowed.size === 0;\n}\n\n/**\n * 状态是否允许触发 ASR 转写\n */\nexport function canStartTranscription(status: RecordingTransferStatus): boolean {\n return (\n status === \"synced\"\n || status === \"transcribe_failed\"\n || status === \"transcribed\"\n );\n}\n\n/**\n * 获取当前状态的所有合法后续状态\n */\nexport function getNextStatuses(\n status: RecordingTransferStatus,\n): RecordingTransferStatus[] {\n const allowed = VALID_TRANSITIONS.get(status);\n return allowed ? [...allowed] : [];\n}\n\nexport class TransitionError extends Error {\n constructor(\n public readonly from: RecordingTransferStatus,\n public readonly to: RecordingTransferStatus,\n ) {\n super(`非法状态转换: ${from} → ${to}`);\n this.name = \"TransitionError\";\n }\n}\n",
|
|
58
|
+
"export const TRANSCRIPT_DOCUMENT_SCHEMA_VERSION = 1;\n\nexport interface TranscriptDocumentSource {\n provider: string;\n taskId?: string;\n requestId?: string;\n status?: string;\n}\n\nexport interface TranscriptDocumentSegment {\n text: string;\n startMs?: number;\n endMs?: number;\n speakerId?: number;\n}\n\nexport interface TranscriptDocumentContentItem {\n content: string;\n speakerId?: number;\n startTime?: number;\n endTime?: number;\n}\n\nexport interface TranscriptDocumentNormalized {\n title?: string;\n category?: string;\n summary?: string;\n text: string;\n segments: TranscriptDocumentSegment[];\n}\n\nexport interface TranscriptDocument {\n schemaVersion: number;\n recordingId: string;\n generatedAt: string;\n source: TranscriptDocumentSource;\n normalized: TranscriptDocumentNormalized;\n raw?: unknown;\n}\n\nexport function buildTranscriptDataFilename(recordingId: string): string {\n return `${recordingId}.json`;\n}\n\nexport function buildTranscriptDocument(params: {\n recordingId: string;\n generatedAt?: string;\n source: TranscriptDocumentSource;\n title?: string;\n category?: string;\n summary?: string;\n text?: string;\n segments?: TranscriptDocumentSegment[];\n raw?: unknown;\n}): TranscriptDocument {\n const segments = normalizeSegments(params.segments);\n const text = normalizePossiblyEmptyText(params.text) ?? joinSegmentsText(segments) ?? \"\";\n\n return {\n schemaVersion: TRANSCRIPT_DOCUMENT_SCHEMA_VERSION,\n recordingId: params.recordingId,\n generatedAt: params.generatedAt ?? new Date().toISOString(),\n source: {\n provider: params.source.provider,\n taskId: normalizeOptionalText(params.source.taskId),\n requestId: normalizeOptionalText(params.source.requestId),\n status: normalizeOptionalText(params.source.status),\n },\n normalized: {\n title: normalizeOptionalText(params.title),\n category: normalizeOptionalText(params.category),\n summary: normalizePossiblyEmptyText(params.summary),\n text,\n segments,\n },\n raw: params.raw,\n };\n}\n\nexport function parseTranscriptDocument(\n value: string | unknown,\n): TranscriptDocument | undefined {\n const parsed = typeof value === \"string\"\n ? parseJson(value)\n : value;\n\n if (!parsed || typeof parsed !== \"object\") {\n return undefined;\n }\n\n const doc = parsed as Record<string, unknown>;\n const recordingId = normalizeOptionalText(doc.recordingId);\n const generatedAt = normalizeOptionalText(doc.generatedAt);\n const source = normalizeSource(doc.source);\n const normalized = normalizeDocumentBody(doc.normalized);\n\n if (!recordingId || !generatedAt || !source || !normalized) {\n return undefined;\n }\n\n return {\n schemaVersion:\n typeof doc.schemaVersion === \"number\"\n ? doc.schemaVersion\n : TRANSCRIPT_DOCUMENT_SCHEMA_VERSION,\n recordingId,\n generatedAt,\n source,\n normalized,\n raw: doc.raw,\n };\n}\n\nexport function extractTranscriptTextFromDocument(\n doc: TranscriptDocument | undefined,\n): string | undefined {\n if (!doc) return undefined;\n return normalizePossiblyEmptyText(doc.normalized.text)\n ?? joinSegmentsText(doc.normalized.segments);\n}\n\nexport function extractTranscriptSummaryFromDocument(\n doc: TranscriptDocument | undefined,\n): string | undefined {\n if (!doc) return undefined;\n return normalizePossiblyEmptyText(doc.normalized.summary);\n}\n\nexport function extractTranscriptTitleFromDocument(\n doc: TranscriptDocument | undefined,\n): string | undefined {\n if (!doc) return undefined;\n return normalizeOptionalText(doc.normalized.title);\n}\n\nexport function extractSourceTextListFromDocument(\n doc: TranscriptDocument | undefined,\n): TranscriptDocumentContentItem[] | undefined {\n if (!doc) return undefined;\n\n const fromNormalized = doc.normalized.segments\n .map((segment) => ({\n content: segment.text,\n speakerId: segment.speakerId,\n startTime: segment.startMs,\n endTime: segment.endMs,\n }))\n .filter((segment) => normalizeOptionalText(segment.content));\n\n if (fromNormalized.length > 0) {\n return fromNormalized;\n }\n\n const rawList = extractRawSourceTextList(doc.raw);\n if (rawList.length > 0) {\n return rawList;\n }\n\n const normalizedText = normalizeOptionalText(doc.normalized.text);\n return normalizedText\n ? [{ content: normalizedText }]\n : undefined;\n}\n\nfunction parseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeSource(value: unknown): TranscriptDocumentSource | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const source = value as Record<string, unknown>;\n const provider = normalizeOptionalText(source.provider);\n if (!provider) {\n return undefined;\n }\n\n return {\n provider,\n taskId: normalizeOptionalText(source.taskId),\n requestId: normalizeOptionalText(source.requestId),\n status: normalizeOptionalText(source.status),\n };\n}\n\nfunction normalizeDocumentBody(\n value: unknown,\n): TranscriptDocumentNormalized | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const normalized = value as Record<string, unknown>;\n const segments = normalizeSegments(normalized.segments);\n const text = normalizePossiblyEmptyText(normalized.text) ?? joinSegmentsText(segments);\n if (text === undefined) {\n return undefined;\n }\n\n return {\n title: normalizeOptionalText(normalized.title),\n category: normalizeOptionalText(normalized.category),\n summary: normalizePossiblyEmptyText(normalized.summary),\n text,\n segments,\n };\n}\n\nfunction normalizeSegments(value: unknown): TranscriptDocumentSegment[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .map((item) => normalizeSegment(item))\n .filter((item): item is TranscriptDocumentSegment => !!item);\n}\n\nfunction normalizeSegment(value: unknown): TranscriptDocumentSegment | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const segment = value as Record<string, unknown>;\n const text = normalizeOptionalText(segment.text);\n if (!text) {\n return undefined;\n }\n\n return {\n text,\n startMs: normalizeOptionalNumber(segment.startMs),\n endMs: normalizeOptionalNumber(segment.endMs),\n speakerId: normalizeOptionalInteger(segment.speakerId),\n };\n}\n\nfunction joinSegmentsText(\n segments: TranscriptDocumentSegment[],\n): string | undefined {\n const parts = segments\n .map((segment) => normalizeOptionalText(segment.text))\n .filter((segment): segment is string => !!segment);\n\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.join(\"\\n\\n\");\n}\n\nfunction extractRawSourceTextList(raw: unknown): TranscriptDocumentContentItem[] {\n if (!raw || typeof raw !== \"object\") {\n return [];\n }\n\n const recordResult = (raw as { recordResult?: unknown }).recordResult;\n if (!recordResult || typeof recordResult !== \"object\") {\n return [];\n }\n\n const sourceTextList = (recordResult as { sourceTextList?: unknown }).sourceTextList;\n if (!Array.isArray(sourceTextList)) {\n return [];\n }\n\n return sourceTextList\n .flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const value = item as Record<string, unknown>;\n const content = normalizeOptionalText(value.content);\n if (!content) {\n return [];\n }\n\n return [{\n content,\n speakerId: normalizeOptionalInteger(value.speakerId),\n startTime: normalizeOptionalNumber(value.startTime),\n endTime: normalizeOptionalNumber(value.endTime),\n }];\n });\n}\n\nfunction normalizeOptionalText(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim()\n ? value.trim()\n : undefined;\n}\n\nfunction normalizePossiblyEmptyText(value: unknown): string | undefined {\n return typeof value === \"string\"\n ? value.trim()\n : undefined;\n}\n\nfunction normalizeOptionalNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction normalizeOptionalInteger(value: unknown): number | undefined {\n return Number.isInteger(value)\n ? Number(value)\n : undefined;\n}\n",
|
|
65
59
|
"/**\n * OSS 文件下载器(约束 R-6)\n *\n * 从 OSS URL 下载原始音频(mp3)和打点文件(srt)到本地。\n * 支持重试、超时控制、下载进度日志。\n */\n\nimport { createWriteStream, existsSync, mkdirSync, statSync, unlinkSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport type { Logger } from \"../logger.js\";\n\n// ─── Types ───\n\nexport interface DownloadOptions {\n /** 下载超时(毫秒),默认 5 分钟 */\n timeoutMs?: number;\n /** 最大重试次数,默认 3 */\n maxRetries?: number;\n /** 重试间隔基数(毫秒),默认 2000 */\n retryBackoffMs?: number;\n}\n\nexport interface DownloadResult {\n ok: boolean;\n /** 下载的文件大小(字节) */\n sizeBytes?: number;\n /** 耗时(毫秒) */\n elapsedMs?: number;\n /** 错误信息 */\n error?: string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5 分钟(最大 ~56MB 文件)\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_BACKOFF_MS = 2000;\n\n// ─── Public API ───\n\n/**\n * 从 URL 下载文件到本地路径\n */\nexport async function downloadFile(\n url: string,\n destPath: string,\n logger: Logger,\n options?: DownloadOptions,\n): Promise<DownloadResult> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;\n const retryBackoffMs = options?.retryBackoffMs ?? DEFAULT_RETRY_BACKOFF_MS;\n\n mkdirSync(dirname(destPath), { recursive: true });\n\n let lastError: string | undefined;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n const startMs = Date.now();\n try {\n logger.info(\n `[downloader] 开始下载 (attempt ${attempt}/${maxRetries}): ${url}`,\n );\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const res = await fetch(url, { signal: controller.signal });\n\n if (!res.ok) {\n throw new Error(`HTTP ${res.status} ${res.statusText}`);\n }\n\n if (!res.body) {\n throw new Error(\"响应体为空\");\n }\n\n // 写入文件\n const writeStream = createWriteStream(destPath);\n const readable = Readable.fromWeb(res.body as any);\n await pipeline(readable, writeStream);\n\n const elapsed = Date.now() - startMs;\n const fileSize = existsSync(destPath)\n ? statSync(destPath).size\n : 0;\n\n logger.info(\n `[downloader] 下载完成: ${destPath} (${formatBytes(fileSize)}, ${elapsed}ms)`,\n );\n\n return { ok: true, sizeBytes: fileSize, elapsedMs: elapsed };\n } finally {\n clearTimeout(timer);\n }\n } catch (err: any) {\n lastError = err?.message ?? String(err);\n\n // 清理可能写了一半的文件\n try {\n if (existsSync(destPath)) unlinkSync(destPath);\n } catch {\n // ignore\n }\n\n const isAbort = err?.name === \"AbortError\";\n logger.warn(\n `[downloader] 下载失败 (attempt ${attempt}/${maxRetries}): ${isAbort ? \"超时\" : lastError}`,\n );\n\n if (attempt < maxRetries) {\n const delay = retryBackoffMs * Math.pow(2, attempt - 1);\n logger.info(`[downloader] ${delay}ms 后重试...`);\n await sleep(delay);\n }\n }\n }\n\n return { ok: false, error: lastError ?? \"下载失败\" };\n}\n\n/**\n * 下载录音的音频文件和打点文件\n */\nexport async function downloadRecordingFiles(\n ossAudioUrl: string,\n ossSrtUrl: string | undefined,\n audioDestPath: string,\n srtDestPath: string,\n logger: Logger,\n options?: DownloadOptions,\n): Promise<{\n audio: DownloadResult;\n srt: DownloadResult | null;\n}> {\n // 下载音频(必须)\n const audio = await downloadFile(ossAudioUrl, audioDestPath, logger, options);\n\n // 下载打点文件(可选)\n let srt: DownloadResult | null = null;\n if (ossSrtUrl) {\n srt = await downloadFile(ossSrtUrl, srtDestPath, logger, options);\n if (!srt.ok) {\n // 打点文件下载失败不阻断主流程,仅警告\n logger.warn(`[downloader] 打点文件下载失败(非致命): ${srt.error}`);\n }\n }\n\n return { audio, srt };\n}\n\n// ─── Helpers ───\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n",
|
|
66
|
-
"export {\n RecordingStorage,\n resolveRecordingStorageDir,\n type RecordingIndexEntry,\n type RecordingStorageContext,\n} from \"./storage.js\";\n\nexport {\n TRANSCRIPT_DOCUMENT_SCHEMA_VERSION,\n buildTranscriptDataFilename,\n buildTranscriptDocument,\n parseTranscriptDocument,\n extractTranscriptTextFromDocument,\n extractTranscriptSummaryFromDocument,\n extractTranscriptTitleFromDocument,\n extractSourceTextListFromDocument,\n type TranscriptDocument,\n type TranscriptDocumentContentItem,\n type TranscriptDocumentNormalized,\n type TranscriptDocumentSegment,\n type TranscriptDocumentSource,\n} from \"./transcript-document.js\";\n\nexport {\n isValidTransition,\n transition,\n isTerminalStatus,\n canStartTranscription,\n getNextStatuses,\n TransitionError,\n} from \"./state-machine.js\";\n\nexport {\n downloadFile,\n downloadRecordingFiles,\n type DownloadResult,\n type DownloadOptions,\n} from \"./downloader.js\";\n\nexport {\n isAsrConfigured,\n validateAsrConfig,\n initializeAsr,\n transcribeAudio,\n buildTranscriptMarkdown,\n extractSummary,\n runTranscriptionWorkflow,\n type TranscriptionResult,\n type TranscriptSegment,\n} from \"./asr.js\";\n\nexport {\n detectEnvironment,\n selectModelByMemory,\n isModelDownloaded,\n downloadModel,\n findWhisperBinary,\n transcribeWithWhisperLocal,\n getWhisperLocalStatus,\n} from \"./whisper-local.js\";\n\nexport {\n handleRecordingSync,\n triggerTranscription,\n type RecordingStatusEvent,\n type RecordingSyncOptions,\n} from \"./handler.js\";\n",
|
|
67
|
-
"
|
|
60
|
+
"/**\n * ASR 转写调度器(§6 / §7)\n *\n * 按 arc-long-recording §6.2 定义的两层配置结构调度 ASR:\n * - mode = \"api\":YoooClaw 托管云端 ASR(经 model-proxy 长录音接口调用)\n * - mode = \"local\":已停用(保留枚举值用于兼容旧客户端,调用时直接返回错误)\n * - mode = \"yoooclaw\":YoooClaw 自建 ASR(P2,预留接口)\n *\n * 转写流程:\n * 1. 读取录音 OSS URL 与本地文件\n * 2. 调用云端 model-proxy 获取转写文本\n * 3. 将关键点以 [关键点 MM:SS] 内嵌转写文本\n * 4. 自动生成摘要标题(≤ 10 字)\n * 5. 写入 /recordings/transcripts/日期_时间_摘要.md\n */\n\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type {\n AsrConfig,\n AsrApiConfig,\n RecordingMarker,\n RecordingAsrInitResult,\n RecordingTranscriptItem,\n} from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\nimport { requireApiKey, loadApiKey } from \"../auth/credentials.js\";\nimport { getEnvUrls } from \"../env.js\";\nimport {\n buildTranscriptDataFilename,\n buildTranscriptDocument,\n extractSourceTextListFromDocument,\n} from \"./transcript-document.js\";\n\nconst DEFAULT_LONG_RECORDING_POLL_INTERVAL_MS = 2000;\nconst DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS = 3600;\nconst LONG_RECORDING_RUNNING_STATUSES = new Set([\"PENDING\", \"RUNNING\", \"SUSPENDED\"]);\nconst LONG_RECORDING_TERMINAL_FAILURE_STATUSES = new Set([\"FAILED\", \"CANCELED\", \"UNKNOWN\"]);\n\nconst DEFAULT_HTTP_MAX_ATTEMPTS = 3;\nconst DEFAULT_HTTP_RETRY_BACKOFF_MS = 2000;\n\n// ─── Types ───\n\nexport interface TranscriptionResult {\n ok: boolean;\n /** 转写全文 */\n text?: string;\n /** 带时间戳的分段(如 ASR 支持) */\n segments?: TranscriptSegment[];\n /** 自动生成的摘要标题 */\n summary?: string;\n /** 给客户端展示的摘要文本 */\n summaryText?: string;\n /** 分类信息(如会议纪要、采访) */\n category?: string;\n /** 转写来源信息 */\n sourceInfo?: {\n provider: string;\n taskId?: string;\n requestId?: string;\n status?: string;\n };\n /** Provider 原始响应,供后续兼容字段演进 */\n rawResponse?: unknown;\n /** 错误信息 */\n error?: string;\n}\n\nexport interface TranscriptSegment {\n /** 开始时间(毫秒) */\n start_ms: number;\n /** 结束时间(毫秒) */\n end_ms: number;\n /** 文本内容 */\n text: string;\n /** 说话人 ID(如云端 ASR 返回) */\n speaker_id?: number;\n}\n\ninterface ModelProxyLongRecordingSubmitRequest {\n audioOssUrl: string;\n language?: string;\n enableNormalization?: boolean;\n}\n\ninterface ModelProxyLongRecordingResult {\n sourceText?: string | null;\n sourceTextList?: ModelProxyLongRecordingSourceTextItem[] | null;\n summaryResult?: string | null;\n category?: string | null;\n title?: string | null;\n}\n\ninterface ModelProxyLongRecordingSourceTextItem {\n content?: string | null;\n speakerId?: number | null;\n startTime?: number | null;\n endTime?: number | null;\n}\n\ninterface ModelProxyLongRecordingStatusResponse {\n taskId?: string;\n status?: string;\n requestId?: string;\n errorMessage?: string | null;\n recordResult?: ModelProxyLongRecordingResult | null;\n}\n\ninterface ResponseEnvelope<T> {\n success?: boolean;\n code?: number | string;\n message?: string | null;\n e?: unknown;\n data?: T | null;\n}\n\n// ─── Public API ───\n\n/**\n * 判断 ASR 是否已配置\n */\nexport function isAsrConfigured(config?: AsrConfig): boolean {\n return !!config && !validateAsrConfig(config);\n}\n\n/**\n * 校验客户端下发的 ASR 配置。\n * 返回 undefined 表示配置可用;返回字符串表示错误原因。\n */\nexport function validateAsrConfig(config?: AsrConfig): string | undefined {\n if (!config?.mode) {\n return \"asr.mode is required\";\n }\n\n switch (config.mode) {\n case \"api\":\n return undefined;\n case \"local\":\n return \"本地 Whisper 模式已停用,请改用 asr.mode = \\\"api\\\"\";\n case \"yoooclaw\":\n return \"YoooClaw ASR 尚未实现(P2)\";\n default:\n return `未知的 ASR mode: ${(config as { mode: string }).mode}`;\n }\n}\n\n/**\n * 显式初始化 ASR 能力。\n * - mode=api:校验插件本地 API Key 是否存在,并返回最终使用的 model-proxy submit-task endpoint\n * - mode=local:按配置预下载模型,并返回本地环境状态\n */\nexport async function initializeAsr(\n config: AsrConfig,\n dataDir: string,\n logger: Logger,\n): Promise<RecordingAsrInitResult> {\n const validationError = validateAsrConfig(config);\n if (validationError) {\n return {\n ok: false,\n mode: config.mode,\n error: validationError,\n };\n }\n\n switch (config.mode) {\n case \"api\": {\n const endpoint = resolveModelProxyLongRecordingSubmitEndpoint(config.api);\n const keyConfigured = hasText(config.api?.apiKey) || hasText(loadApiKey());\n\n if (!keyConfigured) {\n return {\n ok: false,\n mode: \"api\",\n provider: \"model-proxy\",\n endpoint,\n language: config.api?.language ?? \"auto\",\n keyConfigured: false,\n error:\n \"API Key 未设置,请在本次 asr.api.apiKey 中传入,或先写入 credentials.json / 执行 ntf auth set-api-key <apiKey>\",\n };\n }\n\n return {\n ok: true,\n mode: \"api\",\n provider: \"model-proxy\",\n endpoint,\n language: config.api?.language ?? \"auto\",\n keyConfigured: true,\n };\n }\n case \"local\":\n return {\n ok: false,\n mode: \"local\",\n error: \"本地 Whisper 模式已停用,请改用 asr.mode = \\\"api\\\"\",\n };\n case \"yoooclaw\":\n return {\n ok: false,\n mode: \"yoooclaw\",\n error: \"YoooClaw ASR 尚未实现(P2)\",\n };\n default:\n return {\n ok: false,\n mode: config.mode,\n error: `未知的 ASR mode: ${config.mode}`,\n };\n }\n}\n\n/**\n * 执行 ASR 转写\n *\n * @param audioFilePath 本地音频文件绝对路径\n * @param config ASR 配置(两层结构:mode + api/local)\n * @param logger 日志\n * @param options 额外上下文(云端 ASR 需要 OSS URL)\n */\nexport async function transcribeAudio(\n audioFilePath: string,\n config: AsrConfig,\n logger: Logger,\n options: {\n audioOssUrl?: string;\n audioDurationMs?: number;\n } = {},\n): Promise<TranscriptionResult> {\n if (!existsSync(audioFilePath)) {\n return { ok: false, error: `音频文件不存在: ${audioFilePath}` };\n }\n\n logger.info(\n `[asr] 开始转写: mode=${config.mode}, file=${audioFilePath}`,\n );\n\n try {\n switch (config.mode) {\n case \"api\":\n return await transcribeWithModelProxy(\n options.audioOssUrl,\n options.audioDurationMs,\n config.api,\n logger,\n );\n case \"local\":\n return {\n ok: false,\n error: \"本地 Whisper 模式已停用,请改用 asr.mode = \\\"api\\\"\",\n };\n case \"yoooclaw\":\n return { ok: false, error: \"YoooClaw ASR 尚未实现(P2)\" };\n default:\n return {\n ok: false,\n error: `未知的 ASR mode: ${config.mode}`,\n };\n }\n } catch (err: any) {\n const msg = err?.message ?? String(err);\n logger.error(`[asr] 转写异常: ${msg}`);\n return { ok: false, error: msg };\n }\n}\n\n/**\n * 将转写结果与关键点标记合并,生成最终 Markdown 转写文本\n *\n * @param result 转写结果\n * @param markers 关键点列表\n * @param recordingName 录音名称\n * @param durationSec 录音总时长(秒)\n * @param createdAt 录音创建时间\n */\nexport function buildTranscriptMarkdown(\n result: TranscriptionResult,\n markers: RecordingMarker[],\n recordingName: string,\n durationSec: number,\n createdAt: string,\n): string { \n const summary = result.summary ?? recordingName.slice(0, 10);\n const lines: string[] = [];\n\n // 元数据头\n lines.push(`# ${summary}`);\n lines.push(\"\");\n lines.push(`> 录音名称:${recordingName}`);\n lines.push(`> 时长:${formatDuration(durationSec)}`);\n lines.push(`> 创建时间:${createdAt}`);\n if (markers.length > 0) {\n lines.push(`> 关键点数:${markers.length}`);\n }\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n\n if (result.segments && result.segments.length > 0) {\n // 有分段的转写文本:在合适的位置插入关键点标记\n const sortedMarkers = [...markers].sort(\n (a, b) => a.timestamp_ms - b.timestamp_ms,\n );\n let markerIdx = 0;\n\n for (const seg of result.segments) {\n // 在当前段之前插入所有对应的关键点\n while (\n markerIdx < sortedMarkers.length &&\n sortedMarkers[markerIdx].timestamp_ms <= seg.start_ms\n ) {\n const m = sortedMarkers[markerIdx];\n lines.push(\n `**[关键点 ${formatTimestamp(m.timestamp_ms)}]**`,\n );\n lines.push(\"\");\n markerIdx++;\n }\n\n const segmentText = formatTranscriptSegmentText(seg);\n if (segmentText) {\n lines.push(segmentText);\n lines.push(\"\");\n }\n }\n\n // 追加剩余关键点\n while (markerIdx < sortedMarkers.length) {\n const m = sortedMarkers[markerIdx];\n lines.push(\n `**[关键点 ${formatTimestamp(m.timestamp_ms)}]**`,\n );\n lines.push(\"\");\n markerIdx++;\n }\n } else if (result.text) {\n // 纯文本转写:在文本头部集中列出关键点\n if (markers.length > 0) {\n lines.push(\"### 关键点\");\n lines.push(\"\");\n for (const m of markers) {\n lines.push(`- **[关键点 ${formatTimestamp(m.timestamp_ms)}]**`);\n }\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n }\n lines.push(result.text);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * 从转写文本中提取摘要标题(≤ 10 字)\n */\nexport function extractSummary(text: string): string {\n // 取第一句话,截断到 10 字\n const firstLine = text.split(/[。!?\\n]/).find((s) => s.trim().length > 0);\n if (!firstLine) return \"录音转写\";\n const trimmed = firstLine.trim();\n return trimmed.length <= 10 ? trimmed : trimmed.slice(0, 10);\n}\n\n/**\n * 完整的转写工作流:转写 → 生成 Markdown → 写入文件\n */\nexport async function runTranscriptionWorkflow(params: {\n audioFilePath: string;\n audioOssUrl?: string;\n config: AsrConfig;\n markers: RecordingMarker[];\n recordingName: string;\n durationSec: number;\n createdAt: string;\n transcriptsDir: string;\n transcriptDataDir: string;\n summariesDir: string;\n recordingId: string;\n logger: Logger;\n}): Promise<{\n ok: boolean;\n transcriptFilename?: string;\n transcriptDataFilename?: string;\n summaryFilename?: string;\n transcript?: RecordingTranscriptItem[];\n summary?: string;\n title?: string;\n error?: string;\n}> {\n const {\n audioFilePath,\n audioOssUrl,\n config,\n markers,\n recordingName,\n durationSec,\n createdAt,\n transcriptsDir,\n transcriptDataDir,\n summariesDir,\n recordingId,\n logger,\n } = params;\n\n // 1. ASR 转写\n const result = await transcribeAudio(audioFilePath, config, logger, {\n audioOssUrl,\n audioDurationMs: Math.max(0, Math.round(durationSec * 1000)),\n });\n if (!result.ok) {\n return { ok: false, error: result.error };\n }\n\n // 2. 提取摘要\n const title = normalizeOptionalText(result.summary)\n ? normalizeOptionalText(result.summary)!\n : extractSummary(result.text ?? \"\");\n const summary = result.summaryText ?? \"\";\n result.summary = title;\n const transcriptData = buildTranscriptDocument({\n recordingId,\n generatedAt: new Date().toISOString(),\n source: result.sourceInfo ?? {\n provider: config.mode === \"api\" ? \"model-proxy\" : config.mode,\n },\n title,\n category: result.category,\n summary,\n text: result.text,\n segments: (result.segments ?? []).map((segment) => ({\n text: segment.text,\n startMs: segment.start_ms,\n endMs: segment.end_ms,\n speakerId: segment.speaker_id,\n })),\n raw: result.rawResponse,\n });\n\n // 3. 生成 Markdown\n const markdown = buildTranscriptMarkdown(\n result,\n markers,\n recordingName,\n durationSec,\n createdAt,\n );\n\n // 4. 写入文件\n const transcriptDataFilename = buildTranscriptDataFilename(recordingId);\n const transcriptDataPath = join(transcriptDataDir, transcriptDataFilename);\n writeFileSync(\n transcriptDataPath,\n JSON.stringify(transcriptData, null, 2),\n \"utf-8\",\n );\n logger.info(`[asr] 转写 JSON 已写入: ${transcriptDataPath}`);\n\n const safeSummary = title\n .replace(/[/\\\\:*?\"<>|]/g, \"\")\n .trim()\n .slice(0, 20);\n const filename = safeSummary\n ? `${recordingId}_${safeSummary}.md`\n : `${recordingId}.md`;\n const filePath = join(transcriptsDir, filename);\n writeFileSync(filePath, markdown, \"utf-8\");\n logger.info(`[asr] 转写文本已写入: ${filePath}`);\n\n let summaryFilename: string | undefined;\n if (summary) {\n summaryFilename = `${recordingId}.md`;\n const summaryFilePath = join(summariesDir, summaryFilename);\n writeFileSync(summaryFilePath, summary, \"utf-8\");\n logger.info(`[asr] 摘要文本已写入: ${summaryFilePath}`);\n }\n\n return {\n ok: true,\n transcriptFilename: filename,\n transcriptDataFilename,\n summaryFilename,\n transcript: extractSourceTextListFromDocument(transcriptData),\n summary,\n title,\n };\n}\n\n// ─── ASR Provider Implementations ───\n\n/**\n * 通过 model-proxy 的长录音接口执行云端转写。\n */\nasync function transcribeWithModelProxy(\n audioOssUrl: string | undefined,\n audioDurationMs: number | undefined,\n apiConfig: AsrApiConfig | undefined,\n logger: Logger,\n): Promise<TranscriptionResult> {\n const normalizedAudioOssUrl = normalizeOptionalText(audioOssUrl);\n if (!normalizedAudioOssUrl) {\n return { ok: false, error: \"API 模式缺少 audioOssUrl,无法调用 model-proxy\" };\n }\n\n const apiKey = resolveModelProxyApiKey(apiConfig);\n const submitEndpoint = resolveModelProxyLongRecordingSubmitEndpoint(apiConfig);\n const submitBody = buildLongRecordingSubmitRequest(normalizedAudioOssUrl, apiConfig);\n\n logger.info(\n `[asr-submit] 提交长录音任务: endpoint=${submitEndpoint}, body=${stringifyForLog(submitBody) ?? \"{}\"}`,\n );\n\n let res: Response;\n try {\n res = await fetchWithRetry(\n submitEndpoint,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key-Id\": apiKey,\n },\n body: JSON.stringify(submitBody),\n },\n { logger, context: \"asr-submit\" },\n );\n } catch (err: any) {\n const msg = err?.message ?? String(err);\n logger.error(`[asr-submit] 提交长录音任务网络异常 (已重试): ${msg}`);\n return {\n ok: false,\n error: `Model Proxy ASR submit network error: ${msg}`,\n };\n }\n\n if (!res.ok) {\n const errText = await res.text();\n logger.error(\n `[asr-submit-response] 提交长录音任务失败: status=${res.status}, body=${errText.slice(0, 500)}`,\n );\n return {\n ok: false,\n error: `Model Proxy ASR error: ${res.status} ${errText.slice(0, 200)}`,\n };\n }\n\n const raw = (await res.json()) as\n | ModelProxyLongRecordingStatusResponse\n | ResponseEnvelope<ModelProxyLongRecordingStatusResponse>;\n logger.info(\n `[asr-submit-response] 提交长录音任务响应: ${stringifyForLog(raw) ?? \"{}\"}`,\n );\n const submitEnvelopeError = buildModelProxyEnvelopeError(raw);\n if (submitEnvelopeError) {\n logger.error(\n `[asr-submit-response] 提交长录音任务失败: ${submitEnvelopeError}`,\n );\n return {\n ok: false,\n error: `Model Proxy ASR 提交失败: ${submitEnvelopeError}`,\n };\n }\n\n const data = unwrapResponse(raw);\n const taskId = normalizeOptionalText(data?.taskId);\n const requestId = normalizeOptionalText(data?.requestId);\n const status = normalizeLongRecordingStatus(data?.status);\n\n if (!taskId) {\n return {\n ok: false,\n error: \"Model Proxy ASR 响应缺少 taskId\",\n };\n }\n\n logger.info(\n `[asr] Model Proxy 长录音任务已提交: taskId=${taskId}, status=${status ?? \"UNKNOWN\"}, requestId=${requestId ?? \"n/a\"}`,\n );\n\n if (status && LONG_RECORDING_TERMINAL_FAILURE_STATUSES.has(status)) {\n return {\n ok: false,\n error: buildLongRecordingStatusError(data, status),\n };\n }\n\n return await pollLongRecordingTaskResult({\n apiKey,\n taskId,\n initialRequestId: requestId,\n audioDurationMs,\n apiConfig,\n logger,\n });\n}\n\n// ─── Helpers ───\n\nfunction resolveModelProxyLongRecordingSubmitEndpoint(apiConfig?: AsrApiConfig): string {\n return apiConfig?.endpoint?.trim() || getEnvUrls().modelProxyLongRecordingSubmitTaskUrl;\n}\n\nfunction resolveModelProxyApiKey(apiConfig?: AsrApiConfig): string {\n const requestApiKey = normalizeOptionalText(apiConfig?.apiKey);\n return normalizeApiKeyHeaderValue(requestApiKey ?? requireApiKey());\n}\n\nfunction resolveModelProxyLongRecordingQueryTaskResultBaseUrl(\n apiConfig?: AsrApiConfig,\n): string {\n const customEndpoint = apiConfig?.endpoint?.trim();\n if (customEndpoint) {\n return deriveLongRecordingQueryTaskResultBaseUrl(customEndpoint);\n }\n return getEnvUrls().modelProxyLongRecordingQueryTaskResultBaseUrl;\n}\n\nfunction deriveLongRecordingQueryTaskResultBaseUrl(endpoint: string): string {\n const trimmed = endpoint.replace(/\\/+$/, \"\");\n if (trimmed.endsWith(\"/submit-task\")) {\n return `${trimmed.slice(0, -\"/submit-task\".length)}/query-task-result`;\n }\n return trimmed;\n}\n\nfunction buildLongRecordingSubmitRequest(\n audioOssUrl: string,\n apiConfig?: AsrApiConfig,\n): ModelProxyLongRecordingSubmitRequest {\n const body: ModelProxyLongRecordingSubmitRequest = {\n audioOssUrl,\n };\n\n if (apiConfig?.language?.trim()) {\n body.language = apiConfig.language.trim();\n }\n if (typeof apiConfig?.enableNormalization === \"boolean\") {\n body.enableNormalization = apiConfig.enableNormalization;\n }\n\n return body;\n}\n\nasync function pollLongRecordingTaskResult(params: {\n apiKey: string;\n taskId: string;\n initialRequestId?: string;\n audioDurationMs?: number;\n apiConfig?: AsrApiConfig;\n logger: Logger;\n}): Promise<TranscriptionResult> {\n const {\n apiKey,\n taskId,\n initialRequestId,\n audioDurationMs,\n apiConfig,\n logger,\n } = params;\n const queryBaseUrl = resolveModelProxyLongRecordingQueryTaskResultBaseUrl(apiConfig);\n let lastStatus: string | undefined;\n\n const pollIntervalMs = getPollIntervalMs();\n\n for (let attempt = 1; attempt <= DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS; attempt++) {\n const queryUrl = `${queryBaseUrl}/${encodeURIComponent(taskId)}`;\n let res: Response;\n try {\n res = await fetch(queryUrl, {\n method: \"GET\",\n headers: {\n \"X-Api-Key-Id\": apiKey,\n },\n });\n } catch (err: any) {\n const msg = err?.message ?? String(err);\n logger.warn(\n `[asr-query] 长录音任务查询网络异常: taskId=${taskId}, attempt=${attempt}, error=${msg} — 等待下次轮询`,\n );\n if (attempt < DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS) {\n await sleep(pollIntervalMs);\n continue;\n }\n return {\n ok: false,\n error: `Model Proxy ASR query network error: ${msg}`,\n };\n }\n\n if (!res.ok) {\n const errText = await res.text().catch(() => \"\");\n if (isRetryableHttpStatus(res.status)) {\n logger.warn(\n `[asr-query] 长录音任务查询暂时失败: taskId=${taskId}, attempt=${attempt}, status=${res.status}, body=${errText.slice(0, 200)} — 等待下次轮询`,\n );\n if (attempt < DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS) {\n await sleep(pollIntervalMs);\n continue;\n }\n } else {\n logger.error(\n `[asr-query-response] 长录音任务查询失败: taskId=${taskId}, attempt=${attempt}, status=${res.status}, body=${errText.slice(0, 500)}`,\n );\n }\n return {\n ok: false,\n error: `Model Proxy ASR query error: ${res.status} ${errText.slice(0, 200)}`,\n };\n }\n\n const raw = (await res.json()) as\n | ModelProxyLongRecordingStatusResponse\n | ResponseEnvelope<ModelProxyLongRecordingStatusResponse>;\n const queryEnvelopeError = buildModelProxyEnvelopeError(raw);\n if (queryEnvelopeError) {\n logger.error(\n `[asr-query-response] 长录音任务查询失败: taskId=${taskId}, attempt=${attempt}, ${queryEnvelopeError}`,\n );\n return {\n ok: false,\n error: `Model Proxy ASR 查询失败: ${queryEnvelopeError}`,\n };\n }\n\n const data = unwrapResponse(raw);\n const status = normalizeLongRecordingStatus(data?.status) ?? \"UNKNOWN\";\n const requestId = normalizeOptionalText(data?.requestId) ?? initialRequestId;\n\n if (status !== lastStatus) {\n logger.info(\n `[asr-query-response] 长录音任务查询响应: taskId=${taskId}, attempt=${attempt}, body=${stringifyForLog(raw) ?? \"{}\"}`,\n );\n logger.info(\n `[asr] Model Proxy 长录音任务状态: taskId=${taskId}, status=${status}, attempt=${attempt}, requestId=${requestId ?? \"n/a\"}`,\n );\n lastStatus = status;\n }\n\n if (status === \"SUCCEEDED\") {\n return buildLongRecordingSuccessResult(\n taskId,\n requestId,\n data,\n audioDurationMs,\n logger,\n );\n }\n\n if (LONG_RECORDING_TERMINAL_FAILURE_STATUSES.has(status)) {\n return {\n ok: false,\n error: buildLongRecordingStatusError(data, status),\n };\n }\n\n if (!LONG_RECORDING_RUNNING_STATUSES.has(status)) {\n return {\n ok: false,\n error: `Model Proxy ASR 返回未知任务状态: ${status}`,\n };\n }\n\n if (attempt < DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS) {\n await sleep(pollIntervalMs);\n }\n }\n\n return {\n ok: false,\n error:\n `Model Proxy ASR 轮询超时: taskId=${taskId}, waited=${DEFAULT_LONG_RECORDING_MAX_POLL_ATTEMPTS * pollIntervalMs}ms`,\n };\n}\n\nfunction buildLongRecordingSuccessResult(\n taskId: string,\n requestId: string | undefined,\n data: ModelProxyLongRecordingStatusResponse | undefined,\n audioDurationMs: number | undefined,\n logger: Logger,\n): TranscriptionResult {\n const sourceTextList = normalizeLongRecordingSourceTextList(\n data?.recordResult?.sourceTextList,\n );\n const listResult = extractLongRecordingTextFromList(sourceTextList, audioDurationMs);\n const sourceText = normalizeOptionalText(data?.recordResult?.sourceText);\n const summaryText = normalizeOptionalText(data?.recordResult?.summaryResult) ?? \"\";\n const title = normalizeOptionalText(data?.recordResult?.title);\n const category = normalizeOptionalText(data?.recordResult?.category);\n const text = listResult.text ?? sourceText ?? summaryText;\n const status = normalizeLongRecordingStatus(data?.status) ?? \"SUCCEEDED\";\n\n if (!listResult.text && !sourceText && summaryText) {\n logger.warn(\n `[asr] Model Proxy 长录音结果缺少 sourceTextList/sourceText,已回退使用 summaryResult 作为转写文本: taskId=${taskId}`,\n );\n }\n\n logger.info(\n `[asr] Model Proxy 长录音转写完成: taskId=${taskId}, requestId=${requestId ?? \"n/a\"}, chars=${text.length}`,\n );\n\n return {\n ok: true,\n text,\n segments: listResult.segments,\n summary: title,\n summaryText,\n category,\n sourceInfo: {\n provider: \"model-proxy\",\n taskId,\n requestId,\n status,\n },\n rawResponse: data,\n };\n}\n\nfunction buildLongRecordingStatusError(\n data: ModelProxyLongRecordingStatusResponse | undefined,\n status: string,\n): string {\n const errorMessage = normalizeOptionalText(data?.errorMessage);\n return errorMessage\n ? `Model Proxy ASR ${status}: ${errorMessage}`\n : `Model Proxy ASR ${status}`;\n}\n\nfunction buildModelProxyEnvelopeError(\n payload:\n | ModelProxyLongRecordingStatusResponse\n | ResponseEnvelope<ModelProxyLongRecordingStatusResponse>,\n): string | undefined {\n if (!payload || typeof payload !== \"object\" || !(\"data\" in payload)) {\n return undefined;\n }\n\n const envelope = payload as ResponseEnvelope<ModelProxyLongRecordingStatusResponse>;\n const explicitFailure = envelope.success === false;\n const message = normalizeOptionalText(envelope.message);\n if (!explicitFailure && (!message || envelope.data)) {\n return undefined;\n }\n\n const code = normalizeOptionalCode(envelope.code);\n if (code && message) {\n return `${code} ${message}`;\n }\n return message ?? code ?? \"response envelope indicates failure\";\n}\n\nfunction unwrapResponse(\n payload:\n | ModelProxyLongRecordingStatusResponse\n | ResponseEnvelope<ModelProxyLongRecordingStatusResponse>,\n): ModelProxyLongRecordingStatusResponse | undefined {\n if (\n payload &&\n typeof payload === \"object\" &&\n \"data\" in payload &&\n payload.data &&\n typeof payload.data === \"object\"\n ) {\n return payload.data;\n }\n\n return payload as ModelProxyLongRecordingStatusResponse;\n}\n\nfunction normalizeApiKeyHeaderValue(apiKey: string): string {\n return apiKey.startsWith(\"Bearer \")\n ? apiKey.slice(\"Bearer \".length)\n : apiKey;\n}\n\nfunction normalizeLongRecordingStatus(status: unknown): string | undefined {\n return typeof status === \"string\" && status.trim()\n ? status.trim().toUpperCase()\n : undefined;\n}\n\nfunction normalizeOptionalText(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim()\n ? value.trim()\n : undefined;\n}\n\nfunction normalizeOptionalCode(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n return undefined;\n}\n\nfunction normalizeOptionalInteger(value: unknown): number | undefined {\n return Number.isInteger(value)\n ? Number(value)\n : undefined;\n}\n\nfunction normalizeOptionalNonNegativeNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : undefined;\n}\n\nfunction normalizeLongRecordingSourceTextList(\n value: unknown,\n): Array<{\n content: string;\n speakerId?: number;\n startTime?: number;\n endTime?: number;\n}> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const record = item as Record<string, unknown>;\n const content = normalizeOptionalText(record.content);\n if (!content) {\n return [];\n }\n\n return [{\n content,\n speakerId: normalizeOptionalInteger(record.speakerId),\n startTime: normalizeOptionalNonNegativeNumber(record.startTime),\n endTime: normalizeOptionalNonNegativeNumber(record.endTime),\n }];\n });\n}\n\nfunction extractLongRecordingTextFromList(\n items: Array<{\n content: string;\n speakerId?: number;\n startTime?: number;\n endTime?: number;\n }>,\n finalFallbackEndMs?: number,\n): {\n text?: string;\n segments: TranscriptSegment[];\n} {\n if (items.length === 0) {\n return {\n segments: [],\n };\n }\n\n const segments = items.map((item, index) => {\n const startMs = item.startTime ?? 0;\n const explicitEndMs = item.endTime;\n const nextStart = items[index + 1]?.startTime;\n const fallbackEndMs = index === items.length - 1\n ? normalizeOptionalNonNegativeNumber(finalFallbackEndMs)\n : undefined;\n const endMs = explicitEndMs ?? nextStart ?? fallbackEndMs ?? startMs;\n\n return {\n start_ms: startMs,\n end_ms: Math.max(startMs, endMs),\n text: item.content,\n speaker_id: item.speakerId,\n };\n });\n\n return {\n text: items.map((item) => item.content).join(\"\\n\\n\"),\n segments,\n };\n}\n\nfunction stringifyForLog(value: unknown, maxLength = 500): string | undefined {\n if (value == null) {\n return undefined;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed ? trimmed.slice(0, maxLength) : undefined;\n }\n\n try {\n const serialized = JSON.stringify(value);\n return serialized ? serialized.slice(0, maxLength) : undefined;\n } catch {\n return String(value).slice(0, maxLength);\n }\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRetryableHttpStatus(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction getHttpRetryBackoffMs(): number {\n const raw = process.env.OPENCLAW_ASR_HTTP_RETRY_BACKOFF_MS;\n if (raw) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return parsed;\n }\n }\n return DEFAULT_HTTP_RETRY_BACKOFF_MS;\n}\n\nfunction getPollIntervalMs(): number {\n const raw = process.env.OPENCLAW_ASR_POLL_INTERVAL_MS;\n if (raw) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return parsed;\n }\n }\n return DEFAULT_LONG_RECORDING_POLL_INTERVAL_MS;\n}\n\n/**\n * 带重试的 fetch 包装:\n * - HTTP 5xx / 429:按指数退避重试\n * - 网络异常(fetch throw):按指数退避重试\n * - HTTP 4xx(除 429)/ 2xx / 3xx:直接返回,由调用方处理\n *\n * 用于 ASR submit 这类一次性请求;polling 走自己的节奏,无需此包装。\n */\nasync function fetchWithRetry(\n url: string,\n init: RequestInit,\n options: {\n logger: Logger;\n context: string;\n maxAttempts?: number;\n backoffMs?: number;\n },\n): Promise<Response> {\n const maxAttempts = options.maxAttempts ?? DEFAULT_HTTP_MAX_ATTEMPTS;\n const baseBackoff = options.backoffMs ?? getHttpRetryBackoffMs();\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const res = await fetch(url, init);\n if (isRetryableHttpStatus(res.status) && attempt < maxAttempts) {\n const errText = await res.text().catch(() => \"\");\n const delay = baseBackoff * Math.pow(2, attempt - 1);\n options.logger.warn(\n `[${options.context}] HTTP ${res.status} (attempt ${attempt}/${maxAttempts}), ${delay}ms 后重试, body=${errText.slice(0, 200)}`,\n );\n await sleep(delay);\n continue;\n }\n return res;\n } catch (err) {\n lastError = err;\n if (attempt < maxAttempts) {\n const delay = baseBackoff * Math.pow(2, attempt - 1);\n const msg = (err as any)?.message ?? String(err);\n options.logger.warn(\n `[${options.context}] 网络异常 (attempt ${attempt}/${maxAttempts}): ${msg}, ${delay}ms 后重试`,\n );\n await sleep(delay);\n continue;\n }\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n}\n\nfunction extractTranscriptSummary(text: string): string {\n const normalized = text.replace(/\\s+/g, \" \").trim();\n if (!normalized) {\n return \"\";\n }\n\n const sentence = normalized\n .split(/[。!?!?]/)\n .map((part) => part.trim())\n .find((part) => part.length > 0);\n\n const candidate = sentence || normalized;\n return candidate.length <= 120\n ? candidate\n : `${candidate.slice(0, 117).trimEnd()}...`;\n}\n/** 毫秒 → \"MM:SS\" */\nfunction formatTimestamp(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n}\n\n/** 秒 → \"HH:MM:SS\" 或 \"MM:SS\" */\nfunction formatDuration(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = Math.floor(seconds % 60);\n if (h > 0) {\n return `${h}:${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n }\n return `${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n}\n\nfunction hasText(value: unknown): boolean {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction formatTranscriptSegmentText(segment: TranscriptSegment): string {\n const text = segment.text.trim();\n if (!text) {\n return text;\n }\n\n if (typeof segment.speaker_id === \"number\") {\n return `说话人${segment.speaker_id}:${text}`;\n }\n\n return text;\n}\n",
|
|
61
|
+
"import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n watch,\n} from \"node:fs\";\nimport { dirname, basename } from \"node:path\";\nimport { resolveStateFile } from \"../host.js\";\n\ninterface Credentials {\n /**\n * 推荐:API Key 明文(例如 ock_xxx)\n */\n apiKey?: string;\n /**\n * CLI multi-key 共享格式。存在该字段时以它为准;空数组表示显式未配置 key。\n */\n apiKeys?: ApiKeyEntry[];\n /**\n * 兼容旧字段:历史上这里存的是 token;现在等价于 apiKey\n */\n token?: string;\n /**\n * 当前环境(development / production),由 ntf env switch 写入\n */\n env?: string;\n}\n\ninterface ApiKeyEntry {\n label?: string;\n key?: string;\n default?: boolean;\n createdAt?: string;\n}\n\nconst API_KEY_ENV = \"YOOOCLAW_API_KEY\";\n\nexport function credentialsPath(): string {\n return resolveStateFile(\"credentials.json\");\n}\n\nexport function readCredentials(): Credentials {\n const path = credentialsPath();\n if (!existsSync(path)) return {};\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nexport function writeCredentials(creds: Credentials): void {\n const path = credentialsPath();\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n writeFileSync(path, JSON.stringify(creds, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n}\n\nfunction normalizedKey(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction loadApiKeyFromMulti(creds: Credentials): string | undefined {\n if (!Array.isArray(creds.apiKeys)) return undefined;\n const entries = creds.apiKeys\n .map((entry) => ({\n key: normalizedKey(entry?.key),\n default: entry?.default === true,\n }))\n .filter((entry): entry is { key: string; default: boolean } => Boolean(entry.key));\n return entries.find((entry) => entry.default)?.key ?? entries[0]?.key;\n}\n\nexport function loadApiKey(): string | undefined {\n const env = normalizedKey(process.env[API_KEY_ENV]);\n if (env) return env;\n\n const creds = readCredentials();\n if (Array.isArray(creds.apiKeys)) {\n return loadApiKeyFromMulti(creds);\n }\n return normalizedKey(creds.apiKey) ?? normalizedKey(creds.token);\n}\n\nexport function writeSingleApiKey(apiKey: string): void {\n const creds = readCredentials();\n delete creds.apiKeys;\n writeCredentials({ ...creds, apiKey, token: undefined });\n}\n\nexport function clearApiKeys(): void {\n const creds = readCredentials();\n delete creds.apiKey;\n delete creds.apiKeys;\n delete creds.token;\n writeCredentials(creds);\n}\n\nexport function requireApiKey(): string {\n const apiKey = loadApiKey();\n if (!apiKey) {\n throw new Error(\n `API Key 未设置,请先写入 ${credentialsPath()},或通过宿主 CLI 执行 ntf auth set-api-key <apiKey>`,\n );\n }\n return apiKey;\n}\n\n// ---- Backward-compatible exports (旧代码仍可编译;语义等价于 apiKey) ----\nexport function loadToken(): string | undefined {\n return loadApiKey();\n}\n\nexport function requireToken(): string {\n return requireApiKey();\n}\n\n/** 监听 credentials 文件变化(如 set-token 后)触发 callback;返回取消监听的函数 */\nexport function watchCredentials(onChange: () => void): () => void {\n const path = credentialsPath();\n const dir = dirname(path);\n const filename = basename(path);\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n const delayMs = 200;\n\n const listener = (_event: string, changedName: string | null) => {\n if (!changedName || (changedName !== filename && !changedName.endsWith(filename))) return;\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n onChange();\n }, delayMs);\n };\n\n let watcher: ReturnType<typeof watch> | null = null;\n try {\n watcher = watch(dir, { persistent: false }, listener);\n } catch {\n // 目录可能不存在\n }\n\n return () => {\n if (debounceTimer) clearTimeout(debounceTimer);\n watcher?.close();\n };\n}\n",
|
|
62
|
+
"/**\n * 宿主检测。\n *\n * - detectHostKind():旧的路径/状态目录家族检测(openclaw | qclaw),行为与 host.ts 完全一致。\n * - resolveClawKind():新的渠道 Profile 选择(openclaw | arkclaw | jvsclaw),\n * 优先级 PHONE_NOTIFICATIONS_CLAW_PROFILE 环境变量 > 持久化 profile >\n * jvsclaw 直解 tgz 痕迹 > openclaw。\n */\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ClawKind, HostKind } from \"./types.js\";\nimport {\n DEFAULT_JVSCLAW_STATE_DIR,\n loadQClawMeta,\n hasOpenClawMarkers,\n resolveConfigPathFromEnv,\n resolvePersistedProfileStateDirs,\n resolvePluginConfigPathOverrideFromEnv,\n resolveStateDirFromEnv,\n trimToUndefined,\n} from \"./paths.js\";\n\nfunction detectHostKindFromPath(value: string | undefined): HostKind | undefined {\n if (!value) {\n return undefined;\n }\n const normalized = value.replace(/\\\\/g, \"/\").toLowerCase();\n if (\n normalized.endsWith(\"/.qclaw\") ||\n normalized.includes(\"/.qclaw/\") ||\n normalized.endsWith(\"/.qclow\") ||\n normalized.includes(\"/.qclow/\")\n ) {\n return \"qclaw\";\n }\n if (normalized.endsWith(\"/.openclaw\") || normalized.includes(\"/.openclaw/\")) {\n return \"openclaw\";\n }\n return undefined;\n}\n\nexport function detectHostKind(): HostKind {\n if (\n trimToUndefined(process.env.QCLAW_STATE_DIR) ||\n trimToUndefined(process.env.QCLAW_CONFIG_PATH) ||\n trimToUndefined(process.env.QCLAW_HOME)\n ) {\n return \"qclaw\";\n }\n\n const pathHintKind =\n detectHostKindFromPath(resolveStateDirFromEnv()) ??\n detectHostKindFromPath(resolveConfigPathFromEnv());\n if (pathHintKind) {\n return pathHintKind;\n }\n\n if (hasOpenClawMarkers()) {\n return \"openclaw\";\n }\n\n if (loadQClawMeta()) {\n return \"qclaw\";\n }\n\n return \"openclaw\";\n}\n\nconst VALID_CLAW_KINDS: ReadonlySet<string> = new Set<ClawKind>([\n \"openclaw\",\n \"arkclaw\",\n \"jvsclaw\",\n]);\nconst PLUGIN_ID = \"phone-notifications\";\n\n/** 读取持久化到可写 stateDir/.env 的 PHONE_NOTIFICATIONS_CLAW_PROFILE。 */\nfunction readPersistedClawProfile(): string | undefined {\n for (const stateDir of resolvePersistedProfileStateDirs()) {\n let content: string;\n try {\n content = readFileSync(join(stateDir, \".env\"), \"utf-8\");\n } catch {\n continue;\n }\n for (const line of content.split(\"\\n\")) {\n const eq = line.indexOf(\"=\");\n if (eq < 1) continue;\n if (line.slice(0, eq).trim() === \"PHONE_NOTIFICATIONS_CLAW_PROFILE\") {\n return line.slice(eq + 1).trim();\n }\n }\n }\n return undefined;\n}\n\nfunction hasJvsclawEnvHint(): boolean {\n return Boolean(\n trimToUndefined(process.env.JVSCLAW_STATE_DIR) ||\n trimToUndefined(process.env.JVSCLAW_CONFIG_PATH) ||\n trimToUndefined(process.env.JVSCLAW_HOME),\n );\n}\n\nfunction readPluginLinkSecret(configPath: string | undefined): string | undefined {\n if (!configPath) return undefined;\n\n let config: unknown;\n try {\n config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch {\n return undefined;\n }\n\n const entries = readObject(readObject(config, \"plugins\"), \"entries\");\n const pluginEntry = readObject(entries, PLUGIN_ID);\n const pluginConfig = readObject(pluginEntry, \"config\");\n const linkSecret = pluginConfig?.link_secret;\n return typeof linkSecret === \"string\"\n ? linkSecret.trim() || undefined\n : undefined;\n}\n\nfunction hasJvsclawLinkSecret(): boolean {\n const paths = [\n resolvePluginConfigPathOverrideFromEnv(),\n resolveConfigPathFromEnv(),\n join(DEFAULT_JVSCLAW_STATE_DIR, \"openclaw.json\"),\n ].filter((value, index, arr): value is string => Boolean(value) && arr.indexOf(value) === index);\n\n return paths.some((configPath) => Boolean(readPluginLinkSecret(configPath)));\n}\n\nfunction readObject(\n value: unknown,\n key: string,\n): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const nested = (value as Record<string, unknown>)[key];\n return nested && typeof nested === \"object\"\n ? (nested as Record<string, unknown>)\n : undefined;\n}\n\n/**\n * 选择渠道 Profile。\n * 优先级:PHONE_NOTIFICATIONS_CLAW_PROFILE 环境变量 > 持久化的 .env(安装脚本 --channel)\n * > jvsclaw 直解 tgz 的运行期/配置痕迹 > 默认 openclaw。\n * 安装脚本带 --channel 时写入 .env,运行期零歧义;jvsclaw 线上直解 tgz 时没有这一步,\n * 需要从 JVSCLAW_* env 或宿主注入的 link_secret 识别。\n */\nexport function resolveClawKind(): ClawKind {\n const fromEnv = trimToUndefined(process.env.PHONE_NOTIFICATIONS_CLAW_PROFILE)?.toLowerCase();\n if (fromEnv && VALID_CLAW_KINDS.has(fromEnv)) {\n return fromEnv as ClawKind;\n }\n\n const persisted = readPersistedClawProfile()?.toLowerCase();\n if (persisted && VALID_CLAW_KINDS.has(persisted)) {\n return persisted as ClawKind;\n }\n\n if (hasJvsclawEnvHint() || hasJvsclawLinkSecret()) {\n return \"jvsclaw\";\n }\n\n // 自动检测兜底:qclaw 与 openclaw 同属 apiKey 家族,统一归为 openclaw。\n return \"openclaw\";\n}\n",
|
|
63
|
+
"/**\n * 宿主原始路径解析。\n *\n * 注意:这里解析的是宿主暴露的目录,不保证可写。JvsClaw 可能把\n * JVSCLAW_STATE_DIR / JVSCLAW_HOME 指向只读 rootfs(例如 /opt/jvs-claw)。\n * 插件自己的可写目录必须通过 runtime-paths.ts 解析。\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\ninterface QClawMeta {\n stateDir?: string;\n configPath?: string;\n}\n\nexport const DEFAULT_JVSCLAW_STATE_DIR = \"/home/admin/.openclaw\";\nexport const PHONE_NOTIFICATIONS_STATE_DIR_ENV = \"PHONE_NOTIFICATIONS_STATE_DIR\";\nexport const PHONE_NOTIFICATIONS_CONFIG_PATH_ENV = \"PHONE_NOTIFICATIONS_CONFIG_PATH\";\n\nexport function trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nexport function homeDir(): string {\n return process.env.HOME || process.env.USERPROFILE || \"/tmp\";\n}\n\nexport function expandUserPath(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n if (value === \"~\") {\n return homeDir();\n }\n if (value.startsWith(\"~/\")) {\n return join(homeDir(), value.slice(2));\n }\n return value;\n}\n\nfunction candidateMetaPaths(): string[] {\n const home = homeDir();\n return [\n join(home, \".qclaw\", \"qclaw.json\"),\n join(home, \".qclow\", \"qclaw.json\"),\n ];\n}\n\nexport function loadQClawMeta(): QClawMeta | undefined {\n for (const metaPath of candidateMetaPaths()) {\n if (!existsSync(metaPath)) {\n continue;\n }\n try {\n const parsed = JSON.parse(readFileSync(metaPath, \"utf-8\")) as QClawMeta;\n return {\n stateDir: expandUserPath(trimToUndefined(parsed?.stateDir)),\n configPath: expandUserPath(trimToUndefined(parsed?.configPath)),\n };\n } catch {\n // ignore invalid metadata and keep trying\n }\n }\n return undefined;\n}\n\n/** 插件可写状态目录的显式覆盖。与宿主原始 stateDir 分离。 */\nexport function resolvePluginStateDirOverrideFromEnv(): string | undefined {\n return expandUserPath(\n trimToUndefined(process.env[PHONE_NOTIFICATIONS_STATE_DIR_ENV]),\n );\n}\n\n/** 插件使用的配置文件显式覆盖。与宿主原始 configPath 分离。 */\nexport function resolvePluginConfigPathOverrideFromEnv(): string | undefined {\n return expandUserPath(\n trimToUndefined(process.env[PHONE_NOTIFICATIONS_CONFIG_PATH_ENV]),\n );\n}\n\n/** 解析宿主暴露的原始状态目录环境变量。返回值不保证可写。 */\nexport function resolveStateDirFromEnv(): string | undefined {\n return expandUserPath(\n trimToUndefined(process.env.JVSCLAW_STATE_DIR) ??\n trimToUndefined(process.env.JVSCLAW_HOME) ??\n trimToUndefined(process.env.OPENCLAW_STATE_DIR) ??\n trimToUndefined(process.env.QCLAW_STATE_DIR) ??\n trimToUndefined(process.env.OPENCLAW_ROOT) ??\n trimToUndefined(process.env.OPENCLAW_HOME) ??\n trimToUndefined(process.env.QCLAW_HOME),\n );\n}\n\n/** 解析宿主暴露的原始配置文件环境变量。返回值不保证可写。 */\nexport function resolveConfigPathFromEnv(): string | undefined {\n return expandUserPath(\n trimToUndefined(process.env.JVSCLAW_CONFIG_PATH) ??\n trimToUndefined(process.env.OPENCLAW_CONFIG_PATH) ??\n trimToUndefined(process.env.QCLAW_CONFIG_PATH),\n );\n}\n\nexport function hasOpenClawMarkers(): boolean {\n const baseDir = join(homeDir(), \".openclaw\");\n return [\n join(baseDir, \"openclaw.json\"),\n join(baseDir, \"credentials.json\"),\n join(baseDir, \"extensions\"),\n ].some((candidate) => existsSync(candidate));\n}\n\n/**\n * 解析宿主原始状态目录。仅用于必须与宿主运行时交互的场景,例如 Gateway\n * 设备配对。插件文件写入请使用 runtime-paths.ts 的 resolveStateDir()。\n */\nexport function resolveHostStateDir(stateDir?: string): string {\n const explicitDir = expandUserPath(trimToUndefined(stateDir));\n if (explicitDir) {\n return explicitDir;\n }\n\n const envDir = resolveStateDirFromEnv();\n if (envDir) {\n return envDir;\n }\n\n if (hasOpenClawMarkers()) {\n return join(homeDir(), \".openclaw\");\n }\n\n const meta = loadQClawMeta();\n if (meta?.stateDir) {\n return meta.stateDir;\n }\n if (meta?.configPath) {\n return dirname(meta.configPath);\n }\n\n return join(homeDir(), \".openclaw\");\n}\n\n/** 解析宿主原始配置文件路径。返回值不保证位于可写目录。 */\nexport function resolveHostConfigPath(\n stateDir = resolveHostStateDir(),\n): string {\n const envConfigPath = resolveConfigPathFromEnv();\n if (envConfigPath) {\n return envConfigPath;\n }\n\n const meta = loadQClawMeta();\n if (\n meta?.configPath &&\n (!meta.stateDir || !stateDir || meta.stateDir === stateDir)\n ) {\n return meta.configPath;\n }\n\n return join(stateDir, \"openclaw.json\");\n}\n\n/**\n * 返回可能持久化 PHONE_NOTIFICATIONS_CLAW_PROFILE 的目录。\n * detect.ts 使用这些候选路径判断渠道,避免因宿主只读根目录而漏读 JvsClaw 配置。\n */\nexport function resolvePersistedProfileStateDirs(): string[] {\n const dirs: string[] = [];\n const add = (dir: string | undefined) => {\n if (dir && !dirs.includes(dir)) {\n dirs.push(dir);\n }\n };\n\n add(resolvePluginStateDirOverrideFromEnv());\n add(DEFAULT_JVSCLAW_STATE_DIR);\n add(resolveHostStateDir());\n return dirs;\n}\n",
|
|
64
|
+
"/**\n * 插件可写路径解析。\n *\n * 宿主原始目录与插件可写目录在 OpenClaw / QClaw 下通常相同,但 JvsClaw\n * 可能把宿主目录指向只读 rootfs。所有插件文件写入都应经过这里。\n */\nimport { join } from \"node:path\";\nimport { resolveClawKind } from \"./detect.js\";\nimport {\n DEFAULT_JVSCLAW_STATE_DIR,\n resolveHostConfigPath,\n resolveHostStateDir,\n resolvePluginConfigPathOverrideFromEnv,\n resolvePluginStateDirOverrideFromEnv,\n} from \"./paths.js\";\n\n/**\n * 解析插件可写状态目录。\n *\n * PHONE_NOTIFICATIONS_STATE_DIR 是明确的可写覆盖;JVSCLAW_STATE_DIR 等变量\n * 只描述宿主原始目录,不参与 JvsClaw 插件文件写入。\n */\nexport function resolveStateDir(hostStateDir?: string): string {\n const override = resolvePluginStateDirOverrideFromEnv();\n if (override) {\n return override;\n }\n\n if (resolveClawKind() === \"jvsclaw\") {\n return DEFAULT_JVSCLAW_STATE_DIR;\n }\n\n return resolveHostStateDir(hostStateDir);\n}\n\n/** 解析插件应使用的配置文件路径。 */\nexport function resolveConfigPath(hostStateDir?: string): string {\n const override = resolvePluginConfigPathOverrideFromEnv();\n if (override) {\n return override;\n }\n\n if (resolveClawKind() === \"jvsclaw\") {\n return join(resolveStateDir(hostStateDir), \"openclaw.json\");\n }\n\n return resolveHostConfigPath(resolveHostStateDir(hostStateDir));\n}\n\n/** 解析插件可写状态目录中的文件。 */\nexport function resolveStateFile(\n filename: string,\n hostStateDir?: string,\n): string {\n return join(resolveStateDir(hostStateDir), filename);\n}\n",
|
|
65
|
+
"import { randomBytes } from \"node:crypto\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { readCredentials } from \"./auth/credentials.js\";\nimport { resolveStateFile } from \"./host.js\";\n\n// 容错解析:先按换行切分,再按 KEY= 边界切分,恢复历史上把多条记录粘在同一行的 .env。\n// lookbehind 限定前一个字符不是标识符字符,避免在 key 内部错误切分。\nfunction parseEnvContent(content: string): Map<string, string> {\n const entries = new Map<string, string>();\n const tokens = content\n .split(/\\r?\\n/)\n .flatMap((line) => line.split(/(?<![A-Z0-9_])(?=[A-Z_][A-Z0-9_]*=)/));\n for (const token of tokens) {\n const trimmed = token.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq < 1) continue;\n const key = trimmed.slice(0, eq).trim();\n if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) continue;\n entries.set(key, trimmed.slice(eq + 1).trim());\n }\n return entries;\n}\n\nfunction writeDotEnv(key: string, value: string): void {\n const path = resolveStateFile(\".env\");\n mkdirSync(dirname(path), { recursive: true });\n const existing = existsSync(path) ? readFileSync(path, \"utf-8\") : \"\";\n const entries = parseEnvContent(existing);\n entries.set(key, value);\n const output =\n Array.from(entries, ([k, v]) => `${k}=${v}`).join(\"\\n\") + \"\\n\";\n const tmpPath = `${path}.tmp.${process.pid}.${randomBytes(4).toString(\"hex\")}`;\n try {\n // JvsClaw may leave an existing .env read-only while its state directory\n // remains writable. Replacing a sibling temp file avoids reopening it.\n writeFileSync(tmpPath, output, { encoding: \"utf-8\", mode: 0o600 });\n renameSync(tmpPath, path);\n } catch (error) {\n try {\n rmSync(tmpPath, { force: true });\n } catch {\n // ignore tmp cleanup failure\n }\n throw error;\n }\n}\n\nexport type EnvName = \"development\" | \"test\" | \"production\";\n\nconst DEFAULT_ENV_HOSTS: Record<EnvName, string> = {\n development: \"openclaw-service-dev.yoooclaw.com\",\n test: \"openclaw-service-test.yoooclaw.com\",\n production: \"openclaw-service.yoooclaw.com\",\n};\n\ninterface EnvUrls {\n lightApiUrl: string;\n appNameMapUrl: string;\n relayTunnelUrl: string;\n modelProxyLongRecordingSubmitTaskUrl: string;\n modelProxyLongRecordingQueryTaskResultBaseUrl: string;\n accountFileDeleteUrl: string;\n gatewayConnectStatusUrl: string;\n /** jvsclaw 实例就绪/密文换 apiKey 接口(复用插件现有接口 host)。 */\n clawManagerInstanceReadyUrl: string;\n}\n\nfunction normalizeHost(host: string | undefined): string | undefined {\n const trimmed = host?.trim();\n if (!trimmed) return undefined;\n return trimmed\n .replace(/^https?:\\/\\//, \"\")\n .replace(/^wss?:\\/\\//, \"\")\n .replace(/\\/+$/, \"\");\n}\n\nfunction getEnvHost(env: EnvName): string {\n let host: string | undefined;\n switch (env) {\n case \"development\":\n host = process.env.OPENCLAW_HOST_DEVELOPMENT;\n break;\n case \"test\":\n host = process.env.OPENCLAW_HOST_TEST;\n break;\n case \"production\":\n host = process.env.OPENCLAW_HOST_PRODUCTION;\n break;\n }\n return normalizeHost(host) ?? DEFAULT_ENV_HOSTS[env];\n}\n\nfunction buildEnvUrls(host: string): EnvUrls {\n const https = `https://${host}`;\n const wss = `wss://${host}`;\n return {\n lightApiUrl: `${https}/api/message/tob/sendMessage`,\n relayTunnelUrl: `${wss}/message/messages/ws/plugin`,\n appNameMapUrl: `${https}/api/application-config/app-package/config-all`,\n modelProxyLongRecordingSubmitTaskUrl: `${https}/api/model-proxy/long-recording/submit-task`,\n modelProxyLongRecordingQueryTaskResultBaseUrl: `${https}/api/model-proxy/long-recording/query-task-result`,\n accountFileDeleteUrl: `${https}/api/account/file/delete`,\n gatewayConnectStatusUrl: `${https}/api/message/messageBridge/plugin/gateway-connect-status`,\n clawManagerInstanceReadyUrl: `${https}/claw-manager/internal/claw-manager/instance/ready`,\n };\n}\n\nconst VALID_ENVS: ReadonlySet<string> = new Set<string>([\n \"development\",\n \"test\",\n \"production\",\n]);\n\nfunction readDotEnv(): Record<string, string> {\n const path = resolveStateFile(\".env\");\n if (!existsSync(path)) return {};\n return Object.fromEntries(parseEnvContent(readFileSync(path, \"utf-8\")));\n}\n\n/** 读取持久化到 .env 的环境名称;仅反映本地配置,不考虑进程环境变量。 */\nexport function readPersistedEnvName(): EnvName | undefined {\n const fromDotEnv = readDotEnv()[\"PHONE_NOTIFICATIONS_ENV\"]?.trim();\n if (fromDotEnv && VALID_ENVS.has(fromDotEnv)) return fromDotEnv as EnvName;\n return undefined;\n}\n\n/** 读取当前环境名称。优先级:PHONE_NOTIFICATIONS_ENV 环境变量 > .env > credentials.json > 默认 production */\nexport function loadEnvName(): EnvName {\n const fromEnvVar = process.env.PHONE_NOTIFICATIONS_ENV?.trim();\n if (fromEnvVar && VALID_ENVS.has(fromEnvVar)) return fromEnvVar as EnvName;\n\n const fromDotEnv = readPersistedEnvName();\n if (fromDotEnv) return fromDotEnv;\n\n const { env } = readCredentials();\n if (env && VALID_ENVS.has(env)) return env as EnvName;\n\n return \"production\";\n}\n\n/** 持久化当前环境到 .env */\nexport function saveEnvName(env: EnvName): void {\n if (!VALID_ENVS.has(env)) {\n throw new Error(\n `无效的环境名称: ${env},可选值: ${[...VALID_ENVS].join(\", \")}`,\n );\n }\n writeDotEnv(\"PHONE_NOTIFICATIONS_ENV\", env);\n}\n\n/** 获取当前环境的 URL 配置 */\nexport function getEnvUrls(env?: EnvName): EnvUrls {\n return buildEnvUrls(getEnvHost(env ?? loadEnvName()));\n}\n\n/** 获取所有可用环境名称 */\nexport function getAvailableEnvs(): EnvName[] {\n return [\"development\", \"test\", \"production\"];\n}\n",
|
|
66
|
+
"/**\n * 本地 Whisper 转写模块(arc-long-recording §6.4)\n *\n * 插件内置 Whisper 推理能力:\n * 1. 自动检测运行环境与硬件配置(§6.4.1)\n * 2. 选择最优推理后端(§6.4.2)\n * 3. 根据可用内存自动选择模型规格(§6.4.3)\n * 4. 首次使用时下载模型文件(§6.4.5)\n * 5. 通过 whisper.cpp CLI 执行本地离线转写\n */\n\nimport { execSync, execFileSync, spawnSync, type SpawnSyncReturns } from \"node:child_process\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n statSync,\n createWriteStream,\n unlinkSync,\n copyFileSync,\n openSync,\n readSync,\n closeSync,\n} from \"node:fs\";\nimport { join, dirname, basename } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport { platform, arch, totalmem, cpus, freemem } from \"node:os\";\nimport type {\n WhisperLocalConfig,\n WhisperModelSize,\n WhisperModelSource,\n WhisperBackend,\n WhisperEnvironmentInfo,\n} from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\nimport type { TranscriptionResult, TranscriptSegment } from \"./asr.js\";\n\n// ─── Constants ───\n\nconst WHISPER_MODELS_DIR = \"whisper-models\";\nconst WHISPER_BIN_DIR = \"whisper-bin\";\n\n/** Hugging Face GGML 模型下载 URL 模板(海外) */\nconst HF_MODEL_URL_TEMPLATE =\n \"https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-{model}.bin\";\n\n/** 国内 ModelScope 镜像 URL 模板(lihuoo/whisper.cpp-asr-model-collection) */\nconst MODELSCOPE_MODEL_URL_TEMPLATE =\n \"https://modelscope.cn/models/lihuoo/whisper.cpp-asr-model-collection/resolve/master/{model}.bin\";\n\n/** 连通性探测超时(ms) */\nconst PROBE_TIMEOUT_MS = 5_000;\n\n/** 模型规格 → 文件名映射 */\nconst MODEL_FILENAMES: Record<WhisperModelSize, string> = {\n tiny: \"ggml-tiny.bin\",\n base: \"ggml-base.bin\",\n small: \"ggml-small.bin\",\n medium: \"ggml-medium.bin\",\n \"large-v3\": \"ggml-large-v3.bin\",\n};\n\n/** 模型规格 → 推理内存需求 GB(§6.4.3) */\nconst MODEL_MEMORY_REQUIREMENTS: Record<WhisperModelSize, number> = {\n tiny: 1,\n base: 1.5,\n small: 3,\n medium: 6,\n \"large-v3\": 11,\n};\n\n/** 模型规格 → 磁盘占用(字节,近似值) */\nconst MODEL_DISK_SIZES: Record<WhisperModelSize, number> = {\n tiny: 75 * 1024 * 1024,\n base: 140 * 1024 * 1024,\n small: 460 * 1024 * 1024,\n medium: 1500 * 1024 * 1024,\n \"large-v3\": 3000 * 1024 * 1024,\n};\n\n/** whisper.cpp JSON 输出格式 */\ninterface WhisperCppJsonOutput {\n transcription?: Array<{\n timestamps?: { from: string; to: string };\n offsets?: { from: number; to: number };\n text: string;\n }>;\n}\n\n// ─── Public API ───\n\n/**\n * 检测运行环境与硬件配置(§6.4.1)\n *\n * 检测操作系统、CPU 架构、GPU、可用内存,\n * 推荐最优推理后端与模型规格。\n */\nexport function detectEnvironment(logger: Logger): WhisperEnvironmentInfo {\n const os = platform() as \"darwin\" | \"linux\" | \"win32\";\n const cpuArch = arch() as \"arm64\" | \"x64\";\n const isAppleSilicon = os === \"darwin\" && cpuArch === \"arm64\";\n const hasCuda = detectCuda(logger);\n\n // 推荐后端(§6.4.2)\n let recommendedBackend: WhisperBackend;\n if (isAppleSilicon) {\n recommendedBackend = \"coreml\";\n } else if (hasCuda) {\n recommendedBackend = \"cuda\";\n } else {\n recommendedBackend = \"cpu\";\n }\n\n // 可用内存\n const availableMemoryGB = getAvailableMemoryGB(recommendedBackend, logger);\n const physicalCores = getPhysicalCoreCount();\n\n // 推荐模型\n const recommendedModel = selectModelByMemory(availableMemoryGB, isAppleSilicon);\n\n const info: WhisperEnvironmentInfo = {\n os,\n arch: cpuArch,\n isAppleSilicon,\n hasCuda,\n recommendedBackend,\n availableMemoryGB: Math.round(availableMemoryGB * 10) / 10,\n recommendedModel,\n physicalCores,\n };\n\n logger.info(\n `[whisper-local] 环境检测完成: os=${os}, arch=${cpuArch}, ` +\n `appleSilicon=${isAppleSilicon}, cuda=${hasCuda}, ` +\n `backend=${recommendedBackend}, memory=${info.availableMemoryGB}GB, ` +\n `model=${recommendedModel}, cores=${physicalCores}`,\n );\n\n return info;\n}\n\n/**\n * 根据可用内存自动选择模型规格(§6.4.3)\n *\n * 策略:优先匹配可用内存最大能承载的模型(向下取最近档位)。\n * Apple Silicon CoreML 后端内存效率更高,同档位需求降低 ~30%。\n */\nexport function selectModelByMemory(\n availableGB: number,\n isAppleSilicon: boolean = false,\n): WhisperModelSize {\n // Apple Silicon CoreML 内存效率提升约 30%\n const effectiveGB = isAppleSilicon ? availableGB / 0.7 : availableGB;\n\n if (effectiveGB >= 12) return \"large-v3\";\n if (effectiveGB >= 8) return \"medium\";\n if (effectiveGB >= 6) return \"small\";\n if (effectiveGB >= 4) return \"base\";\n return \"tiny\";\n}\n\n/**\n * 解析模型存储目录\n */\nexport function resolveModelsDir(dataDir: string): string {\n const dir = join(dataDir, WHISPER_MODELS_DIR);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n\n/**\n * 解析 whisper.cpp 二进制目录\n */\nexport function resolveBinDir(dataDir: string): string {\n const dir = join(dataDir, WHISPER_BIN_DIR);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n\n/**\n * 检查模型文件是否已下载(§6.4.5)\n */\nexport function isModelDownloaded(modelsDir: string, modelSize: WhisperModelSize): boolean {\n const modelPath = join(modelsDir, MODEL_FILENAMES[modelSize]);\n if (!existsSync(modelPath)) return false;\n\n // 简单校验:文件大小至少为预期大小的 80%(防止下载不完整)\n try {\n const stat = statSync(modelPath);\n const expectedSize = MODEL_DISK_SIZES[modelSize];\n return stat.size >= expectedSize * 0.8;\n } catch {\n return false;\n }\n}\n\n/**\n * 下载 Whisper 模型文件(§6.4.5)\n *\n * 下载源选择策略:\n * - modelMirrorUrl 存在 → 使用自定义 URL\n * - modelSource = \"huggingface\" → 直接使用 Hugging Face\n * - modelSource = \"domestic\" → 直接使用国内镜像(ModelScope)\n * - modelSource = \"auto\"(默认)→ 先探测 Hugging Face 连通性(5s 超时),\n * 可达则用 HF,不可达则回退国内镜像\n */\nexport async function downloadModel(\n modelsDir: string,\n modelSize: WhisperModelSize,\n logger: Logger,\n modelSource?: WhisperModelSource,\n mirrorUrl?: string,\n): Promise<{ ok: boolean; modelPath: string; error?: string }> {\n const filename = MODEL_FILENAMES[modelSize];\n const modelPath = join(modelsDir, filename);\n\n // 已存在且完整 → 跳过\n if (isModelDownloaded(modelsDir, modelSize)) {\n logger.info(`[whisper-local] 模型已存在,跳过下载: ${filename}`);\n return { ok: true, modelPath };\n }\n\n // 解析下载 URL\n const url = await resolveModelUrl(modelSize, modelSource, mirrorUrl, logger);\n\n logger.info(\n `[whisper-local] 开始下载模型: ${modelSize} (${formatBytes(MODEL_DISK_SIZES[modelSize])})`,\n );\n logger.info(`[whisper-local] 下载 URL: ${url}`);\n\n const result = await downloadFromUrl(url, modelPath, logger);\n\n // auto 模式且 HF 失败 → 尝试国内镜像回退\n if (\n !result.ok &&\n !mirrorUrl &&\n (modelSource === \"auto\" || !modelSource) &&\n url.includes(\"huggingface.co\")\n ) {\n const fallbackUrl = MODELSCOPE_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n logger.info(\n `[whisper-local] Hugging Face 下载失败,回退至国内镜像(ModelScope): ${fallbackUrl}`,\n );\n return downloadFromUrl(fallbackUrl, modelPath, logger);\n }\n\n return result;\n}\n\n/**\n * 解析模型下载 URL\n */\nasync function resolveModelUrl(\n modelSize: WhisperModelSize,\n modelSource: WhisperModelSource | undefined,\n mirrorUrl: string | undefined,\n logger: Logger,\n): Promise<string> {\n // 自定义 URL 优先级最高\n if (mirrorUrl) {\n return `${mirrorUrl.replace(/\\/$/, \"\")}/${MODEL_FILENAMES[modelSize]}`;\n }\n\n const source = modelSource ?? \"auto\";\n\n switch (source) {\n case \"huggingface\":\n return HF_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n case \"domestic\":\n return MODELSCOPE_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n case \"auto\": {\n // 探测 Hugging Face 连通性\n const hfReachable = await probeUrl(\"https://huggingface.co\", logger);\n if (hfReachable) {\n logger.info(\"[whisper-local] Hugging Face 可达,使用海外源\");\n return HF_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n }\n logger.info(\"[whisper-local] Hugging Face 不可达,使用国内镜像(ModelScope)\");\n return MODELSCOPE_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n }\n default:\n return HF_MODEL_URL_TEMPLATE.replace(\"{model}\", modelSize);\n }\n}\n\n/**\n * 探测 URL 连通性(HEAD 请求,短超时)\n */\nasync function probeUrl(url: string, logger: Logger): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), PROBE_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: \"HEAD\",\n signal: controller.signal,\n });\n return res.ok || res.status === 301 || res.status === 302;\n } finally {\n clearTimeout(timer);\n }\n } catch (err: any) {\n logger.info(\n `[whisper-local] 连通性探测失败: ${url} (${err?.name ?? err?.message ?? \"unknown\"})`,\n );\n return false;\n }\n}\n\n/**\n * 从指定 URL 下载模型文件至本地\n */\nasync function downloadFromUrl(\n url: string,\n modelPath: string,\n logger: Logger,\n): Promise<{ ok: boolean; modelPath: string; error?: string }> {\n const tmpPath = `${modelPath}.downloading`;\n\n try {\n mkdirSync(dirname(modelPath), { recursive: true });\n\n const controller = new AbortController();\n // 模型下载超时:30 分钟(large-v3 约 3GB)\n const timer = setTimeout(() => controller.abort(), 30 * 60 * 1000);\n\n try {\n const res = await fetch(url, { signal: controller.signal });\n\n if (!res.ok) {\n return {\n ok: false,\n modelPath,\n error: `模型下载失败: HTTP ${res.status} ${res.statusText}`,\n };\n }\n\n if (!res.body) {\n return { ok: false, modelPath, error: \"模型下载失败: 响应体为空\" };\n }\n\n const contentLength = Number(res.headers.get(\"content-length\") ?? 0);\n const writeStream = createWriteStream(tmpPath);\n const readable = Readable.fromWeb(res.body as any);\n\n // 下载进度日志\n let downloaded = 0;\n let lastLogPercent = 0;\n readable.on(\"data\", (chunk: Buffer) => {\n downloaded += chunk.length;\n if (contentLength > 0) {\n const percent = Math.floor((downloaded / contentLength) * 100);\n if (percent >= lastLogPercent + 10) {\n logger.info(\n `[whisper-local] 下载进度: ${percent}% (${formatBytes(downloaded)} / ${formatBytes(contentLength)})`,\n );\n lastLogPercent = percent;\n }\n }\n });\n\n await pipeline(readable, writeStream);\n } finally {\n clearTimeout(timer);\n }\n\n // 重命名为正式文件\n const { renameSync } = await import(\"node:fs\");\n renameSync(tmpPath, modelPath);\n\n const fileSize = statSync(modelPath).size;\n logger.info(\n `[whisper-local] 模型下载完成: ${basename(modelPath)} (${formatBytes(fileSize)})`,\n );\n\n return { ok: true, modelPath };\n } catch (err: any) {\n // 清理临时文件\n try {\n if (existsSync(tmpPath)) unlinkSync(tmpPath);\n } catch { /* ignore */ }\n\n const msg = err?.name === \"AbortError\"\n ? \"模型下载超时(30 分钟)\"\n : (err?.message ?? String(err));\n logger.error(`[whisper-local] 模型下载失败: ${msg}`);\n return { ok: false, modelPath, error: msg };\n }\n}\n\n/**\n * 查找 whisper.cpp CLI 二进制文件\n *\n * 按以下优先级查找:\n * 1. 插件数据目录下的 whisper-bin/\n * 2. 系统 PATH 中的 whisper-cli / whisper-cpp / whisper\n */\nexport function findWhisperBinary(dataDir: string, logger: Logger): string | null {\n // 1. 检查插件 bin 目录\n const binDir = resolveBinDir(dataDir);\n const binNames = platform() === \"win32\"\n ? [\"whisper-cli.exe\", \"whisper.exe\", \"main.exe\"]\n : [\"whisper-cli\", \"whisper\", \"main\"];\n\n for (const name of binNames) {\n const binPath = join(binDir, name);\n if (existsSync(binPath)) {\n logger.info(`[whisper-local] 找到本地二进制: ${binPath}`);\n return binPath;\n }\n }\n\n // 2. 检查系统 PATH\n const pathNames = platform() === \"win32\"\n ? [\"whisper-cli\", \"whisper-cpp\", \"whisper\"]\n : [\"whisper-cli\", \"whisper-cpp\", \"whisper\"];\n\n for (const name of pathNames) {\n try {\n const cmd = platform() === \"win32\" ? \"where\" : \"which\";\n const result = execSync(`${cmd} ${name}`, { encoding: \"utf-8\", stdio: \"pipe\" }).trim();\n if (result) {\n logger.info(`[whisper-local] 找到系统 PATH 二进制: ${result}`);\n return result.split(\"\\n\")[0].trim();\n }\n } catch {\n // not found, continue\n }\n }\n\n logger.warn(\"[whisper-local] 未找到 whisper.cpp 二进制文件\");\n return null;\n}\n\n/**\n * 使用本地 Whisper 执行转写(§6.4)\n *\n * @param audioFilePath 本地音频文件绝对路径\n * @param localConfig 本地 Whisper 配置\n * @param dataDir 插件数据目录(存放模型和二进制)\n * @param logger 日志\n */\nexport async function transcribeWithWhisperLocal(\n audioFilePath: string,\n localConfig: WhisperLocalConfig,\n dataDir: string,\n logger: Logger,\n): Promise<TranscriptionResult> {\n // 1. 检测环境\n const env = detectEnvironment(logger);\n\n // 2. 确定后端、模型、线程数\n const backend = localConfig.backend ?? env.recommendedBackend;\n const modelSize = localConfig.model ?? env.recommendedModel;\n const threads = localConfig.threads ?? env.physicalCores;\n const language = localConfig.language ?? \"auto\";\n const translate = localConfig.translate ?? false;\n\n logger.info(\n `[whisper-local] 转写参数: backend=${backend}, model=${modelSize}, ` +\n `threads=${threads}, language=${language}, translate=${translate}`,\n );\n\n // 3. 查找 whisper.cpp 二进制\n const whisperBin = findWhisperBinary(dataDir, logger);\n if (!whisperBin) {\n return {\n ok: false,\n error:\n \"未找到 whisper.cpp 二进制文件。请安装 whisper.cpp 并确保 whisper-cli 在 PATH 中,\" +\n `或将二进制文件放入 ${resolveBinDir(dataDir)}`,\n };\n }\n\n // 4. 确保模型已下载\n const modelsDir = resolveModelsDir(dataDir);\n if (!isModelDownloaded(modelsDir, modelSize)) {\n logger.info(`[whisper-local] 模型 ${modelSize} 未下载,开始下载...`);\n const downloadResult = await downloadModel(\n modelsDir,\n modelSize,\n logger,\n localConfig.modelSource,\n localConfig.modelMirrorUrl,\n );\n if (!downloadResult.ok) {\n return { ok: false, error: `模型下载失败: ${downloadResult.error}` };\n }\n }\n\n const modelPath = join(modelsDir, MODEL_FILENAMES[modelSize]);\n\n // 5. 音频格式转换(whisper.cpp 仅支持 16kHz mono WAV)\n // 通过 magic bytes 判断真实格式,不依赖扩展名\n let inputPath = audioFilePath;\n let tmpWavPath: string | null = null;\n\n const actualFmt = detectAudioFormat(audioFilePath);\n if (actualFmt !== \".wav\") {\n tmpWavPath = audioFilePath.replace(/\\.[^.]+$/, \".whisper.wav\");\n logger.info(\n `[whisper-local] 转换音频格式: ${audioFilePath} (${actualFmt ?? \"未知\"}) → WAV (16kHz mono)`,\n );\n\n const convertResult = convertToWav(audioFilePath, tmpWavPath, actualFmt, logger);\n if (!convertResult.ok) {\n return { ok: false, error: convertResult.error! };\n }\n inputPath = tmpWavPath;\n }\n\n // 6. 构建 whisper.cpp CLI 参数\n const args = buildWhisperArgs({\n audioFilePath: inputPath,\n modelPath,\n language,\n translate,\n threads,\n backend,\n });\n\n logger.info(`[whisper-local] 执行: ${whisperBin} ${args.join(\" \")}`);\n\n // 7. 执行转写\n try {\n const startMs = Date.now();\n let result: SpawnSyncReturns<string>;\n\n try {\n result = spawnSync(whisperBin, args, {\n encoding: \"utf-8\" as const,\n timeout: 60 * 60 * 1000, // 1 小时超时(5 小时录音)\n maxBuffer: 100 * 1024 * 1024, // 100MB stdout buffer\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch (err: any) {\n cleanupTmpWav(tmpWavPath);\n return { ok: false, error: `whisper.cpp 执行失败: ${err?.message ?? err}` };\n }\n\n if (result.status !== 0) {\n cleanupTmpWav(tmpWavPath);\n const stderr = result.stderr?.slice(0, 500) ?? \"\";\n return {\n ok: false,\n error: `whisper.cpp 退出码 ${result.status}: ${stderr}`,\n };\n }\n\n const elapsed = Date.now() - startMs;\n logger.info(`[whisper-local] 转写耗时: ${Math.round(elapsed / 1000)}s`);\n\n // 8. 读取 JSON 输出文件(--output-json 将结果写入 {inputPath}.json)\n const jsonPath = inputPath + \".json\";\n let jsonContent: string;\n\n if (existsSync(jsonPath)) {\n jsonContent = readFileSync(jsonPath, \"utf-8\");\n // 清理 JSON 文件\n try { unlinkSync(jsonPath); } catch { /* ignore */ }\n } else {\n // 回退:尝试解析 stdout(部分 whisper.cpp 版本可能输出到 stdout)\n jsonContent = result.stdout;\n }\n\n cleanupTmpWav(tmpWavPath);\n\n return parseWhisperOutput(jsonContent, logger);\n } catch (err: any) {\n cleanupTmpWav(tmpWavPath);\n return { ok: false, error: `whisper.cpp 转写异常: ${err?.message ?? err}` };\n }\n}\n\n/**\n * 获取本地 Whisper 状态信息(供 App 查询环境检测结果)\n */\nexport function getWhisperLocalStatus(\n dataDir: string,\n logger: Logger,\n): {\n environment: WhisperEnvironmentInfo;\n binaryFound: boolean;\n binaryPath: string | null;\n downloadedModels: WhisperModelSize[];\n} {\n const env = detectEnvironment(logger);\n const binaryPath = findWhisperBinary(dataDir, logger);\n const modelsDir = resolveModelsDir(dataDir);\n\n const allModels: WhisperModelSize[] = [\"tiny\", \"base\", \"small\", \"medium\", \"large-v3\"];\n const downloadedModels = allModels.filter((m) => isModelDownloaded(modelsDir, m));\n\n return {\n environment: env,\n binaryFound: binaryPath !== null,\n binaryPath,\n downloadedModels,\n };\n}\n\n// ─── Internal Helpers ───\n\n/**\n * 检测 CUDA 是否可用(§6.4.1)\n */\nfunction detectCuda(logger: Logger): boolean {\n try {\n // 尝试运行 nvidia-smi\n execSync(\"nvidia-smi\", { encoding: \"utf-8\", stdio: \"pipe\", timeout: 5000 });\n logger.info(\"[whisper-local] 检测到 NVIDIA GPU (nvidia-smi)\");\n return true;\n } catch {\n // nvidia-smi 不存在或执行失败\n }\n\n // 检查 CUDA runtime 库\n if (platform() === \"linux\") {\n try {\n const ldconfig = execSync(\"ldconfig -p 2>/dev/null | grep libcudart\", {\n encoding: \"utf-8\",\n stdio: \"pipe\",\n timeout: 5000,\n });\n if (ldconfig.includes(\"libcudart\")) {\n logger.info(\"[whisper-local] 检测到 CUDA runtime (ldconfig)\");\n return true;\n }\n } catch { /* ignore */ }\n }\n\n return false;\n}\n\n/**\n * 获取可用内存(GB)\n *\n * CUDA 后端使用 VRAM,其余使用系统 RAM。\n */\nfunction getAvailableMemoryGB(backend: WhisperBackend, logger: Logger): number {\n if (backend === \"cuda\") {\n // 尝试获取 GPU VRAM\n try {\n const output = execSync(\n \"nvidia-smi --query-gpu=memory.free --format=csv,noheader,nounits\",\n { encoding: \"utf-8\", stdio: \"pipe\", timeout: 5000 },\n );\n const freeVramMB = parseInt(output.trim().split(\"\\n\")[0], 10);\n if (!Number.isNaN(freeVramMB) && freeVramMB > 0) {\n return freeVramMB / 1024;\n }\n } catch {\n logger.warn(\"[whisper-local] 无法获取 GPU VRAM,使用系统 RAM 代替\");\n }\n }\n\n // 使用系统可用内存(取 total 的 80% 和 free 的较大值作为可用估计)\n const totalGB = totalmem() / (1024 * 1024 * 1024);\n const freeGB = freemem() / (1024 * 1024 * 1024);\n return Math.max(freeGB, totalGB * 0.6);\n}\n\n/**\n * 获取物理 CPU 核心数\n */\nfunction getPhysicalCoreCount(): number {\n const cpuList = cpus();\n if (cpuList.length === 0) return 4; // fallback\n\n // 简单估算:逻辑核 / 2(假设超线程)\n // macOS ARM 无超线程,直接使用逻辑核数\n if (platform() === \"darwin\" && arch() === \"arm64\") {\n // Apple Silicon: P-cores only (exclude E-cores for inference)\n // 简化处理:使用总核数\n return cpuList.length;\n }\n\n return Math.max(1, Math.floor(cpuList.length / 2));\n}\n\n/**\n * 通过文件头 magic bytes 检测音频的真实格式\n * @returns 正确的文件扩展名(如 .aiff, .wav, .m4a),或 null\n */\nfunction detectAudioFormat(filePath: string): string | null {\n try {\n const fd = openSync(filePath, \"r\");\n const buf = Buffer.alloc(12);\n readSync(fd, buf, 0, 12, 0);\n closeSync(fd);\n\n const header = buf.toString(\"ascii\", 0, 4);\n const header8 = buf.toString(\"ascii\", 0, 8);\n\n // RIFF....WAVE = WAV\n if (header === \"RIFF\" && buf.toString(\"ascii\", 8, 12) === \"WAVE\") return \".wav\";\n // FORM....AIFF / FORM....AIFC = AIFF\n if (header === \"FORM\") {\n const sub = buf.toString(\"ascii\", 8, 12);\n if (sub === \"AIFF\" || sub === \"AIFC\") return \".aiff\";\n }\n // ftyp = MP4/M4A/AAC container\n if (buf.toString(\"ascii\", 4, 8) === \"ftyp\") return \".m4a\";\n // ID3 or 0xFF 0xFB = MP3\n if (header.startsWith(\"ID3\") || (buf[0] === 0xff && (buf[1] & 0xe0) === 0xe0)) return \".mp3\";\n // OggS = Ogg (Vorbis/Opus)\n if (header === \"OggS\") return \".ogg\";\n // fLaC = FLAC\n if (header === \"fLaC\") return \".flac\";\n\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * 将音频文件转换为 whisper.cpp 所需的 16kHz mono WAV 格式\n *\n * 转换链(按优先级):\n * 1. ffmpeg — 支持全格式,含 OGG/Opus\n * 2. opusdec — 专用于 OGG/Opus(来自 brew install opus-tools)\n * 3. afconvert — macOS 内置,支持 AIFF/M4A/AAC;需正确文件扩展名\n *\n * @param actualFmt detectAudioFormat 检测到的真实格式(如 \".ogg\", \".aiff\"),可为 null\n */\nfunction convertToWav(\n inputPath: string,\n outputPath: string,\n actualFmt: string | null,\n logger: Logger,\n): { ok: boolean; error?: string } {\n // 尝试 ffmpeg(可自动检测格式,不依赖扩展名)\n try {\n const ffmpegResult = spawnSync(\"ffmpeg\", [\n \"-y\", \"-i\", inputPath,\n \"-ar\", \"16000\", \"-ac\", \"1\", \"-c:a\", \"pcm_s16le\",\n outputPath,\n ], {\n encoding: \"utf-8\",\n timeout: 120_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (ffmpegResult.status === 0 && existsSync(outputPath)) {\n logger.info(`[whisper-local] ffmpeg 转换完成: ${outputPath}`);\n return { ok: true };\n }\n } catch {\n // ffmpeg 不可用,继续尝试其他方式\n }\n\n // 2. opusdec — 专用于 OGG/Opus(ffmpeg 不可用时)\n if (actualFmt === \".ogg\") {\n try {\n const opusResult = spawnSync(\n \"opusdec\",\n [\"--rate\", \"16000\", \"--mono\", inputPath, outputPath],\n { encoding: \"utf-8\", timeout: 120_000, stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n );\n if (opusResult.status === 0 && existsSync(outputPath)) {\n logger.info(`[whisper-local] opusdec 转换完成: ${outputPath}`);\n return { ok: true };\n }\n } catch { /* opusdec 不可用,继续 */ }\n }\n\n // 3. macOS afconvert — 支持 AIFF/M4A/AAC,不支持 OGG\n if (process.platform === \"darwin\" && actualFmt !== \".ogg\") {\n // afconvert 依赖扩展名判断输入格式,先确保扩展名正确\n let actualInputPath = inputPath;\n let tmpCopy: string | null = null;\n const detectedExt = actualFmt;\n\n if (detectedExt && !inputPath.endsWith(detectedExt)) {\n // 扩展名不匹配,创建带正确扩展名的临时副本\n tmpCopy = inputPath + \".detected\" + detectedExt;\n try {\n copyFileSync(inputPath, tmpCopy);\n actualInputPath = tmpCopy;\n logger.info(\n `[whisper-local] 检测到实际格式 ${detectedExt},临时重命名`,\n );\n } catch {\n tmpCopy = null;\n }\n }\n\n try {\n const afResult = spawnSync(\"afconvert\", [\n \"-f\", \"WAVE\", \"-d\", \"LEI16@16000\", \"-c\", \"1\",\n actualInputPath, outputPath,\n ], {\n encoding: \"utf-8\",\n timeout: 120_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n // 清理临时副本\n if (tmpCopy && existsSync(tmpCopy)) {\n try { unlinkSync(tmpCopy); } catch { /* ignore */ }\n }\n\n if (afResult.status === 0 && existsSync(outputPath)) {\n logger.info(`[whisper-local] afconvert 转换完成: ${outputPath}`);\n return { ok: true };\n }\n\n const stderr = afResult.stderr?.slice(0, 200) ?? \"\";\n return { ok: false, error: `afconvert 转换失败 (exit ${afResult.status}): ${stderr}` };\n } catch (err: any) {\n // 清理临时副本\n if (tmpCopy && existsSync(tmpCopy)) {\n try { unlinkSync(tmpCopy); } catch { /* ignore */ }\n }\n return { ok: false, error: `afconvert 不可用: ${err?.message}` };\n }\n }\n\n const fmtHint = actualFmt === \".ogg\"\n ? \"OGG/Opus 格式需要 ffmpeg 或 opus-tools(brew install opus-tools)\"\n : \"请安装 ffmpeg(brew install ffmpeg)或确保音频文件为 WAV 格式\";\n return { ok: false, error: `无法将音频转换为 WAV 格式。${fmtHint}` };\n}\n\n/** 清理临时 WAV 文件 */\nfunction cleanupTmpWav(path: string | null): void {\n if (path && existsSync(path)) {\n try { unlinkSync(path); } catch { /* ignore */ }\n }\n}\n\n/**\n * 构建 whisper.cpp CLI 参数\n */\nfunction buildWhisperArgs(params: {\n audioFilePath: string;\n modelPath: string;\n language: string;\n translate: boolean;\n threads: number;\n backend: WhisperBackend;\n}): string[] {\n const args: string[] = [\n \"--model\", params.modelPath,\n \"--file\", params.audioFilePath,\n \"--output-json\", // JSON 格式输出到 {audioFilePath}.json\n \"--no-prints\", // 抑制模型信息输出\n \"--threads\", String(params.threads),\n ];\n\n // 语言\n if (params.language && params.language !== \"auto\") {\n args.push(\"--language\", params.language);\n } else {\n args.push(\"--language\", \"auto\");\n }\n\n // 翻译为英文\n if (params.translate) {\n args.push(\"--translate\");\n }\n\n return args;\n}\n\n/**\n * 解析 whisper.cpp JSON 输出\n */\nfunction parseWhisperOutput(\n stdout: string,\n logger: Logger,\n): TranscriptionResult {\n if (!stdout || !stdout.trim()) {\n return { ok: false, error: \"whisper.cpp 无输出\" };\n }\n\n try {\n const data = JSON.parse(stdout.trim()) as WhisperCppJsonOutput;\n\n if (!data.transcription || !Array.isArray(data.transcription)) {\n // 可能是纯文本输出\n return {\n ok: true,\n text: stdout.trim(),\n segments: [],\n };\n }\n\n const segments: TranscriptSegment[] = [];\n const textParts: string[] = [];\n\n for (const item of data.transcription) {\n const text = item.text?.trim() ?? \"\";\n if (!text) continue;\n\n textParts.push(text);\n\n const startMs = item.offsets?.from ?? parseTimestamp(item.timestamps?.from);\n const endMs = item.offsets?.to ?? parseTimestamp(item.timestamps?.to);\n\n segments.push({\n start_ms: startMs,\n end_ms: endMs,\n text,\n });\n }\n\n const fullText = textParts.join(\" \");\n\n logger.info(\n `[whisper-local] 转写完成: ${fullText.length} 字, ${segments.length} 段`,\n );\n\n return {\n ok: true,\n text: fullText,\n segments,\n };\n } catch (err: any) {\n logger.warn(`[whisper-local] JSON 解析失败,尝试纯文本: ${err?.message}`);\n\n // Fallback: 将 stdout 视为纯文本\n return {\n ok: true,\n text: stdout.trim(),\n segments: [],\n };\n }\n}\n\n/**\n * 解析 whisper.cpp 时间戳字符串 \"HH:MM:SS,mmm\" → 毫秒\n */\nfunction parseTimestamp(ts?: string): number {\n if (!ts) return 0;\n // \"00:00:05,000\" or \"00:00:05.000\"\n const match = ts.match(/^(\\d+):(\\d+):(\\d+)[,.](\\d+)$/);\n if (!match) return 0;\n const [, h, m, s, ms] = match;\n return (\n parseInt(h, 10) * 3600000 +\n parseInt(m, 10) * 60000 +\n parseInt(s, 10) * 1000 +\n parseInt(ms, 10)\n );\n}\n\n/**\n * 格式化字节数\n */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)}GB`;\n}\n",
|
|
68
67
|
"/**\n * Account Service OSS 文件删除(imp-account-user-controllers-api §5.7)\n *\n * 调用 `POST /account/file/delete?fileUrl=...`,`fileUrl` 通过查询串传递\n * (后端确认的传参方式,form-urlencoded / multipart 经网关都会丢字段)。\n */\n\nimport type { Logger } from \"../logger.js\";\nimport { loadApiKey } from \"../auth/credentials.js\";\nimport { getEnvUrls } from \"../env.js\";\n\ninterface AccountServiceResponse {\n code?: string | number;\n msg?: string | null;\n data?: unknown;\n}\n\nexport interface DeleteOssFileResult {\n ok: boolean;\n error?: string;\n}\n\nexport interface DeleteAccountOssFileOptions {\n /** 最大尝试次数(含首次),默认 3 */\n maxAttempts?: number;\n /** 指数退避基数(毫秒),默认 500 */\n backoffMs?: number;\n}\n\ntype AttemptOutcome =\n | { kind: \"ok\" }\n | { kind: \"permanent\"; error: string }\n | { kind: \"retryable\"; error: string };\n\nconst DEFAULT_DELETE_MAX_ATTEMPTS = 3;\nconst DEFAULT_DELETE_BACKOFF_MS = 500;\n\nfunction getDeleteMaxAttempts(): number {\n const raw = process.env.OPENCLAW_OSS_DELETE_MAX_ATTEMPTS;\n if (raw) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed >= 1) return Math.floor(parsed);\n }\n return DEFAULT_DELETE_MAX_ATTEMPTS;\n}\n\nfunction getDeleteBackoffMs(): number {\n const raw = process.env.OPENCLAW_OSS_DELETE_BACKOFF_MS;\n if (raw) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed >= 0) return parsed;\n }\n return DEFAULT_DELETE_BACKOFF_MS;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// 仅对网络抖动/服务端临时不可用做重试;4xx(除 429)是确定性失败,重试无意义。\nfunction isRetryableStatus(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction parseBody(text: string): AccountServiceResponse | \"invalid-json\" | undefined {\n if (!text) return undefined;\n try {\n return JSON.parse(text) as AccountServiceResponse;\n } catch {\n return \"invalid-json\";\n }\n}\n\nfunction extractCode(payload: AccountServiceResponse | undefined): string | undefined {\n if (!payload) return undefined;\n if (typeof payload.code === \"number\") return String(payload.code);\n return payload.code?.trim?.();\n}\n\nasync function attemptDelete(\n endpoint: string,\n headerKey: string,\n logger: Logger,\n): Promise<AttemptOutcome> {\n let res: Response;\n try {\n res = await fetch(endpoint, {\n method: \"POST\",\n headers: { \"X-Api-Key-Id\": headerKey },\n });\n } catch (err: any) {\n return { kind: \"retryable\", error: err?.message ?? String(err) };\n }\n\n const text = await res.text();\n\n if (!res.ok) {\n const error = `HTTP ${res.status} ${text.slice(0, 200)}`;\n if (isRetryableStatus(res.status)) {\n return { kind: \"retryable\", error };\n }\n logger.warn(\n `[account-oss-delete] HTTP 错误: status=${res.status}, body=${text.slice(0, 300)}`,\n );\n return { kind: \"permanent\", error };\n }\n\n const payload = parseBody(text);\n if (payload === \"invalid-json\") {\n logger.warn(`[account-oss-delete] 响应非 JSON: body=${text.slice(0, 300)}`);\n return { kind: \"permanent\", error: \"response is not JSON\" };\n }\n\n const code = extractCode(payload);\n if (code !== \"000000\") {\n const msg = payload?.msg?.trim?.() || text.slice(0, 200);\n logger.warn(`[account-oss-delete] 业务失败: code=${code ?? \"n/a\"}, msg=${msg}`);\n return { kind: \"permanent\", error: `${code ?? \"unknown\"} ${msg}`.trim() };\n }\n\n return { kind: \"ok\" };\n}\n\n/**\n * 删除 account-service 上传到 OSS 的文件。\n * 只接受形如 `https://{bucket}.{endpoint}/{objectKey}` 的完整 URL(即上传接口返回值)。\n * 失败不抛异常,由调用方按场景决定是否致命。\n *\n * 重试策略:网络异常 / HTTP 5xx / 429 走指数退避;其余(4xx、非 JSON、业务 code)直接返回。\n */\nexport async function deleteAccountOssFile(\n fileUrl: string,\n logger: Logger,\n options?: DeleteAccountOssFileOptions,\n): Promise<DeleteOssFileResult> {\n const trimmed = fileUrl?.trim();\n if (!trimmed) {\n return { ok: false, error: \"fileUrl is empty\" };\n }\n\n const apiKey = loadApiKey();\n if (!apiKey) {\n return { ok: false, error: \"API Key 未设置,跳过 OSS 文件删除\" };\n }\n\n const baseEndpoint = getEnvUrls().accountFileDeleteUrl;\n const headerKey = apiKey.startsWith(\"Bearer \")\n ? apiKey.slice(\"Bearer \".length)\n : apiKey;\n\n const url = new URL(baseEndpoint);\n url.searchParams.set(\"fileUrl\", trimmed);\n const endpoint = url.toString();\n\n const maxAttempts = Math.max(\n 1,\n Math.floor(options?.maxAttempts ?? getDeleteMaxAttempts()),\n );\n const baseBackoff = Math.max(0, options?.backoffMs ?? getDeleteBackoffMs());\n\n logger.info(\n `[account-oss-delete] 提交 OSS 文件删除: endpoint=${endpoint}, maxAttempts=${maxAttempts}`,\n );\n\n let lastError = \"unknown error\";\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const outcome = await attemptDelete(endpoint, headerKey, logger);\n\n if (outcome.kind === \"ok\") {\n logger.info(`[account-oss-delete] OSS 文件已删除: fileUrl=${trimmed}`);\n return { ok: true };\n }\n\n if (outcome.kind === \"permanent\") {\n return { ok: false, error: outcome.error };\n }\n\n lastError = outcome.error;\n if (attempt < maxAttempts) {\n const delay = baseBackoff * Math.pow(2, attempt - 1);\n logger.warn(\n `[account-oss-delete] 临时失败 (attempt ${attempt}/${maxAttempts}): ${outcome.error}, ${delay}ms 后重试`,\n );\n await sleep(delay);\n } else {\n logger.warn(\n `[account-oss-delete] 临时失败 (attempt ${attempt}/${maxAttempts}, 放弃): ${outcome.error}`,\n );\n }\n }\n\n return { ok: false, error: lastError };\n}\n",
|
|
68
|
+
"/**\n * 录音同步处理器(§2 阶段 4–5)\n *\n * 统一处理 recordings.sync 请求:\n * 1. 元数据入库\n * 2. 从 OSS 下载音频 + 打点文件\n * 3. 更新状态 → synced\n * 4. 如已配置 ASR → 自动触发转写\n */\n\nimport type {\n RecordingMetadata,\n RecordingSyncResult,\n AsrConfig,\n RecordingTranscriptItem,\n RecordingTransferStatus,\n} from \"../types.js\";\nimport type { Logger } from \"../logger.js\";\nimport { RecordingStorage } from \"./storage.js\";\nimport { downloadRecordingFiles } from \"./downloader.js\";\nimport { isAsrConfigured, runTranscriptionWorkflow } from \"./asr.js\";\nimport { canStartTranscription } from \"./state-machine.js\";\nimport { deleteAccountOssFile } from \"./account-oss.js\";\n\nexport interface RecordingStatusEvent {\n recordingId: string;\n transfer_status: RecordingTransferStatus;\n audioFile?: string;\n srtFile?: string;\n transcriptDataFile?: string;\n transcriptFile?: string;\n transcript?: RecordingTranscriptItem[];\n summary?: string;\n title: string;\n updatedAt: string;\n error?: string;\n}\n\nexport interface RecordingSyncOptions {\n notifyStatus?: (event: RecordingStatusEvent) => void;\n}\n\nfunction emitRecordingStatus(\n recordingId: string,\n storage: RecordingStorage,\n logger: Logger,\n notifyStatus?: RecordingSyncOptions[\"notifyStatus\"],\n error?: string,\n extras?: Pick<RecordingStatusEvent, \"transcript\" | \"summary\" | \"title\">,\n): void {\n if (!notifyStatus) {\n return;\n }\n\n const entry = storage.findById(recordingId);\n if (!entry) {\n return;\n }\n\n const title = extras?.title?.trim()\n || entry.title?.trim()\n || entry.metadata.name?.trim()\n || entry.id;\n const persistedError = entry.lastError?.trim() || undefined;\n\n try {\n notifyStatus({\n recordingId: entry.id,\n transfer_status: entry.status,\n audioFile: entry.audioFile,\n srtFile: entry.srtFile,\n transcriptDataFile: entry.transcriptDataFile,\n transcriptFile: entry.transcriptFile,\n transcript: extras?.transcript,\n summary: extras?.summary,\n title,\n updatedAt: entry.updatedAt,\n error: error ?? persistedError,\n });\n } catch (err: any) {\n logger.error(\n `[recording-status] 状态事件发送失败: ${recordingId}, ${err?.message ?? err}`,\n );\n }\n}\n\nasync function runRecordingSyncInBackground(\n metadata: RecordingMetadata,\n recordingId: string,\n storage: RecordingStorage,\n asrConfig: AsrConfig | undefined,\n logger: Logger,\n options: RecordingSyncOptions,\n): Promise<void> {\n const audioDestPath = storage.getAudioFilePath(\n recordingId,\n metadata.oss_audio_url,\n );\n const srtDestPath = storage.getSrtFilePath(recordingId);\n\n logger.info(\n `[recording-sync] 开始下载录音文件: ${recordingId}, audio=${metadata.oss_audio_url}`,\n );\n\n const downloadResult = await downloadRecordingFiles(\n metadata.oss_audio_url,\n metadata.oss_srt_url,\n audioDestPath,\n srtDestPath,\n logger,\n );\n\n if (!downloadResult.audio.ok) {\n const error = `音频下载失败: ${downloadResult.audio.error}`;\n logger.error(`[recording-sync] ${error}: ${recordingId}`);\n storage.updateStatus(recordingId, \"sync_failed\");\n storage.setLastError(recordingId, error);\n emitRecordingStatus(\n recordingId,\n storage,\n logger,\n options.notifyStatus,\n error,\n );\n return;\n }\n\n storage.setLastError(recordingId, undefined);\n storage.setAudioFile(\n recordingId,\n storage.buildAudioFilename(recordingId, metadata.oss_audio_url),\n );\n if (downloadResult.srt?.ok) {\n storage.setSrtFile(recordingId, storage.buildSrtFilename(recordingId));\n }\n\n storage.updateStatus(recordingId, \"synced\");\n logger.info(`[recording-sync] 录音已同步: ${recordingId}`);\n emitRecordingStatus(recordingId, storage, logger, options.notifyStatus);\n\n if (isAsrConfigured(asrConfig) && canStartTranscription(\"synced\")) {\n await triggerTranscription(\n recordingId,\n storage,\n asrConfig!,\n logger,\n options,\n );\n }\n}\n\n/**\n * 处理 recordings.sync 请求的核心逻辑\n */\nexport async function handleRecordingSync(\n recordingId: string,\n metadata: RecordingMetadata,\n storage: RecordingStorage,\n asrConfig: AsrConfig | undefined,\n logger: Logger,\n options: RecordingSyncOptions = {},\n): Promise<RecordingSyncResult> {\n const existing = storage.findById(recordingId);\n const shouldDownloadAndSync =\n !existing\n || existing.metadata.oss_audio_url !== metadata.oss_audio_url\n || !existing.audioFile\n || existing.status === \"syncing_openclaw\"\n || existing.status === \"sync_failed\";\n\n storage.ingest(recordingId, metadata);\n if (shouldDownloadAndSync) {\n runRecordingSyncInBackground(\n metadata,\n recordingId,\n storage,\n asrConfig,\n logger,\n options,\n ).catch((err) => {\n const error = `录音同步失败: ${err?.message ?? err}`;\n logger.error(`[recording-sync] ${error}: ${recordingId}`);\n const current = storage.findById(recordingId);\n if (current?.status === \"syncing_openclaw\") {\n storage.updateStatus(recordingId, \"sync_failed\");\n }\n storage.setLastError(recordingId, error);\n emitRecordingStatus(\n recordingId,\n storage,\n logger,\n options.notifyStatus,\n error,\n );\n });\n } else {\n logger.info(\n `[recording-sync] 录音已存在且音频未变化,跳过重复下载: ${recordingId}`,\n );\n emitRecordingStatus(recordingId, storage, logger, options.notifyStatus);\n\n const current = storage.findById(recordingId);\n if (current?.status === \"synced\" && isAsrConfigured(asrConfig)) {\n triggerTranscription(\n recordingId,\n storage,\n asrConfig!,\n logger,\n options,\n ).catch((err) => {\n logger.error(\n `[asr-trigger] 转写触发失败: ${recordingId}, ${err?.message ?? err}`,\n );\n });\n }\n }\n\n const current = storage.findById(recordingId);\n return {\n ok: true,\n recordingId,\n transfer_status: current?.status ?? \"syncing_openclaw\",\n ...(current?.lastError ? { error: current.lastError } : {}),\n };\n}\n\n/**\n * 触发 ASR 转写(可从 sync handler 自动触发或手动重试调用)\n */\nexport async function triggerTranscription(\n recordingId: string,\n storage: RecordingStorage,\n asrConfig: AsrConfig,\n logger: Logger,\n options: RecordingSyncOptions = {},\n): Promise<void> {\n const entry = storage.findById(recordingId);\n if (!entry) {\n logger.warn(`[asr-trigger] 录音不存在: ${recordingId}`);\n return;\n }\n\n if (!canStartTranscription(entry.status)) {\n logger.warn(\n `[asr-trigger] 当前状态不允许转写: ${recordingId} (status=${entry.status})`,\n );\n return;\n }\n\n // 状态 → transcribing\n storage.updateStatus(recordingId, \"transcribing\");\n storage.setLastError(recordingId, undefined);\n emitRecordingStatus(recordingId, storage, logger, options.notifyStatus);\n\n const audioFilePath = storage.getAudioFilePath(recordingId);\n\n let result: Awaited<ReturnType<typeof runTranscriptionWorkflow>>;\n try {\n result = await runTranscriptionWorkflow({\n audioFilePath,\n audioOssUrl: entry.metadata.oss_audio_url,\n config: asrConfig,\n markers: entry.metadata.markers ?? [],\n recordingName: entry.metadata.name,\n durationSec: entry.metadata.duration_sec,\n createdAt: entry.metadata.created_at,\n transcriptDataDir: storage.getTranscriptDataDir(),\n transcriptsDir: storage.getTranscriptsDir(),\n summariesDir: storage.getSummariesDir(),\n recordingId,\n logger,\n });\n } catch (err: any) {\n const error = `转写任务异常: ${err?.message ?? err}`;\n logger.error(`[asr-trigger] ${error}: ${recordingId}`);\n result = { ok: false, error };\n }\n\n if (result.ok && result.transcriptFilename) {\n if (result.transcriptDataFilename) {\n storage.setTranscriptDataFile(recordingId, result.transcriptDataFilename);\n }\n storage.setTranscriptFile(recordingId, result.transcriptFilename);\n if (result.summaryFilename) {\n storage.setSummaryFile(recordingId, result.summaryFilename);\n }\n storage.setTitle(recordingId, result.title);\n storage.updateStatus(recordingId, \"transcribed\");\n emitRecordingStatus(\n recordingId,\n storage,\n logger,\n options.notifyStatus,\n undefined,\n {\n transcript: result.transcript ?? [],\n summary: result.summary,\n title: result.title ?? \"\",\n },\n );\n logger.info(\n `[asr-trigger] 转写完成: ${recordingId}, summary=\"${result.summary}\"`,\n );\n\n // ASR 成功后删除 OSS 上的音频文件(imp-account-user-controllers-api §5.7)\n const ossAudioUrl = entry.metadata.oss_audio_url?.trim();\n if (ossAudioUrl) {\n void deleteAccountOssFile(ossAudioUrl, logger).catch((err) => {\n logger.warn(\n `[asr-trigger] OSS 音频清理异常 (非致命): ${recordingId}, ${err?.message ?? err}`,\n );\n });\n }\n } else {\n const error = result.error ?? \"ASR 转写失败\";\n storage.updateStatus(recordingId, \"transcribe_failed\");\n storage.setLastError(recordingId, error);\n emitRecordingStatus(\n recordingId,\n storage,\n logger,\n options.notifyStatus,\n error,\n );\n logger.error(\n `[asr-trigger] 转写失败: ${recordingId}, error=${error}`,\n );\n }\n}\n",
|
|
69
69
|
"import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport {\n RecordingStorage,\n canStartTranscription,\n extractSourceTextListFromDocument,\n extractTranscriptTitleFromDocument,\n handleRecordingSync,\n initializeAsr,\n triggerTranscription,\n type RecordingIndexEntry,\n type RecordingStatusEvent,\n validateAsrConfig,\n} from \"../recording/index.js\";\nimport { RELAY_INTERNAL_HTTP_HEADER } from \"../tunnel/http-proxy.js\";\nimport type { RelayTunnelService } from \"../tunnel/service.js\";\nimport type {\n HttpRecordingBody,\n RecordingAsrInitParams,\n RecordingDetail,\n RecordingListItem,\n RecordingListParams,\n RecordingRenameParams,\n RecordingRetranscribeParams,\n RecordingStatusParams,\n RecordingSyncParams,\n RecordingTransferStatus,\n} from \"../types.js\";\nimport {\n readBody,\n trimToUndefined,\n type GatewayMethodRegistrar,\n} from \"./shared.js\";\n\nconst RECORDING_TRANSFER_STATUSES = new Set<RecordingTransferStatus>([\n \"receiving_failed\",\n \"receiving\",\n \"pending_oss_upload\",\n \"uploading_oss\",\n \"oss_uploaded\",\n \"syncing_openclaw\",\n \"sync_failed\",\n \"synced\",\n \"transcribing\",\n \"transcribe_failed\",\n \"transcribed\",\n]);\n\nfunction isRecordingTransferStatus(\n value: string,\n): value is RecordingTransferStatus {\n return RECORDING_TRANSFER_STATUSES.has(value as RecordingTransferStatus);\n}\n\nfunction buildRecordingListItem(entry: RecordingIndexEntry): RecordingListItem {\n return {\n recordingId: entry.id,\n name: entry.metadata.name,\n duration_sec: entry.metadata.duration_sec,\n file_size_bytes: entry.metadata.file_size_bytes,\n created_at: entry.metadata.created_at,\n transfer_status: entry.status,\n marker_count: entry.metadata.markers?.length ?? 0,\n has_audio: !!entry.audioFile,\n has_srt: !!entry.srtFile,\n has_transcript: !!entry.transcriptFile,\n audioFile: entry.audioFile,\n transcriptDataFile: entry.transcriptDataFile,\n transcriptFile: entry.transcriptFile,\n updatedAt: entry.updatedAt,\n ...(entry.lastError ? { error: entry.lastError } : {}),\n };\n}\n\nfunction isRelayInternalHttpRequest(req: IncomingMessage): boolean {\n const header = req.headers?.[RELAY_INTERNAL_HTTP_HEADER];\n if (Array.isArray(header)) {\n return header.includes(\"1\");\n }\n return header === \"1\";\n}\n\nfunction buildRecordingDetail(\n entry: RecordingIndexEntry,\n extras?: Partial<Pick<\n RecordingDetail,\n \"summary\" | \"title\" | \"transcript\" | \"transcriptData\"\n >>,\n): RecordingDetail {\n const title = entry.title?.trim()\n || extras?.title?.trim()\n || entry.metadata.name?.trim()\n || entry.id;\n\n return {\n recordingId: entry.id,\n name: entry.metadata.name,\n duration_sec: entry.metadata.duration_sec,\n file_size_bytes: entry.metadata.file_size_bytes,\n created_at: entry.metadata.created_at,\n location: entry.metadata.location,\n oss_audio_url: entry.metadata.oss_audio_url,\n oss_srt_url: entry.metadata.oss_srt_url,\n markers: entry.metadata.markers ?? [],\n transfer_status: entry.status,\n audioFile: entry.audioFile,\n srtFile: entry.srtFile,\n transcriptDataFile: entry.transcriptDataFile,\n transcriptFile: entry.transcriptFile,\n summaryFile: entry.summaryFile,\n title,\n summary: extras?.summary,\n transcript: extras?.transcript,\n transcriptData: extras?.transcriptData,\n ingestedAt: entry.ingestedAt,\n updatedAt: entry.updatedAt,\n ...(entry.lastError ? { error: entry.lastError } : {}),\n };\n}\n\ninterface RecordingInterfaceDeps {\n api: OpenClawPluginApi;\n logger: Logger;\n asrDataDir: string;\n getRecordingStorage: () => RecordingStorage | null;\n notifyRecordingStatus: (event: RecordingStatusEvent) => void;\n registerGatewayMethod: GatewayMethodRegistrar;\n shouldBroadcastStatusOnHttp: () => boolean;\n tunnelService?: RelayTunnelService | null;\n}\n\nexport function registerRecordingInterfaces(\n deps: RecordingInterfaceDeps,\n): void {\n const {\n api,\n logger,\n asrDataDir,\n getRecordingStorage,\n notifyRecordingStatus,\n registerGatewayMethod,\n shouldBroadcastStatusOnHttp,\n tunnelService,\n } = deps;\n\n registerGatewayMethod(\"recordings.sync\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const {\n recordingId: rawRecordingId,\n recording,\n asr,\n } = params as unknown as RecordingSyncParams;\n const recordingId = trimToUndefined(rawRecordingId);\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n if (!recording || !recording.oss_audio_url || !recording.created_at) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recording with oss_audio_url and created_at is required\",\n });\n return;\n }\n\n const asrError = asr ? validateAsrConfig(asr) : undefined;\n if (asrError) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: asrError,\n });\n return;\n }\n\n const result = await handleRecordingSync(\n recordingId,\n recording,\n recordingStorage,\n asr,\n logger,\n { notifyStatus: notifyRecordingStatus },\n );\n respond(\n result.ok,\n result,\n result.ok\n ? undefined\n : {\n code: \"SYNC_FAILED\",\n message: result.error ?? \"Unknown error\",\n },\n );\n });\n\n registerGatewayMethod(\"recordings.list\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const rawStatus = trimToUndefined(\n (params as RecordingListParams | undefined)?.status,\n );\n if (rawStatus && !isRecordingTransferStatus(rawStatus)) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: `invalid recording status: ${rawStatus}`,\n });\n return;\n }\n\n const status = rawStatus as RecordingTransferStatus | undefined;\n const entries = status\n ? recordingStorage.listByStatus(status)\n : recordingStorage.listAll();\n\n respond(true, {\n total: entries.length,\n recordings: entries.map(buildRecordingListItem),\n });\n });\n\n registerGatewayMethod(\"recordings.status\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const { recordingId } = params as unknown as RecordingStatusParams;\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n const entry = recordingStorage.findById(recordingId);\n if (!entry) {\n respond(false, null, {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n });\n return;\n }\n\n respond(\n true,\n (() => {\n const transcriptDocument =\n recordingStorage.readTranscriptDocument(recordingId);\n\n return buildRecordingDetail(entry, {\n summary: recordingStorage.readSummary(recordingId),\n title: extractTranscriptTitleFromDocument(transcriptDocument),\n transcript: extractSourceTextListFromDocument(transcriptDocument),\n transcriptData: transcriptDocument,\n });\n })(),\n );\n });\n\n registerGatewayMethod(\"recordings.rename\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const { recordingId: rawRecordingId, name: rawName } =\n params as unknown as RecordingRenameParams;\n const recordingId = trimToUndefined(rawRecordingId);\n const name = trimToUndefined(rawName);\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n if (!name) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"name is required\",\n });\n return;\n }\n\n const entry = recordingStorage.findById(recordingId);\n if (!entry) {\n respond(false, null, {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n });\n return;\n }\n\n const updated = recordingStorage.rename(recordingId, name);\n respond(true, buildRecordingDetail(updated));\n });\n\n registerGatewayMethod(\"recordings.delete\", async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const { recordingId, deleteRemote } = params as {\n recordingId: string;\n deleteRemote?: boolean;\n };\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n if (deleteRemote) {\n const deleted = recordingStorage.delete(recordingId);\n respond(\n deleted,\n { ok: deleted, recordingId, deletedRemote: true },\n deleted\n ? undefined\n : {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n },\n );\n return;\n }\n\n const deleted = recordingStorage.delete(recordingId, {\n localOnly: true,\n });\n respond(\n deleted,\n { ok: deleted, recordingId, deletedRemote: false },\n deleted\n ? undefined\n : {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n },\n );\n });\n\n registerGatewayMethod(\n \"recordings.retranscribe\",\n async ({ params, respond }) => {\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n respond(false, null, {\n code: \"NOT_READY\",\n message: \"Recording storage service not ready\",\n });\n return;\n }\n\n const { recordingId, asr } =\n params as unknown as RecordingRetranscribeParams;\n if (!recordingId) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"recordingId is required\",\n });\n return;\n }\n\n const asrError = validateAsrConfig(asr);\n if (asrError) {\n respond(false, null, {\n code: \"ASR_NOT_CONFIGURED\",\n message: asrError,\n });\n return;\n }\n\n const entry = recordingStorage.findById(recordingId);\n if (!entry) {\n respond(false, null, {\n code: \"NOT_FOUND\",\n message: `Recording not found: ${recordingId}`,\n });\n return;\n }\n\n if (!canStartTranscription(entry.status)) {\n respond(false, null, {\n code: \"INVALID_STATE\",\n message: `Recording status does not allow retranscribe: ${entry.status}`,\n });\n return;\n }\n\n triggerTranscription(recordingId, recordingStorage, asr, logger, {\n notifyStatus: notifyRecordingStatus,\n }).catch((err) => {\n logger.error(\n `[recordings.retranscribe] 重试转写失败: ${recordingId}, ${err?.message ?? err}`,\n );\n });\n\n respond(true, { ok: true, recordingId, message: \"转写已重新触发\" });\n },\n );\n\n registerGatewayMethod(\"recordings.asr.init\", async ({ params, respond }) => {\n const { asr } = params as unknown as RecordingAsrInitParams;\n const asrError = validateAsrConfig(asr);\n if (asrError) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: asrError,\n });\n return;\n }\n\n const result = await initializeAsr(asr, asrDataDir, logger);\n respond(\n result.ok,\n result,\n result.ok\n ? undefined\n : {\n code: \"ASR_INIT_FAILED\",\n message: result.error ?? \"ASR init failed\",\n },\n );\n });\n\n api.registerHttpRoute({\n path: \"/recordings\",\n auth: \"gateway\",\n async handler(req: IncomingMessage, res: ServerResponse) {\n if (req.method !== \"POST\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Method Not Allowed\" }));\n return;\n }\n\n if (!isRelayInternalHttpRequest(req)) {\n await tunnelService?.deactivateForExternalTunnel(\"POST /recordings\");\n }\n\n const recordingStorage = getRecordingStorage();\n if (!recordingStorage) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Service Not Ready\" }));\n return;\n }\n\n let body: HttpRecordingBody;\n try {\n const raw = await readBody(req);\n body = JSON.parse(raw);\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Invalid JSON\" }));\n return;\n }\n\n const recordingId = trimToUndefined(body.recordingId);\n if (!recordingId) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n ok: false,\n error: \"recordingId is required\",\n }),\n );\n return;\n }\n\n if (!body.recording || !body.recording.oss_audio_url) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n ok: false,\n error: \"recording with oss_audio_url is required\",\n }),\n );\n return;\n }\n\n const asrError = body.asr ? validateAsrConfig(body.asr) : undefined;\n if (asrError) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: asrError }));\n return;\n }\n\n const result = await handleRecordingSync(\n recordingId,\n body.recording,\n recordingStorage,\n body.asr,\n logger,\n shouldBroadcastStatusOnHttp()\n ? { notifyStatus: notifyRecordingStatus }\n : undefined,\n );\n\n res.writeHead(result.ok ? 200 : 500, {\n \"Content-Type\": \"application/json\",\n });\n res.end(JSON.stringify(result));\n },\n } as any);\n\n logger.info(\n \"Gateway 录音方法已注册: recordings.sync / recordings.list / recordings.status / recordings.rename / recordings.delete / recordings.retranscribe / recordings.asr.init\",\n );\n logger.info(\"HTTP 录音端点已注册: POST /recordings\");\n}\n",
|
|
70
|
-
"
|
|
71
|
-
"import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n rmSync,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport type { LightSegment } from \"../types.js\";\nimport type { LightRuleMeta } from \"./types.js\";\nimport { assertAncsRepeatTimes, normalizeRepeatTimes } from \"../light/repeat.js\";\n\nexport interface LightRuleStorageContext {\n workspaceDir?: string;\n stateDir?: string;\n}\n\nfunction resolveBaseDir(ctx: LightRuleStorageContext): string {\n if (ctx.workspaceDir) return ctx.workspaceDir;\n\n if (ctx.stateDir) {\n const inferredWorkspaceDir = join(ctx.stateDir, \"workspace\");\n if (existsSync(inferredWorkspaceDir)) return inferredWorkspaceDir;\n return ctx.stateDir;\n }\n\n throw new Error(\"workspaceDir and stateDir both unavailable\");\n}\n\nfunction tasksDir(ctx: LightRuleStorageContext): string {\n return join(resolveBaseDir(ctx), \"tasks\");\n}\n\nfunction normalizeLightRuleLookupName(name: string): string {\n return name.trim().replace(/\\.json$/i, \"\");\n}\n\nfunction resolveLightRuleTask(\n ctx: LightRuleStorageContext,\n name: string,\n): { taskDir: string; meta: LightRuleMeta } | null {\n const dir = tasksDir(ctx);\n const normalizedName = normalizeLightRuleLookupName(name);\n if (!normalizedName) return null;\n\n const directTaskDir = join(dir, normalizedName);\n const directMeta = readMeta(directTaskDir);\n if (directMeta) {\n return {\n taskDir: directTaskDir,\n meta: directMeta,\n };\n }\n\n if (!existsSync(dir)) return null;\n\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n\n const taskDir = join(dir, entry.name);\n const meta = readMeta(taskDir);\n if (meta?.name === normalizedName) {\n return {\n taskDir,\n meta,\n };\n }\n }\n\n return null;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nfunction readMeta(taskDir: string): LightRuleMeta | null {\n const metaPath = join(taskDir, \"meta.json\");\n if (!existsSync(metaPath)) return null;\n try {\n const raw = JSON.parse(readFileSync(metaPath, \"utf-8\"));\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return null;\n if (raw.type !== \"light-rule\") return null;\n if (!Array.isArray(raw.segments)) return null;\n const name = readOptionalString(raw.name) ?? basename(taskDir);\n const title = readOptionalString(raw.title) ?? name;\n const description = readOptionalString(raw.description) ?? name;\n const createdAt =\n readOptionalString(raw.createdAt) ?? statSync(metaPath).birthtime.toISOString();\n const enabled = typeof raw.enabled === \"boolean\" ? raw.enabled : true;\n const repeatTimes = normalizeRepeatTimes({\n repeat: raw.repeat,\n repeat_times: raw.repeat_times,\n });\n assertAncsRepeatTimes(repeatTimes);\n return {\n ...raw,\n name,\n title,\n type: \"light-rule\",\n description,\n segments: raw.segments,\n repeat_times: repeatTimes,\n enabled,\n createdAt,\n } as LightRuleMeta;\n } catch {\n return null;\n }\n}\n\nfunction writeMeta(taskDir: string, meta: LightRuleMeta): void {\n writeFileSync(join(taskDir, \"meta.json\"), JSON.stringify(meta, null, 2), \"utf-8\");\n}\n\nexport function listLightRules(ctx: LightRuleStorageContext): LightRuleMeta[] {\n const dir = tasksDir(ctx);\n if (!existsSync(dir)) return [];\n\n const rules: LightRuleMeta[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const meta = readMeta(join(dir, entry.name));\n if (meta) rules.push(meta);\n }\n return rules;\n}\n\nexport function getLightRule(\n ctx: LightRuleStorageContext,\n name: string,\n): LightRuleMeta | null {\n return resolveLightRuleTask(ctx, name)?.meta ?? null;\n}\n\nexport function createLightRule(\n ctx: LightRuleStorageContext,\n params: {\n name: string;\n title: string;\n description: string;\n segments: LightSegment[];\n repeat_times?: number;\n repeat?: boolean;\n },\n): { meta: LightRuleMeta } {\n const dir = tasksDir(ctx);\n const taskDir = join(dir, params.name);\n\n if (existsSync(taskDir)) {\n throw new LightRuleError(\"ALREADY_EXISTS\", `灯效规则 '${params.name}' 已存在`);\n }\n\n mkdirSync(taskDir, { recursive: true });\n\n const repeatTimes = normalizeRepeatTimes({\n repeat: params.repeat,\n repeat_times: params.repeat_times,\n });\n assertAncsRepeatTimes(repeatTimes);\n\n const meta: LightRuleMeta = {\n name: params.name,\n title: params.title,\n type: \"light-rule\",\n description: params.description,\n segments: params.segments,\n repeat_times: repeatTimes,\n enabled: true,\n createdAt: new Date().toISOString(),\n };\n\n writeMeta(taskDir, meta);\n\n return { meta };\n}\n\nexport function updateLightRule(\n ctx: LightRuleStorageContext,\n params: {\n name: string;\n title?: string;\n description?: string;\n segments?: LightSegment[];\n repeat_times?: number;\n repeat?: boolean;\n enabled?: boolean;\n },\n): { meta: LightRuleMeta } {\n const resolved = resolveLightRuleTask(ctx, params.name);\n const taskDir = resolved?.taskDir;\n const meta = resolved?.meta;\n\n if (!taskDir || !meta) {\n throw new LightRuleError(\"NOT_FOUND\", `灯效规则 '${params.name}' 不存在`);\n }\n\n if (params.description !== undefined) {\n meta.description = params.description;\n }\n if (params.title !== undefined) {\n meta.title = params.title;\n }\n if (params.segments !== undefined) {\n meta.segments = params.segments;\n }\n if (params.repeat !== undefined || params.repeat_times !== undefined) {\n meta.repeat_times = normalizeRepeatTimes({\n repeat: params.repeat,\n repeat_times: params.repeat_times,\n });\n assertAncsRepeatTimes(meta.repeat_times);\n }\n if (params.enabled !== undefined) {\n meta.enabled = params.enabled;\n }\n\n meta.updatedAt = new Date().toISOString();\n writeMeta(taskDir, meta);\n\n return { meta };\n}\n\nexport function deleteLightRule(\n ctx: LightRuleStorageContext,\n name: string,\n): { name: string } {\n const resolved = resolveLightRuleTask(ctx, name);\n const taskDir = resolved?.taskDir;\n const meta = resolved?.meta;\n\n if (!taskDir || !meta) {\n throw new LightRuleError(\"NOT_FOUND\", `灯效规则 '${name}' 不存在`);\n }\n\n rmSync(taskDir, { recursive: true, force: true });\n\n return { name: meta.name };\n}\n\nexport class LightRuleError extends Error {\n constructor(\n public code: string,\n message: string,\n ) {\n super(message);\n this.name = \"LightRuleError\";\n }\n}\n",
|
|
70
|
+
"import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n rmSync,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport type { LightSegment } from \"../types.js\";\nimport type { LightRuleMeta } from \"./types.js\";\nimport { assertAncsRepeatTimes, normalizeRepeatTimes } from \"../light/repeat.js\";\n\nexport interface LightRuleStorageContext {\n workspaceDir?: string;\n stateDir?: string;\n}\n\nfunction addUniquePath(paths: string[], path: string | undefined): void {\n if (!path) return;\n\n const normalized = resolve(path);\n if (!paths.includes(normalized)) {\n paths.push(normalized);\n }\n}\n\nfunction inferSiblingWorkspaceDir(stateDir: string): string | undefined {\n const stateDirName = basename(stateDir);\n if (!stateDirName.startsWith(\".\")) return undefined;\n\n // JVSClaw may keep plugin state under /home/admin/.openclaw while the\n // runtime workspace is /home/admin/openclaw/workspace.\n const siblingStateDir = join(dirname(stateDir), stateDirName.slice(1));\n const siblingWorkspaceDir = join(siblingStateDir, \"workspace\");\n return existsSync(siblingWorkspaceDir) ? siblingWorkspaceDir : undefined;\n}\n\nfunction resolveBaseDirs(ctx: LightRuleStorageContext): string[] {\n const dirs: string[] = [];\n\n addUniquePath(dirs, ctx.workspaceDir);\n\n if (ctx.stateDir) {\n addUniquePath(dirs, inferSiblingWorkspaceDir(ctx.stateDir));\n\n const inferredWorkspaceDir = join(ctx.stateDir, \"workspace\");\n if (existsSync(inferredWorkspaceDir)) {\n addUniquePath(dirs, inferredWorkspaceDir);\n }\n\n addUniquePath(dirs, ctx.stateDir);\n }\n\n if (dirs.length === 0) {\n throw new Error(\"workspaceDir and stateDir both unavailable\");\n }\n\n return dirs;\n}\n\nfunction resolveWriteBaseDir(ctx: LightRuleStorageContext): string {\n return resolveBaseDirs(ctx)[0];\n}\n\nfunction tasksDirs(ctx: LightRuleStorageContext): string[] {\n return resolveBaseDirs(ctx).map((baseDir) => join(baseDir, \"tasks\"));\n}\n\nfunction writeTasksDir(ctx: LightRuleStorageContext): string {\n return join(resolveWriteBaseDir(ctx), \"tasks\");\n}\n\nfunction normalizeLightRuleLookupName(name: string): string {\n return name.trim().replace(/\\.json$/i, \"\");\n}\n\nfunction resolveLightRuleTask(\n ctx: LightRuleStorageContext,\n name: string,\n): { taskDir: string; meta: LightRuleMeta } | null {\n const normalizedName = normalizeLightRuleLookupName(name);\n if (!normalizedName) return null;\n\n const dirs = tasksDirs(ctx);\n\n for (const dir of dirs) {\n const directTaskDir = join(dir, normalizedName);\n const directMeta = readMeta(directTaskDir);\n if (directMeta) {\n return {\n taskDir: directTaskDir,\n meta: directMeta,\n };\n }\n }\n\n for (const dir of dirs) {\n if (!existsSync(dir)) continue;\n\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n\n const taskDir = join(dir, entry.name);\n const meta = readMeta(taskDir);\n if (meta?.name === normalizedName) {\n return {\n taskDir,\n meta,\n };\n }\n }\n }\n\n return null;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nfunction readMeta(taskDir: string): LightRuleMeta | null {\n const metaPath = join(taskDir, \"meta.json\");\n if (!existsSync(metaPath)) return null;\n try {\n const raw = JSON.parse(readFileSync(metaPath, \"utf-8\"));\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return null;\n if (raw.type !== \"light-rule\") return null;\n if (!Array.isArray(raw.segments)) return null;\n const name = readOptionalString(raw.name) ?? basename(taskDir);\n const title = readOptionalString(raw.title) ?? name;\n const description = readOptionalString(raw.description) ?? name;\n const createdAt =\n readOptionalString(raw.createdAt) ?? statSync(metaPath).birthtime.toISOString();\n const enabled = typeof raw.enabled === \"boolean\" ? raw.enabled : true;\n const repeatTimes = normalizeRepeatTimes({\n repeat: raw.repeat,\n repeat_times: raw.repeat_times,\n });\n assertAncsRepeatTimes(repeatTimes);\n return {\n ...raw,\n name,\n title,\n type: \"light-rule\",\n description,\n segments: raw.segments,\n repeat_times: repeatTimes,\n enabled,\n createdAt,\n } as LightRuleMeta;\n } catch {\n return null;\n }\n}\n\nfunction writeMeta(taskDir: string, meta: LightRuleMeta): void {\n writeFileSync(join(taskDir, \"meta.json\"), JSON.stringify(meta, null, 2), \"utf-8\");\n}\n\nexport function listLightRules(ctx: LightRuleStorageContext): LightRuleMeta[] {\n const rules: LightRuleMeta[] = [];\n const seenNames = new Set<string>();\n\n for (const dir of tasksDirs(ctx)) {\n if (!existsSync(dir)) continue;\n\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const meta = readMeta(join(dir, entry.name));\n if (!meta || seenNames.has(meta.name)) continue;\n\n rules.push(meta);\n seenNames.add(meta.name);\n }\n }\n\n return rules;\n}\n\nexport function getLightRule(\n ctx: LightRuleStorageContext,\n name: string,\n): LightRuleMeta | null {\n return resolveLightRuleTask(ctx, name)?.meta ?? null;\n}\n\nexport function createLightRule(\n ctx: LightRuleStorageContext,\n params: {\n name: string;\n title: string;\n description: string;\n segments: LightSegment[];\n repeat_times?: number;\n repeat?: boolean;\n },\n): { meta: LightRuleMeta } {\n const existing = resolveLightRuleTask(ctx, params.name);\n if (existing) {\n throw new LightRuleError(\"ALREADY_EXISTS\", `灯效规则 '${params.name}' 已存在`);\n }\n\n const dir = writeTasksDir(ctx);\n const taskDir = join(dir, params.name);\n\n if (existsSync(taskDir)) {\n throw new LightRuleError(\"ALREADY_EXISTS\", `灯效规则 '${params.name}' 已存在`);\n }\n\n mkdirSync(taskDir, { recursive: true });\n\n const repeatTimes = normalizeRepeatTimes({\n repeat: params.repeat,\n repeat_times: params.repeat_times,\n });\n assertAncsRepeatTimes(repeatTimes);\n\n const meta: LightRuleMeta = {\n name: params.name,\n title: params.title,\n type: \"light-rule\",\n description: params.description,\n segments: params.segments,\n repeat_times: repeatTimes,\n enabled: true,\n createdAt: new Date().toISOString(),\n };\n\n writeMeta(taskDir, meta);\n\n return { meta };\n}\n\nexport function updateLightRule(\n ctx: LightRuleStorageContext,\n params: {\n name: string;\n title?: string;\n description?: string;\n segments?: LightSegment[];\n repeat_times?: number;\n repeat?: boolean;\n enabled?: boolean;\n },\n): { meta: LightRuleMeta } {\n const resolved = resolveLightRuleTask(ctx, params.name);\n const taskDir = resolved?.taskDir;\n const meta = resolved?.meta;\n\n if (!taskDir || !meta) {\n throw new LightRuleError(\"NOT_FOUND\", `灯效规则 '${params.name}' 不存在`);\n }\n\n if (params.description !== undefined) {\n meta.description = params.description;\n }\n if (params.title !== undefined) {\n meta.title = params.title;\n }\n if (params.segments !== undefined) {\n meta.segments = params.segments;\n }\n if (params.repeat !== undefined || params.repeat_times !== undefined) {\n meta.repeat_times = normalizeRepeatTimes({\n repeat: params.repeat,\n repeat_times: params.repeat_times,\n });\n assertAncsRepeatTimes(meta.repeat_times);\n }\n if (params.enabled !== undefined) {\n meta.enabled = params.enabled;\n }\n\n meta.updatedAt = new Date().toISOString();\n writeMeta(taskDir, meta);\n\n return { meta };\n}\n\nexport function deleteLightRule(\n ctx: LightRuleStorageContext,\n name: string,\n): { name: string } {\n const resolved = resolveLightRuleTask(ctx, name);\n const taskDir = resolved?.taskDir;\n const meta = resolved?.meta;\n\n if (!taskDir || !meta) {\n throw new LightRuleError(\"NOT_FOUND\", `灯效规则 '${name}' 不存在`);\n }\n\n rmSync(taskDir, { recursive: true, force: true });\n\n return { name: meta.name };\n}\n\nexport class LightRuleError extends Error {\n constructor(\n public code: string,\n message: string,\n ) {\n super(message);\n this.name = \"LightRuleError\";\n }\n}\n",
|
|
72
71
|
"export interface RepeatConfig {\n repeat?: boolean;\n repeat_times?: number;\n}\n\nexport type RepeatArgument = RepeatConfig | boolean | number | undefined;\n\nexport function normalizeRepeatTimes(input?: RepeatArgument): number {\n if (typeof input === \"boolean\") {\n return input ? 0 : 1;\n }\n\n if (typeof input === \"number\") {\n return validateRepeatTimes(input);\n }\n\n if (!input) {\n return 1;\n }\n\n if (input.repeat_times !== undefined) {\n return validateRepeatTimes(input.repeat_times);\n }\n\n if (input.repeat !== undefined) {\n return input.repeat ? 0 : 1;\n }\n\n return 1;\n}\n\nexport function assertAncsRepeatTimes(repeatTimes: number): void {\n if (repeatTimes !== 0 && repeatTimes !== 1) {\n throw new Error(\n \"当前 ANCS 路径仅支持 repeat_times=0(无限循环)或 1(播放一轮);N>=2 需非 ANCS 路径\",\n );\n }\n}\n\nfunction validateRepeatTimes(value: number): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(\"repeat_times 必须是 >=0 的整数\");\n }\n\n return value;\n}\n",
|
|
73
72
|
"/**\n * LightRuleRegistry —— 灯效规则的内存索引 + CRUD 包装\n *\n * 角色定位:\n * - 在事件驱动重构方案下,每条通知到达时都需要拿到\"当前 enabled 的全部规则\"\n * 用来拼装 Agent 的 system prompt。如果每次都扫盘 N 个 meta.json,\n * 5 秒延迟预算会被磨穿,所以引入这个常驻内存的 index。\n * - 同时它是 storage.ts 的 CRUD 包装:所有 create/update/delete 都会先落盘、\n * 再更新内存 Map,保证两者一致。\n *\n * 本类**不**做规则匹配 —— 匹配交给 Agent。registry 只负责\"有哪些规则\"和\n * \"按需拼装 prompt\"。\n *\n * 写路径用一个 promise 链做串行化(最朴素的 mutex),保证并发 CRUD\n * 不会出现\"内存和磁盘交错\"的状态。\n *\n * 见 prd-lightrules-event-driven-refactor.md §数据模型 / §触发流程\n */\n\nimport {\n createLightRule,\n deleteLightRule,\n listLightRules,\n updateLightRule,\n type LightRuleStorageContext,\n} from \"./storage.js\";\nimport type { LightRuleMeta } from \"./types.js\";\n\nexport { LightRuleError } from \"./storage.js\";\n\ntype CreateParams = Parameters<typeof createLightRule>[1];\ntype UpdateParams = Parameters<typeof updateLightRule>[1];\ntype CreateResult = ReturnType<typeof createLightRule>;\ntype UpdateResult = ReturnType<typeof updateLightRule>;\ntype DeleteResult = ReturnType<typeof deleteLightRule>;\n\nexport class LightRuleRegistry {\n private readonly ctx: LightRuleStorageContext;\n /** name → meta 的内存索引;落盘成功后才更新 */\n private readonly index = new Map<string, LightRuleMeta>();\n /** 写路径串行化锁:每次 mutate 都 chain 在前一次之后 */\n private writeChain: Promise<unknown> = Promise.resolve();\n\n constructor(ctx: LightRuleStorageContext) {\n this.ctx = ctx;\n this.reload();\n }\n\n /**\n * 从磁盘重新加载全部规则到内存。仅在构造时和外部显式触发时使用。\n * 正常 CRUD 路径不应该调用本方法 —— 通过 create/update/delete 增量维护即可。\n */\n reload(): void {\n this.index.clear();\n for (const meta of listLightRules(this.ctx)) {\n this.index.set(meta.name, meta);\n }\n }\n\n /** 全部规则(包含 disabled),调用方不要改返回值。 */\n list(): LightRuleMeta[] {\n return Array.from(this.index.values());\n }\n\n /** 仅 enabled 的规则。事件驱动评估链路使用。 */\n getEnabled(): LightRuleMeta[] {\n return this.list().filter((rule) => rule.enabled);\n }\n\n /** 按名字精确查找;不存在返回 null。 */\n get(name: string): LightRuleMeta | null {\n return this.index.get(name) ?? null;\n }\n\n /**\n * 创建规则。落盘成功后再写入内存索引。\n * 失败时 storage 抛 LightRuleError,内存索引保持不变。\n */\n async create(params: CreateParams): Promise<CreateResult> {\n return this.runExclusive(() => {\n const result = createLightRule(this.ctx, params);\n this.index.set(result.meta.name, result.meta);\n return result;\n });\n }\n\n /**\n * 更新规则。落盘成功后再刷新内存条目。\n */\n async update(params: UpdateParams): Promise<UpdateResult> {\n return this.runExclusive(() => {\n const result = updateLightRule(this.ctx, params);\n this.index.set(result.meta.name, result.meta);\n return result;\n });\n }\n\n /**\n * 删除规则。落盘成功后再从内存索引移除。\n */\n async delete(name: string): Promise<DeleteResult> {\n return this.runExclusive(() => {\n const result = deleteLightRule(this.ctx, name);\n this.index.delete(result.name);\n return result;\n });\n }\n\n /**\n * 拼装 Agent 评估用的 system prompt。\n *\n * 当前实现是一个最小可用骨架:列出全部 enabled 规则的 title + name + description。\n * M3 接入真实 Agent 链路时,会按 prd-lightrules-event-driven-refactor.md §Prompt 拼装\n * 的模板补齐\"任务说明 / 输出约束\"等段落。\n *\n * 现在先把方法签名冻结,避免后续散落在多个调用点。\n */\n buildSystemPrompt(): string {\n const enabled = this.getEnabled();\n if (enabled.length === 0) {\n return \"当前没有启用任何灯效规则。\";\n }\n\n const lines: string[] = [\n '你是一个判断\"通知 → 灯效规则\"是否命中的助手。',\n \"\",\n \"下面是用户当前启用的全部灯效规则(按创建时间倒序):\",\n \"\",\n ];\n\n const sorted = [...enabled].sort((a, b) =>\n (b.createdAt ?? \"\").localeCompare(a.createdAt ?? \"\"),\n );\n\n sorted.forEach((rule, idx) => {\n lines.push(\n `[${idx + 1}] title: ${rule.title}`,\n ` name: ${rule.name}`,\n ` description: ${rule.description}`,\n \"\",\n );\n });\n\n lines.push(\n '任务:根据用户接下来发给你的\"通知\"内容,判断哪些规则被命中。',\n \"- 命中 0 条:不调用任何工具,直接结束。\",\n \"- 命中 1 条或多条:对每一条命中的规则调用一次 trigger_light(rule_name)。\",\n \"- 不要回复任何自由文本;判定结果**只**通过 tool calling 表达。\",\n '- 拿不准的时候倾向于\"不触发\",避免骚扰用户。',\n );\n\n return lines.join(\"\\n\");\n }\n\n /**\n * 把一段同步操作排队进 write chain,保证 mutate 串行执行。\n *\n * 用 promise 链做 mutex 是最简单的方案:每次 runExclusive 都把\n * `writeChain` 推进一步。即使前一个任务失败,链也会继续往下走,\n * 后续任务不会被永久阻塞。\n */\n private runExclusive<T>(fn: () => T): Promise<T> {\n const next = this.writeChain.then(\n () => fn(),\n () => fn(),\n );\n // 不让链上的失败传播下去(已在 then 的 onRejected 回调里吸收)\n this.writeChain = next.catch(() => undefined);\n return next;\n }\n}\n",
|
|
74
73
|
"import type { LightPixelFramePixel, LightSegment } from \"../types.js\";\nimport { output, exitError } from \"../cli/helpers.js\";\n\nexport const VALID_MODES = [\n \"wave\",\n \"breath\",\n \"strobe\",\n \"steady\",\n \"color_flow\",\n \"pixel_frame\",\n] as const;\nexport const MAX_SEGMENTS = 12;\n\nexport interface ValidationError {\n field: string;\n message: string;\n}\n\nexport interface ValidationWarning {\n field: string;\n code: string;\n message: string;\n}\n\nexport type ValidationResult =\n | { valid: true; segments: LightSegment[]; warnings: ValidationWarning[] }\n | { valid: false; errors: ValidationError[] };\n\nexport function validateSegments(segments: unknown): ValidationResult {\n if (!Array.isArray(segments)) {\n return { valid: false, errors: [{ field: \"segments\", message: \"必须是数组\" }] };\n }\n if (segments.length === 0) {\n return { valid: false, errors: [{ field: \"segments\", message: \"不能为空\" }] };\n }\n if (segments.length > MAX_SEGMENTS) {\n return {\n valid: false,\n errors: [{ field: \"segments\", message: `最多 ${MAX_SEGMENTS} 段` }],\n };\n }\n\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n for (let i = 0; i < segments.length; i++) {\n validateSegment(segments[i], `segments[${i}]`, errors, warnings);\n }\n\n if (errors.length > 0) return { valid: false, errors };\n return { valid: true, segments: segments as LightSegment[], warnings };\n}\n\n/**\n * 解析 JSON 字符串并校验 segments,失败时直接 exitError。\n * 适用于 CLI action 中的统一入口。\n */\nexport function parseAndValidateSegments(json: string): LightSegment[] {\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n exitError(\"VALIDATION_FAILED\", \"segments 必须是合法的 JSON\");\n }\n\n const result = validateSegments(parsed);\n if (!result.valid) {\n output({ ok: false, error: { code: \"VALIDATION_FAILED\", details: result.errors } });\n process.exit(1);\n }\n\n return result.segments;\n}\n\nfunction validateSegment(\n seg: unknown,\n prefix: string,\n errors: ValidationError[],\n warnings: ValidationWarning[],\n): void {\n if (!isRecord(seg)) {\n errors.push({ field: prefix, message: \"必须是对象\" });\n return;\n }\n\n const mode = seg.mode;\n if (!VALID_MODES.includes(mode as (typeof VALID_MODES)[number])) {\n errors.push({\n field: `${prefix}.mode`,\n message: `不支持的模式 '${String(mode)}',可选:${VALID_MODES.join(\"/\")}`,\n });\n }\n\n validateNonNegativeNumber(seg.duration_s, `${prefix}.duration_s`, errors, \"必须是 ≥0 的数字(0 表示无限时长)\");\n\n switch (mode) {\n case \"wave\":\n validateForegroundSegment(seg, prefix, errors);\n validateOptionalNonNegativeNumber(seg.interval_ms, `${prefix}.interval_ms`, errors);\n validateOptionalDirection(seg.direction, `${prefix}.direction`, errors);\n validateOptionalWindow(seg.window, `${prefix}.window`, errors);\n validateOptionalBackground(seg.background, `${prefix}.background`, errors);\n break;\n case \"color_flow\":\n validateForegroundSegment(seg, prefix, errors);\n validateOptionalNonNegativeNumber(seg.interval_ms, `${prefix}.interval_ms`, errors);\n validateOptionalDirection(seg.direction, `${prefix}.direction`, errors);\n validateOptionalWindow(seg.window, `${prefix}.window`, errors);\n validateOptionalBackground(seg.background, `${prefix}.background`, errors);\n type RgbLike = Parameters<typeof hasNonZeroRgb>[0];\n if (!hasNonZeroRgb(seg.color as RgbLike) && !hasNonZeroRgb(seg.background as RgbLike)) {\n errors.push({\n field: prefix,\n message: \"color_flow 至少需要一组非零颜色锚点(color 或 background)\",\n });\n }\n detectColorFlowSingleAnchorMisuse(seg, prefix, warnings);\n break;\n case \"breath\":\n validateForegroundSegment(seg, prefix, errors);\n validateOptionalBreathTiming(seg.breath_timing, `${prefix}.breath_timing`, errors);\n break;\n case \"strobe\":\n validateForegroundSegment(seg, prefix, errors);\n validateOptionalNonNegativeNumber(seg.interval_ms, `${prefix}.interval_ms`, errors);\n break;\n case \"steady\":\n validateForegroundSegment(seg, prefix, errors);\n break;\n case \"pixel_frame\":\n validatePixelFrame(seg.pixels, `${prefix}.pixels`, errors);\n break;\n default:\n validateOptionalNonNegativeNumber(seg.brightness, `${prefix}.brightness`, errors);\n validateOptionalColor(seg.color, `${prefix}.color`, errors);\n validateOptionalNonNegativeNumber(seg.interval_ms, `${prefix}.interval_ms`, errors);\n validateOptionalDirection(seg.direction, `${prefix}.direction`, errors);\n validateOptionalWindow(seg.window, `${prefix}.window`, errors);\n validateOptionalBreathTiming(seg.breath_timing, `${prefix}.breath_timing`, errors);\n validateOptionalBackground(seg.background, `${prefix}.background`, errors);\n }\n}\n\nfunction validateForegroundSegment(\n seg: Record<string, unknown>,\n prefix: string,\n errors: ValidationError[],\n): void {\n validateNumberInRange(\n seg.brightness,\n `${prefix}.brightness`,\n errors,\n 0,\n 255,\n \"必须是 0–255 的数字\",\n );\n validateColor(seg.color, `${prefix}.color`, errors);\n\n if (seg.mode !== \"steady\" && seg.brightness === 0) {\n errors.push({\n field: `${prefix}.brightness`,\n message: \"brightness=0 仅 steady 模式允许;其它模式会在固件侧被过滤\",\n });\n }\n}\n\nfunction validatePixelFrame(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (!Array.isArray(value)) {\n errors.push({ field, message: \"pixel_frame 必须提供 pixels 数组(1–7 项)\" });\n return;\n }\n\n if (value.length < 1 || value.length > 7) {\n errors.push({ field, message: \"pixels 必须为 1–7 项\" });\n }\n\n const seen = new Set<number>();\n for (let i = 0; i < value.length; i++) {\n const pixel = value[i];\n const prefix = `${field}[${i}]`;\n if (!isRecord(pixel)) {\n errors.push({ field: prefix, message: \"必须是对象\" });\n continue;\n }\n\n const idx = pixel.index;\n if (!Number.isInteger(idx) || (idx as number) < 0 || (idx as number) > 6) {\n errors.push({ field: `${prefix}.index`, message: \"index 必须是 0–6 的整数\" });\n } else if (seen.has(idx as number)) {\n errors.push({ field: `${prefix}.index`, message: `index=${idx} 重复` });\n } else {\n seen.add(idx as number);\n }\n\n validateNumberInRange(\n pixel.brightness,\n `${prefix}.brightness`,\n errors,\n 0,\n 255,\n \"必须是 0–255 的数字\",\n );\n validateColor(pixel.color, `${prefix}.color`, errors);\n }\n}\n\nfunction validateOptionalBreathTiming(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (value === undefined) return;\n if (!isRecord(value)) {\n errors.push({ field, message: \"必须是对象\" });\n return;\n }\n\n validatePositiveNumber(\n value.rise_ms,\n `${field}.rise_ms`,\n errors,\n \"rise_ms 必须是 >0 的数字(不支持 0ms)\",\n );\n validateNonNegativeNumber(\n value.hold_ms,\n `${field}.hold_ms`,\n errors,\n \"hold_ms 必须是 ≥0 的数字\",\n );\n validatePositiveNumber(\n value.fall_ms,\n `${field}.fall_ms`,\n errors,\n \"fall_ms 必须是 >0 的数字(不支持 0ms)\",\n );\n validateNonNegativeNumber(\n value.off_ms,\n `${field}.off_ms`,\n errors,\n \"off_ms 必须是 ≥0 的数字\",\n );\n}\n\nfunction validateOptionalBackground(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (value === undefined) return;\n if (!isRecord(value)) {\n errors.push({ field, message: \"必须包含 r/g/b/brightness 数值\" });\n return;\n }\n\n validateColor(value, field, errors);\n validateNumberInRange(\n value.brightness,\n `${field}.brightness`,\n errors,\n 0,\n 255,\n \"必须是 0–255 的数字\",\n );\n}\n\nfunction validateOptionalColor(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (value === undefined) return;\n validateColor(value, field, errors);\n}\n\nfunction validateColor(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (!isRecord(value)) {\n errors.push({ field, message: \"必须包含 r/g/b 数值\" });\n return;\n }\n\n validateNumberInRange(value.r, `${field}.r`, errors, 0, 255, \"必须是 0–255 的数字\");\n validateNumberInRange(value.g, `${field}.g`, errors, 0, 255, \"必须是 0–255 的数字\");\n validateNumberInRange(value.b, `${field}.b`, errors, 0, 255, \"必须是 0–255 的数字\");\n}\n\nfunction validateOptionalDirection(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (value === undefined) return;\n if (value !== \"ltr\" && value !== \"rtl\") {\n errors.push({ field, message: \"direction 必须是 ltr 或 rtl\" });\n }\n}\n\nfunction validateOptionalWindow(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (value === undefined) return;\n if (value !== 1 && value !== 2 && value !== 3) {\n errors.push({ field, message: \"window 仅支持 1/2/3\" });\n }\n}\n\nfunction validateOptionalNonNegativeNumber(\n value: unknown,\n field: string,\n errors: ValidationError[],\n): void {\n if (value === undefined) return;\n validateNonNegativeNumber(value, field, errors, \"必须是 ≥0 的数字\");\n}\n\nfunction validatePositiveNumber(\n value: unknown,\n field: string,\n errors: ValidationError[],\n message: string,\n): void {\n if (value === undefined) return;\n if (!isFiniteNumber(value) || value <= 0) {\n errors.push({ field, message });\n }\n}\n\nfunction validateNonNegativeNumber(\n value: unknown,\n field: string,\n errors: ValidationError[],\n message: string,\n): void {\n if (!isFiniteNumber(value) || value < 0) {\n errors.push({ field, message });\n }\n}\n\nfunction validateNumberInRange(\n value: unknown,\n field: string,\n errors: ValidationError[],\n min: number,\n max: number,\n message: string,\n): void {\n if (!isFiniteNumber(value) || value < min || value > max) {\n errors.push({ field, message });\n }\n}\n\nfunction hasNonZeroRgb(\n value: Pick<LightPixelFramePixel[\"color\"], \"r\" | \"g\" | \"b\"> | { r?: unknown; g?: unknown; b?: unknown } | undefined,\n): boolean {\n if (!value) return false;\n return [value.r, value.g, value.b].some((channel) => isFiniteNumber(channel) && channel > 0);\n}\n\n/**\n * color_flow 是「调色板沿圆周流动」,由 1~2 个颜色锚点插值得到。\n * 当用户/模型只给单一极端纯色锚点(如纯红 R=255、G=B=0)且没有底色锚点时,\n * 实际效果是「同色系亮暗环状流动」(红→暗红),而不是多色调色板流动。\n * 这是已知的 bug 模式(详见 imp-custom-led-ai-read.md「模式选择易错对照」):\n * 上层往往是把用户的\"单色波浪\"误映射到 color_flow,应该改用 wave 模式。\n * 此处不阻塞,只 push 一条 warning 让前端/审计可见。\n */\nfunction detectColorFlowSingleAnchorMisuse(\n seg: Record<string, unknown>,\n prefix: string,\n warnings: ValidationWarning[],\n): void {\n const color = seg.color as { r?: unknown; g?: unknown; b?: unknown } | undefined;\n const background = seg.background as\n | { r?: unknown; g?: unknown; b?: unknown; brightness?: unknown }\n | undefined;\n\n const fgChannels = extractChannels(color);\n const bgChannels = extractChannels(background);\n if (!fgChannels) return;\n\n const bgBrightnessRaw = background?.brightness;\n const bgBrightness = isFiniteNumber(bgBrightnessRaw) ? bgBrightnessRaw : 0;\n const bgActive = !!bgChannels && bgChannels.some((c) => c > 0) && bgBrightness > 0;\n if (bgActive) return;\n\n const fgActiveChannels = fgChannels.filter((c) => c > 0);\n if (fgActiveChannels.length !== 1) return;\n if (fgActiveChannels[0] < 192) return;\n\n warnings.push({\n field: prefix,\n code: \"COLOR_FLOW_SINGLE_ANCHOR_MISUSE\",\n message:\n \"color_flow 仅设置了单一极端纯色前景锚点(无有效底色锚点),实际效果是同色系亮暗环状流动,不是多色调色板流动。\" +\n \"若用户期望的是\\\"单色波浪\\\",请改用 mode='wave';若期望多色流动,请同时设置 background 作为第二锚点。\",\n });\n}\n\nfunction extractChannels(\n value: { r?: unknown; g?: unknown; b?: unknown } | undefined,\n): [number, number, number] | null {\n if (!value) return null;\n const r = isFiniteNumber(value.r) ? value.r : 0;\n const g = isFiniteNumber(value.g) ? value.g : 0;\n const b = isFiniteNumber(value.b) ? value.b : 0;\n return [r, g, b];\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n",
|
|
75
74
|
"export const LIGHT_RULE_GATEWAY_METHODS = {\n list: \"lightrules.list\",\n create: \"lightrules.create\",\n update: \"lightrules.update\",\n delete: \"lightrules.delete\",\n} as const;\n\nexport const LIGHT_RULE_GATEWAY_METHOD_LIST = [\n LIGHT_RULE_GATEWAY_METHODS.list,\n LIGHT_RULE_GATEWAY_METHODS.create,\n LIGHT_RULE_GATEWAY_METHODS.update,\n LIGHT_RULE_GATEWAY_METHODS.delete,\n] as const;\n\nexport const LIGHT_RULE_TOOL_NAMES = {\n list: \"lightrules_list\",\n create: \"lightrules_create\",\n update: \"lightrules_update\",\n delete: \"lightrules_delete\",\n} as const;\n\nexport const LIGHT_RULE_TOOL_NAME_LIST = [\n LIGHT_RULE_TOOL_NAMES.list,\n LIGHT_RULE_TOOL_NAMES.create,\n LIGHT_RULE_TOOL_NAMES.update,\n LIGHT_RULE_TOOL_NAMES.delete,\n] as const;\n",
|
|
76
75
|
"import type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport type { Logger } from \"../logger.js\";\nimport { assertAncsRepeatTimes, normalizeRepeatTimes } from \"../light/repeat.js\";\nimport { validateSegments } from \"../light/validators.js\";\nimport { LIGHT_RULE_GATEWAY_METHODS } from \"./names.js\";\nimport type { LightSegment } from \"../types.js\";\nimport type { BroadcastFn } from \"../update/types.js\";\nimport type {\n LightRuleCreateParams,\n LightRuleUpdateParams,\n LightRuleDeleteParams,\n} from \"./types.js\";\nimport { LightRuleError } from \"./storage.js\";\nimport type { LightRuleRegistry } from \"./registry.js\";\n\nfunction resolveRuleIdentifier(params: unknown): string | undefined {\n if (!params || typeof params !== \"object\") return undefined;\n\n const raw = params as Record<string, unknown>;\n const candidates = [raw.name, raw.id, raw.ruleId, raw.ruleName];\n for (const candidate of candidates) {\n if (typeof candidate !== \"string\") continue;\n const normalized = candidate.trim().replace(/\\.json$/i, \"\");\n if (normalized) return normalized;\n }\n\n return undefined;\n}\n\nexport function registerLightRulesGateway(\n api: OpenClawPluginApi,\n registry: LightRuleRegistry,\n logger: Pick<Logger, \"info\" | \"warn\">,\n rememberBroadcast?: (broadcast: BroadcastFn | undefined) => void,\n): void {\n type GatewayHandler = Parameters<OpenClawPluginApi[\"registerGatewayMethod\"]>[1];\n\n const registerGatewayMethodWithBroadcastCapture = (\n method: string,\n handler: GatewayHandler,\n ): void => {\n api.registerGatewayMethod(method, (opts) => {\n rememberBroadcast?.(opts.context?.broadcast);\n return handler(opts);\n });\n };\n\n // lightrules.list\n registerGatewayMethodWithBroadcastCapture(LIGHT_RULE_GATEWAY_METHODS.list, async ({ respond }) => {\n try {\n registry.reload();\n const rules = registry.list().map((rule) => ({\n ...rule,\n id: rule.name,\n }));\n respond(true, { ok: true, rules });\n } catch (err: any) {\n logger.warn(`${LIGHT_RULE_GATEWAY_METHODS.list} failed: ${err?.message}`);\n respond(false, null, {\n code: \"INTERNAL_ERROR\",\n message: err?.message ?? \"Unknown error\",\n });\n }\n });\n\n // lightrules.create\n registerGatewayMethodWithBroadcastCapture(\n LIGHT_RULE_GATEWAY_METHODS.create,\n async ({ params, respond }) => {\n const { name, title, description, segments, repeat, repeat_times } =\n params as unknown as LightRuleCreateParams;\n const resolvedTitle = typeof title === \"string\" && title.trim() ? title.trim() : name;\n\n if (!name || typeof name !== \"string\") {\n respond(false, null, { code: \"INVALID_PARAMS\", message: \"name is required\" });\n return;\n }\n if (!description || typeof description !== \"string\") {\n respond(false, null, { code: \"INVALID_PARAMS\", message: \"description is required\" });\n return;\n }\n\n const validation = validateSegments(segments);\n if (!validation.valid) {\n respond(false, null, {\n code: \"VALIDATION_FAILED\",\n message: JSON.stringify(validation.errors),\n });\n return;\n }\n\n let repeatTimes: number;\n try {\n repeatTimes = normalizeRepeatTimes({ repeat, repeat_times });\n assertAncsRepeatTimes(repeatTimes);\n } catch (err: any) {\n respond(false, null, {\n code: \"VALIDATION_FAILED\",\n message: err?.message ?? \"Unknown error\",\n });\n return;\n }\n\n try {\n const result = await registry.create({\n name,\n title: resolvedTitle,\n description,\n segments: validation.segments,\n repeat_times: repeatTimes,\n });\n logger.info(`Light rule created: ${name}`);\n respond(true, {\n ok: true,\n id: result.meta.name,\n name: result.meta.name,\n title: result.meta.title,\n rule: result.meta,\n });\n } catch (err: any) {\n if (err instanceof LightRuleError) {\n respond(false, null, { code: err.code, message: err.message });\n } else {\n logger.warn(`${LIGHT_RULE_GATEWAY_METHODS.create} failed: ${err?.message}`);\n respond(false, null, {\n code: \"INTERNAL_ERROR\",\n message: err?.message ?? \"Unknown error\",\n });\n }\n }\n },\n );\n\n // lightrules.update\n registerGatewayMethodWithBroadcastCapture(\n LIGHT_RULE_GATEWAY_METHODS.update,\n async ({ params, respond }) => {\n const { title, description, segments, repeat, repeat_times, enabled } =\n params as unknown as LightRuleUpdateParams;\n const name = resolveRuleIdentifier(params);\n const resolvedTitle = typeof title === \"string\" ? title.trim() : undefined;\n\n if (!name) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"name is required (or provide id/ruleId/ruleName)\",\n });\n return;\n }\n if (title !== undefined && !resolvedTitle) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"title must be a non-empty string\",\n });\n return;\n }\n if (description !== undefined && typeof description !== \"string\") {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"description must be a string\",\n });\n return;\n }\n\n let validatedSegments: LightSegment[] | undefined;\n if (segments !== undefined) {\n const validation = validateSegments(segments);\n if (!validation.valid) {\n respond(false, null, {\n code: \"VALIDATION_FAILED\",\n message: JSON.stringify(validation.errors),\n });\n return;\n }\n validatedSegments = validation.segments;\n }\n\n let repeatTimes: number | undefined;\n if (repeat !== undefined || repeat_times !== undefined) {\n try {\n repeatTimes = normalizeRepeatTimes({ repeat, repeat_times });\n assertAncsRepeatTimes(repeatTimes);\n } catch (err: any) {\n respond(false, null, {\n code: \"VALIDATION_FAILED\",\n message: err?.message ?? \"Unknown error\",\n });\n return;\n }\n }\n\n try {\n const result = await registry.update({\n name,\n title: resolvedTitle,\n description,\n segments: validatedSegments,\n repeat_times: repeatTimes,\n enabled,\n });\n logger.info(`Light rule updated: ${name}`);\n respond(true, {\n ok: true,\n id: result.meta.name,\n name: result.meta.name,\n title: result.meta.title,\n updated: true,\n rule: result.meta,\n });\n } catch (err: any) {\n if (err instanceof LightRuleError) {\n respond(false, null, { code: err.code, message: err.message });\n } else {\n logger.warn(`${LIGHT_RULE_GATEWAY_METHODS.update} failed: ${err?.message}`);\n respond(false, null, {\n code: \"INTERNAL_ERROR\",\n message: err?.message ?? \"Unknown error\",\n });\n }\n }\n },\n );\n\n // lightrules.delete\n registerGatewayMethodWithBroadcastCapture(\n LIGHT_RULE_GATEWAY_METHODS.delete,\n async ({ params, respond }) => {\n const name = resolveRuleIdentifier(params as unknown as LightRuleDeleteParams);\n\n if (!name) {\n respond(false, null, {\n code: \"INVALID_PARAMS\",\n message: \"name is required (or provide id/ruleId/ruleName)\",\n });\n return;\n }\n try {\n const result = await registry.delete(name);\n logger.info(`Light rule deleted: ${result.name}`);\n respond(true, {\n ok: true,\n id: result.name,\n name: result.name,\n deleted: true,\n });\n } catch (err: any) {\n if (err instanceof LightRuleError) {\n respond(false, null, { code: err.code, message: err.message });\n } else {\n logger.warn(`${LIGHT_RULE_GATEWAY_METHODS.delete} failed: ${err?.message}`);\n respond(false, null, {\n code: \"INTERNAL_ERROR\",\n message: err?.message ?? \"Unknown error\",\n });\n }\n }\n },\n );\n}\n",
|
|
77
|
-
"import { randomUUID } from \"node:crypto\";\nimport { buildLightEffectApnsBody } from \"./protocol.js\";\nimport { getEnvUrls } from \"../env.js\";\nimport type { LightSegment } from \"../types.js\";\nimport type { RepeatArgument } from \"./repeat.js\";\n\nexport interface SendLightResult {\n ok: boolean;\n bizUniqueId?: string;\n response?: unknown;\n status?: number;\n error?: string;\n}\n\nexport async function sendLightEffect(\n apiKey: string,\n segments: LightSegment[],\n logger?: { info: (msg: string) => void; warn: (msg: string) => void },\n repeatInput?: RepeatArgument,\n reason?: string,\n title?: string,\n): Promise<SendLightResult> {\n const apiUrl = getEnvUrls().lightApiUrl;\n const appKey = process.env.LIGHT_APP_KEY;\n const templateId = process.env.LIGHT_TEMPLATE_ID;\n const resolvedTitle = resolveLightTitle(title, reason, segments);\n\n logger?.info(\n `Light sender: apiUrl=${apiUrl ?? \"UNSET\"}, appKey=${appKey ? appKey.substring(0, 8) + \"…\" : \"UNSET\"}, templateId=${templateId ?? \"UNSET\"}, apiKey=${apiKey ? apiKey.substring(0, 20) + \"…\" : \"EMPTY\"}, title=${resolvedTitle}, reason=${reason ?? \"\"}, segments=${JSON.stringify(segments)}`,\n );\n\n if (!apiUrl || !appKey || !templateId) {\n return {\n ok: false,\n error:\n \"灯效 API
|
|
76
|
+
"import { randomUUID } from \"node:crypto\";\nimport { buildLightEffectApnsBody } from \"./protocol.js\";\nimport { getEnvUrls } from \"../env.js\";\nimport type { LightSegment } from \"../types.js\";\nimport type { RepeatArgument } from \"./repeat.js\";\n\nexport interface SendLightResult {\n ok: boolean;\n bizUniqueId?: string;\n response?: unknown;\n status?: number;\n error?: string;\n}\n\nexport async function sendLightEffect(\n apiKey: string,\n segments: LightSegment[],\n logger?: { info: (msg: string) => void; warn: (msg: string) => void },\n repeatInput?: RepeatArgument,\n reason?: string,\n title?: string,\n): Promise<SendLightResult> {\n const apiUrl = getEnvUrls().lightApiUrl;\n const appKey = process.env.LIGHT_APP_KEY;\n const templateId = process.env.LIGHT_TEMPLATE_ID;\n const resolvedTitle = resolveLightTitle(title, reason, segments);\n\n logger?.info(\n `Light sender: apiUrl=${apiUrl ?? \"UNSET\"}, appKey=${appKey ? appKey.substring(0, 8) + \"…\" : \"UNSET\"}, templateId=${templateId ?? \"UNSET\"}, apiKey=${apiKey ? apiKey.substring(0, 20) + \"…\" : \"EMPTY\"}, title=${resolvedTitle}, reason=${reason ?? \"\"}, segments=${JSON.stringify(segments)}`,\n );\n\n if (!apiUrl || !appKey || !templateId) {\n return {\n ok: false,\n error:\n \"灯效 API 未配置,请确认构建时已封装 OPENCLAW_HOST_* / LIGHT_APP_KEY / LIGHT_TEMPLATE_ID\",\n };\n }\n\n let bizContent: string;\n try {\n bizContent = buildLightEffectApnsBody(segments, repeatInput, reason);\n } catch (error: any) {\n return { ok: false, error: error?.message ?? String(error) };\n }\n const bizUniqueId = randomUUID();\n\n const requestBody = {\n appKey,\n bizMap: { noticeType: \"APP_NOTIFICATION_IMPORTANT\", title: resolvedTitle, reason },\n bizUniqueId,\n paramsMap: { bizContent },\n pushType: \"SPECIFY_PUSH\",\n templateId,\n };\n\n logger?.info(\n `Light sender: POST ${apiUrl}, bizUniqueId=${bizUniqueId}, body=${JSON.stringify(requestBody).substring(0, 500)}`,\n );\n\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key-Id\": apiKey.startsWith(\"Bearer \")\n ? apiKey.slice(\"Bearer \".length)\n : apiKey,\n },\n body: JSON.stringify(requestBody),\n });\n\n const resBody = await res.text();\n if (!res.ok) {\n logger?.warn(\n `Light sender: FAILED ${res.status}, url=${apiUrl}, resBody=${resBody.substring(0, 500)}`,\n );\n return { ok: false, status: res.status, error: resBody };\n }\n\n logger?.info(`Light sender: OK bizUniqueId=${bizUniqueId}, resBody=${resBody.substring(0, 200)}`);\n return { ok: true, bizUniqueId, response: JSON.parse(resBody) };\n}\n\nfunction resolveLightTitle(\n title: string | undefined,\n reason: string | undefined,\n segments: LightSegment[],\n): string {\n const trimmedTitle = title?.trim();\n if (trimmedTitle) return trimmedTitle;\n\n const trimmedReason = reason?.trim();\n if (trimmedReason) return trimmedReason;\n\n const modeDesc = segments.map((segment) => segment.mode).join(\"+\");\n return `Effect: ${modeDesc || \"custom\"}`;\n}\n",
|
|
78
77
|
"import type { LightSegment } from \"../types.js\";\nimport { assertAncsRepeatTimes, normalizeRepeatTimes, type RepeatArgument } from \"./repeat.js\";\nimport { validateSegments } from \"./validators.js\";\n\nexport const MAX_LIGHT_SEGMENTS = 12;\n\nconst PROTOCOL_DIGITS = [\n \"\\u0080\",\n \"\\u0081\",\n \"\\u0082\",\n \"\\u0083\",\n \"\\u0084\",\n \"\\u0091\",\n \"\\u0092\",\n \"\\u0093\",\n \"\\u0094\",\n \"\\u0095\",\n \"\\u0096\",\n \"\\u0097\",\n] as const;\n\n/** \\u009A = play once, \\u009B = infinite loop */\nconst LED_SEPARATOR_ONCE = \"\\u009A\";\nconst LED_SEPARATOR_LOOP = \"\\u009B\";\n\n/** v0–v10 mapped by index; duration_s=0 is special-cased to v11 (infinite) */\nconst DURATION_STEPS_S = [0.5, 1, 2, 3, 5, 6, 8, 16, 24, 32, 48] as const;\n/** v0–v10 mapped by index; removed 400ms, added 50ms */\nconst INTERVAL_STEPS_MS = [50, 100, 200, 300, 500, 600, 800, 1600, 2400, 3200, 4800] as const;\nconst BREATH_STEPS_MS = [1040, 1560, 2080, 2600, 3100, 4160] as const;\nconst BRIGHTNESS_STEPS = [32, 64, 96, 128, 192, 255] as const;\nconst COLOR_STEPS = [0, 32, 64, 128, 192, 255] as const;\nconst BACKGROUND_BRIGHTNESS_STEPS = [0, 32, 64, 96, 128, 192, 255] as const;\nconst MULTI_CHANNEL_COLOR_COEFFICIENTS = { r: 1, g: 0.25, b: 0.25 } as const;\nconst PURE_WHITE_COLOR_COEFFICIENTS = { r: 1, g: 0.35, b: 0.35 } as const;\n\n/**\n * mode → wire-protocol M value.\n * color_flow encodes to M=v4 (firmware enum APP_LED_CUSTOM_MODE_WAVE_RAINBOW).\n * \"WAVE_RAINBOW\" is a legacy firmware name and does NOT imply rainbow/multi-color semantics;\n * the TS-side enum uses color_flow to avoid that confusion. See imp-custom-led-ai-read.md\n * \"模式选择易错对照\" for the mapping rules.\n */\nconst MODE_TO_INDEX: Record<LightSegment[\"mode\"], number> = {\n wave: 0,\n breath: 1,\n strobe: 2,\n steady: 3,\n color_flow: 4,\n pixel_frame: 5,\n};\n\nexport function buildLightEffectApnsBody(\n segments: LightSegment[],\n repeatInput?: RepeatArgument,\n visibleTextOverride?: string,\n): string {\n assertSegmentCount(segments);\n assertSegmentsValid(segments);\n\n const repeatTimes = normalizeRepeatTimes(repeatInput);\n assertAncsRepeatTimes(repeatTimes);\n\n const visibleText = resolveVisibleText(visibleTextOverride, segments);\n const separator = repeatTimes === 0 ? LED_SEPARATOR_LOOP : LED_SEPARATOR_ONCE;\n const payload = segments.map((segment) => encodeSegment(segment)).join(\"\");\n return `${visibleText}${separator}${payload}`;\n}\n\nfunction resolveVisibleText(\n override: string | undefined,\n segments: LightSegment[],\n): string {\n const trimmed = override?.trim();\n if (trimmed) return trimmed;\n return summarizeSegments(segments);\n}\n\nfunction assertSegmentCount(segments: LightSegment[]): void {\n if (segments.length < 1 || segments.length > MAX_LIGHT_SEGMENTS) {\n throw new Error(`light_control supports 1-${MAX_LIGHT_SEGMENTS} segments`);\n }\n}\n\nfunction summarizeSegments(segments: LightSegment[]): string {\n const modeDesc = segments.map((segment) => segment.mode).join(\"+\");\n return `Effect: ${modeDesc} (${segments.length} segment${segments.length > 1 ? \"s\" : \"\"})`;\n}\n\nfunction assertSegmentsValid(segments: LightSegment[]): void {\n const validation = validateSegments(segments);\n if (!validation.valid) {\n throw new Error(\n validation.errors.map((error) => `${error.field}: ${error.message}`).join(\"; \"),\n );\n }\n}\n\nfunction encodeSegment(segment: LightSegment): string {\n const common = [\n MODE_TO_INDEX[segment.mode],\n quantizeDuration(segment.duration_s),\n ];\n\n let values: number[];\n switch (segment.mode) {\n case \"wave\":\n case \"color_flow\":\n const color = normalizeProtocolColor(segment.color);\n const background = normalizeProtocolColor(segment.background);\n values = [\n ...common,\n quantize(segment.interval_ms ?? 200, INTERVAL_STEPS_MS),\n quantizeBrightnessValue(segment.brightness ?? 0),\n quantize(color.r, COLOR_STEPS),\n quantize(color.g, COLOR_STEPS),\n quantize(color.b, COLOR_STEPS),\n segment.direction === \"rtl\" ? 1 : 0,\n quantizeWindow(segment.window ?? 2),\n quantize(background.r, COLOR_STEPS),\n quantize(background.g, COLOR_STEPS),\n quantize(background.b, COLOR_STEPS),\n quantize(segment.background?.brightness ?? 0, BACKGROUND_BRIGHTNESS_STEPS),\n ];\n break;\n case \"breath\":\n const breathColor = normalizeProtocolColor(segment.color);\n values = [\n ...common,\n quantizeBreathRiseFall(segment.breath_timing?.rise_ms),\n quantizeBreathHoldOff(segment.breath_timing?.hold_ms),\n quantizeBreathRiseFall(segment.breath_timing?.fall_ms),\n quantizeBreathHoldOff(segment.breath_timing?.off_ms),\n quantizeBrightnessValue(segment.brightness ?? 0),\n quantize(breathColor.r, COLOR_STEPS),\n quantize(breathColor.g, COLOR_STEPS),\n quantize(breathColor.b, COLOR_STEPS),\n ];\n break;\n case \"strobe\":\n const strobeColor = normalizeProtocolColor(segment.color);\n values = [\n ...common,\n quantize(segment.interval_ms ?? 200, INTERVAL_STEPS_MS),\n quantizeBrightnessValue(segment.brightness ?? 0),\n quantize(strobeColor.r, COLOR_STEPS),\n quantize(strobeColor.g, COLOR_STEPS),\n quantize(strobeColor.b, COLOR_STEPS),\n ];\n break;\n case \"steady\":\n const steadyColor = normalizeProtocolColor(segment.color);\n values = [\n ...common,\n quantizeBrightnessValue(segment.brightness ?? 0),\n quantize(steadyColor.r, COLOR_STEPS),\n quantize(steadyColor.g, COLOR_STEPS),\n quantize(steadyColor.b, COLOR_STEPS),\n ];\n break;\n case \"pixel_frame\":\n values = encodePixelFrameValues(common, segment);\n break;\n }\n\n return values.map((value) => PROTOCOL_DIGITS[value]).join(\"\");\n}\n\nfunction encodePixelFrameValues(common: number[], segment: LightSegment): number[] {\n const pixels = segment.pixels ?? [];\n return [\n ...common,\n pixels.length - 1,\n ...pixels.flatMap((pixel) => {\n const color = normalizeProtocolColor(pixel.color);\n return [\n pixel.index,\n quantize(color.r, COLOR_STEPS),\n quantize(color.g, COLOR_STEPS),\n quantize(color.b, COLOR_STEPS),\n quantizeBrightnessValue(pixel.brightness),\n ];\n }),\n ];\n}\n\nexport function normalizeProtocolColor(\n color:\n | Pick<NonNullable<LightSegment[\"color\"]>, \"r\" | \"g\" | \"b\">\n | Pick<NonNullable<LightSegment[\"background\"]>, \"r\" | \"g\" | \"b\">\n | undefined,\n): { r: number; g: number; b: number } {\n const normalized = {\n r: color?.r ?? 0,\n g: color?.g ?? 0,\n b: color?.b ?? 0,\n };\n\n if (isPureWhiteProtocolColor(normalized)) {\n return applyProtocolColorCoefficients(normalized, PURE_WHITE_COLOR_COEFFICIENTS);\n }\n\n if (countActiveProtocolColorChannels(normalized) <= 1) {\n return normalized;\n }\n\n return applyProtocolColorCoefficients(normalized, MULTI_CHANNEL_COLOR_COEFFICIENTS);\n}\n\nfunction countActiveProtocolColorChannels(color: { r: number; g: number; b: number }): number {\n return Number(color.r > 0) + Number(color.g > 0) + Number(color.b > 0);\n}\n\nfunction isPureWhiteProtocolColor(color: { r: number; g: number; b: number }): boolean {\n return color.r === 255 && color.g === 255 && color.b === 255;\n}\n\nfunction applyProtocolColorCoefficients(\n color: { r: number; g: number; b: number },\n coefficients: { r: number; g: number; b: number },\n): { r: number; g: number; b: number } {\n return {\n r: scaleProtocolColorChannel(color.r, coefficients.r),\n g: scaleProtocolColorChannel(color.g, coefficients.g),\n b: scaleProtocolColorChannel(color.b, coefficients.b),\n };\n}\n\nfunction scaleProtocolColorChannel(value: number, coefficient: number): number {\n return Math.max(0, Math.min(255, Math.round(value * coefficient)));\n}\n\nfunction quantize(value: number, steps: readonly number[]): number {\n let bestIndex = 0;\n let bestDistance = Number.POSITIVE_INFINITY;\n\n for (const [index, step] of steps.entries()) {\n const distance = Math.abs(value - step);\n if (distance < bestDistance) {\n bestIndex = index;\n bestDistance = distance;\n }\n }\n\n return bestIndex;\n}\n\n/** duration_s=0 maps to v11 (infinite); otherwise quantize to DURATION_STEPS_S */\nfunction quantizeDuration(duration_s: number): number {\n if (duration_s === 0) return 11;\n return quantize(duration_s, DURATION_STEPS_S);\n}\n\n/**\n * brightness=0 maps to v11 (explicit off / pixel-off).\n * Otherwise quantize to BRIGHTNESS_STEPS (v0–v5).\n */\nfunction quantizeBrightnessValue(brightness: number): number {\n if (brightness === 0) return 11;\n return quantize(brightness, BRIGHTNESS_STEPS);\n}\n\nfunction quantizeBreathRiseFall(value: number | undefined): number {\n return quantize(value ?? 1040, BREATH_STEPS_MS);\n}\n\nfunction quantizeBreathHoldOff(value: number | undefined): number {\n if (value === 0) {\n return 5;\n }\n\n return quantize(value ?? 1040, BREATH_STEPS_MS.slice(0, 5));\n}\n\nfunction quantizeWindow(value: 1 | 2 | 3): number {\n return value - 1;\n}\n",
|
|
79
|
-
"import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport WebSocket from \"ws\";\nimport type { InboundFrame, OutboundFrame } from \"./types.js\";\nimport { maskSecret, redactUrlSecrets } from \"./utils.js\";\nimport type { AuthCredential } from \"../profile/types.js\";\n\n/** 每次(重)连接时获取最新连接凭据;jvsclaw 等可在此透明刷新 token。 */\nexport type CredentialProvider = () => Promise<AuthCredential>;\n\nfunction previewText(text: string, max = 500): string {\n return text.length <= max ? text : `${text.substring(0, max)}…`;\n}\n\n/** 从凭据里挑一个代表性密文用于脱敏日志(优先 query.apiKey,其次首个 header 值)。 */\nfunction maskableSecret(credential: AuthCredential): string {\n return (\n credential.query?.apiKey ??\n Object.values(credential.headers ?? {})[0] ??\n \"\"\n );\n}\n\n/** WebSocket Upgrade 握手超时(毫秒)。云上常见 NAT/中间盒吞包场景下兜底用。 */\nconst HANDSHAKE_TIMEOUT_MS = 15_000;\n/** 兜底 watchdog:如果握手超时也没触发,强制 terminate 进入重连路径。 */\nconst CONNECT_WATCHDOG_MS = 20_000;\n/** 断线期间发送会非常密集,限频避免把真正的断线原因刷掉。 */\nconst SEND_SKIPPED_LOG_INTERVAL_MS = 30_000;\n\n/** 持久化到磁盘的隧道连接状态 */\nexport interface TunnelStatusInfo {\n /** 当前连接状态 */\n state: \"connected\" | \"disconnected\" | \"connecting\" | \"stopped\";\n /** 状态变更时间 ISO */\n since: string;\n /** 累计重连次数 */\n reconnectAttempt: number;\n /** 上次断开原因(仅 disconnected 时有值) */\n lastDisconnectReason?: string;\n}\n\nexport interface RelayClientOptions {\n tunnelUrl: string;\n /** 每次连接时获取连接凭据(query/headers);支持 token 刷新。 */\n credentialProvider: CredentialProvider;\n heartbeatSec: number;\n reconnectBackoffMs: number;\n /** 状态文件路径,设置后会在连接状态变更时写入 */\n statusFilePath?: string;\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n}\n\nexport type InboundHandler = (frame: InboundFrame) => void | Promise<void>;\nexport type ConnectedHandler = () => void | Promise<void>;\nexport type DisconnectedHandler = (reason: string) => void | Promise<void>;\n\n/**\n * Relay WebSocket 客户端。\n * 负责建连、token 认证、心跳保活、断线指数退避重连。\n */\nexport class RelayClient {\n private ws: WebSocket | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private handlers: InboundHandler[] = [];\n private connectedHandlers: ConnectedHandler[] = [];\n private disconnectedHandlers: DisconnectedHandler[] = [];\n private aborted = false;\n private lastInboundAt = 0;\n private stopPromise: Promise<void> | null = null;\n private skippedSendLogLastAt: number | null = null;\n private skippedSendLogSuppressed = 0;\n\n constructor(private readonly opts: RelayClientOptions) {}\n\n /** 写连接状态到磁盘 */\n private writeStatus(\n state: TunnelStatusInfo[\"state\"],\n lastDisconnectReason?: string,\n ): void {\n if (!this.opts.statusFilePath) return;\n const info: TunnelStatusInfo = {\n state,\n since: new Date().toISOString(),\n reconnectAttempt: this.reconnectAttempt,\n lastDisconnectReason,\n };\n try {\n mkdirSync(dirname(this.opts.statusFilePath), { recursive: true });\n writeFileSync(this.opts.statusFilePath, JSON.stringify(info, null, 2));\n } catch {\n // 写状态文件失败不影响主流程\n }\n }\n\n /** 注册入站帧处理函数 */\n onInbound(handler: InboundHandler): void {\n this.handlers.push(handler);\n }\n\n /** 注册连接成功后的回调 */\n onConnected(handler: ConnectedHandler): void {\n this.connectedHandlers.push(handler);\n }\n\n /** 注册 Relay 连接断开后的回调 */\n onDisconnected(handler: DisconnectedHandler): void {\n this.disconnectedHandlers.push(handler);\n }\n\n /** 当前是否已连上 Relay */\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n /** 优雅停止客户端,优先发送 close 帧,超时后再强制 terminate */\n async stop(reason = \"client stopping\"): Promise<void> {\n if (this.stopPromise) {\n return this.stopPromise;\n }\n\n this.aborted = true;\n this.writeStatus(\"stopped\");\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n const ws = this.ws;\n this.ws = null;\n if (!ws) {\n return;\n }\n\n this.opts.logger.info(\n `Relay tunnel: stopping client (readyState=${ws.readyState}, reason=${reason})`,\n );\n\n if (\n ws.readyState === WebSocket.CLOSED ||\n ws.readyState === WebSocket.CLOSING\n ) {\n return;\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n try {\n ws.terminate();\n } catch {\n // ignore\n }\n return;\n }\n\n this.stopPromise = new Promise<void>((resolve) => {\n let finished = false;\n let fallbackTimer: ReturnType<typeof setTimeout> | null = null;\n\n const finish = () => {\n if (finished) return;\n finished = true;\n if (fallbackTimer) {\n clearTimeout(fallbackTimer);\n fallbackTimer = null;\n }\n ws.off(\"close\", handleClose);\n ws.off(\"error\", handleError);\n this.stopPromise = null;\n resolve();\n };\n\n const handleClose = () => finish();\n const handleError = () => finish();\n\n ws.once(\"close\", handleClose);\n ws.once(\"error\", handleError);\n\n fallbackTimer = setTimeout(() => {\n this.opts.logger.warn(\n \"Relay tunnel: graceful close timed out, forcing terminate\",\n );\n try {\n ws.terminate();\n } catch {\n // ignore\n }\n finish();\n }, 1500);\n\n try {\n ws.close(1000, reason);\n } catch {\n finish();\n }\n });\n\n await this.stopPromise;\n }\n\n /** 发送出站帧 */\n send(frame: OutboundFrame): void {\n const ws = this.ws;\n if (ws?.readyState === WebSocket.OPEN) {\n const payload = JSON.stringify(frame);\n this.opts.logger.info(\n `Relay tunnel: ▶ send frame type=${frame.type}, id=${\"id\" in frame ? frame.id : \"N/A\"} (${payload.length} chars)`,\n );\n try {\n ws.send(payload);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: send failed, forcing reconnect: ${message}`,\n );\n this.forceReconnectFromSocket(ws, `send-failed: ${message}`);\n }\n } else {\n this.logSendSkipped(\"send\", `frame type=${frame.type}`);\n }\n }\n\n /** 原样透传文本到 Relay(用于 Gateway WS 响应直接回传) */\n sendRaw(text: string): void {\n const ws = this.ws;\n if (ws?.readyState === WebSocket.OPEN) {\n this.opts.logger.info(\n `Relay tunnel: ▶ sendRaw (${text.length} chars): ${text.length <= 500 ? text : text.substring(0, 500) + \"…\"}`,\n );\n try {\n ws.send(text);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: sendRaw failed, forcing reconnect: ${message}`,\n );\n this.forceReconnectFromSocket(ws, `sendRaw-failed: ${message}`);\n }\n } else {\n this.logSendSkipped(\"sendRaw\");\n }\n }\n\n /** 启动连接,带自动重连,直到 abortSignal 触发 */\n async connectWithAutoReconnect(abortSignal?: AbortSignal): Promise<void> {\n if (abortSignal) {\n abortSignal.addEventListener(\n \"abort\",\n () => {\n void this.stop();\n },\n { once: true },\n );\n }\n\n await this.connect();\n\n // 保持运行直到 abort\n return new Promise<void>((resolve) => {\n if (abortSignal) {\n abortSignal.addEventListener(\"abort\", () => resolve(), { once: true });\n }\n });\n }\n\n private async connect(): Promise<void> {\n if (this.aborted) return;\n\n // 确保旧连接和定时器都被清理,防止重复连接\n this.cleanup(true);\n\n let credential: AuthCredential;\n try {\n credential = await this.opts.credentialProvider();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: failed to resolve credential, scheduling reconnect: ${message}`,\n );\n this.writeStatus(\"disconnected\", `credential-error: ${message}`);\n this.scheduleReconnect();\n return;\n }\n\n this.opts.logger.info(\n `Relay tunnel: connecting to ${redactUrlSecrets(this.opts.tunnelUrl)} (attempt=${this.reconnectAttempt}, heartbeat=${this.opts.heartbeatSec}s, apiKey=${maskSecret(maskableSecret(credential))})`,\n );\n this.writeStatus(\"connecting\");\n\n return new Promise<void>((resolve) => {\n let settled = false;\n const settle = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n\n const wsUrl = new URL(this.opts.tunnelUrl);\n // 凭据中的 query 参数(如 apiKey)拼到连接 URL;已显式带上的不覆盖。\n for (const [key, value] of Object.entries(credential.query ?? {})) {\n if (!wsUrl.searchParams.get(key)) {\n wsUrl.searchParams.set(key, value);\n }\n }\n\n const ws = new WebSocket(wsUrl.toString(), {\n headers: credential.headers ?? {},\n // 防止 TCP 通但 HTTP Upgrade 响应被吞导致永久挂在 CONNECTING\n handshakeTimeout: HANDSHAKE_TIMEOUT_MS,\n });\n // 将握手中的 socket 也记为当前连接,确保首连失败/握手前断开也能触发重连。\n this.ws = ws;\n\n // 兜底 watchdog:即使 handshakeTimeout 因某些原因失效,也强制 terminate 走重连路径。\n let connectWatchdog: ReturnType<typeof setTimeout> | null = setTimeout(\n () => {\n connectWatchdog = null;\n if (this.ws !== ws || ws.readyState === WebSocket.OPEN) {\n return;\n }\n this.opts.logger.warn(\n `Relay tunnel: connect watchdog fired (readyState=${ws.readyState}, attempt=${this.reconnectAttempt}), forcing reconnect`,\n );\n this.forceReconnectFromSocket(ws, \"connect-watchdog-timeout\");\n settle();\n },\n CONNECT_WATCHDOG_MS,\n );\n\n const clearConnectWatchdog = () => {\n if (connectWatchdog) {\n clearTimeout(connectWatchdog);\n connectWatchdog = null;\n }\n };\n\n ws.on(\"open\", () => {\n clearConnectWatchdog();\n if (this.aborted || this.ws !== ws) {\n this.opts.logger.warn(\n `Relay tunnel: open fired but aborted=${this.aborted}, stale=${this.ws !== ws}, closing`,\n );\n try {\n ws.terminate();\n } catch {\n // ignore\n }\n settle();\n return;\n }\n this.reconnectAttempt = 0;\n this.lastInboundAt = Date.now();\n this.startHeartbeat();\n this.opts.logger.info(\"Relay tunnel: ✔ connected, heartbeat started\");\n this.writeStatus(\"connected\");\n this.emitConnected();\n settle();\n });\n\n ws.on(\"pong\", () => {\n if (this.ws === ws) {\n this.opts.logger.info(\"Relay tunnel: ← pong received\");\n this.markInboundActivity();\n }\n });\n\n ws.on(\"message\", (data: WebSocket.RawData) => {\n if (this.ws !== ws) {\n return;\n }\n this.handleMessage(data);\n });\n\n ws.on(\"close\", (code: number, reason: Buffer) => {\n clearConnectWatchdog();\n const reasonStr = reason.toString();\n const lastInboundAgoMs = this.lastInboundAt\n ? Date.now() - this.lastInboundAt\n : null;\n const isCurrentSocket = this.ws === ws;\n const logMessage =\n `Relay tunnel: disconnected (code=${code}, reason=${previewText(reasonStr, 200)}, lastInboundAgoMs=${lastInboundAgoMs ?? \"N/A\"}, reconnectAttempt=${this.reconnectAttempt})`;\n if (this.aborted || !isCurrentSocket) {\n this.opts.logger.info(logMessage);\n } else {\n this.opts.logger.warn(logMessage);\n }\n if (isCurrentSocket) {\n this.stopHeartbeat();\n this.ws = null;\n const disconnectReason = `code=${code}, reason=${reasonStr}`;\n this.writeStatus(\"disconnected\", disconnectReason);\n this.emitDisconnected(disconnectReason);\n this.scheduleReconnect();\n }\n settle();\n });\n\n ws.on(\"error\", (err: Error) => {\n clearConnectWatchdog();\n this.opts.logger.error(\n `Relay tunnel: WebSocket error: ${err.message} (readyState=${ws.readyState}, reconnectAttempt=${this.reconnectAttempt}, url=${redactUrlSecrets(wsUrl.toString())})`,\n );\n // 多数情况 error 后 ws 会再触发 close;但部分底层错误只 error 不 close,\n // 这里幂等地兜底一次 scheduleReconnect,scheduleReconnect 内部对已排程的重连会跳过。\n if (this.ws === ws) {\n this.forceReconnectFromSocket(ws, `error: ${err.message}`);\n }\n settle();\n });\n });\n }\n\n private emitConnected(): void {\n for (const handler of this.connectedHandlers) {\n Promise.resolve(handler()).catch((err) => {\n this.opts.logger.warn(\n `Relay tunnel: onConnected handler failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n }\n }\n\n private emitDisconnected(reason: string): void {\n for (const handler of this.disconnectedHandlers) {\n Promise.resolve(handler(reason)).catch((err) => {\n this.opts.logger.warn(\n `Relay tunnel: onDisconnected handler failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n }\n }\n\n private handleMessage(data: WebSocket.RawData): void {\n const text =\n typeof data === \"string\"\n ? data\n : Buffer.isBuffer(data)\n ? data.toString()\n : String(data);\n\n this.markInboundActivity();\n\n // 应用层心跳 pong 直接消费,不走帧解析\n if (text === \"pong\") {\n return;\n }\n\n this.opts.logger.info(\n `Relay tunnel: ★ received message (${text.length} chars): ${previewText(text)}`,\n );\n\n let frame: InboundFrame;\n try {\n frame = JSON.parse(text) as InboundFrame;\n } catch {\n this.opts.logger.warn(\n `Relay tunnel: received invalid frame, ignoring (preview=${previewText(text, 200)})`,\n );\n return;\n }\n\n this.opts.logger.info(`Relay tunnel: parsed frame type=${frame.type}, id=${\"id\" in frame ? frame.id : \"N/A\"}`);\n\n for (const handler of this.handlers) {\n try {\n const result = handler(frame);\n if (result instanceof Promise) {\n result.catch((err) => {\n this.opts.logger.error(`Relay tunnel: handler error: ${err}`);\n });\n }\n } catch (err) {\n this.opts.logger.error(`Relay tunnel: handler error: ${err}`);\n }\n }\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n const intervalMs = this.opts.heartbeatSec * 1000;\n this.sendHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n this.sendHeartbeat();\n }, intervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private getHeartbeatTimeoutMs(): number {\n return this.opts.heartbeatSec * 3 * 1000;\n }\n\n private sendHeartbeat(): void {\n const ws = this.ws;\n if (ws?.readyState !== WebSocket.OPEN) {\n return;\n }\n\n const idleMs = Date.now() - this.lastInboundAt;\n const timeoutMs = this.getHeartbeatTimeoutMs();\n if (idleMs >= timeoutMs) {\n this.opts.logger.warn(\n `Relay tunnel: heartbeat timeout, no inbound activity for ${idleMs}ms (threshold=${timeoutMs}ms)`,\n );\n this.forceReconnectFromSocket(ws, `heartbeat-timeout idleMs=${idleMs}`);\n return;\n }\n\n this.opts.logger.info('Relay tunnel: → heartbeat \"ping\"');\n try {\n ws.send(\"ping\");\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: heartbeat text ping failed, forcing reconnect: ${message}`,\n );\n this.forceReconnectFromSocket(ws, `heartbeat-send-failed: ${message}`);\n return;\n }\n try {\n ws.ping();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: heartbeat control ping failed, forcing reconnect: ${message}`,\n );\n this.forceReconnectFromSocket(ws, `heartbeat-ping-failed: ${message}`);\n }\n }\n\n private markInboundActivity(): void {\n this.lastInboundAt = Date.now();\n }\n\n private cleanup(force = false): void {\n this.opts.logger.info(\n `Relay tunnel: cleanup (ws=${this.ws ? \"open\" : \"null\"}, heartbeat=${!!this.heartbeatTimer}, reconnect=${!!this.reconnectTimer})`,\n );\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.ws) {\n try {\n if (force) {\n this.ws.terminate();\n } else {\n this.ws.close();\n }\n } catch {\n // ignore\n }\n this.ws = null;\n }\n }\n\n private forceReconnectFromSocket(ws: WebSocket, reason: string): void {\n if (this.aborted || this.ws !== ws) return;\n\n this.stopHeartbeat();\n this.ws = null;\n this.writeStatus(\"disconnected\", reason);\n this.emitDisconnected(reason);\n this.scheduleReconnect();\n\n try {\n if (ws.readyState !== WebSocket.CLOSED) {\n ws.terminate();\n }\n } catch {\n // ignore\n }\n }\n\n private logSendSkipped(kind: \"send\" | \"sendRaw\", detail?: string): void {\n const now = Date.now();\n const shouldLog =\n this.skippedSendLogLastAt === null ||\n now - this.skippedSendLogLastAt >= SEND_SKIPPED_LOG_INTERVAL_MS;\n\n if (!shouldLog) {\n this.skippedSendLogSuppressed++;\n return;\n }\n\n const suppressedSuffix =\n this.skippedSendLogSuppressed > 0\n ? `, suppressed=${this.skippedSendLogSuppressed}`\n : \"\";\n const detailSuffix = detail ? `, ${detail}` : \"\";\n this.opts.logger.warn(\n `Relay tunnel: ▶ ${kind} skipped, ws not open (readyState=${this.ws?.readyState ?? \"null\"}${detailSuffix}${suppressedSuffix})`,\n );\n this.skippedSendLogLastAt = now;\n this.skippedSendLogSuppressed = 0;\n }\n\n private scheduleReconnect(): void {\n if (this.aborted) return;\n\n // 已经排了一次重连就不再重排,避免 error+close 双触发或 watchdog 与 close 双触发时\n // attempt 被多扣、退避被无意义重置。\n if (this.reconnectTimer) {\n return;\n }\n\n const baseMs = this.opts.reconnectBackoffMs;\n const delayMs = Math.min(\n baseMs * Math.pow(2, this.reconnectAttempt),\n 60_000,\n );\n this.reconnectAttempt++;\n\n this.opts.logger.info(\n `Relay tunnel: reconnecting in ${delayMs}ms (attempt ${this.reconnectAttempt})`,\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (!this.aborted) {\n this.connect().catch((err) => {\n this.opts.logger.error(`Relay tunnel: reconnect failed: ${err}`);\n });\n }\n }, delayMs);\n }\n}\n",
|
|
78
|
+
"import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport WebSocket from \"ws\";\nimport type { InboundFrame, OutboundFrame } from \"./types.js\";\nimport { maskSecret, redactUrlSecrets } from \"./utils.js\";\nimport type { AuthCredential } from \"../profile/types.js\";\n\n/** 每次(重)连接时获取最新连接凭据;jvsclaw 等可在此透明刷新 token。 */\nexport type CredentialProvider = () => Promise<AuthCredential>;\n\nfunction previewText(text: string, max = 500): string {\n return text.length <= max ? text : `${text.substring(0, max)}…`;\n}\n\n/** 从凭据里挑一个代表性密文用于脱敏日志(优先 query.apiKey,其次首个 header 值)。 */\nfunction maskableSecret(credential: AuthCredential): string {\n return (\n credential.query?.apiKey ??\n Object.values(credential.headers ?? {})[0] ??\n \"\"\n );\n}\n\n/** WebSocket Upgrade 握手超时(毫秒)。云上常见 NAT/中间盒吞包场景下兜底用。 */\nconst HANDSHAKE_TIMEOUT_MS = 15_000;\n/** 兜底 watchdog:如果握手超时也没触发,强制 terminate 进入重连路径。 */\nconst CONNECT_WATCHDOG_MS = 20_000;\n/** 断线期间发送会非常密集,限频避免把真正的断线原因刷掉。 */\nconst SEND_SKIPPED_LOG_INTERVAL_MS = 30_000;\n\n/** 持久化到磁盘的隧道连接状态 */\nexport interface TunnelStatusInfo {\n /** 当前连接状态 */\n state: \"connected\" | \"disconnected\" | \"connecting\" | \"stopped\";\n /** 状态变更时间 ISO */\n since: string;\n /** 累计重连次数 */\n reconnectAttempt: number;\n /** 上次断开原因(仅 disconnected 时有值) */\n lastDisconnectReason?: string;\n}\n\nexport interface RelayClientOptions {\n tunnelUrl: string;\n /** 每次连接时获取连接凭据(query/headers);支持 token 刷新。 */\n credentialProvider: CredentialProvider;\n heartbeatSec: number;\n reconnectBackoffMs: number;\n /** 状态文件路径,设置后会在连接状态变更时写入 */\n statusFilePath?: string;\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n}\n\nexport type InboundHandler = (frame: InboundFrame) => void | Promise<void>;\nexport type ConnectedHandler = () => void | Promise<void>;\nexport type DisconnectedHandler = (reason: string) => void | Promise<void>;\n\n/**\n * Relay WebSocket 客户端。\n * 负责建连、token 认证、心跳保活、断线指数退避重连。\n */\nexport class RelayClient {\n private ws: WebSocket | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private handlers: InboundHandler[] = [];\n private connectedHandlers: ConnectedHandler[] = [];\n private disconnectedHandlers: DisconnectedHandler[] = [];\n private aborted = false;\n private lastInboundAt = 0;\n private stopPromise: Promise<void> | null = null;\n private skippedSendLogLastAt: number | null = null;\n private skippedSendLogSuppressed = 0;\n\n constructor(private readonly opts: RelayClientOptions) {}\n\n /** 写连接状态到磁盘 */\n private writeStatus(\n state: TunnelStatusInfo[\"state\"],\n lastDisconnectReason?: string,\n ): void {\n if (!this.opts.statusFilePath) return;\n const info: TunnelStatusInfo = {\n state,\n since: new Date().toISOString(),\n reconnectAttempt: this.reconnectAttempt,\n lastDisconnectReason,\n };\n try {\n mkdirSync(dirname(this.opts.statusFilePath), { recursive: true });\n writeFileSync(this.opts.statusFilePath, JSON.stringify(info, null, 2));\n } catch {\n // 写状态文件失败不影响主流程\n }\n }\n\n /** 注册入站帧处理函数 */\n onInbound(handler: InboundHandler): void {\n this.handlers.push(handler);\n }\n\n /** 注册连接成功后的回调 */\n onConnected(handler: ConnectedHandler): void {\n this.connectedHandlers.push(handler);\n }\n\n /** 注册 Relay 连接断开后的回调 */\n onDisconnected(handler: DisconnectedHandler): void {\n this.disconnectedHandlers.push(handler);\n }\n\n /** 当前是否已连上 Relay */\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n /** 优雅停止客户端,优先发送 close 帧,超时后再强制 terminate */\n async stop(reason = \"client stopping\"): Promise<void> {\n if (this.stopPromise) {\n return this.stopPromise;\n }\n\n this.aborted = true;\n this.writeStatus(\"stopped\");\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n const ws = this.ws;\n this.ws = null;\n if (!ws) {\n return;\n }\n\n this.opts.logger.info(\n `Relay tunnel: stopping client (readyState=${ws.readyState}, reason=${reason})`,\n );\n\n if (\n ws.readyState === WebSocket.CLOSED ||\n ws.readyState === WebSocket.CLOSING\n ) {\n return;\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n try {\n ws.terminate();\n } catch {\n // ignore\n }\n return;\n }\n\n this.stopPromise = new Promise<void>((resolve) => {\n let finished = false;\n let fallbackTimer: ReturnType<typeof setTimeout> | null = null;\n\n const finish = () => {\n if (finished) return;\n finished = true;\n if (fallbackTimer) {\n clearTimeout(fallbackTimer);\n fallbackTimer = null;\n }\n ws.off(\"close\", handleClose);\n ws.off(\"error\", handleError);\n this.stopPromise = null;\n resolve();\n };\n\n const handleClose = () => finish();\n const handleError = () => finish();\n\n ws.once(\"close\", handleClose);\n ws.once(\"error\", handleError);\n\n fallbackTimer = setTimeout(() => {\n this.opts.logger.warn(\n \"Relay tunnel: graceful close timed out, forcing terminate\",\n );\n try {\n ws.terminate();\n } catch {\n // ignore\n }\n finish();\n }, 1500);\n\n try {\n ws.close(1000, reason);\n } catch {\n finish();\n }\n });\n\n await this.stopPromise;\n }\n\n /** 发送出站帧 */\n send(frame: OutboundFrame): void {\n const ws = this.ws;\n if (ws?.readyState === WebSocket.OPEN) {\n const payload = JSON.stringify(frame);\n this.opts.logger.info(\n `Relay tunnel: ▶ send frame type=${frame.type}, id=${\"id\" in frame ? frame.id : \"N/A\"} (${payload.length} chars)`,\n );\n try {\n ws.send(payload);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: send failed, forcing reconnect: ${message}`,\n );\n this.forceReconnectFromSocket(ws, `send-failed: ${message}`);\n }\n } else {\n this.logSendSkipped(\"send\", `frame type=${frame.type}`);\n }\n }\n\n /** 原样透传文本到 Relay(用于 Gateway WS 响应直接回传) */\n sendRaw(text: string): void {\n const ws = this.ws;\n if (ws?.readyState === WebSocket.OPEN) {\n this.opts.logger.info(\n `Relay tunnel: ▶ sendRaw (${text.length} chars): ${text.length <= 500 ? text : text.substring(0, 500) + \"…\"}`,\n );\n try {\n ws.send(text);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: sendRaw failed, forcing reconnect: ${message}`,\n );\n this.forceReconnectFromSocket(ws, `sendRaw-failed: ${message}`);\n }\n } else {\n this.logSendSkipped(\"sendRaw\");\n }\n }\n\n /** 启动连接,带自动重连,直到 abortSignal 触发 */\n async connectWithAutoReconnect(abortSignal?: AbortSignal): Promise<void> {\n if (abortSignal) {\n abortSignal.addEventListener(\n \"abort\",\n () => {\n void this.stop();\n },\n { once: true },\n );\n }\n\n await this.connect();\n\n // 保持运行直到 abort\n return new Promise<void>((resolve) => {\n if (abortSignal) {\n abortSignal.addEventListener(\"abort\", () => resolve(), { once: true });\n }\n });\n }\n\n private async connect(): Promise<void> {\n if (this.aborted) return;\n\n // 确保旧连接和定时器都被清理,防止重复连接\n this.cleanup(true);\n\n let credential: AuthCredential;\n try {\n credential = await this.opts.credentialProvider();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: failed to resolve credential, scheduling reconnect: ${message}`,\n );\n this.writeStatus(\"disconnected\", `credential-error: ${message}`);\n this.scheduleReconnect();\n return;\n }\n\n this.opts.logger.info(\n `Relay tunnel: connecting to ${redactUrlSecrets(this.opts.tunnelUrl)} (attempt=${this.reconnectAttempt}, heartbeat=${this.opts.heartbeatSec}s, apiKey=${maskSecret(maskableSecret(credential))})`,\n );\n this.writeStatus(\"connecting\");\n\n return new Promise<void>((resolve) => {\n let settled = false;\n const settle = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n\n const wsUrl = new URL(this.opts.tunnelUrl);\n // 凭据中的 query 参数(如 apiKey)拼到连接 URL;已显式带上的不覆盖。\n for (const [key, value] of Object.entries(credential.query ?? {})) {\n if (!wsUrl.searchParams.get(key)) {\n wsUrl.searchParams.set(key, value);\n }\n }\n\n const loggableUrl = new URL(wsUrl.toString());\n const apiKey = loggableUrl.searchParams.get(\"apiKey\");\n if (apiKey) {\n loggableUrl.searchParams.set(\n \"apiKey\",\n apiKey.length > 8 ? `${apiKey.substring(0, 8)}…` : \"…\",\n );\n }\n this.opts.logger.info(\n `Relay tunnel: connecting to ${loggableUrl.toString()} (attempt=${this.reconnectAttempt + 1})`,\n );\n\n const ws = new WebSocket(wsUrl.toString(), {\n headers: credential.headers ?? {},\n // 防止 TCP 通但 HTTP Upgrade 响应被吞导致永久挂在 CONNECTING\n handshakeTimeout: HANDSHAKE_TIMEOUT_MS,\n });\n // 将握手中的 socket 也记为当前连接,确保首连失败/握手前断开也能触发重连。\n this.ws = ws;\n\n // 兜底 watchdog:即使 handshakeTimeout 因某些原因失效,也强制 terminate 走重连路径。\n let connectWatchdog: ReturnType<typeof setTimeout> | null = setTimeout(\n () => {\n connectWatchdog = null;\n if (this.ws !== ws || ws.readyState === WebSocket.OPEN) {\n return;\n }\n this.opts.logger.warn(\n `Relay tunnel: connect watchdog fired (readyState=${ws.readyState}, attempt=${this.reconnectAttempt}), forcing reconnect`,\n );\n this.forceReconnectFromSocket(ws, \"connect-watchdog-timeout\");\n settle();\n },\n CONNECT_WATCHDOG_MS,\n );\n\n const clearConnectWatchdog = () => {\n if (connectWatchdog) {\n clearTimeout(connectWatchdog);\n connectWatchdog = null;\n }\n };\n\n ws.on(\"open\", () => {\n clearConnectWatchdog();\n if (this.aborted || this.ws !== ws) {\n this.opts.logger.warn(\n `Relay tunnel: open fired but aborted=${this.aborted}, stale=${this.ws !== ws}, closing`,\n );\n try {\n ws.terminate();\n } catch {\n // ignore\n }\n settle();\n return;\n }\n this.reconnectAttempt = 0;\n this.lastInboundAt = Date.now();\n this.startHeartbeat();\n this.opts.logger.info(\"Relay tunnel: ✔ connected, heartbeat started\");\n this.writeStatus(\"connected\");\n this.emitConnected();\n settle();\n });\n\n ws.on(\"pong\", () => {\n if (this.ws === ws) {\n this.opts.logger.info(\"Relay tunnel: ← pong received\");\n this.markInboundActivity();\n }\n });\n\n ws.on(\"message\", (data: WebSocket.RawData) => {\n if (this.ws !== ws) {\n return;\n }\n this.handleMessage(data);\n });\n\n ws.on(\"close\", (code: number, reason: Buffer) => {\n clearConnectWatchdog();\n const reasonStr = reason.toString();\n const lastInboundAgoMs = this.lastInboundAt\n ? Date.now() - this.lastInboundAt\n : null;\n const isCurrentSocket = this.ws === ws;\n const logMessage =\n `Relay tunnel: disconnected (code=${code}, reason=${previewText(reasonStr, 200)}, lastInboundAgoMs=${lastInboundAgoMs ?? \"N/A\"}, reconnectAttempt=${this.reconnectAttempt})`;\n if (this.aborted || !isCurrentSocket) {\n this.opts.logger.info(logMessage);\n } else {\n this.opts.logger.warn(logMessage);\n }\n if (isCurrentSocket) {\n this.stopHeartbeat();\n this.ws = null;\n const disconnectReason = `code=${code}, reason=${reasonStr}`;\n this.writeStatus(\"disconnected\", disconnectReason);\n this.emitDisconnected(disconnectReason);\n this.scheduleReconnect();\n }\n settle();\n });\n\n ws.on(\"error\", (err: Error) => {\n clearConnectWatchdog();\n this.opts.logger.error(\n `Relay tunnel: WebSocket error: ${err.message} (readyState=${ws.readyState}, reconnectAttempt=${this.reconnectAttempt}, url=${redactUrlSecrets(wsUrl.toString())})`,\n );\n // 多数情况 error 后 ws 会再触发 close;但部分底层错误只 error 不 close,\n // 这里幂等地兜底一次 scheduleReconnect,scheduleReconnect 内部对已排程的重连会跳过。\n if (this.ws === ws) {\n this.forceReconnectFromSocket(ws, `error: ${err.message}`);\n }\n settle();\n });\n });\n }\n\n private emitConnected(): void {\n for (const handler of this.connectedHandlers) {\n Promise.resolve(handler()).catch((err) => {\n this.opts.logger.warn(\n `Relay tunnel: onConnected handler failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n }\n }\n\n private emitDisconnected(reason: string): void {\n for (const handler of this.disconnectedHandlers) {\n Promise.resolve(handler(reason)).catch((err) => {\n this.opts.logger.warn(\n `Relay tunnel: onDisconnected handler failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n }\n }\n\n private handleMessage(data: WebSocket.RawData): void {\n const text =\n typeof data === \"string\"\n ? data\n : Buffer.isBuffer(data)\n ? data.toString()\n : String(data);\n\n this.markInboundActivity();\n\n // 应用层心跳 pong 直接消费,不走帧解析\n if (text === \"pong\") {\n return;\n }\n\n this.opts.logger.info(\n `Relay tunnel: ★ received message (${text.length} chars): ${previewText(text)}`,\n );\n\n let frame: InboundFrame;\n try {\n frame = JSON.parse(text) as InboundFrame;\n } catch {\n this.opts.logger.warn(\n `Relay tunnel: received invalid frame, ignoring (preview=${previewText(text, 200)})`,\n );\n return;\n }\n\n this.opts.logger.info(`Relay tunnel: parsed frame type=${frame.type}, id=${\"id\" in frame ? frame.id : \"N/A\"}`);\n\n for (const handler of this.handlers) {\n try {\n const result = handler(frame);\n if (result instanceof Promise) {\n result.catch((err) => {\n this.opts.logger.error(`Relay tunnel: handler error: ${err}`);\n });\n }\n } catch (err) {\n this.opts.logger.error(`Relay tunnel: handler error: ${err}`);\n }\n }\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n const intervalMs = this.opts.heartbeatSec * 1000;\n this.sendHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n this.sendHeartbeat();\n }, intervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private getHeartbeatTimeoutMs(): number {\n return this.opts.heartbeatSec * 3 * 1000;\n }\n\n private sendHeartbeat(): void {\n const ws = this.ws;\n if (ws?.readyState !== WebSocket.OPEN) {\n return;\n }\n\n const idleMs = Date.now() - this.lastInboundAt;\n const timeoutMs = this.getHeartbeatTimeoutMs();\n if (idleMs >= timeoutMs) {\n this.opts.logger.warn(\n `Relay tunnel: heartbeat timeout, no inbound activity for ${idleMs}ms (threshold=${timeoutMs}ms)`,\n );\n this.forceReconnectFromSocket(ws, `heartbeat-timeout idleMs=${idleMs}`);\n return;\n }\n\n this.opts.logger.info('Relay tunnel: → heartbeat \"ping\"');\n try {\n ws.send(\"ping\");\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: heartbeat text ping failed, forcing reconnect: ${message}`,\n );\n this.forceReconnectFromSocket(ws, `heartbeat-send-failed: ${message}`);\n return;\n }\n try {\n ws.ping();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.opts.logger.warn(\n `Relay tunnel: heartbeat control ping failed, forcing reconnect: ${message}`,\n );\n this.forceReconnectFromSocket(ws, `heartbeat-ping-failed: ${message}`);\n }\n }\n\n private markInboundActivity(): void {\n this.lastInboundAt = Date.now();\n }\n\n private cleanup(force = false): void {\n this.opts.logger.info(\n `Relay tunnel: cleanup (ws=${this.ws ? \"open\" : \"null\"}, heartbeat=${!!this.heartbeatTimer}, reconnect=${!!this.reconnectTimer})`,\n );\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.ws) {\n try {\n if (force) {\n this.ws.terminate();\n } else {\n this.ws.close();\n }\n } catch {\n // ignore\n }\n this.ws = null;\n }\n }\n\n private forceReconnectFromSocket(ws: WebSocket, reason: string): void {\n if (this.aborted || this.ws !== ws) return;\n\n this.stopHeartbeat();\n this.ws = null;\n this.writeStatus(\"disconnected\", reason);\n this.emitDisconnected(reason);\n this.scheduleReconnect();\n\n try {\n if (ws.readyState !== WebSocket.CLOSED) {\n ws.terminate();\n }\n } catch {\n // ignore\n }\n }\n\n private logSendSkipped(kind: \"send\" | \"sendRaw\", detail?: string): void {\n const now = Date.now();\n const shouldLog =\n this.skippedSendLogLastAt === null ||\n now - this.skippedSendLogLastAt >= SEND_SKIPPED_LOG_INTERVAL_MS;\n\n if (!shouldLog) {\n this.skippedSendLogSuppressed++;\n return;\n }\n\n const suppressedSuffix =\n this.skippedSendLogSuppressed > 0\n ? `, suppressed=${this.skippedSendLogSuppressed}`\n : \"\";\n const detailSuffix = detail ? `, ${detail}` : \"\";\n this.opts.logger.warn(\n `Relay tunnel: ▶ ${kind} skipped, ws not open (readyState=${this.ws?.readyState ?? \"null\"}${detailSuffix}${suppressedSuffix})`,\n );\n this.skippedSendLogLastAt = now;\n this.skippedSendLogSuppressed = 0;\n }\n\n private scheduleReconnect(): void {\n if (this.aborted) return;\n\n // 已经排了一次重连就不再重排,避免 error+close 双触发或 watchdog 与 close 双触发时\n // attempt 被多扣、退避被无意义重置。\n if (this.reconnectTimer) {\n return;\n }\n\n const baseMs = this.opts.reconnectBackoffMs;\n const delayMs = Math.min(\n baseMs * Math.pow(2, this.reconnectAttempt),\n 60_000,\n );\n this.reconnectAttempt++;\n\n this.opts.logger.info(\n `Relay tunnel: reconnecting in ${delayMs}ms (attempt ${this.reconnectAttempt})`,\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (!this.aborted) {\n this.connect().catch((err) => {\n this.opts.logger.error(`Relay tunnel: reconnect failed: ${err}`);\n });\n }\n }, delayMs);\n }\n}\n",
|
|
80
79
|
"import createWebSocketStream from './lib/stream.js';\nimport extension from './lib/extension.js';\nimport PerMessageDeflate from './lib/permessage-deflate.js';\nimport Receiver from './lib/receiver.js';\nimport Sender from './lib/sender.js';\nimport subprotocol from './lib/subprotocol.js';\nimport WebSocket from './lib/websocket.js';\nimport WebSocketServer from './lib/websocket-server.js';\n\nexport {\n createWebSocketStream,\n extension,\n PerMessageDeflate,\n Receiver,\n Sender,\n subprotocol,\n WebSocket,\n WebSocketServer\n};\n\nexport default WebSocket;\n",
|
|
81
|
-
"import { randomUUID } from \"node:crypto\";\nimport WebSocket from \"ws\";\nimport type { RelayClient } from \"./relay-client.js\";\nimport type { ReqFrame, InboundFrame, RequestFrame } from \"./types.js\";\nimport { previewText } from \"./utils.js\";\nimport { resolveStateDir as resolveHostStateDir } from \"../host.js\";\nimport {\n type DeviceIdentity,\n resolveClientStateDir,\n loadOrCreateDeviceIdentity,\n loadDeviceAuthToken,\n storeDeviceAuthToken,\n clearDeviceAuthToken,\n buildDeviceAuthPayload,\n signDevicePayload,\n publicKeyRawBase64UrlFromPem,\n} from \"./device-identity.js\";\nimport { handleHttpRequest } from \"./http-proxy.js\";\nimport { WsProxy } from \"./ws-proxy.js\";\n\n// ─── Types ───\n\nexport const RELAY_TUNNEL_GATEWAY_CLIENT_INSTANCE_ID =\n \"phone-notifications-relay-tunnel\";\n\nconst GATEWAY_OPERATOR_SCOPES = [\n \"operator.admin\",\n \"operator.approvals\",\n \"operator.pairing\",\n \"operator.read\",\n \"operator.write\",\n] as const;\n\n// openclaw 2026.5.12 起本地 gateway RPC 要求 protocol >= 4;保留 3 以兼容老网关。\nconst GATEWAY_RPC_MIN_PROTOCOL = 3;\nconst GATEWAY_RPC_MAX_PROTOCOL = 4;\n\ninterface ProxyOptions {\n stateDir?: string;\n hostStateDir?: string;\n gatewayBaseUrl: string;\n /** Gateway 鉴权模式 */\n gatewayAuthMode?: \"token\" | \"password\";\n /** Gateway 鉴权 token,代理请求到本地 gateway 时使用 */\n gatewayToken?: string;\n /** Gateway 鉴权密码,代理请求到本地 gateway 时使用 */\n gatewayPassword?: string;\n client: RelayClient;\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n}\n\nconst MAX_AUTO_PAIRING_APPROVALS = 3;\nconst RECENT_ABORTED_CHAT_RUN_TTL_MS = 60_000;\nconst GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS = 10_000;\nconst MAX_GATEWAY_WS_PENDING = 200;\n\ninterface PendingGatewayReqMeta {\n method: string;\n sessionKey?: string;\n}\n\ninterface PendingGatewayPayload {\n payload: string;\n reqId?: string;\n}\n\ninterface RecentAbortedChatRun {\n sessionKey: string;\n abortedAtMs: number;\n}\n\ntype ApproveDevicePairingFn = (\n requestId: string,\n hostStateDir?: string,\n) => Promise<unknown>;\n\nlet approveDevicePairingPromise: Promise<ApproveDevicePairingFn | null> | null =\n null;\nlet approveDevicePairingWarned = false;\n\nfunction formatErrorMessage(err: unknown): string {\n if (err instanceof Error && err.message) return err.message;\n return String(err);\n}\n\nasync function loadApproveDevicePairing(\n logger: ProxyOptions[\"logger\"],\n): Promise<ApproveDevicePairingFn | null> {\n if (!approveDevicePairingPromise) {\n approveDevicePairingPromise = import(\"openclaw/plugin-sdk/device-bootstrap\")\n .then((mod) =>\n typeof mod.approveDevicePairing === \"function\"\n ? (mod.approveDevicePairing as ApproveDevicePairingFn)\n : null,\n )\n .catch((err: unknown) => {\n if (!approveDevicePairingWarned) {\n approveDevicePairingWarned = true;\n logger.warn(\n `TunnelProxy: local gateway auto-pairing disabled because current OpenClaw runtime does not expose device bootstrap SDK (${formatErrorMessage(err)})`,\n );\n }\n return null;\n });\n }\n\n const approveDevicePairing = await approveDevicePairingPromise;\n if (!approveDevicePairing && !approveDevicePairingWarned) {\n approveDevicePairingWarned = true;\n logger.warn(\n \"TunnelProxy: local gateway auto-pairing disabled because current OpenClaw runtime does not expose device bootstrap SDK\",\n );\n }\n return approveDevicePairing;\n}\n\n/**\n * 透明代理:接收 Relay 转发的请求帧,代理到本地 gateway,回传响应帧。\n * 支持 HTTP 请求代理和 WebSocket 连接代理。\n */\nexport class TunnelProxy {\n /** 到本地 Gateway 的持久 RPC WebSocket 连接 */\n private gatewayWs: WebSocket | null = null;\n private gatewayWsConnecting = false;\n /** 握手是否已完成(收到 hello-ok) */\n private gatewayWsReady = false;\n /** 收到本地自动配对成功后,在 close 回调里触发重连 */\n private gatewayWsReconnectRequested = false;\n /** 本地自动配对审批进行中,期间 Gateway 关闭连接时先保留 pending 请求。 */\n private gatewayWsPairingApprovalPending = false;\n /** 防止配对失败时无限重连 */\n private gatewayWsAutoPairingApprovals = 0;\n /** 等待 Gateway WS 握手完成后发送的帧队列 */\n private gatewayWsPending: PendingGatewayPayload[] = [];\n /** 记录已转发到 Gateway 的 req 元信息,便于回包时做定向处理。 */\n private gatewayReqMetaById = new Map<string, PendingGatewayReqMeta>();\n /** 最近由用户手动中断的 chat.run,用于过滤 runtime 误补发的 synthetic failure。 */\n private recentAbortedChatRuns = new Map<string, RecentAbortedChatRun>();\n /** Relay 断开或服务停止时要中断的 HTTP 代理请求。 */\n private httpAbortControllers = new Map<string, AbortController>();\n\n /** 设备身份,用于 Gateway connect 握手 */\n private deviceIdentity: DeviceIdentity;\n\n private readonly stateDir: string;\n private readonly hostStateDir: string;\n private readonly wsProxy: WsProxy;\n\n constructor(private readonly opts: ProxyOptions) {\n this.stateDir = resolveClientStateDir(opts.stateDir);\n this.hostStateDir = opts.hostStateDir ?? resolveHostStateDir();\n this.deviceIdentity = loadOrCreateDeviceIdentity(this.stateDir);\n opts.logger.info(\n `TunnelProxy: loaded device identity (deviceId=${this.deviceIdentity.deviceId})`,\n );\n this.wsProxy = new WsProxy({\n gatewayBaseUrl: opts.gatewayBaseUrl,\n client: opts.client,\n logger: opts.logger,\n });\n }\n\n // ─── Frame dispatcher ───\n\n /** 处理从 Relay 收到的入站帧 */\n async handleFrame(frame: InboundFrame): Promise<void> {\n this.opts.logger.info(\n `TunnelProxy: handling frame type=${frame.type}, id=${\"id\" in frame ? frame.id : \"N/A\"}`,\n );\n switch (frame.type) {\n case \"request\":\n await this.handleRequestFrame(frame);\n break;\n case \"req\":\n this.handleReqFrame(frame);\n break;\n case \"ws_open\":\n this.wsProxy.handleWsOpen(frame);\n break;\n case \"ws_data\":\n this.wsProxy.handleWsData(frame);\n break;\n case \"ws_close\":\n this.wsProxy.handleWsClose(frame);\n break;\n default:\n this.opts.logger.warn(\n `TunnelProxy: unknown frame type=\"${(frame as any).type}\", id=${\"id\" in frame ? (frame as any).id : \"N/A\"}, forwarding raw to gateway`,\n );\n // 未知帧类型也尝试通过 RPC WS 转发,避免静默丢弃\n this.forwardRawToGateway(JSON.stringify(frame));\n break;\n }\n }\n\n /** 清理所有代理的 WebSocket 连接 */\n cleanup(): void {\n this.opts.logger.info(\n `TunnelProxy: cleanup, closing ${this.wsProxy.activeCount} active WS connections, gatewayWs=${!!this.gatewayWs}`,\n );\n this.wsProxy.cleanup();\n for (const [id, controller] of this.httpAbortControllers) {\n this.opts.logger.info(`TunnelProxy: aborting HTTP proxy id=${id}`);\n controller.abort();\n }\n this.httpAbortControllers.clear();\n\n const gatewayWs = this.gatewayWs;\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n this.gatewayWsConnecting = false;\n this.gatewayWsReconnectRequested = false;\n this.gatewayWsPairingApprovalPending = false;\n this.gatewayWsAutoPairingApprovals = 0;\n this.gatewayWsPending = [];\n this.gatewayReqMetaById.clear();\n this.recentAbortedChatRuns.clear();\n if (gatewayWs) {\n try {\n gatewayWs.close();\n } catch {\n // ignore\n }\n }\n }\n\n // ─── Gateway RPC WebSocket ───\n\n private async handleRequestFrame(frame: RequestFrame): Promise<void> {\n const controller = new AbortController();\n this.httpAbortControllers.set(frame.id, controller);\n try {\n await handleHttpRequest(\n {\n ...this.opts,\n abortSignal: controller.signal,\n },\n frame,\n );\n } finally {\n this.httpAbortControllers.delete(frame.id);\n }\n }\n\n private pushGatewayPending(\n entry: PendingGatewayPayload,\n reason: string,\n ): boolean {\n if (this.gatewayWsPending.length >= MAX_GATEWAY_WS_PENDING) {\n this.opts.logger.error(\n `TunnelProxy: gateway WS pending queue overflow (${this.gatewayWsPending.length}/${MAX_GATEWAY_WS_PENDING}); failing ${entry.reqId ? `req id=${entry.reqId}` : \"raw frame\"}`,\n );\n this.failGatewayPendingEntry(\n entry,\n \"GATEWAY_RPC_QUEUE_FULL\",\n \"local gateway RPC queue is full\",\n );\n return false;\n }\n\n this.gatewayWsPending.push(entry);\n this.opts.logger.info(\n `TunnelProxy: gateway WS pending queue size=${this.gatewayWsPending.length} (${reason})`,\n );\n return true;\n }\n\n /** 将未知帧原样转发到 Gateway WS */\n private forwardRawToGateway(payload: string): void {\n if (this.gatewayWsReady && this.gatewayWs?.readyState === WebSocket.OPEN) {\n this.sendGatewayPayload(this.gatewayWs, { payload }, \"raw frame\");\n } else {\n if (\n this.pushGatewayPending(\n { payload },\n \"raw frame queued before gateway WS ready\",\n )\n ) {\n this.ensureGatewayWs();\n }\n }\n }\n\n /** 处理 Relay 转发的 Gateway RPC 请求帧,原样通过 WebSocket 发给本地 Gateway */\n private handleReqFrame(frame: ReqFrame): void {\n const payload = JSON.stringify(frame);\n this.gatewayReqMetaById.set(frame.id, {\n method: frame.method,\n sessionKey: this.normalizeSessionKey(frame.params?.sessionKey),\n });\n this.opts.logger.info(\n `TunnelProxy: req id=${frame.id} method=${frame.method} → gateway WS (${payload.length} chars)`,\n );\n\n if (this.gatewayWsReady && this.gatewayWs?.readyState === WebSocket.OPEN) {\n this.sendGatewayPayload(\n this.gatewayWs,\n { payload, reqId: frame.id },\n `req id=${frame.id}`,\n );\n } else {\n this.opts.logger.info(\n `TunnelProxy: req id=${frame.id} queued, gateway WS not ready yet`,\n );\n if (\n this.pushGatewayPending(\n { payload, reqId: frame.id },\n `req id=${frame.id} queued before gateway WS handshake`,\n )\n ) {\n this.ensureGatewayWs();\n }\n }\n }\n\n private sendGatewayRpcError(\n id: string,\n code: string,\n message: string,\n ): void {\n this.gatewayReqMetaById.delete(id);\n this.opts.client.sendRaw(\n JSON.stringify({\n type: \"res\",\n id,\n ok: false,\n error: {\n code,\n message,\n },\n }),\n );\n }\n\n private failGatewayPendingEntry(\n entry: PendingGatewayPayload,\n code: string,\n message: string,\n ): void {\n if (!entry.reqId) return;\n this.sendGatewayRpcError(entry.reqId, code, message);\n }\n\n private failGatewayPending(code: string, message: string): void {\n if (this.gatewayWsPending.length === 0) return;\n const pending = this.gatewayWsPending;\n this.gatewayWsPending = [];\n this.opts.logger.warn(\n `TunnelProxy: failing ${pending.length} pending gateway RPC frame(s): ${message}`,\n );\n for (const entry of pending) {\n this.failGatewayPendingEntry(entry, code, message);\n }\n }\n\n private failGatewayInflight(code: string, message: string): void {\n if (this.gatewayReqMetaById.size === 0) return;\n const ids = [...this.gatewayReqMetaById.keys()];\n this.opts.logger.warn(\n `TunnelProxy: failing ${ids.length} in-flight gateway RPC request(s): ${message}`,\n );\n for (const id of ids) {\n this.sendGatewayRpcError(id, code, message);\n }\n }\n\n private failAllGatewayRequests(code: string, message: string): void {\n this.failGatewayPending(code, message);\n this.failGatewayInflight(code, message);\n }\n\n private sendGatewayPayload(\n ws: WebSocket,\n entry: PendingGatewayPayload,\n context: string,\n ): boolean {\n try {\n ws.send(entry.payload);\n return true;\n } catch (err) {\n const message = formatErrorMessage(err);\n this.opts.logger.warn(\n `TunnelProxy: RPC WS send failed for ${context}: ${message}`,\n );\n this.failGatewayPendingEntry(\n entry,\n \"GATEWAY_RPC_SEND_FAILED\",\n `local gateway RPC send failed: ${message}`,\n );\n this.failGatewayInflight(\n \"GATEWAY_RPC_SEND_FAILED\",\n \"local gateway RPC connection closed after send failure\",\n );\n if (this.gatewayWs === ws) {\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n this.gatewayWsConnecting = false;\n }\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n } else {\n ws.close();\n }\n } catch {\n // ignore\n }\n return false;\n }\n }\n\n // ─── Gateway connect auth helpers ───\n\n private resolveGatewayConnectAuth():\n | { token?: string; password?: string }\n | undefined {\n const token = this.opts.gatewayToken?.trim() || undefined;\n const password = this.opts.gatewayPassword?.trim() || undefined;\n if (!token && !password) return undefined;\n return { token, password };\n }\n\n private loadStoredDeviceToken(role: string): string | undefined {\n return (\n loadDeviceAuthToken({\n stateDir: this.stateDir,\n deviceId: this.deviceIdentity.deviceId,\n role,\n })?.token ?? undefined\n );\n }\n\n private buildGatewayConnectAuth(role: string): {\n auth?: { token?: string; deviceToken?: string; password?: string };\n authToken?: string;\n authPassword?: string;\n deviceToken?: string;\n } {\n const explicitAuth = this.resolveGatewayConnectAuth();\n const authPassword = explicitAuth?.password?.trim() || undefined;\n const explicitGatewayToken = explicitAuth?.token?.trim() || undefined;\n const deviceToken = explicitGatewayToken\n ? undefined\n : this.loadStoredDeviceToken(role);\n const authToken = explicitGatewayToken ?? deviceToken;\n const auth =\n authToken || authPassword || deviceToken\n ? { token: authToken, deviceToken, password: authPassword }\n : undefined;\n return { auth, authToken, authPassword, deviceToken };\n }\n\n private storeIssuedDeviceToken(params: {\n fallbackRole: string;\n fallbackScopes: string[];\n authInfo: any;\n }): void {\n const token = params.authInfo?.deviceToken;\n if (typeof token !== \"string\" || !token.trim()) return;\n const role =\n typeof params.authInfo?.role === \"string\" && params.authInfo.role.trim()\n ? params.authInfo.role.trim()\n : params.fallbackRole;\n const scopes = Array.isArray(params.authInfo?.scopes)\n ? params.authInfo.scopes.filter(\n (scope: unknown): scope is string =>\n typeof scope === \"string\" && !!scope.trim(),\n )\n : params.fallbackScopes;\n storeDeviceAuthToken({\n stateDir: this.stateDir,\n deviceId: this.deviceIdentity.deviceId,\n role,\n token: token.trim(),\n scopes,\n });\n }\n\n private maybeClearStoredDeviceTokenOnMismatch(code: number, reason: string): void {\n const explicitAuth = this.resolveGatewayConnectAuth();\n if (explicitAuth?.token || explicitAuth?.password) return;\n if (code !== 1008 || !reason.toLowerCase().includes(\"device token mismatch\")) return;\n clearDeviceAuthToken({\n stateDir: this.stateDir,\n deviceId: this.deviceIdentity.deviceId,\n role: \"operator\",\n });\n this.opts.logger.warn(\n `TunnelProxy: cleared stale stored device token after gateway mismatch (deviceId=${this.deviceIdentity.deviceId})`,\n );\n }\n\n private async maybeAutoApproveGatewayPairing(frame: any): Promise<boolean> {\n const errorCode =\n typeof frame?.error?.code === \"string\" ? frame.error.code : undefined;\n const detailsCode =\n typeof frame?.error?.details?.code === \"string\"\n ? frame.error.details.code\n : undefined;\n if (errorCode !== \"NOT_PAIRED\" && detailsCode !== \"PAIRING_REQUIRED\") {\n return false;\n }\n\n const requestId =\n typeof frame?.error?.details?.requestId === \"string\"\n ? frame.error.details.requestId.trim()\n : \"\";\n const reason =\n typeof frame?.error?.details?.reason === \"string\"\n ? frame.error.details.reason.trim()\n : \"\";\n\n if (!requestId) {\n this.opts.logger.warn(\n \"TunnelProxy: gateway pairing required but requestId missing; unable to auto-approve\",\n );\n return false;\n }\n\n if (\n reason &&\n reason !== \"not-paired\" &&\n reason !== \"scope-upgrade\"\n ) {\n this.opts.logger.warn(\n `TunnelProxy: gateway pairing required with unsupported reason=${reason}; skipping auto-approve`,\n );\n return false;\n }\n\n if (this.gatewayWsAutoPairingApprovals >= MAX_AUTO_PAIRING_APPROVALS) {\n this.opts.logger.warn(\n `TunnelProxy: reached auto-pairing retry limit (${MAX_AUTO_PAIRING_APPROVALS}); requestId=${requestId}`,\n );\n return false;\n }\n\n this.gatewayWsPairingApprovalPending = true;\n try {\n const approveDevicePairing = await loadApproveDevicePairing(this.opts.logger);\n if (!approveDevicePairing) {\n this.gatewayWsPairingApprovalPending = false;\n return false;\n }\n const approved = await approveDevicePairing(requestId, this.hostStateDir);\n if (!approved) {\n this.gatewayWsPairingApprovalPending = false;\n this.opts.logger.warn(\n `TunnelProxy: gateway pairing request ${requestId} not found in host state ${this.hostStateDir}`,\n );\n return false;\n }\n this.gatewayWsAutoPairingApprovals += 1;\n this.gatewayWsReconnectRequested = true;\n this.gatewayWsPairingApprovalPending = false;\n this.opts.logger.info(\n `TunnelProxy: auto-approved local gateway pairing request ${requestId} (reason=${reason || \"not-paired\"}, hostStateDir=${this.hostStateDir}, approval=${this.gatewayWsAutoPairingApprovals}/${MAX_AUTO_PAIRING_APPROVALS})`,\n );\n return true;\n } catch (err: any) {\n this.gatewayWsPairingApprovalPending = false;\n this.opts.logger.warn(\n `TunnelProxy: failed to auto-approve gateway pairing request ${requestId}: ${err?.message ?? String(err)}`,\n );\n return false;\n }\n }\n\n // ─── Gateway RPC WebSocket lifecycle ───\n\n private normalizeSessionKey(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n }\n\n private normalizeRunId(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n }\n\n private pruneRecentAbortedChatRuns(now = Date.now()): void {\n for (const [runId, entry] of this.recentAbortedChatRuns) {\n if (now - entry.abortedAtMs > RECENT_ABORTED_CHAT_RUN_TTL_MS) {\n this.recentAbortedChatRuns.delete(runId);\n }\n }\n }\n\n private rememberRecentAbortedChatRun(runId: unknown, sessionKey: unknown): void {\n const normalizedRunId = this.normalizeRunId(runId);\n const normalizedSessionKey = this.normalizeSessionKey(sessionKey);\n if (!normalizedRunId || !normalizedSessionKey) return;\n this.pruneRecentAbortedChatRuns();\n this.recentAbortedChatRuns.set(normalizedRunId, {\n sessionKey: normalizedSessionKey,\n abortedAtMs: Date.now(),\n });\n }\n\n private getAssistantMessageText(message: any): string {\n if (!message || typeof message !== \"object\") return \"\";\n if (typeof message.text === \"string\") return message.text;\n if (!Array.isArray(message.content)) return \"\";\n return message.content\n .filter(\n (item: any) =>\n item &&\n typeof item === \"object\" &&\n item.type === \"text\" &&\n typeof item.text === \"string\",\n )\n .map((item: any) => item.text)\n .join(\"\");\n }\n\n private looksLikeSyntheticAbortFailureText(text: string): boolean {\n const normalized = text.trim().toLowerCase();\n if (!normalized) return false;\n return (\n normalized.includes(\"agent failed before reply:\") &&\n normalized.includes(\"aborted\") &&\n normalized.includes(\"openclaw logs --follow\")\n );\n }\n\n private isSyntheticAbortHistoryMessage(\n message: any,\n sessionKey: string,\n ): boolean {\n const text = this.getAssistantMessageText(message);\n if (!this.looksLikeSyntheticAbortFailureText(text)) return false;\n const messageTimestamp =\n typeof message?.timestamp === \"number\" ? message.timestamp : null;\n const now = Date.now();\n this.pruneRecentAbortedChatRuns(now);\n for (const entry of this.recentAbortedChatRuns.values()) {\n if (entry.sessionKey !== sessionKey) continue;\n if (messageTimestamp === null) return true;\n if (Math.abs(messageTimestamp - entry.abortedAtMs) <= RECENT_ABORTED_CHAT_RUN_TTL_MS) {\n return true;\n }\n }\n return false;\n }\n\n private maybeRewriteGatewayFrame(text: string, frame: any): string | null {\n this.pruneRecentAbortedChatRuns();\n\n if (\n frame?.type === \"event\" &&\n frame?.event === \"chat\" &&\n frame?.payload?.state === \"aborted\"\n ) {\n this.rememberRecentAbortedChatRun(\n frame.payload?.runId,\n frame.payload?.sessionKey,\n );\n return text;\n }\n\n if (frame?.type === \"ack\" && frame?.ok === false && typeof frame?.id === \"string\") {\n this.gatewayReqMetaById.delete(frame.id);\n return text;\n }\n\n let reqMeta: PendingGatewayReqMeta | undefined;\n if (frame?.type === \"res\" && typeof frame?.id === \"string\") {\n reqMeta = this.gatewayReqMetaById.get(frame.id);\n this.gatewayReqMetaById.delete(frame.id);\n }\n\n if (\n frame?.type === \"res\" &&\n frame?.ok === true &&\n reqMeta?.method === \"chat.abort\"\n ) {\n const runIds = Array.isArray(frame?.payload?.runIds)\n ? frame.payload.runIds\n : [];\n for (const runId of runIds) {\n this.rememberRecentAbortedChatRun(runId, reqMeta.sessionKey);\n }\n return text;\n }\n\n if (\n frame?.type === \"event\" &&\n frame?.event === \"chat\" &&\n frame?.payload?.state === \"final\"\n ) {\n const runId = this.normalizeRunId(frame?.payload?.runId);\n const assistantText = this.getAssistantMessageText(frame?.payload?.message);\n const recentAbort = runId ? this.recentAbortedChatRuns.get(runId) : undefined;\n if (\n recentAbort &&\n this.looksLikeSyntheticAbortFailureText(assistantText)\n ) {\n this.opts.logger.info(\n `TunnelProxy: suppressing synthetic abort failure final for runId=${runId}`,\n );\n return null;\n }\n return text;\n }\n\n if (\n frame?.type === \"res\" &&\n frame?.ok === true &&\n reqMeta?.method === \"chat.history\" &&\n Array.isArray(frame?.payload?.messages)\n ) {\n const sessionKey =\n this.normalizeSessionKey(frame?.payload?.sessionKey) ?? reqMeta.sessionKey;\n if (!sessionKey) return text;\n const filteredMessages = frame.payload.messages.filter(\n (message: any) =>\n !this.isSyntheticAbortHistoryMessage(message, sessionKey),\n );\n if (filteredMessages.length === frame.payload.messages.length) {\n return text;\n }\n this.opts.logger.info(\n `TunnelProxy: removed ${frame.payload.messages.length - filteredMessages.length} synthetic abort history message(s) for session=${sessionKey}`,\n );\n return JSON.stringify({\n ...frame,\n payload: {\n ...frame.payload,\n messages: filteredMessages,\n },\n });\n }\n\n return text;\n }\n\n /** 确保到本地 Gateway 的 RPC WebSocket 已连接且握手完成 */\n private ensureGatewayWs(): void {\n if (this.gatewayWsReady && this.gatewayWs?.readyState === WebSocket.OPEN)\n return;\n if (this.gatewayWsConnecting) return;\n\n this.gatewayWsConnecting = true;\n this.gatewayWsReady = false;\n const wsUrl = this.opts.gatewayBaseUrl.replace(/^http/, \"ws\");\n\n this.opts.logger.info(\n `TunnelProxy: RPC WS connecting to gateway ${wsUrl} (pending=${this.gatewayWsPending.length})`,\n );\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(wsUrl, {\n handshakeTimeout: GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS,\n });\n } catch (err) {\n const message = formatErrorMessage(err);\n this.gatewayWsConnecting = false;\n this.opts.logger.error(\n `TunnelProxy: RPC WS failed to create gateway connection: ${message}`,\n );\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_CONNECT_FAILED\",\n `local gateway RPC connect failed: ${message}`,\n );\n return;\n }\n\n this.gatewayWs = ws;\n let handshakeTimer: ReturnType<typeof setTimeout> | null = setTimeout(\n () => {\n handshakeTimer = null;\n if (this.gatewayWs !== ws || this.gatewayWsReady) return;\n this.opts.logger.warn(\n `TunnelProxy: RPC WS handshake timed out after ${GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS}ms (pending=${this.gatewayWsPending.length})`,\n );\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n this.gatewayWsConnecting = false;\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_HANDSHAKE_TIMEOUT\",\n \"local gateway RPC handshake timed out\",\n );\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n } else {\n ws.close();\n }\n } catch {\n // ignore\n }\n },\n GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS,\n );\n\n const clearHandshakeTimer = () => {\n if (handshakeTimer) {\n clearTimeout(handshakeTimer);\n handshakeTimer = null;\n }\n };\n\n ws.on(\"open\", () => {\n this.opts.logger.info(\n `TunnelProxy: RPC WS tcp connected, waiting for connect.challenge (pending=${this.gatewayWsPending.length})`,\n );\n });\n\n ws.on(\"message\", async (data: WebSocket.RawData) => {\n let text: string;\n if (typeof data === \"string\") {\n text = data;\n } else if (Buffer.isBuffer(data)) {\n text = data.toString();\n } else {\n text = Buffer.from(data as ArrayBuffer).toString();\n }\n\n const preview = text.length <= 500 ? text : text.substring(0, 500) + \"…\";\n this.opts.logger.info(\n `TunnelProxy: RPC WS ← gateway (${text.length} chars): ${preview}`,\n );\n\n let frame: any;\n try {\n frame = JSON.parse(text);\n } catch {\n this.opts.logger.warn(\n \"TunnelProxy: RPC WS received non-JSON, ignoring\",\n );\n return;\n }\n\n // 1) 收到 connect.challenge → 回复 connect 请求(带设备身份签名)\n if (frame.type === \"event\" && frame.event === \"connect.challenge\") {\n this.handleConnectChallenge(ws, frame);\n return;\n }\n\n // 2) 收到 connect 的 hello-ok 响应 → 握手完成,flush 待发帧\n if (\n frame.type === \"res\" &&\n frame.ok === true &&\n frame.payload?.type === \"hello-ok\"\n ) {\n clearHandshakeTimer();\n this.storeIssuedDeviceToken({\n fallbackRole: \"operator\",\n fallbackScopes: [...GATEWAY_OPERATOR_SCOPES],\n authInfo: frame.payload?.auth,\n });\n this.gatewayWsAutoPairingApprovals = 0;\n this.gatewayWsReconnectRequested = false;\n this.gatewayWsReady = true;\n this.gatewayWsConnecting = false;\n this.opts.logger.info(\n `TunnelProxy: RPC WS handshake done (hello-ok), flushing ${this.gatewayWsPending.length} pending frames`,\n );\n const pending = this.gatewayWsPending;\n this.gatewayWsPending = [];\n for (let i = 0; i < pending.length; i++) {\n const entry = pending[i];\n if (!this.sendGatewayPayload(ws, entry, entry.reqId ?? \"pending frame\")) {\n return;\n }\n }\n return;\n }\n\n // 3) 收到 connect 失败响应 → 关闭连接\n if (frame.type === \"res\" && frame.ok === false && !this.gatewayWsReady) {\n const autoApproved = await this.maybeAutoApproveGatewayPairing(frame);\n if (autoApproved) {\n const wsAlreadyClosed =\n ws.readyState === WebSocket.CLOSING ||\n ws.readyState === WebSocket.CLOSED ||\n this.gatewayWs !== ws;\n this.opts.logger.info(\n `TunnelProxy: RPC WS handshake requested local pairing approval, reconnecting${wsAlreadyClosed ? \" immediately\" : \" after close\"} (pending=${this.gatewayWsPending.length})`,\n );\n if (wsAlreadyClosed) {\n this.gatewayWsReconnectRequested = false;\n this.ensureGatewayWs();\n return;\n }\n ws.close(1000, \"pairing approved, reconnecting\");\n return;\n }\n this.opts.logger.error(\n `TunnelProxy: RPC WS handshake failed (pending=${this.gatewayWsPending.length}): ${previewText(JSON.stringify(frame.error), 500)}`,\n );\n clearHandshakeTimer();\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_HANDSHAKE_FAILED\",\n `local gateway RPC handshake failed: ${previewText(JSON.stringify(frame.error), 500)}`,\n );\n ws.close();\n return;\n }\n\n // 4) 握手后的普通消息 → 透传回 Relay\n const rewritten = this.maybeRewriteGatewayFrame(text, frame);\n if (rewritten !== null) {\n this.opts.client.sendRaw(rewritten);\n }\n });\n\n ws.on(\"close\", (code: number, reason: Buffer) => {\n clearHandshakeTimer();\n const wasReady = this.gatewayWsReady;\n const pendingCount = this.gatewayWsPending.length;\n const reasonText = reason.toString();\n const shouldReconnect =\n this.gatewayWsReconnectRequested && pendingCount > 0;\n const shouldHoldForPairing =\n this.gatewayWsPairingApprovalPending && pendingCount > 0;\n this.opts.logger.info(\n `TunnelProxy: RPC WS closed by gateway (code=${code}, reason=${reasonText}, ready=${wasReady}, pending=${pendingCount}, activeWs=${this.wsProxy.activeCount})`,\n );\n if (this.gatewayWs === ws) {\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n }\n this.gatewayWsConnecting = false;\n this.maybeClearStoredDeviceTokenOnMismatch(code, reasonText);\n if (shouldReconnect) {\n this.gatewayWsReconnectRequested = false;\n this.opts.logger.info(\n `TunnelProxy: retrying RPC WS after local pairing approval (pending=${this.gatewayWsPending.length})`,\n );\n queueMicrotask(() => this.ensureGatewayWs());\n } else if (\n !shouldHoldForPairing &&\n (pendingCount > 0 || this.gatewayReqMetaById.size > 0)\n ) {\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_DISCONNECTED\",\n `local gateway RPC disconnected: code=${code}, reason=${reasonText}`,\n );\n }\n });\n\n ws.on(\"error\", (err: Error) => {\n clearHandshakeTimer();\n this.opts.logger.warn(\n `TunnelProxy: RPC WS error: ${err.message} (ready=${this.gatewayWsReady}, pending=${this.gatewayWsPending.length}, activeWs=${this.wsProxy.activeCount})`,\n );\n const shouldFailRequests =\n this.gatewayWs === ws &&\n (this.gatewayWsPending.length > 0 || this.gatewayReqMetaById.size > 0);\n this.gatewayWsConnecting = false;\n if (this.gatewayWs === ws) {\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n }\n if (shouldFailRequests) {\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_ERROR\",\n `local gateway RPC error: ${err.message}`,\n );\n }\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n }\n } catch {\n // ignore\n }\n });\n }\n\n private handleConnectChallenge(ws: WebSocket, frame: any): void {\n const challengeNonce: string = frame.payload?.nonce ?? \"\";\n const connectRequestId = `tunnel-connect-${randomUUID()}`;\n const role = \"operator\";\n const scopes = [...GATEWAY_OPERATOR_SCOPES];\n const gatewayConnectAuth = this.buildGatewayConnectAuth(role);\n this.opts.logger.info(\n `TunnelProxy: received connect.challenge (nonce=${challengeNonce}, connectReqId=${connectRequestId}, hasToken=${!!gatewayConnectAuth.authToken}, hasPassword=${!!gatewayConnectAuth.authPassword}, hasDeviceToken=${!!gatewayConnectAuth.deviceToken}), sending connect request with device identity`,\n );\n\n const signedAtMs = Date.now();\n const clientId = \"gateway-client\";\n const clientMode = \"backend\";\n\n const authPayload = buildDeviceAuthPayload({\n deviceId: this.deviceIdentity.deviceId,\n clientId,\n clientMode,\n role,\n scopes,\n signedAtMs,\n token: gatewayConnectAuth.authToken ?? null,\n nonce: challengeNonce,\n });\n const signature = signDevicePayload(\n this.deviceIdentity.privateKeyPem,\n authPayload,\n );\n\n const connectReq = {\n type: \"req\",\n id: connectRequestId,\n method: \"connect\",\n params: {\n minProtocol: GATEWAY_RPC_MIN_PROTOCOL,\n maxProtocol: GATEWAY_RPC_MAX_PROTOCOL,\n client: {\n id: clientId,\n version: \"1.0.0\",\n platform: process.platform,\n mode: clientMode,\n instanceId: RELAY_TUNNEL_GATEWAY_CLIENT_INSTANCE_ID,\n },\n role,\n scopes,\n ...(gatewayConnectAuth.auth ? { auth: gatewayConnectAuth.auth } : {}),\n device: {\n id: this.deviceIdentity.deviceId,\n publicKey: publicKeyRawBase64UrlFromPem(\n this.deviceIdentity.publicKeyPem,\n ),\n signature,\n signedAt: signedAtMs,\n nonce: challengeNonce,\n },\n },\n };\n ws.send(JSON.stringify(connectReq));\n }\n}\n",
|
|
82
|
-
"import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { resolveStateDir
|
|
80
|
+
"import { randomUUID } from \"node:crypto\";\nimport WebSocket from \"ws\";\nimport type { RelayClient } from \"./relay-client.js\";\nimport type { ReqFrame, InboundFrame, RequestFrame } from \"./types.js\";\nimport { previewText } from \"./utils.js\";\nimport { resolveHostStateDir } from \"../host.js\";\nimport {\n type DeviceIdentity,\n resolveClientStateDir,\n loadOrCreateDeviceIdentity,\n loadDeviceAuthToken,\n storeDeviceAuthToken,\n clearDeviceAuthToken,\n buildDeviceAuthPayload,\n signDevicePayload,\n publicKeyRawBase64UrlFromPem,\n} from \"./device-identity.js\";\nimport { handleHttpRequest } from \"./http-proxy.js\";\nimport { WsProxy } from \"./ws-proxy.js\";\n\n// ─── Types ───\n\nexport const RELAY_TUNNEL_GATEWAY_CLIENT_INSTANCE_ID =\n \"phone-notifications-relay-tunnel\";\n\nconst GATEWAY_OPERATOR_SCOPES = [\n \"operator.admin\",\n \"operator.approvals\",\n \"operator.pairing\",\n \"operator.read\",\n \"operator.write\",\n] as const;\n\n// openclaw 2026.5.12 起本地 gateway RPC 要求 protocol >= 4;保留 3 以兼容老网关。\nconst GATEWAY_RPC_MIN_PROTOCOL = 3;\nconst GATEWAY_RPC_MAX_PROTOCOL = 4;\n\ninterface ProxyOptions {\n stateDir?: string;\n hostStateDir?: string;\n gatewayBaseUrl: string;\n /** Gateway 鉴权模式 */\n gatewayAuthMode?: \"token\" | \"password\";\n /** Gateway 鉴权 token,代理请求到本地 gateway 时使用 */\n gatewayToken?: string;\n /** Gateway 鉴权密码,代理请求到本地 gateway 时使用 */\n gatewayPassword?: string;\n client: RelayClient;\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n}\n\nconst MAX_AUTO_PAIRING_APPROVALS = 3;\nconst RECENT_ABORTED_CHAT_RUN_TTL_MS = 60_000;\nconst GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS = 10_000;\nconst MAX_GATEWAY_WS_PENDING = 200;\n\ninterface PendingGatewayReqMeta {\n method: string;\n sessionKey?: string;\n}\n\ninterface PendingGatewayPayload {\n payload: string;\n reqId?: string;\n}\n\ninterface RecentAbortedChatRun {\n sessionKey: string;\n abortedAtMs: number;\n}\n\ntype ApproveDevicePairingFn = (\n requestId: string,\n hostStateDir?: string,\n) => Promise<unknown>;\n\nlet approveDevicePairingPromise: Promise<ApproveDevicePairingFn | null> | null =\n null;\nlet approveDevicePairingWarned = false;\n\nfunction formatErrorMessage(err: unknown): string {\n if (err instanceof Error && err.message) return err.message;\n return String(err);\n}\n\nasync function loadApproveDevicePairing(\n logger: ProxyOptions[\"logger\"],\n): Promise<ApproveDevicePairingFn | null> {\n if (!approveDevicePairingPromise) {\n approveDevicePairingPromise = import(\"openclaw/plugin-sdk/device-bootstrap\")\n .then((mod) =>\n typeof mod.approveDevicePairing === \"function\"\n ? (mod.approveDevicePairing as ApproveDevicePairingFn)\n : null,\n )\n .catch((err: unknown) => {\n if (!approveDevicePairingWarned) {\n approveDevicePairingWarned = true;\n logger.warn(\n `TunnelProxy: local gateway auto-pairing disabled because current OpenClaw runtime does not expose device bootstrap SDK (${formatErrorMessage(err)})`,\n );\n }\n return null;\n });\n }\n\n const approveDevicePairing = await approveDevicePairingPromise;\n if (!approveDevicePairing && !approveDevicePairingWarned) {\n approveDevicePairingWarned = true;\n logger.warn(\n \"TunnelProxy: local gateway auto-pairing disabled because current OpenClaw runtime does not expose device bootstrap SDK\",\n );\n }\n return approveDevicePairing;\n}\n\n/**\n * 透明代理:接收 Relay 转发的请求帧,代理到本地 gateway,回传响应帧。\n * 支持 HTTP 请求代理和 WebSocket 连接代理。\n */\nexport class TunnelProxy {\n /** 到本地 Gateway 的持久 RPC WebSocket 连接 */\n private gatewayWs: WebSocket | null = null;\n private gatewayWsConnecting = false;\n /** 握手是否已完成(收到 hello-ok) */\n private gatewayWsReady = false;\n /** 收到本地自动配对成功后,在 close 回调里触发重连 */\n private gatewayWsReconnectRequested = false;\n /** 本地自动配对审批进行中,期间 Gateway 关闭连接时先保留 pending 请求。 */\n private gatewayWsPairingApprovalPending = false;\n /** 防止配对失败时无限重连 */\n private gatewayWsAutoPairingApprovals = 0;\n /** 等待 Gateway WS 握手完成后发送的帧队列 */\n private gatewayWsPending: PendingGatewayPayload[] = [];\n /** 记录已转发到 Gateway 的 req 元信息,便于回包时做定向处理。 */\n private gatewayReqMetaById = new Map<string, PendingGatewayReqMeta>();\n /** 最近由用户手动中断的 chat.run,用于过滤 runtime 误补发的 synthetic failure。 */\n private recentAbortedChatRuns = new Map<string, RecentAbortedChatRun>();\n /** Relay 断开或服务停止时要中断的 HTTP 代理请求。 */\n private httpAbortControllers = new Map<string, AbortController>();\n\n /** 设备身份,用于 Gateway connect 握手 */\n private deviceIdentity: DeviceIdentity;\n\n private readonly stateDir: string;\n private readonly hostStateDir: string;\n private readonly wsProxy: WsProxy;\n\n constructor(private readonly opts: ProxyOptions) {\n this.stateDir = resolveClientStateDir(opts.stateDir);\n this.hostStateDir = opts.hostStateDir ?? resolveHostStateDir();\n this.deviceIdentity = loadOrCreateDeviceIdentity(this.stateDir);\n opts.logger.info(\n `TunnelProxy: loaded device identity (deviceId=${this.deviceIdentity.deviceId})`,\n );\n this.wsProxy = new WsProxy({\n gatewayBaseUrl: opts.gatewayBaseUrl,\n client: opts.client,\n logger: opts.logger,\n });\n }\n\n // ─── Frame dispatcher ───\n\n /** 处理从 Relay 收到的入站帧 */\n async handleFrame(frame: InboundFrame): Promise<void> {\n this.opts.logger.info(\n `TunnelProxy: handling frame type=${frame.type}, id=${\"id\" in frame ? frame.id : \"N/A\"}`,\n );\n switch (frame.type) {\n case \"request\":\n await this.handleRequestFrame(frame);\n break;\n case \"req\":\n this.handleReqFrame(frame);\n break;\n case \"ws_open\":\n this.wsProxy.handleWsOpen(frame);\n break;\n case \"ws_data\":\n this.wsProxy.handleWsData(frame);\n break;\n case \"ws_close\":\n this.wsProxy.handleWsClose(frame);\n break;\n default:\n this.opts.logger.warn(\n `TunnelProxy: unknown frame type=\"${(frame as any).type}\", id=${\"id\" in frame ? (frame as any).id : \"N/A\"}, forwarding raw to gateway`,\n );\n // 未知帧类型也尝试通过 RPC WS 转发,避免静默丢弃\n this.forwardRawToGateway(JSON.stringify(frame));\n break;\n }\n }\n\n /** 清理所有代理的 WebSocket 连接 */\n cleanup(): void {\n this.opts.logger.info(\n `TunnelProxy: cleanup, closing ${this.wsProxy.activeCount} active WS connections, gatewayWs=${!!this.gatewayWs}`,\n );\n this.wsProxy.cleanup();\n for (const [id, controller] of this.httpAbortControllers) {\n this.opts.logger.info(`TunnelProxy: aborting HTTP proxy id=${id}`);\n controller.abort();\n }\n this.httpAbortControllers.clear();\n\n const gatewayWs = this.gatewayWs;\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n this.gatewayWsConnecting = false;\n this.gatewayWsReconnectRequested = false;\n this.gatewayWsPairingApprovalPending = false;\n this.gatewayWsAutoPairingApprovals = 0;\n this.gatewayWsPending = [];\n this.gatewayReqMetaById.clear();\n this.recentAbortedChatRuns.clear();\n if (gatewayWs) {\n try {\n gatewayWs.close();\n } catch {\n // ignore\n }\n }\n }\n\n // ─── Gateway RPC WebSocket ───\n\n private async handleRequestFrame(frame: RequestFrame): Promise<void> {\n const controller = new AbortController();\n this.httpAbortControllers.set(frame.id, controller);\n try {\n await handleHttpRequest(\n {\n ...this.opts,\n abortSignal: controller.signal,\n },\n frame,\n );\n } finally {\n this.httpAbortControllers.delete(frame.id);\n }\n }\n\n private pushGatewayPending(\n entry: PendingGatewayPayload,\n reason: string,\n ): boolean {\n if (this.gatewayWsPending.length >= MAX_GATEWAY_WS_PENDING) {\n this.opts.logger.error(\n `TunnelProxy: gateway WS pending queue overflow (${this.gatewayWsPending.length}/${MAX_GATEWAY_WS_PENDING}); failing ${entry.reqId ? `req id=${entry.reqId}` : \"raw frame\"}`,\n );\n this.failGatewayPendingEntry(\n entry,\n \"GATEWAY_RPC_QUEUE_FULL\",\n \"local gateway RPC queue is full\",\n );\n return false;\n }\n\n this.gatewayWsPending.push(entry);\n this.opts.logger.info(\n `TunnelProxy: gateway WS pending queue size=${this.gatewayWsPending.length} (${reason})`,\n );\n return true;\n }\n\n /** 将未知帧原样转发到 Gateway WS */\n private forwardRawToGateway(payload: string): void {\n if (this.gatewayWsReady && this.gatewayWs?.readyState === WebSocket.OPEN) {\n this.sendGatewayPayload(this.gatewayWs, { payload }, \"raw frame\");\n } else {\n if (\n this.pushGatewayPending(\n { payload },\n \"raw frame queued before gateway WS ready\",\n )\n ) {\n this.ensureGatewayWs();\n }\n }\n }\n\n /** 处理 Relay 转发的 Gateway RPC 请求帧,原样通过 WebSocket 发给本地 Gateway */\n private handleReqFrame(frame: ReqFrame): void {\n const payload = JSON.stringify(frame);\n this.gatewayReqMetaById.set(frame.id, {\n method: frame.method,\n sessionKey: this.normalizeSessionKey(frame.params?.sessionKey),\n });\n this.opts.logger.info(\n `TunnelProxy: req id=${frame.id} method=${frame.method} → gateway WS (${payload.length} chars)`,\n );\n\n if (this.gatewayWsReady && this.gatewayWs?.readyState === WebSocket.OPEN) {\n this.sendGatewayPayload(\n this.gatewayWs,\n { payload, reqId: frame.id },\n `req id=${frame.id}`,\n );\n } else {\n this.opts.logger.info(\n `TunnelProxy: req id=${frame.id} queued, gateway WS not ready yet`,\n );\n if (\n this.pushGatewayPending(\n { payload, reqId: frame.id },\n `req id=${frame.id} queued before gateway WS handshake`,\n )\n ) {\n this.ensureGatewayWs();\n }\n }\n }\n\n private sendGatewayRpcError(\n id: string,\n code: string,\n message: string,\n ): void {\n this.gatewayReqMetaById.delete(id);\n this.opts.client.sendRaw(\n JSON.stringify({\n type: \"res\",\n id,\n ok: false,\n error: {\n code,\n message,\n },\n }),\n );\n }\n\n private failGatewayPendingEntry(\n entry: PendingGatewayPayload,\n code: string,\n message: string,\n ): void {\n if (!entry.reqId) return;\n this.sendGatewayRpcError(entry.reqId, code, message);\n }\n\n private failGatewayPending(code: string, message: string): void {\n if (this.gatewayWsPending.length === 0) return;\n const pending = this.gatewayWsPending;\n this.gatewayWsPending = [];\n this.opts.logger.warn(\n `TunnelProxy: failing ${pending.length} pending gateway RPC frame(s): ${message}`,\n );\n for (const entry of pending) {\n this.failGatewayPendingEntry(entry, code, message);\n }\n }\n\n private failGatewayInflight(code: string, message: string): void {\n if (this.gatewayReqMetaById.size === 0) return;\n const ids = [...this.gatewayReqMetaById.keys()];\n this.opts.logger.warn(\n `TunnelProxy: failing ${ids.length} in-flight gateway RPC request(s): ${message}`,\n );\n for (const id of ids) {\n this.sendGatewayRpcError(id, code, message);\n }\n }\n\n private failAllGatewayRequests(code: string, message: string): void {\n this.failGatewayPending(code, message);\n this.failGatewayInflight(code, message);\n }\n\n private sendGatewayPayload(\n ws: WebSocket,\n entry: PendingGatewayPayload,\n context: string,\n ): boolean {\n try {\n ws.send(entry.payload);\n return true;\n } catch (err) {\n const message = formatErrorMessage(err);\n this.opts.logger.warn(\n `TunnelProxy: RPC WS send failed for ${context}: ${message}`,\n );\n this.failGatewayPendingEntry(\n entry,\n \"GATEWAY_RPC_SEND_FAILED\",\n `local gateway RPC send failed: ${message}`,\n );\n this.failGatewayInflight(\n \"GATEWAY_RPC_SEND_FAILED\",\n \"local gateway RPC connection closed after send failure\",\n );\n if (this.gatewayWs === ws) {\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n this.gatewayWsConnecting = false;\n }\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n } else {\n ws.close();\n }\n } catch {\n // ignore\n }\n return false;\n }\n }\n\n // ─── Gateway connect auth helpers ───\n\n private resolveGatewayConnectAuth():\n | { token?: string; password?: string }\n | undefined {\n const token = this.opts.gatewayToken?.trim() || undefined;\n const password = this.opts.gatewayPassword?.trim() || undefined;\n if (!token && !password) return undefined;\n return { token, password };\n }\n\n private loadStoredDeviceToken(role: string): string | undefined {\n return (\n loadDeviceAuthToken({\n stateDir: this.stateDir,\n deviceId: this.deviceIdentity.deviceId,\n role,\n })?.token ?? undefined\n );\n }\n\n private buildGatewayConnectAuth(role: string): {\n auth?: { token?: string; deviceToken?: string; password?: string };\n authToken?: string;\n authPassword?: string;\n deviceToken?: string;\n } {\n const explicitAuth = this.resolveGatewayConnectAuth();\n const authPassword = explicitAuth?.password?.trim() || undefined;\n const explicitGatewayToken = explicitAuth?.token?.trim() || undefined;\n const deviceToken = explicitGatewayToken\n ? undefined\n : this.loadStoredDeviceToken(role);\n const authToken = explicitGatewayToken ?? deviceToken;\n const auth =\n authToken || authPassword || deviceToken\n ? { token: authToken, deviceToken, password: authPassword }\n : undefined;\n return { auth, authToken, authPassword, deviceToken };\n }\n\n private storeIssuedDeviceToken(params: {\n fallbackRole: string;\n fallbackScopes: string[];\n authInfo: any;\n }): void {\n const token = params.authInfo?.deviceToken;\n if (typeof token !== \"string\" || !token.trim()) return;\n const role =\n typeof params.authInfo?.role === \"string\" && params.authInfo.role.trim()\n ? params.authInfo.role.trim()\n : params.fallbackRole;\n const scopes = Array.isArray(params.authInfo?.scopes)\n ? params.authInfo.scopes.filter(\n (scope: unknown): scope is string =>\n typeof scope === \"string\" && !!scope.trim(),\n )\n : params.fallbackScopes;\n storeDeviceAuthToken({\n stateDir: this.stateDir,\n deviceId: this.deviceIdentity.deviceId,\n role,\n token: token.trim(),\n scopes,\n });\n }\n\n private maybeClearStoredDeviceTokenOnMismatch(code: number, reason: string): void {\n const explicitAuth = this.resolveGatewayConnectAuth();\n if (explicitAuth?.token || explicitAuth?.password) return;\n if (code !== 1008 || !reason.toLowerCase().includes(\"device token mismatch\")) return;\n clearDeviceAuthToken({\n stateDir: this.stateDir,\n deviceId: this.deviceIdentity.deviceId,\n role: \"operator\",\n });\n this.opts.logger.warn(\n `TunnelProxy: cleared stale stored device token after gateway mismatch (deviceId=${this.deviceIdentity.deviceId})`,\n );\n }\n\n private async maybeAutoApproveGatewayPairing(frame: any): Promise<boolean> {\n const errorCode =\n typeof frame?.error?.code === \"string\" ? frame.error.code : undefined;\n const detailsCode =\n typeof frame?.error?.details?.code === \"string\"\n ? frame.error.details.code\n : undefined;\n if (errorCode !== \"NOT_PAIRED\" && detailsCode !== \"PAIRING_REQUIRED\") {\n return false;\n }\n\n const requestId =\n typeof frame?.error?.details?.requestId === \"string\"\n ? frame.error.details.requestId.trim()\n : \"\";\n const reason =\n typeof frame?.error?.details?.reason === \"string\"\n ? frame.error.details.reason.trim()\n : \"\";\n\n if (!requestId) {\n this.opts.logger.warn(\n \"TunnelProxy: gateway pairing required but requestId missing; unable to auto-approve\",\n );\n return false;\n }\n\n if (\n reason &&\n reason !== \"not-paired\" &&\n reason !== \"scope-upgrade\"\n ) {\n this.opts.logger.warn(\n `TunnelProxy: gateway pairing required with unsupported reason=${reason}; skipping auto-approve`,\n );\n return false;\n }\n\n if (this.gatewayWsAutoPairingApprovals >= MAX_AUTO_PAIRING_APPROVALS) {\n this.opts.logger.warn(\n `TunnelProxy: reached auto-pairing retry limit (${MAX_AUTO_PAIRING_APPROVALS}); requestId=${requestId}`,\n );\n return false;\n }\n\n this.gatewayWsPairingApprovalPending = true;\n try {\n const approveDevicePairing = await loadApproveDevicePairing(this.opts.logger);\n if (!approveDevicePairing) {\n this.gatewayWsPairingApprovalPending = false;\n return false;\n }\n const approved = await approveDevicePairing(requestId, this.hostStateDir);\n if (!approved) {\n this.gatewayWsPairingApprovalPending = false;\n this.opts.logger.warn(\n `TunnelProxy: gateway pairing request ${requestId} not found in host state ${this.hostStateDir}`,\n );\n return false;\n }\n this.gatewayWsAutoPairingApprovals += 1;\n this.gatewayWsReconnectRequested = true;\n this.gatewayWsPairingApprovalPending = false;\n this.opts.logger.info(\n `TunnelProxy: auto-approved local gateway pairing request ${requestId} (reason=${reason || \"not-paired\"}, hostStateDir=${this.hostStateDir}, approval=${this.gatewayWsAutoPairingApprovals}/${MAX_AUTO_PAIRING_APPROVALS})`,\n );\n return true;\n } catch (err: any) {\n this.gatewayWsPairingApprovalPending = false;\n this.opts.logger.warn(\n `TunnelProxy: failed to auto-approve gateway pairing request ${requestId}: ${err?.message ?? String(err)}`,\n );\n return false;\n }\n }\n\n // ─── Gateway RPC WebSocket lifecycle ───\n\n private normalizeSessionKey(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n }\n\n private normalizeRunId(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n }\n\n private pruneRecentAbortedChatRuns(now = Date.now()): void {\n for (const [runId, entry] of this.recentAbortedChatRuns) {\n if (now - entry.abortedAtMs > RECENT_ABORTED_CHAT_RUN_TTL_MS) {\n this.recentAbortedChatRuns.delete(runId);\n }\n }\n }\n\n private rememberRecentAbortedChatRun(runId: unknown, sessionKey: unknown): void {\n const normalizedRunId = this.normalizeRunId(runId);\n const normalizedSessionKey = this.normalizeSessionKey(sessionKey);\n if (!normalizedRunId || !normalizedSessionKey) return;\n this.pruneRecentAbortedChatRuns();\n this.recentAbortedChatRuns.set(normalizedRunId, {\n sessionKey: normalizedSessionKey,\n abortedAtMs: Date.now(),\n });\n }\n\n private getAssistantMessageText(message: any): string {\n if (!message || typeof message !== \"object\") return \"\";\n if (typeof message.text === \"string\") return message.text;\n if (!Array.isArray(message.content)) return \"\";\n return message.content\n .filter(\n (item: any) =>\n item &&\n typeof item === \"object\" &&\n item.type === \"text\" &&\n typeof item.text === \"string\",\n )\n .map((item: any) => item.text)\n .join(\"\");\n }\n\n private looksLikeSyntheticAbortFailureText(text: string): boolean {\n const normalized = text.trim().toLowerCase();\n if (!normalized) return false;\n return (\n normalized.includes(\"agent failed before reply:\") &&\n normalized.includes(\"aborted\") &&\n normalized.includes(\"openclaw logs --follow\")\n );\n }\n\n private isSyntheticAbortHistoryMessage(\n message: any,\n sessionKey: string,\n ): boolean {\n const text = this.getAssistantMessageText(message);\n if (!this.looksLikeSyntheticAbortFailureText(text)) return false;\n const messageTimestamp =\n typeof message?.timestamp === \"number\" ? message.timestamp : null;\n const now = Date.now();\n this.pruneRecentAbortedChatRuns(now);\n for (const entry of this.recentAbortedChatRuns.values()) {\n if (entry.sessionKey !== sessionKey) continue;\n if (messageTimestamp === null) return true;\n if (Math.abs(messageTimestamp - entry.abortedAtMs) <= RECENT_ABORTED_CHAT_RUN_TTL_MS) {\n return true;\n }\n }\n return false;\n }\n\n private maybeRewriteGatewayFrame(text: string, frame: any): string | null {\n this.pruneRecentAbortedChatRuns();\n\n if (\n frame?.type === \"event\" &&\n frame?.event === \"chat\" &&\n frame?.payload?.state === \"aborted\"\n ) {\n this.rememberRecentAbortedChatRun(\n frame.payload?.runId,\n frame.payload?.sessionKey,\n );\n return text;\n }\n\n if (frame?.type === \"ack\" && frame?.ok === false && typeof frame?.id === \"string\") {\n this.gatewayReqMetaById.delete(frame.id);\n return text;\n }\n\n let reqMeta: PendingGatewayReqMeta | undefined;\n if (frame?.type === \"res\" && typeof frame?.id === \"string\") {\n reqMeta = this.gatewayReqMetaById.get(frame.id);\n this.gatewayReqMetaById.delete(frame.id);\n }\n\n if (\n frame?.type === \"res\" &&\n frame?.ok === true &&\n reqMeta?.method === \"chat.abort\"\n ) {\n const runIds = Array.isArray(frame?.payload?.runIds)\n ? frame.payload.runIds\n : [];\n for (const runId of runIds) {\n this.rememberRecentAbortedChatRun(runId, reqMeta.sessionKey);\n }\n return text;\n }\n\n if (\n frame?.type === \"event\" &&\n frame?.event === \"chat\" &&\n frame?.payload?.state === \"final\"\n ) {\n const runId = this.normalizeRunId(frame?.payload?.runId);\n const assistantText = this.getAssistantMessageText(frame?.payload?.message);\n const recentAbort = runId ? this.recentAbortedChatRuns.get(runId) : undefined;\n if (\n recentAbort &&\n this.looksLikeSyntheticAbortFailureText(assistantText)\n ) {\n this.opts.logger.info(\n `TunnelProxy: suppressing synthetic abort failure final for runId=${runId}`,\n );\n return null;\n }\n return text;\n }\n\n if (\n frame?.type === \"res\" &&\n frame?.ok === true &&\n reqMeta?.method === \"chat.history\" &&\n Array.isArray(frame?.payload?.messages)\n ) {\n const sessionKey =\n this.normalizeSessionKey(frame?.payload?.sessionKey) ?? reqMeta.sessionKey;\n if (!sessionKey) return text;\n const filteredMessages = frame.payload.messages.filter(\n (message: any) =>\n !this.isSyntheticAbortHistoryMessage(message, sessionKey),\n );\n if (filteredMessages.length === frame.payload.messages.length) {\n return text;\n }\n this.opts.logger.info(\n `TunnelProxy: removed ${frame.payload.messages.length - filteredMessages.length} synthetic abort history message(s) for session=${sessionKey}`,\n );\n return JSON.stringify({\n ...frame,\n payload: {\n ...frame.payload,\n messages: filteredMessages,\n },\n });\n }\n\n return text;\n }\n\n /** 确保到本地 Gateway 的 RPC WebSocket 已连接且握手完成 */\n private ensureGatewayWs(): void {\n if (this.gatewayWsReady && this.gatewayWs?.readyState === WebSocket.OPEN)\n return;\n if (this.gatewayWsConnecting) return;\n\n this.gatewayWsConnecting = true;\n this.gatewayWsReady = false;\n const wsUrl = this.opts.gatewayBaseUrl.replace(/^http/, \"ws\");\n\n this.opts.logger.info(\n `TunnelProxy: RPC WS connecting to gateway ${wsUrl} (pending=${this.gatewayWsPending.length})`,\n );\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(wsUrl, {\n handshakeTimeout: GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS,\n });\n } catch (err) {\n const message = formatErrorMessage(err);\n this.gatewayWsConnecting = false;\n this.opts.logger.error(\n `TunnelProxy: RPC WS failed to create gateway connection: ${message}`,\n );\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_CONNECT_FAILED\",\n `local gateway RPC connect failed: ${message}`,\n );\n return;\n }\n\n this.gatewayWs = ws;\n let handshakeTimer: ReturnType<typeof setTimeout> | null = setTimeout(\n () => {\n handshakeTimer = null;\n if (this.gatewayWs !== ws || this.gatewayWsReady) return;\n this.opts.logger.warn(\n `TunnelProxy: RPC WS handshake timed out after ${GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS}ms (pending=${this.gatewayWsPending.length})`,\n );\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n this.gatewayWsConnecting = false;\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_HANDSHAKE_TIMEOUT\",\n \"local gateway RPC handshake timed out\",\n );\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n } else {\n ws.close();\n }\n } catch {\n // ignore\n }\n },\n GATEWAY_RPC_HANDSHAKE_TIMEOUT_MS,\n );\n\n const clearHandshakeTimer = () => {\n if (handshakeTimer) {\n clearTimeout(handshakeTimer);\n handshakeTimer = null;\n }\n };\n\n ws.on(\"open\", () => {\n this.opts.logger.info(\n `TunnelProxy: RPC WS tcp connected, waiting for connect.challenge (pending=${this.gatewayWsPending.length})`,\n );\n });\n\n ws.on(\"message\", async (data: WebSocket.RawData) => {\n let text: string;\n if (typeof data === \"string\") {\n text = data;\n } else if (Buffer.isBuffer(data)) {\n text = data.toString();\n } else {\n text = Buffer.from(data as ArrayBuffer).toString();\n }\n\n const preview = text.length <= 500 ? text : text.substring(0, 500) + \"…\";\n this.opts.logger.info(\n `TunnelProxy: RPC WS ← gateway (${text.length} chars): ${preview}`,\n );\n\n let frame: any;\n try {\n frame = JSON.parse(text);\n } catch {\n this.opts.logger.warn(\n \"TunnelProxy: RPC WS received non-JSON, ignoring\",\n );\n return;\n }\n\n // 1) 收到 connect.challenge → 回复 connect 请求(带设备身份签名)\n if (frame.type === \"event\" && frame.event === \"connect.challenge\") {\n this.handleConnectChallenge(ws, frame);\n return;\n }\n\n // 2) 收到 connect 的 hello-ok 响应 → 握手完成,flush 待发帧\n if (\n frame.type === \"res\" &&\n frame.ok === true &&\n frame.payload?.type === \"hello-ok\"\n ) {\n clearHandshakeTimer();\n this.storeIssuedDeviceToken({\n fallbackRole: \"operator\",\n fallbackScopes: [...GATEWAY_OPERATOR_SCOPES],\n authInfo: frame.payload?.auth,\n });\n this.gatewayWsAutoPairingApprovals = 0;\n this.gatewayWsReconnectRequested = false;\n this.gatewayWsReady = true;\n this.gatewayWsConnecting = false;\n this.opts.logger.info(\n `TunnelProxy: RPC WS handshake done (hello-ok), flushing ${this.gatewayWsPending.length} pending frames`,\n );\n const pending = this.gatewayWsPending;\n this.gatewayWsPending = [];\n for (let i = 0; i < pending.length; i++) {\n const entry = pending[i];\n if (!this.sendGatewayPayload(ws, entry, entry.reqId ?? \"pending frame\")) {\n return;\n }\n }\n return;\n }\n\n // 3) 收到 connect 失败响应 → 关闭连接\n if (frame.type === \"res\" && frame.ok === false && !this.gatewayWsReady) {\n const autoApproved = await this.maybeAutoApproveGatewayPairing(frame);\n if (autoApproved) {\n const wsAlreadyClosed =\n ws.readyState === WebSocket.CLOSING ||\n ws.readyState === WebSocket.CLOSED ||\n this.gatewayWs !== ws;\n this.opts.logger.info(\n `TunnelProxy: RPC WS handshake requested local pairing approval, reconnecting${wsAlreadyClosed ? \" immediately\" : \" after close\"} (pending=${this.gatewayWsPending.length})`,\n );\n if (wsAlreadyClosed) {\n this.gatewayWsReconnectRequested = false;\n this.ensureGatewayWs();\n return;\n }\n ws.close(1000, \"pairing approved, reconnecting\");\n return;\n }\n this.opts.logger.error(\n `TunnelProxy: RPC WS handshake failed (pending=${this.gatewayWsPending.length}): ${previewText(JSON.stringify(frame.error), 500)}`,\n );\n clearHandshakeTimer();\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_HANDSHAKE_FAILED\",\n `local gateway RPC handshake failed: ${previewText(JSON.stringify(frame.error), 500)}`,\n );\n ws.close();\n return;\n }\n\n // 4) 握手后的普通消息 → 透传回 Relay\n const rewritten = this.maybeRewriteGatewayFrame(text, frame);\n if (rewritten !== null) {\n this.opts.client.sendRaw(rewritten);\n }\n });\n\n ws.on(\"close\", (code: number, reason: Buffer) => {\n clearHandshakeTimer();\n const wasReady = this.gatewayWsReady;\n const pendingCount = this.gatewayWsPending.length;\n const reasonText = reason.toString();\n const shouldReconnect =\n this.gatewayWsReconnectRequested && pendingCount > 0;\n const shouldHoldForPairing =\n this.gatewayWsPairingApprovalPending && pendingCount > 0;\n this.opts.logger.info(\n `TunnelProxy: RPC WS closed by gateway (code=${code}, reason=${reasonText}, ready=${wasReady}, pending=${pendingCount}, activeWs=${this.wsProxy.activeCount})`,\n );\n if (this.gatewayWs === ws) {\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n }\n this.gatewayWsConnecting = false;\n this.maybeClearStoredDeviceTokenOnMismatch(code, reasonText);\n if (shouldReconnect) {\n this.gatewayWsReconnectRequested = false;\n this.opts.logger.info(\n `TunnelProxy: retrying RPC WS after local pairing approval (pending=${this.gatewayWsPending.length})`,\n );\n queueMicrotask(() => this.ensureGatewayWs());\n } else if (\n !shouldHoldForPairing &&\n (pendingCount > 0 || this.gatewayReqMetaById.size > 0)\n ) {\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_DISCONNECTED\",\n `local gateway RPC disconnected: code=${code}, reason=${reasonText}`,\n );\n }\n });\n\n ws.on(\"error\", (err: Error) => {\n clearHandshakeTimer();\n this.opts.logger.warn(\n `TunnelProxy: RPC WS error: ${err.message} (ready=${this.gatewayWsReady}, pending=${this.gatewayWsPending.length}, activeWs=${this.wsProxy.activeCount})`,\n );\n const shouldFailRequests =\n this.gatewayWs === ws &&\n (this.gatewayWsPending.length > 0 || this.gatewayReqMetaById.size > 0);\n this.gatewayWsConnecting = false;\n if (this.gatewayWs === ws) {\n this.gatewayWs = null;\n this.gatewayWsReady = false;\n }\n if (shouldFailRequests) {\n this.failAllGatewayRequests(\n \"GATEWAY_RPC_ERROR\",\n `local gateway RPC error: ${err.message}`,\n );\n }\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n }\n } catch {\n // ignore\n }\n });\n }\n\n private handleConnectChallenge(ws: WebSocket, frame: any): void {\n const challengeNonce: string = frame.payload?.nonce ?? \"\";\n const connectRequestId = `tunnel-connect-${randomUUID()}`;\n const role = \"operator\";\n const scopes = [...GATEWAY_OPERATOR_SCOPES];\n const gatewayConnectAuth = this.buildGatewayConnectAuth(role);\n this.opts.logger.info(\n `TunnelProxy: received connect.challenge (nonce=${challengeNonce}, connectReqId=${connectRequestId}, hasToken=${!!gatewayConnectAuth.authToken}, hasPassword=${!!gatewayConnectAuth.authPassword}, hasDeviceToken=${!!gatewayConnectAuth.deviceToken}), sending connect request with device identity`,\n );\n\n const signedAtMs = Date.now();\n const clientId = \"gateway-client\";\n const clientMode = \"backend\";\n\n const authPayload = buildDeviceAuthPayload({\n deviceId: this.deviceIdentity.deviceId,\n clientId,\n clientMode,\n role,\n scopes,\n signedAtMs,\n token: gatewayConnectAuth.authToken ?? null,\n nonce: challengeNonce,\n });\n const signature = signDevicePayload(\n this.deviceIdentity.privateKeyPem,\n authPayload,\n );\n\n const connectReq = {\n type: \"req\",\n id: connectRequestId,\n method: \"connect\",\n params: {\n minProtocol: GATEWAY_RPC_MIN_PROTOCOL,\n maxProtocol: GATEWAY_RPC_MAX_PROTOCOL,\n client: {\n id: clientId,\n version: \"1.0.0\",\n platform: process.platform,\n mode: clientMode,\n instanceId: RELAY_TUNNEL_GATEWAY_CLIENT_INSTANCE_ID,\n },\n role,\n scopes,\n ...(gatewayConnectAuth.auth ? { auth: gatewayConnectAuth.auth } : {}),\n device: {\n id: this.deviceIdentity.deviceId,\n publicKey: publicKeyRawBase64UrlFromPem(\n this.deviceIdentity.publicKeyPem,\n ),\n signature,\n signedAt: signedAtMs,\n nonce: challengeNonce,\n },\n },\n };\n ws.send(JSON.stringify(connectReq));\n }\n}\n",
|
|
81
|
+
"import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { resolveStateDir } from \"../host.js\";\n\n// ─── Types ───\n\nexport interface DeviceIdentity {\n deviceId: string;\n publicKeyPem: string;\n privateKeyPem: string;\n}\n\nexport interface DeviceAuthEntry {\n token: string;\n role: string;\n scopes: string[];\n updatedAtMs: number;\n}\n\ninterface DeviceAuthStore {\n version: 1;\n deviceId: string;\n tokens: Record<string, DeviceAuthEntry>;\n}\n\n// ─── Crypto helpers ───\n\nconst ED25519_SPKI_PREFIX = Buffer.from(\"302a300506032b6570032100\", \"hex\");\n\nexport function base64UrlEncode(buf: Buffer): string {\n return buf\n .toString(\"base64\")\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/g, \"\");\n}\n\nexport function derivePublicKeyRaw(publicKeyPem: string): Buffer {\n const spki = crypto.createPublicKey(publicKeyPem).export({\n type: \"spki\",\n format: \"der\",\n });\n if (\n spki.length === ED25519_SPKI_PREFIX.length + 32 &&\n spki.subarray(0, ED25519_SPKI_PREFIX.length).equals(ED25519_SPKI_PREFIX)\n )\n return spki.subarray(ED25519_SPKI_PREFIX.length);\n return spki;\n}\n\nexport function fingerprintPublicKey(publicKeyPem: string): string {\n const raw = derivePublicKeyRaw(publicKeyPem);\n return crypto.createHash(\"sha256\").update(raw).digest(\"hex\");\n}\n\nexport function publicKeyRawBase64UrlFromPem(publicKeyPem: string): string {\n return base64UrlEncode(derivePublicKeyRaw(publicKeyPem));\n}\n\nexport function signDevicePayload(privateKeyPem: string, payload: string): string {\n const key = crypto.createPrivateKey(privateKeyPem);\n return base64UrlEncode(crypto.sign(null, Buffer.from(payload, \"utf8\"), key));\n}\n\nexport function buildDeviceAuthPayload(params: {\n deviceId: string;\n clientId: string;\n clientMode: string;\n role: string;\n scopes: string[];\n signedAtMs: number;\n token: string | null;\n nonce: string;\n}): string {\n const scopes = params.scopes.join(\",\");\n const token = params.token ?? \"\";\n return [\n \"v2\",\n params.deviceId,\n params.clientId,\n params.clientMode,\n params.role,\n scopes,\n String(params.signedAtMs),\n token,\n params.nonce,\n ].join(\"|\");\n}\n\n// ─── File I/O helpers ───\n\nexport function resolveClientStateDir(stateDir: string | undefined): string {\n return stateDir ?? resolveStateDir();\n}\n\nfunction ensureDir(filePath: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n}\n\nfunction resolveIdentityPath(stateDir: string): string {\n return path.join(stateDir, \"identity\", \"device.json\");\n}\n\nfunction normalizeDeviceAuthRole(role: string): string {\n return role.trim();\n}\n\nfunction normalizeDeviceAuthScopes(scopes: string[]): string[] {\n const out = new Set<string>();\n for (const scope of scopes) {\n const trimmed = scope.trim();\n if (trimmed) {\n out.add(trimmed);\n }\n }\n return [...out].sort();\n}\n\nfunction resolveDeviceAuthPath(stateDir: string): string {\n return path.join(stateDir, \"identity\", \"device-auth.json\");\n}\n\nfunction readDeviceAuthStore(filePath: string): DeviceAuthStore | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const raw = fs.readFileSync(filePath, \"utf8\");\n const parsed = JSON.parse(raw);\n if (parsed?.version !== 1 || typeof parsed.deviceId !== \"string\") return null;\n if (!parsed.tokens || typeof parsed.tokens !== \"object\") return null;\n return parsed as DeviceAuthStore;\n } catch {\n return null;\n }\n}\n\nfunction writeDeviceAuthStore(filePath: string, store: DeviceAuthStore): void {\n ensureDir(filePath);\n fs.writeFileSync(filePath, `${JSON.stringify(store, null, 2)}\\n`, {\n mode: 0o600,\n });\n try {\n fs.chmodSync(filePath, 0o600);\n } catch {\n // ignore chmod errors on unsupported filesystems\n }\n}\n\n// ─── Token CRUD ───\n\nexport function loadDeviceAuthToken(params: {\n stateDir: string;\n deviceId: string;\n role: string;\n}): DeviceAuthEntry | null {\n const store = readDeviceAuthStore(resolveDeviceAuthPath(params.stateDir));\n if (!store || store.deviceId !== params.deviceId) return null;\n const entry = store.tokens[normalizeDeviceAuthRole(params.role)];\n if (!entry || typeof entry.token !== \"string\") return null;\n return entry;\n}\n\nexport function storeDeviceAuthToken(params: {\n stateDir: string;\n deviceId: string;\n role: string;\n token: string;\n scopes: string[];\n}): DeviceAuthEntry {\n const filePath = resolveDeviceAuthPath(params.stateDir);\n const existing = readDeviceAuthStore(filePath);\n const role = normalizeDeviceAuthRole(params.role);\n const next: DeviceAuthStore = {\n version: 1,\n deviceId: params.deviceId,\n tokens:\n existing && existing.deviceId === params.deviceId && existing.tokens\n ? { ...existing.tokens }\n : {},\n };\n const entry: DeviceAuthEntry = {\n token: params.token,\n role,\n scopes: normalizeDeviceAuthScopes(params.scopes),\n updatedAtMs: Date.now(),\n };\n next.tokens[role] = entry;\n writeDeviceAuthStore(filePath, next);\n return entry;\n}\n\nexport function clearDeviceAuthToken(params: {\n stateDir: string;\n deviceId: string;\n role: string;\n}): void {\n const filePath = resolveDeviceAuthPath(params.stateDir);\n const store = readDeviceAuthStore(filePath);\n if (!store || store.deviceId !== params.deviceId) return;\n const role = normalizeDeviceAuthRole(params.role);\n if (!store.tokens[role]) return;\n const next: DeviceAuthStore = {\n version: 1,\n deviceId: store.deviceId,\n tokens: { ...store.tokens },\n };\n delete next.tokens[role];\n writeDeviceAuthStore(filePath, next);\n}\n\n// ─── Identity lifecycle ───\n\nexport function loadOrCreateDeviceIdentity(stateDir: string): DeviceIdentity {\n const filePath = resolveIdentityPath(stateDir);\n try {\n if (fs.existsSync(filePath)) {\n const raw = fs.readFileSync(filePath, \"utf8\");\n const parsed = JSON.parse(raw);\n if (\n parsed?.version === 1 &&\n typeof parsed.deviceId === \"string\" &&\n typeof parsed.publicKeyPem === \"string\" &&\n typeof parsed.privateKeyPem === \"string\"\n ) {\n const derivedId = fingerprintPublicKey(parsed.publicKeyPem);\n return {\n deviceId: derivedId,\n publicKeyPem: parsed.publicKeyPem,\n privateKeyPem: parsed.privateKeyPem,\n };\n }\n }\n } catch {\n // fall through to generate\n }\n // Generate new identity\n const { publicKey, privateKey } = crypto.generateKeyPairSync(\"ed25519\");\n const publicKeyPem = publicKey\n .export({ type: \"spki\", format: \"pem\" })\n .toString();\n const privateKeyPem = privateKey\n .export({ type: \"pkcs8\", format: \"pem\" })\n .toString();\n const identity: DeviceIdentity = {\n deviceId: fingerprintPublicKey(publicKeyPem),\n publicKeyPem,\n privateKeyPem,\n };\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const stored = {\n version: 1,\n ...identity,\n createdAtMs: Date.now(),\n };\n ensureDir(filePath);\n fs.writeFileSync(filePath, `${JSON.stringify(stored, null, 2)}\\n`, {\n mode: 0o600,\n });\n return identity;\n}\n",
|
|
83
82
|
"import WebSocket from \"ws\";\nimport type { RelayClient } from \"./relay-client.js\";\nimport type { WsOpenFrame, WsDataFrame, WsCloseFrame } from \"./types.js\";\nimport { mapPath } from \"./http-proxy.js\";\n\nconst GATEWAY_WS_HANDSHAKE_TIMEOUT_MS = 10_000;\n\nexport interface WsProxyOptions {\n gatewayBaseUrl: string;\n client: RelayClient;\n logger: {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n };\n}\n\nexport class WsProxy {\n /** 活跃的 WebSocket 代理连接,按帧 id 索引 */\n private connections = new Map<string, WebSocket>();\n\n constructor(private readonly opts: WsProxyOptions) {}\n\n get activeCount(): number {\n return this.connections.size;\n }\n\n cleanup(): void {\n const connections = [...this.connections.entries()];\n this.connections.clear();\n for (const [id, ws] of connections) {\n this.opts.logger.info(`WsProxy: closing WS id=${id}`);\n try {\n ws.close();\n } catch {\n // ignore\n }\n }\n }\n\n handleWsOpen(frame: WsOpenFrame): void {\n const wsUrl =\n this.opts.gatewayBaseUrl.replace(/^http/, \"ws\") +\n mapPath(frame.path);\n this.opts.logger.info(\n `TunnelProxy: WS open id=${frame.id}, path=${frame.path} → ${wsUrl}`,\n );\n\n try {\n const existing = this.connections.get(frame.id);\n if (existing) {\n this.opts.logger.warn(\n `TunnelProxy: WS id=${frame.id} already exists, closing previous gateway connection`,\n );\n try {\n existing.close(1000, \"replaced by new relay ws_open\");\n } catch {\n // ignore\n }\n }\n\n const ws = new WebSocket(wsUrl, {\n headers: frame.headers,\n handshakeTimeout: GATEWAY_WS_HANDSHAKE_TIMEOUT_MS,\n });\n this.connections.set(frame.id, ws);\n\n let notifiedClosed = false;\n let connectTimer: ReturnType<typeof setTimeout> | null = setTimeout(\n () => {\n connectTimer = null;\n if (\n this.connections.get(frame.id) !== ws ||\n ws.readyState === WebSocket.OPEN\n ) {\n return;\n }\n this.opts.logger.warn(\n `TunnelProxy: WS id=${frame.id} connect timed out after ${GATEWAY_WS_HANDSHAKE_TIMEOUT_MS}ms`,\n );\n notifyClosed(1011, \"gateway websocket connect timeout\");\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n } else {\n ws.close();\n }\n } catch {\n // ignore\n }\n },\n GATEWAY_WS_HANDSHAKE_TIMEOUT_MS,\n );\n\n const clearConnectTimer = () => {\n if (connectTimer) {\n clearTimeout(connectTimer);\n connectTimer = null;\n }\n };\n\n const notifyClosed = (code: number, reason: string) => {\n if (notifiedClosed) return;\n notifiedClosed = true;\n clearConnectTimer();\n if (this.connections.get(frame.id) === ws) {\n this.connections.delete(frame.id);\n }\n this.opts.client.send({\n type: \"ws_close\",\n id: frame.id,\n code,\n reason,\n });\n };\n\n ws.on(\"open\", () => {\n clearConnectTimer();\n if (this.connections.get(frame.id) !== ws) {\n try {\n ws.close(1000, \"stale relay ws_open\");\n } catch {\n // ignore\n }\n return;\n }\n this.opts.logger.info(\n `TunnelProxy: WS id=${frame.id} connected to gateway, active=${this.connections.size}`,\n );\n this.opts.client.send({\n type: \"ws_opened\",\n id: frame.id,\n });\n });\n\n ws.on(\"message\", (data: WebSocket.RawData) => {\n if (this.connections.get(frame.id) !== ws) {\n return;\n }\n const text =\n typeof data === \"string\"\n ? data\n : Buffer.isBuffer(data)\n ? data.toString()\n : String(data);\n\n this.opts.logger.info(\n `TunnelProxy: WS id=${frame.id} ← gateway data (${text.length} chars): ${text.substring(0, 200)}`,\n );\n this.opts.client.send({\n type: \"ws_data\",\n id: frame.id,\n data: text,\n });\n });\n\n ws.on(\"close\", (code: number, reason: Buffer) => {\n clearConnectTimer();\n const reasonText = reason.toString();\n const isCurrent = this.connections.get(frame.id) === ws;\n if (isCurrent) {\n this.connections.delete(frame.id);\n }\n this.opts.logger.info(\n `TunnelProxy: WS id=${frame.id} closed by gateway (code=${code}, reason=${reasonText}), active=${this.connections.size}`,\n );\n if (isCurrent) {\n notifyClosed(code, reasonText);\n }\n });\n\n ws.on(\"error\", (err: Error) => {\n clearConnectTimer();\n this.opts.logger.warn(\n `TunnelProxy: WS id=${frame.id} error: ${err.message}, active=${this.connections.size}`,\n );\n if (this.connections.get(frame.id) === ws) {\n notifyClosed(1011, err.message);\n }\n try {\n if (typeof (ws as any).terminate === \"function\") {\n (ws as any).terminate();\n }\n } catch {\n // ignore\n }\n });\n } catch (err) {\n this.opts.logger.error(\n `TunnelProxy: WS id=${frame.id} failed to connect: ${err instanceof Error ? err.message : String(err)}`,\n );\n this.opts.client.send({\n type: \"ws_close\",\n id: frame.id,\n code: 1011,\n reason: `failed to connect: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n\n handleWsData(frame: WsDataFrame): void {\n const ws = this.connections.get(frame.id);\n if (ws?.readyState === WebSocket.OPEN) {\n this.opts.logger.info(\n `TunnelProxy: WS id=${frame.id} → gateway data (${frame.data.length} chars): ${frame.data.substring(0, 200)}`,\n );\n ws.send(frame.data);\n } else {\n this.opts.logger.warn(\n `TunnelProxy: WS id=${frame.id} data dropped, ws not open (exists=${!!ws}, readyState=${ws?.readyState ?? \"N/A\"})`,\n );\n }\n }\n\n handleWsClose(frame: WsCloseFrame): void {\n const ws = this.connections.get(frame.id);\n if (ws) {\n this.opts.logger.info(\n `TunnelProxy: WS id=${frame.id} close requested by relay (code=${frame.code ?? 1000}, reason=${frame.reason ?? \"\"})`,\n );\n this.connections.delete(frame.id);\n try {\n ws.close(frame.code ?? 1000, frame.reason ?? \"\");\n } catch {\n // ignore\n }\n } else {\n this.opts.logger.warn(\n `TunnelProxy: WS id=${frame.id} close requested but connection not found`,\n );\n }\n }\n}\n",
|
|
84
|
-
"/**\n *
|
|
83
|
+
"/**\n * 共享 src 适配层 —— CLI 与 openclaw 插件**共用** phone-notifications 的 `src/`。\n *\n * 跨包相对路径只在本文件出现,其余 CLI 代码从这里 import,避免到处写 `../../phone-notifications/...`。\n * 这些模块是纯函数/纯存储逻辑(不依赖 openclaw 宿主),Bun 构建时会被打进 CLI 产物。\n */\nexport {\n collectMatchingNotifications,\n matchesNotificationQuery,\n type NotificationQueryOptions,\n} from \"../../phone-notifications/src/cli/ntf-query.js\";\n\nexport type {\n StoredNotification,\n NotificationConversationType,\n} from \"../../phone-notifications/src/notification/storage.js\";\n\nexport {\n listDateKeysAsync,\n readDateFileAsync,\n matchesNotificationAppFilter,\n sortNotificationsByTimestampDesc,\n readRecordingIndex,\n daysAgo,\n today,\n formatDate,\n} from \"../../phone-notifications/src/cli/helpers.js\";\n\nexport type { CliRecordingEntry } from \"../../phone-notifications/src/cli/helpers.js\";\n\n// ── daemon 侧复用(接收手机推送 + 灯效规则 + 灯效校验)──\nexport { NotificationStorage } from \"../../phone-notifications/src/notification/storage.js\";\nexport { registerNotificationInterfaces } from \"../../phone-notifications/src/plugin/notifications.js\";\nexport { RecordingStorage } from \"../../phone-notifications/src/recording/storage.js\";\nexport { registerRecordingInterfaces } from \"../../phone-notifications/src/plugin/recordings.js\";\nexport { handleRecordingSync } from \"../../phone-notifications/src/recording/handler.js\";\nexport type { RecordingStatusEvent } from \"../../phone-notifications/src/recording/handler.js\";\nexport { validateAsrConfig } from \"../../phone-notifications/src/recording/asr.js\";\nexport type {\n AsrConfig,\n RecordingMetadata,\n} from \"../../phone-notifications/src/types.js\";\nexport { LightRuleRegistry } from \"../../phone-notifications/src/light-rules/registry.js\";\nexport { registerLightRulesGateway } from \"../../phone-notifications/src/light-rules/gateway.js\";\nexport {\n LIGHT_RULE_GATEWAY_METHODS,\n LIGHT_RULE_GATEWAY_METHOD_LIST,\n} from \"../../phone-notifications/src/light-rules/names.js\";\nexport { validateSegments } from \"../../phone-notifications/src/light/validators.js\";\nexport { normalizeRepeatTimes, assertAncsRepeatTimes } from \"../../phone-notifications/src/light/repeat.js\";\nexport type { LightSegment, PluginConfig, RawNotification } from \"../../phone-notifications/src/types.js\";\nexport { sendLightEffect } from \"../../phone-notifications/src/light/sender.js\";\nexport type { SendLightResult } from \"../../phone-notifications/src/light/sender.js\";\n\nimport presetsV1Raw from \"../../phone-notifications/src/light/presets-v1.json\";\nimport type { LightSegment as _LightSegment } from \"../../phone-notifications/src/types.js\";\n\nexport interface LightPreset {\n presetId: string;\n displayName: string;\n description: string;\n repeat_times: number;\n segments: _LightSegment[];\n}\n\n/** phone-notifications 共享的内置 preset 表(red-steady / red-breath / red-strobe-3 / green-* / blue-* / yellow-strobe-3)。 */\nexport const LIGHT_PRESETS_V1 = presetsV1Raw as {\n version: string;\n presets: LightPreset[];\n};\n\n// ── Relay 隧道:复用插件的连接逻辑(RelayClient 建连/心跳/重连 + TunnelProxy 反代到本地 HTTP)──\nexport { RelayClient } from \"../../phone-notifications/src/tunnel/relay-client.js\";\nexport type { TunnelStatusInfo } from \"../../phone-notifications/src/tunnel/relay-client.js\";\nexport { TunnelProxy } from \"../../phone-notifications/src/tunnel/proxy.js\";\nexport {\n currentClientLabel,\n getIngestContext,\n runWithIngestContext,\n type IngestContext,\n} from \"../../phone-notifications/src/ingest-context.js\";\nexport {\n RELAY_INTERNAL_HTTP_HEADER,\n mapPath as mapRelayHttpPath,\n} from \"../../phone-notifications/src/tunnel/http-proxy.js\";\n",
|
|
84
|
+
"/**\n * notification service —— search / summary / stats / storage-path + shortcuts。\n * 全部纯读磁盘(🟢),不需要 daemon。\n */\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { buildQueryOptions, queryNotifications, type RawQueryOpts } from \"../notification/query.js\";\nimport type { NotificationQueryOptions } from \"../shared.js\";\nimport { daysAgo, today, formatDate } from \"../shared.js\";\nimport type { StoredNotification } from \"../shared.js\";\n\nconst MAX_LIMIT = Number.MAX_SAFE_INTEGER;\n\nexport async function notificationSearch(\n ctx: CliContext,\n _args: unknown[],\n opts: RawQueryOpts,\n): Promise<unknown> {\n const options = buildQueryOptions(opts);\n return queryNotifications(ctx.paths, options);\n}\n\ninterface SummaryOpts extends RawQueryOpts {\n sample?: string;\n top?: string;\n}\n\nfunction topCounts(\n items: StoredNotification[],\n pick: (n: StoredNotification) => string | undefined,\n topN: number,\n): Array<{ key: string; count: number }> {\n const counts = new Map<string, number>();\n for (const item of items) {\n const key = pick(item);\n if (!key) continue;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return [...counts.entries()]\n .map(([key, count]) => ({ key, count }))\n .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key))\n .slice(0, topN);\n}\n\nexport async function notificationSummary(\n ctx: CliContext,\n _args: unknown[],\n opts: SummaryOpts,\n): Promise<unknown> {\n const sample = opts.sample ? Number(opts.sample) : 30;\n const top = opts.top ? Number(opts.top) : 10;\n const options = buildQueryOptions({ ...opts, limit: String(MAX_LIMIT) }, MAX_LIMIT);\n const items = await queryNotifications(ctx.paths, options);\n return {\n ok: true,\n total: items.length,\n range: { from: opts.from ?? null, to: opts.to ?? null },\n topApps: topCounts(items, (n) => n.appDisplayName || n.appName, top),\n topSenders: topCounts(items, (n) => n.senderName || n.title, top),\n sample: items.slice(0, sample),\n };\n}\n\ninterface StatsOpts {\n from?: string;\n to?: string;\n app?: string;\n client?: string;\n dim?: string;\n}\n\nconst HOUR_KEY = (n: StoredNotification): string =>\n String(new Date(n.timestamp).getHours()).padStart(2, \"0\");\n\nexport async function notificationStats(\n ctx: CliContext,\n _args: unknown[],\n opts: StatsOpts,\n): Promise<unknown> {\n const from = opts.from ?? daysAgo(7);\n const to = opts.to ?? today();\n const dim = opts.dim ?? \"all\";\n const allowed = [\"date\", \"app\", \"sender\", \"hour\", \"client\", \"all\"];\n if (!allowed.includes(dim)) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", `--dim 只能是 ${allowed.join(\"|\")}`);\n }\n const options: NotificationQueryOptions = {\n app: opts.app,\n client: opts.client,\n limit: MAX_LIMIT,\n fromTs: null,\n toTs: null,\n fromDateKey: from,\n toDateKey: to,\n };\n const items = await queryNotifications(ctx.paths, options);\n\n const byDate = topCounts(items, (n) => formatDate(new Date(n.timestamp)), MAX_LIMIT);\n const byApp = topCounts(items, (n) => n.appDisplayName || n.appName, MAX_LIMIT);\n const bySender = topCounts(items, (n) => n.senderName || n.title, MAX_LIMIT);\n const byHour = topCounts(items, HOUR_KEY, MAX_LIMIT);\n const byClient = topCounts(items, (n) => n.clientLabel ?? \"legacy\", MAX_LIMIT);\n\n const dims = { date: byDate, app: byApp, sender: bySender, hour: byHour, client: byClient };\n return {\n ok: true,\n total: items.length,\n range: { from, to },\n dim,\n ...(dim === \"all\" ? dims : { [dim]: dims[dim as keyof typeof dims] }),\n };\n}\n\nexport function notificationStoragePath(ctx: CliContext): unknown {\n return { ok: true, path: ctx.paths.notifications };\n}\n\nexport async function notificationToday(\n ctx: CliContext,\n _args: unknown[],\n opts: { client?: string } = {},\n): Promise<unknown> {\n const day = today();\n const options = buildQueryOptions({\n from: `${day}T00:00:00${tzOffset()}`,\n to: `${day}T23:59:59${tzOffset()}`,\n client: opts.client,\n limit: String(MAX_LIMIT),\n }, MAX_LIMIT);\n return queryNotifications(ctx.paths, options);\n}\n\nexport async function notificationRecent(\n ctx: CliContext,\n _args: unknown[],\n opts: { client?: string } = {},\n): Promise<unknown> {\n const fromTs = Date.now() - 60 * 60 * 1000;\n const options: NotificationQueryOptions = {\n limit: MAX_LIMIT,\n client: opts.client,\n fromTs,\n toTs: null,\n fromDateKey: formatDate(new Date(fromTs)),\n toDateKey: null,\n };\n return queryNotifications(ctx.paths, options);\n}\n\nexport function notificationUnread(): unknown {\n throw new YoooclawError(\n \"YOOOCLAW_NOT_IMPLEMENTED\",\n \"+unread 预留:需要先落地通知的已读状态模型\",\n );\n}\n\n/** 本地时区偏移,如 +08:00。 */\nfunction tzOffset(): string {\n const min = -new Date().getTimezoneOffset();\n const sign = min >= 0 ? \"+\" : \"-\";\n const abs = Math.abs(min);\n const hh = String(Math.floor(abs / 60)).padStart(2, \"0\");\n const mm = String(abs % 60).padStart(2, \"0\");\n return `${sign}${hh}:${mm}`;\n}\n",
|
|
85
85
|
"/**\n * 通知同步 checkpoint 协议(供外部记忆系统按批拉取)。\n * 与 phone-notifications 插件版 `ntf-sync` 行为一致,错误改走 YoooclawError。\n */\nimport { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { writeJsonFile } from \"../fs-utils.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport type { StoredNotification } from \"../shared.js\";\n\nexport const SYNC_FETCH_LIMIT = 300;\n\ninterface CheckpointData {\n [dateKey: string]: { lastIndex: number };\n}\n\nfunction checkpointPath(dir: string): string {\n return join(dir, \".checkpoint.json\");\n}\n\nfunction readCheckpoint(dir: string): CheckpointData {\n const p = checkpointPath(dir);\n if (!existsSync(p)) return {};\n try {\n return JSON.parse(readFileSync(p, \"utf-8\")) as CheckpointData;\n } catch {\n return {};\n }\n}\n\nfunction writeCheckpoint(dir: string, data: CheckpointData): void {\n writeJsonFile(checkpointPath(dir), data);\n}\n\nfunction listDateKeys(dir: string): string[] {\n if (!existsSync(dir)) return [];\n const pattern = /^(\\d{4}-\\d{2}-\\d{2})\\.json$/;\n const keys: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isFile()) continue;\n const m = pattern.exec(entry.name);\n if (m) keys.push(m[1]);\n }\n return keys.sort((a, b) => b.localeCompare(a));\n}\n\nfunction readDateFile(dir: string, dateKey: string): StoredNotification[] {\n const filePath = join(dir, `${dateKey}.json`);\n if (!existsSync(filePath)) return [];\n try {\n const parsed = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nfunction parseIndexOption(raw: string, label: string): number {\n const n = Number.parseInt(raw, 10);\n if (!Number.isInteger(n) || String(n) !== raw || n < 0) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", `${label} 必须是非负整数`);\n }\n return n;\n}\n\nexport function scanSync(dir: string): unknown {\n const checkpoint = readCheckpoint(dir);\n const pending: { date: string; count: number; startIndex: number }[] = [];\n let totalPending = 0;\n for (const dateKey of listDateKeys(dir)) {\n const items = readDateFile(dir, dateKey);\n const lastIndex = checkpoint[dateKey]?.lastIndex ?? -1;\n const unprocessed = items.length - (lastIndex + 1);\n if (unprocessed > 0) {\n pending.push({ date: dateKey, count: unprocessed, startIndex: lastIndex + 1 });\n totalPending += unprocessed;\n }\n }\n return { ok: true, pending, totalPending };\n}\n\nexport function fetchSync(dir: string, date: string, maxEndIndexRaw?: string): unknown {\n const items = readDateFile(dir, date);\n if (items.length === 0) {\n throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `日期 ${date} 无通知数据`);\n }\n const checkpoint = readCheckpoint(dir);\n const lastIndex = checkpoint[date]?.lastIndex ?? -1;\n const startIndex = lastIndex + 1;\n let maxEndIndex = items.length - 1;\n if (maxEndIndexRaw) {\n maxEndIndex = Math.min(parseIndexOption(maxEndIndexRaw, \"--max-end-index\"), items.length - 1);\n }\n const snapshotEndExclusive = Math.max(startIndex, maxEndIndex + 1);\n const unprocessed = items.slice(startIndex, snapshotEndExclusive);\n const notifications = unprocessed.slice(0, SYNC_FETCH_LIMIT);\n const endIndex = notifications.length > 0 ? startIndex + notifications.length - 1 : lastIndex;\n const hasMore = unprocessed.length > notifications.length;\n return {\n ok: true,\n date,\n startIndex,\n endIndex,\n nextStartIndex: hasMore ? endIndex + 1 : null,\n limit: SYNC_FETCH_LIMIT,\n maxEndIndex,\n returned: notifications.length,\n totalUnprocessed: unprocessed.length,\n hasMore,\n notifications,\n };\n}\n\nexport function commitSync(dir: string, date: string, endIndexRaw?: string): unknown {\n const items = readDateFile(dir, date);\n if (items.length === 0) {\n throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `日期 ${date} 无通知数据`);\n }\n const checkpoint = readCheckpoint(dir);\n const lastIndex = checkpoint[date]?.lastIndex ?? -1;\n let committedIndex: number;\n let commitMode: string;\n if (endIndexRaw) {\n committedIndex = parseIndexOption(endIndexRaw, \"--end-index\");\n if (committedIndex >= items.length) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--end-index 超出当前日期通知文件范围\");\n }\n if (committedIndex < lastIndex) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--end-index 早于当前 checkpoint,不能回退消费进度\");\n }\n if (committedIndex > lastIndex + SYNC_FETCH_LIMIT) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--end-index 超出单批 fetch 上限,不能跳过未处理通知\");\n }\n commitMode = \"exact-end-index\";\n } else {\n committedIndex = Math.min(items.length - 1, lastIndex + SYNC_FETCH_LIMIT);\n commitMode = \"legacy-batch-limit\";\n }\n const hasMore = committedIndex < items.length - 1;\n checkpoint[date] = { lastIndex: committedIndex };\n writeCheckpoint(dir, checkpoint);\n return {\n ok: true,\n date,\n committedIndex,\n commitMode,\n limit: SYNC_FETCH_LIMIT,\n hasMore,\n nextStartIndex: hasMore ? committedIndex + 1 : null,\n };\n}\n",
|
|
86
86
|
"/**\n * sync service —— scan / fetch / commit(通知同步给记忆系统)。\n */\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { scanSync, fetchSync, commitSync } from \"../notification/sync.js\";\n\nexport function syncScan(ctx: CliContext): unknown {\n return scanSync(ctx.paths.notifications);\n}\n\nexport function syncFetch(\n ctx: CliContext,\n _args: unknown[],\n opts: { date?: string; maxEndIndex?: string },\n): unknown {\n if (!opts.date) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--date 必填(YYYY-MM-DD)\");\n }\n return fetchSync(ctx.paths.notifications, opts.date, opts.maxEndIndex);\n}\n\nexport function syncCommit(\n ctx: CliContext,\n _args: unknown[],\n opts: { date?: string; endIndex?: string },\n): unknown {\n if (!opts.date) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--date 必填(YYYY-MM-DD)\");\n }\n return commitSync(ctx.paths.notifications, opts.date, opts.endIndex);\n}\n",
|
|
87
|
-
"/**\n * recording service —— list / status / storage-path / setup-asr + +latest。\n * 查询纯读磁盘(🟢);setup-asr 写 asr-config.json(🟢)。\n */\nimport { createReadStream, existsSync, readFileSync, statSync, watch } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { ensureDir, writeJsonFile } from \"../fs-utils.js\";\nimport { ask, isInteractive } from \"../prompt.js\";\nimport { readRecordingIndex, type CliRecordingEntry } from \"../shared.js\";\n\nfunction readIndex(ctx: CliContext): CliRecordingEntry[] {\n if (!existsSync(ctx.paths.recordings)) return [];\n return readRecordingIndex(ctx.paths.recordings);\n}\n\nfunction toListItem(r: CliRecordingEntry) {\n return {\n id: r.id,\n name: r.metadata.name,\n duration_sec: r.metadata.duration_sec,\n status: r.status,\n file_size_bytes: r.metadata.file_size_bytes,\n has_audio: Boolean(r.audioFile),\n has_transcript: Boolean(r.transcriptFile),\n created_at: r.metadata.created_at,\n updated_at: r.updatedAt,\n error: r.lastError ?? null,\n };\n}\n\nexport function recordingList(\n ctx: CliContext,\n _args: unknown[],\n opts: { status?: string },\n): unknown {\n let recordings = readIndex(ctx);\n if (opts.status) recordings = recordings.filter((r) => r.status === opts.status);\n return { ok: true, total: recordings.length, recordings: recordings.map(toListItem) };\n}\n\nexport function recordingStatus(ctx: CliContext, args: unknown[]): unknown {\n const [id] = args as [string];\n const entry = readIndex(ctx).find((r) => r.id === id);\n if (!entry) {\n throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `录音不存在:${id}`);\n }\n return {\n ok: true,\n recording: {\n id: entry.id,\n name: entry.metadata.name,\n duration_sec: entry.metadata.duration_sec,\n file_size_bytes: entry.metadata.file_size_bytes,\n status: entry.status,\n created_at: entry.metadata.created_at,\n location: (entry.metadata as Record<string, unknown>).location ?? null,\n markers: (entry.metadata as Record<string, unknown>).markers ?? [],\n audioFile: entry.audioFile ?? null,\n srtFile: entry.srtFile ?? null,\n transcriptDataFile: entry.transcriptDataFile ?? null,\n transcriptFile: entry.transcriptFile ?? null,\n summaryFile: entry.summaryFile ?? null,\n title: entry.title ?? null,\n error: entry.lastError ?? null,\n ingestedAt: entry.ingestedAt,\n updatedAt: entry.updatedAt,\n },\n };\n}\n\nexport function recordingStoragePath(ctx: CliContext): unknown {\n return { ok: true, path: ctx.paths.recordings };\n}\n\n// ── 录音状态事件流(由 daemon 写到 recordings/state/events.jsonl)──\n\ninterface EventRecord {\n ts: string;\n recordingId: string;\n transfer_status: string;\n error?: string;\n [k: string]: unknown;\n}\n\ninterface RecordingEventsOpts {\n id?: string;\n since?: string;\n watch?: boolean;\n limit?: string;\n}\n\nconst DURATION_UNITS: Record<string, number> = {\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n};\n\nfunction parseSince(input: string | undefined): number | undefined {\n if (!input) return undefined;\n const m = /^(\\d+)([smhd])$/.exec(input.trim());\n if (!m) {\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n `--since 格式应为 <数字><单位>,单位 s/m/h/d(收到 \"${input}\")`,\n );\n }\n return Date.now() - Number(m[1]) * DURATION_UNITS[m[2]];\n}\n\nfunction eventsPath(ctx: CliContext): string {\n return join(ctx.paths.recordings, \"state\", \"events.jsonl\");\n}\n\nfunction readEventsFile(path: string): EventRecord[] {\n if (!existsSync(path)) return [];\n const raw = readFileSync(path, \"utf-8\");\n const out: EventRecord[] = [];\n for (const line of raw.split(\"\\n\")) {\n const t = line.trim();\n if (!t) continue;\n try {\n out.push(JSON.parse(t) as EventRecord);\n } catch {\n // 损坏行跳过\n }\n }\n return out;\n}\n\nfunction filterEvents(\n events: EventRecord[],\n opts: { id?: string; sinceMs?: number; limit: number },\n): EventRecord[] {\n let out = events;\n if (opts.id) out = out.filter((e) => e.recordingId === opts.id);\n if (opts.sinceMs !== undefined) {\n out = out.filter((e) => {\n const ts = Date.parse(e.ts);\n return Number.isFinite(ts) && ts >= opts.sinceMs!;\n });\n }\n if (out.length > opts.limit) out = out.slice(-opts.limit);\n return out;\n}\n\nexport async function recordingEvents(\n ctx: CliContext,\n _args: unknown[],\n opts: RecordingEventsOpts,\n): Promise<unknown> {\n const path = eventsPath(ctx);\n const limit = Number(opts.limit ?? \"200\");\n const sinceMs = parseSince(opts.since);\n const initial = filterEvents(readEventsFile(path), { id: opts.id, sinceMs, limit });\n\n if (!opts.watch) {\n return { ok: true, path, total: initial.length, events: initial };\n }\n\n // --watch:先打印历史,再 tail。直接 stdout 行式输出(脱离命令 JSON 包装)。\n for (const e of initial) {\n process.stdout.write(JSON.stringify(e) + \"\\n\");\n }\n await tailEvents(path, opts.id, (e) => {\n process.stdout.write(JSON.stringify(e) + \"\\n\");\n });\n // tail 永不返回;写在这里只是给类型系统看\n return { ok: true, path, total: initial.length };\n}\n\nfunction tailEvents(\n path: string,\n filterId: string | undefined,\n onEvent: (e: EventRecord) => void,\n): Promise<never> {\n return new Promise<never>(() => {\n let offset = existsSync(path) ? statSync(path).size : 0;\n let buffer = \"\";\n const drain = (): void => {\n if (!existsSync(path)) return;\n const size = statSync(path).size;\n if (size < offset) {\n // 文件被截断/重建,从头读\n offset = 0;\n buffer = \"\";\n }\n if (size === offset) return;\n const stream = createReadStream(path, { start: offset, end: size - 1, encoding: \"utf-8\" });\n stream.on(\"data\", (chunk) => (buffer += chunk));\n stream.on(\"end\", () => {\n offset = size;\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const t = line.trim();\n if (!t) continue;\n try {\n const e = JSON.parse(t) as EventRecord;\n if (!filterId || e.recordingId === filterId) onEvent(e);\n } catch {\n // skip\n }\n }\n });\n };\n drain();\n // 监听目录避免 watch 在文件不存在时报错\n const dir = join(path, \"..\");\n watch(dir, () => drain());\n });\n}\n\nexport function recordingLatest(ctx: CliContext): unknown {\n const recordings = readIndex(ctx).sort(\n (a, b) => Date.parse(b.metadata.created_at) - Date.parse(a.metadata.created_at),\n );\n if (recordings.length === 0) {\n return { ok: true, recording: null };\n }\n return recordingStatus(ctx, [recordings[0].id]);\n}\n\ninterface SetupAsrOpts {\n mode?: string;\n apiKey?: string;\n endpoint?: string;\n language?: string;\n model?: string;\n nonInteractive?: boolean;\n}\n\n/**\n * 写出与 phone-notifications/types.ts 的 AsrConfig 完全兼容的配置:\n * { mode: \"api\" | \"local\", api?: {...}, local?: {...} }\n *\n * api 模式留空 apiKey 时,daemon 跑录音同步会回退到 account 级 ock- key\n * (resolveApiKey),所以普通用户 `yc recording setup-asr --non-interactive` 即可开箱。\n */\nexport async function recordingSetupAsr(\n ctx: CliContext,\n _args: unknown[],\n opts: SetupAsrOpts,\n): Promise<unknown> {\n let mode = (opts.mode ?? \"api\").toLowerCase();\n let apiKey = opts.apiKey;\n let endpoint = opts.endpoint;\n let language = opts.language;\n let model = opts.model;\n\n if (!opts.nonInteractive && isInteractive()) {\n mode = (await ask(\"ASR mode(api / local)\", mode)).toLowerCase();\n if (mode === \"api\") {\n apiKey = await ask(\"API key(留空则使用 account ock- key)\", apiKey ?? \"\");\n endpoint = await ask(\"model-proxy endpoint(留空走默认)\", endpoint ?? \"\");\n language = await ask(\"语言提示(zh / en / auto)\", language ?? \"auto\");\n } else if (mode === \"local\") {\n model = await ask(\"Whisper 模型(留空走推荐值)\", model ?? \"\");\n }\n }\n\n if (mode !== \"api\" && mode !== \"local\") {\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n `--mode 必须是 api 或 local(收到 \"${mode}\")`,\n );\n }\n\n const config = buildAsrConfig(mode, { apiKey, endpoint, language, model });\n\n ensureDir(ctx.paths.recordings);\n const path = join(ctx.paths.recordings, \"asr-config.json\");\n writeJsonFile(path, config);\n return {\n ok: true,\n path,\n mode,\n keyConfigured: mode === \"api\" ? Boolean(apiKey) || \"fallback-to-account\" : \"n/a\",\n };\n}\n\nfunction buildAsrConfig(\n mode: \"api\" | \"local\",\n fields: { apiKey?: string; endpoint?: string; language?: string; model?: string },\n): Record<string, unknown> {\n if (mode === \"api\") {\n const api: Record<string, unknown> = {};\n if (fields.apiKey) api.apiKey = fields.apiKey;\n if (fields.endpoint) api.endpoint = fields.endpoint;\n if (fields.language) api.language = fields.language;\n return Object.keys(api).length > 0 ? { mode, api } : { mode };\n }\n const local: Record<string, unknown> = {};\n if (fields.model) local.model = fields.model;\n return Object.keys(local).length > 0 ? { mode, local } : { mode };\n}\n",
|
|
88
|
-
"/**\n * 图片本地存储读取(images/index.json)。\n *\n * 元数据与同步状态机由 daemon 的图片通道写入(见 PRD「图片通道」);\n * CLI 的 image 查询命令纯读这里,不需要 daemon 在跑。\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, join } from \"node:path\";\nimport type { ProfilePaths } from \"../paths.js\";\n\nexport type ImageSyncStatus = \"syncing\" | \"synced\" | \"sync_failed\";\n\nexport interface ImageMetadata {\n oss_image_url: string;\n created_at: string;\n mime_type?: string;\n width?: number;\n height?: number;\n size_bytes?: number;\n source_app?: string;\n caption?: string;\n}\n\nexport interface ImageIndexEntry {\n imageId: string;\n metadata: ImageMetadata;\n /** 相对 images/ 的本地路径,如 files/img_xxx.jpg。 */\n localFile?: string | null;\n thumbnail?: string | null;\n status: ImageSyncStatus;\n lastError?: string | null;\n syncedAt?: string | null;\n}\n\nexport function imagesIndexPath(paths: ProfilePaths): string {\n return join(paths.images, \"index.json\");\n}\n\n/** 读取图片索引;目录/文件不存在返回空数组。 */\nexport function readImageIndex(paths: ProfilePaths): ImageIndexEntry[] {\n const indexPath = imagesIndexPath(paths);\n if (!existsSync(indexPath)) return [];\n try {\n const raw = JSON.parse(readFileSync(indexPath, \"utf-8\"));\n return Array.isArray(raw?.images) ? raw.images : [];\n } catch {\n return [];\n }\n}\n\n/** 把索引里的相对路径解析为绝对路径。 */\nexport function resolveImageFile(\n paths: ProfilePaths,\n relative: string,\n): string {\n return isAbsolute(relative) ? relative : join(paths.images, relative);\n}\n",
|
|
89
|
-
"/**\n * image service —— list / status / path / storage-path + +latest(🟢,纯读磁盘)。\n */\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport {\n readImageIndex,\n resolveImageFile,\n type ImageIndexEntry,\n} from \"../image/storage.js\";\nimport { matchesNotificationAppFilter } from \"../shared.js\";\n\ninterface ListOpts {\n status?: string;\n app?: string;\n from?: string;\n to?: string;\n limit?: string;\n}\n\nfunction byCreatedDesc(a: ImageIndexEntry, b: ImageIndexEntry): number {\n return Date.parse(b.metadata.created_at) - Date.parse(a.metadata.created_at);\n}\n\nexport function imageList(\n ctx: CliContext,\n _args: unknown[],\n opts: ListOpts,\n): unknown {\n let items = readImageIndex(ctx.paths);\n if (opts.status) items = items.filter((i) => i.status === opts.status);\n if (opts.app) {\n const app = opts.app;\n items = items.filter((i) =>\n matchesNotificationAppFilter(\n { appName: i.metadata.source_app ?? \"\", title: \"\", content: \"\", timestamp: \"\" },\n app,\n ),\n );\n }\n if (opts.from) {\n const fromTs = Date.parse(opts.from);\n items = items.filter((i) => Date.parse(i.metadata.created_at) >= fromTs);\n }\n if (opts.to) {\n const toTs = Date.parse(opts.to);\n items = items.filter((i) => Date.parse(i.metadata.created_at) <= toTs);\n }\n items = items.sort(byCreatedDesc);\n const limit = opts.limit ? Number(opts.limit) : 100;\n return { ok: true, total: items.length, images: items.slice(0, limit) };\n}\n\nexport function imageStatus(ctx: CliContext, args: unknown[]): unknown {\n const [id] = args as [string];\n const entry = readImageIndex(ctx.paths).find((i) => i.imageId === id);\n if (!entry) throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `图片不存在:${id}`);\n return { ok: true, image: entry };\n}\n\nexport function imagePath(\n ctx: CliContext,\n args: unknown[],\n opts: { thumbnail?: boolean },\n): unknown {\n const [id] = args as [string];\n const entry = readImageIndex(ctx.paths).find((i) => i.imageId === id);\n if (!entry) throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `图片不存在:${id}`);\n\n const relative = opts.thumbnail ? entry.thumbnail : entry.localFile;\n if (entry.status !== \"synced\" || !relative) {\n throw new YoooclawError(\n \"YOOOCLAW_IMAGE_NOT_READY\",\n `图片 ${id} 尚未下载完成`,\n { status: entry.status, lastError: entry.lastError ?? null },\n );\n }\n return { ok: true, path: resolveImageFile(ctx.paths, relative) };\n}\n\nexport function imageStoragePath(ctx: CliContext): unknown {\n return { ok: true, path: ctx.paths.images };\n}\n\nexport function imageLatest(ctx: CliContext): unknown {\n const items = readImageIndex(ctx.paths).sort(byCreatedDesc);\n return { ok: true, image: items[0] ?? null };\n}\n",
|
|
87
|
+
"/**\n * recording service —— list / status / storage-path / setup-asr + +latest。\n * 查询纯读磁盘(🟢);setup-asr 写 asr-config.json(🟢)。\n */\nimport { createReadStream, existsSync, readFileSync, statSync, watch } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { ensureDir, writeJsonFile } from \"../fs-utils.js\";\nimport { ask, isInteractive } from \"../prompt.js\";\nimport { readRecordingIndex, type CliRecordingEntry } from \"../shared.js\";\n\nfunction readIndex(ctx: CliContext): CliRecordingEntry[] {\n if (!existsSync(ctx.paths.recordings)) return [];\n return readRecordingIndex(ctx.paths.recordings);\n}\n\nfunction toListItem(r: CliRecordingEntry) {\n return {\n id: r.id,\n clientLabel: r.clientLabel ?? \"legacy\",\n name: r.metadata.name,\n duration_sec: r.metadata.duration_sec,\n status: r.status,\n file_size_bytes: r.metadata.file_size_bytes,\n has_audio: Boolean(r.audioFile),\n has_transcript: Boolean(r.transcriptFile),\n created_at: r.metadata.created_at,\n updated_at: r.updatedAt,\n error: r.lastError ?? null,\n };\n}\n\nexport function recordingList(\n ctx: CliContext,\n _args: unknown[],\n opts: { status?: string; client?: string },\n): unknown {\n let recordings = readIndex(ctx);\n if (opts.status) recordings = recordings.filter((r) => r.status === opts.status);\n if (opts.client && opts.client !== \"all\") {\n recordings = recordings.filter((r) => (r.clientLabel ?? \"legacy\") === opts.client);\n }\n return { ok: true, total: recordings.length, recordings: recordings.map(toListItem) };\n}\n\nexport function recordingStatus(ctx: CliContext, args: unknown[]): unknown {\n const [id] = args as [string];\n const entry = readIndex(ctx).find((r) => r.id === id);\n if (!entry) {\n throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `录音不存在:${id}`);\n }\n return {\n ok: true,\n recording: {\n id: entry.id,\n clientLabel: entry.clientLabel ?? \"legacy\",\n name: entry.metadata.name,\n duration_sec: entry.metadata.duration_sec,\n file_size_bytes: entry.metadata.file_size_bytes,\n status: entry.status,\n created_at: entry.metadata.created_at,\n location: (entry.metadata as Record<string, unknown>).location ?? null,\n markers: (entry.metadata as Record<string, unknown>).markers ?? [],\n audioFile: entry.audioFile ?? null,\n srtFile: entry.srtFile ?? null,\n transcriptDataFile: entry.transcriptDataFile ?? null,\n transcriptFile: entry.transcriptFile ?? null,\n summaryFile: entry.summaryFile ?? null,\n title: entry.title ?? null,\n error: entry.lastError ?? null,\n ingestedAt: entry.ingestedAt,\n updatedAt: entry.updatedAt,\n },\n };\n}\n\nexport function recordingStoragePath(ctx: CliContext): unknown {\n return { ok: true, path: ctx.paths.recordings };\n}\n\n// ── 录音状态事件流(由 daemon 写到 recordings/state/events.jsonl)──\n\ninterface EventRecord {\n ts: string;\n recordingId: string;\n transfer_status: string;\n error?: string;\n [k: string]: unknown;\n}\n\ninterface RecordingEventsOpts {\n id?: string;\n since?: string;\n watch?: boolean;\n limit?: string;\n}\n\nconst DURATION_UNITS: Record<string, number> = {\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n};\n\nfunction parseSince(input: string | undefined): number | undefined {\n if (!input) return undefined;\n const m = /^(\\d+)([smhd])$/.exec(input.trim());\n if (!m) {\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n `--since 格式应为 <数字><单位>,单位 s/m/h/d(收到 \"${input}\")`,\n );\n }\n return Date.now() - Number(m[1]) * DURATION_UNITS[m[2]];\n}\n\nfunction eventsPath(ctx: CliContext): string {\n return join(ctx.paths.recordings, \"state\", \"events.jsonl\");\n}\n\nfunction readEventsFile(path: string): EventRecord[] {\n if (!existsSync(path)) return [];\n const raw = readFileSync(path, \"utf-8\");\n const out: EventRecord[] = [];\n for (const line of raw.split(\"\\n\")) {\n const t = line.trim();\n if (!t) continue;\n try {\n out.push(JSON.parse(t) as EventRecord);\n } catch {\n // 损坏行跳过\n }\n }\n return out;\n}\n\nfunction filterEvents(\n events: EventRecord[],\n opts: { id?: string; sinceMs?: number; limit: number },\n): EventRecord[] {\n let out = events;\n if (opts.id) out = out.filter((e) => e.recordingId === opts.id);\n if (opts.sinceMs !== undefined) {\n out = out.filter((e) => {\n const ts = Date.parse(e.ts);\n return Number.isFinite(ts) && ts >= opts.sinceMs!;\n });\n }\n if (out.length > opts.limit) out = out.slice(-opts.limit);\n return out;\n}\n\nexport async function recordingEvents(\n ctx: CliContext,\n _args: unknown[],\n opts: RecordingEventsOpts,\n): Promise<unknown> {\n const path = eventsPath(ctx);\n const limit = Number(opts.limit ?? \"200\");\n const sinceMs = parseSince(opts.since);\n const initial = filterEvents(readEventsFile(path), { id: opts.id, sinceMs, limit });\n\n if (!opts.watch) {\n return { ok: true, path, total: initial.length, events: initial };\n }\n\n // --watch:先打印历史,再 tail。直接 stdout 行式输出(脱离命令 JSON 包装)。\n for (const e of initial) {\n process.stdout.write(JSON.stringify(e) + \"\\n\");\n }\n await tailEvents(path, opts.id, (e) => {\n process.stdout.write(JSON.stringify(e) + \"\\n\");\n });\n // tail 永不返回;写在这里只是给类型系统看\n return { ok: true, path, total: initial.length };\n}\n\nfunction tailEvents(\n path: string,\n filterId: string | undefined,\n onEvent: (e: EventRecord) => void,\n): Promise<never> {\n return new Promise<never>(() => {\n let offset = existsSync(path) ? statSync(path).size : 0;\n let buffer = \"\";\n const drain = (): void => {\n if (!existsSync(path)) return;\n const size = statSync(path).size;\n if (size < offset) {\n // 文件被截断/重建,从头读\n offset = 0;\n buffer = \"\";\n }\n if (size === offset) return;\n const stream = createReadStream(path, { start: offset, end: size - 1, encoding: \"utf-8\" });\n stream.on(\"data\", (chunk) => (buffer += chunk));\n stream.on(\"end\", () => {\n offset = size;\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const t = line.trim();\n if (!t) continue;\n try {\n const e = JSON.parse(t) as EventRecord;\n if (!filterId || e.recordingId === filterId) onEvent(e);\n } catch {\n // skip\n }\n }\n });\n };\n drain();\n // 监听目录避免 watch 在文件不存在时报错\n const dir = join(path, \"..\");\n watch(dir, () => drain());\n });\n}\n\nexport function recordingLatest(ctx: CliContext): unknown {\n const recordings = readIndex(ctx).sort(\n (a, b) => Date.parse(b.metadata.created_at) - Date.parse(a.metadata.created_at),\n );\n if (recordings.length === 0) {\n return { ok: true, recording: null };\n }\n return recordingStatus(ctx, [recordings[0].id]);\n}\n\ninterface SetupAsrOpts {\n mode?: string;\n apiKey?: string;\n endpoint?: string;\n language?: string;\n model?: string;\n nonInteractive?: boolean;\n}\n\n/**\n * 写出与 phone-notifications/types.ts 的 AsrConfig 完全兼容的配置:\n * { mode: \"api\" | \"local\", api?: {...}, local?: {...} }\n *\n * api 模式留空 apiKey 时,daemon 跑录音同步会回退到 account 级 ock- key\n * (resolveApiKey),所以普通用户 `yc recording setup-asr --non-interactive` 即可开箱。\n */\nexport async function recordingSetupAsr(\n ctx: CliContext,\n _args: unknown[],\n opts: SetupAsrOpts,\n): Promise<unknown> {\n let mode = (opts.mode ?? \"api\").toLowerCase();\n let apiKey = opts.apiKey;\n let endpoint = opts.endpoint;\n let language = opts.language;\n let model = opts.model;\n\n if (!opts.nonInteractive && isInteractive()) {\n mode = (await ask(\"ASR mode(api / local)\", mode)).toLowerCase();\n if (mode === \"api\") {\n apiKey = await ask(\"API key(留空则使用 account ock- key)\", apiKey ?? \"\");\n endpoint = await ask(\"model-proxy endpoint(留空走默认)\", endpoint ?? \"\");\n language = await ask(\"语言提示(zh / en / auto)\", language ?? \"auto\");\n } else if (mode === \"local\") {\n model = await ask(\"Whisper 模型(留空走推荐值)\", model ?? \"\");\n }\n }\n\n if (mode !== \"api\" && mode !== \"local\") {\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n `--mode 必须是 api 或 local(收到 \"${mode}\")`,\n );\n }\n\n const config = buildAsrConfig(mode, { apiKey, endpoint, language, model });\n\n ensureDir(ctx.paths.recordings);\n const path = join(ctx.paths.recordings, \"asr-config.json\");\n writeJsonFile(path, config);\n return {\n ok: true,\n path,\n mode,\n keyConfigured: mode === \"api\" ? Boolean(apiKey) || \"fallback-to-account\" : \"n/a\",\n };\n}\n\nfunction buildAsrConfig(\n mode: \"api\" | \"local\",\n fields: { apiKey?: string; endpoint?: string; language?: string; model?: string },\n): Record<string, unknown> {\n if (mode === \"api\") {\n const api: Record<string, unknown> = {};\n if (fields.apiKey) api.apiKey = fields.apiKey;\n if (fields.endpoint) api.endpoint = fields.endpoint;\n if (fields.language) api.language = fields.language;\n return Object.keys(api).length > 0 ? { mode, api } : { mode };\n }\n const local: Record<string, unknown> = {};\n if (fields.model) local.model = fields.model;\n return Object.keys(local).length > 0 ? { mode, local } : { mode };\n}\n",
|
|
88
|
+
"/**\n * 图片本地存储读取(images/index.json)。\n *\n * 元数据与同步状态机由 daemon 的图片通道写入(见 PRD「图片通道」);\n * CLI 的 image 查询命令纯读这里,不需要 daemon 在跑。\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, join } from \"node:path\";\nimport type { ProfilePaths } from \"../paths.js\";\n\nexport type ImageSyncStatus = \"syncing\" | \"synced\" | \"sync_failed\";\n\nexport interface ImageMetadata {\n oss_image_url: string;\n created_at: string;\n mime_type?: string;\n width?: number;\n height?: number;\n size_bytes?: number;\n source_app?: string;\n caption?: string;\n}\n\nexport interface ImageIndexEntry {\n imageId: string;\n /** 来源客户端 label;旧数据无该字段,查询时视为 legacy */\n clientLabel?: string;\n metadata: ImageMetadata;\n /** 相对 images/ 的本地路径,如 files/img_xxx.jpg。 */\n localFile?: string | null;\n thumbnail?: string | null;\n status: ImageSyncStatus;\n lastError?: string | null;\n syncedAt?: string | null;\n}\n\nexport function imagesIndexPath(paths: ProfilePaths): string {\n return join(paths.images, \"index.json\");\n}\n\n/** 读取图片索引;目录/文件不存在返回空数组。 */\nexport function readImageIndex(paths: ProfilePaths): ImageIndexEntry[] {\n const indexPath = imagesIndexPath(paths);\n if (!existsSync(indexPath)) return [];\n try {\n const raw = JSON.parse(readFileSync(indexPath, \"utf-8\"));\n return Array.isArray(raw?.images) ? raw.images : [];\n } catch {\n return [];\n }\n}\n\n/** 把索引里的相对路径解析为绝对路径。 */\nexport function resolveImageFile(\n paths: ProfilePaths,\n relative: string,\n): string {\n return isAbsolute(relative) ? relative : join(paths.images, relative);\n}\n",
|
|
89
|
+
"/**\n * image service —— list / status / path / storage-path + +latest(🟢,纯读磁盘)。\n */\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport {\n readImageIndex,\n resolveImageFile,\n type ImageIndexEntry,\n} from \"../image/storage.js\";\nimport { matchesNotificationAppFilter } from \"../shared.js\";\n\ninterface ListOpts {\n status?: string;\n app?: string;\n client?: string;\n from?: string;\n to?: string;\n limit?: string;\n}\n\nfunction byCreatedDesc(a: ImageIndexEntry, b: ImageIndexEntry): number {\n return Date.parse(b.metadata.created_at) - Date.parse(a.metadata.created_at);\n}\n\nexport function imageList(\n ctx: CliContext,\n _args: unknown[],\n opts: ListOpts,\n): unknown {\n let items = readImageIndex(ctx.paths);\n if (opts.status) items = items.filter((i) => i.status === opts.status);\n if (opts.client && opts.client !== \"all\") {\n items = items.filter((i) => (i.clientLabel ?? \"legacy\") === opts.client);\n }\n if (opts.app) {\n const app = opts.app;\n items = items.filter((i) =>\n matchesNotificationAppFilter(\n { appName: i.metadata.source_app ?? \"\", title: \"\", content: \"\", timestamp: \"\" },\n app,\n ),\n );\n }\n if (opts.from) {\n const fromTs = Date.parse(opts.from);\n items = items.filter((i) => Date.parse(i.metadata.created_at) >= fromTs);\n }\n if (opts.to) {\n const toTs = Date.parse(opts.to);\n items = items.filter((i) => Date.parse(i.metadata.created_at) <= toTs);\n }\n items = items.sort(byCreatedDesc);\n const limit = opts.limit ? Number(opts.limit) : 100;\n return { ok: true, total: items.length, images: items.slice(0, limit) };\n}\n\nexport function imageStatus(ctx: CliContext, args: unknown[]): unknown {\n const [id] = args as [string];\n const entry = readImageIndex(ctx.paths).find((i) => i.imageId === id);\n if (!entry) throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `图片不存在:${id}`);\n return { ok: true, image: entry };\n}\n\nexport function imagePath(\n ctx: CliContext,\n args: unknown[],\n opts: { thumbnail?: boolean },\n): unknown {\n const [id] = args as [string];\n const entry = readImageIndex(ctx.paths).find((i) => i.imageId === id);\n if (!entry) throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `图片不存在:${id}`);\n\n const relative = opts.thumbnail ? entry.thumbnail : entry.localFile;\n if (entry.status !== \"synced\" || !relative) {\n throw new YoooclawError(\n \"YOOOCLAW_IMAGE_NOT_READY\",\n `图片 ${id} 尚未下载完成`,\n { status: entry.status, lastError: entry.lastError ?? null },\n );\n }\n return { ok: true, path: resolveImageFile(ctx.paths, relative) };\n}\n\nexport function imageStoragePath(ctx: CliContext): unknown {\n return { ok: true, path: ctx.paths.images };\n}\n\nexport function imageLatest(ctx: CliContext): unknown {\n const items = readImageIndex(ctx.paths).sort(byCreatedDesc);\n return { ok: true, image: items[0] ?? null };\n}\n",
|
|
90
90
|
"/**\n * daemon 日志读取 —— 解析 `daemon.log` + 轮转文件 `daemon.log.YYYY-MM-DD`。\n *\n * 行格式(与 daemon logger 写入一致):`<ISO时间> [LEVEL] message`。\n */\nimport { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\n\nexport interface LogLine {\n date: string;\n level: string;\n time: string;\n message: string;\n raw: string;\n}\n\nconst LINE_RE = /^(\\d{4}-\\d{2}-\\d{2})(T\\S+)?\\s+\\[(\\w+)\\]\\s+(.*)$/;\n\nexport interface LogQuery {\n keyword?: string;\n level?: string;\n from?: string;\n to?: string;\n limit: number;\n}\n\n/** 收集 daemon 当前日志 + 轮转日志文件路径(按日期倒序,current 在最前)。 */\nfunction logFiles(daemonLog: string): string[] {\n const dir = dirname(daemonLog);\n const base = basename(daemonLog);\n if (!existsSync(dir)) return [];\n const rotated = readdirSync(dir)\n .filter((f) => f.startsWith(`${base}.`) && /\\.\\d{4}-\\d{2}-\\d{2}$/.test(f))\n .sort((a, b) => b.localeCompare(a))\n .map((f) => join(dir, f));\n const files: string[] = [];\n if (existsSync(daemonLog)) files.push(daemonLog);\n files.push(...rotated);\n return files;\n}\n\nfunction parseLine(raw: string): LogLine | null {\n const m = LINE_RE.exec(raw);\n if (!m) return null;\n return {\n date: m[1],\n time: (m[1] + (m[2] ?? \"\")),\n level: m[3].toLowerCase(),\n message: m[4],\n raw,\n };\n}\n\nexport function searchLogs(daemonLog: string, query: LogQuery): LogLine[] {\n const keyword = query.keyword?.toLowerCase();\n const level = query.level?.toLowerCase();\n const results: LogLine[] = [];\n\n for (const file of logFiles(daemonLog)) {\n const content = readFileSync(file, \"utf-8\");\n // 单文件内按出现顺序,整体最新文件在前 → 反转每个文件使最新行靠前\n const lines = content.split(\"\\n\").filter(Boolean).reverse();\n for (const raw of lines) {\n if (results.length >= query.limit) return results;\n const parsed = parseLine(raw);\n const date = parsed?.date;\n if (query.from && date && date < query.from) continue;\n if (query.to && date && date > query.to) continue;\n if (level && parsed && parsed.level !== level) continue;\n if (keyword && !raw.toLowerCase().includes(keyword)) continue;\n results.push(parsed ?? { date: \"\", time: \"\", level: \"\", message: raw, raw });\n }\n }\n return results;\n}\n",
|
|
91
91
|
"/**\n * log service —— `log [keyword]` + `+errors`(🟢,纯读 daemon 日志文件)。\n */\nimport type { CliContext } from \"../context.js\";\nimport { searchLogs } from \"../log/reader.js\";\nimport { daysAgo, today } from \"../shared.js\";\n\ninterface LogOpts {\n from?: string;\n to?: string;\n limit?: string;\n level?: string;\n}\n\nexport function logSearch(\n ctx: CliContext,\n args: unknown[],\n opts: LogOpts,\n): unknown {\n const [keyword] = args as [string | undefined];\n const lines = searchLogs(ctx.paths.daemonLog, {\n keyword,\n level: opts.level,\n from: opts.from ?? daysAgo(7),\n to: opts.to ?? today(),\n limit: opts.limit ? Number(opts.limit) : 50,\n });\n return { ok: true, keyword: keyword ?? null, total: lines.length, lines };\n}\n\nexport function logErrors(ctx: CliContext): unknown {\n const lines = searchLogs(ctx.paths.daemonLog, {\n level: \"error\",\n from: daysAgo(1),\n to: today(),\n limit: 50,\n });\n return { ok: true, level: \"error\", total: lines.length, lines };\n}\n",
|
|
92
92
|
"/**\n * migrate from-openclaw —— 把 ~/.openclaw 插件数据接管到 ~/.yoooclaw/profiles/<profile>。\n */\nimport { cpSync, existsSync, readdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { CliContext } from \"../context.js\";\nimport { ensureDir, readJsonFile, writeJsonFile, SECRET_FILE_MODE } from \"../fs-utils.js\";\nimport { sharedCredentialsPath } from \"../paths.js\";\nimport { API_KEY_FIELD } from \"../credentials/store.js\";\n\ninterface MigrateOpts {\n dryRun?: boolean;\n source?: string;\n}\n\ninterface SubdirPlan {\n name: string;\n source: string;\n target: string;\n exists: boolean;\n fileCount: number;\n}\n\nfunction countFiles(dir: string): number {\n if (!existsSync(dir)) return 0;\n try {\n return readdirSync(dir, { recursive: true } as never).length;\n } catch {\n return 0;\n }\n}\n\nexport function migrateFromOpenclaw(\n ctx: CliContext,\n _args: unknown[],\n opts: MigrateOpts,\n): unknown {\n const sourceRoot = opts.source ?? join(homedir(), \".openclaw\");\n const pluginRoot = join(sourceRoot, \"plugins\", \"phone-notifications\");\n\n const plans: SubdirPlan[] = [\n { name: \"notifications\", source: join(pluginRoot, \"notifications\"), target: ctx.paths.notifications },\n { name: \"recordings\", source: join(pluginRoot, \"recordings\"), target: ctx.paths.recordings },\n { name: \"light-rules\", source: join(pluginRoot, \"light-rules\"), target: ctx.paths.lightRules },\n { name: \"images\", source: join(pluginRoot, \"images\"), target: ctx.paths.images },\n ].map((p) => ({ ...p, exists: existsSync(p.source), fileCount: countFiles(p.source) }));\n\n // api-key 迁移计划\n const srcCreds = readJsonFile<Record<string, unknown>>(join(sourceRoot, \"credentials.json\"));\n const srcApiKey = typeof srcCreds?.[API_KEY_FIELD] === \"string\" ? (srcCreds[API_KEY_FIELD] as string) : undefined;\n const sharedPath = sharedCredentialsPath();\n const existingShared = readJsonFile<Record<string, unknown>>(sharedPath);\n const apiKeyAction = !srcApiKey\n ? \"none\"\n : existingShared?.[API_KEY_FIELD]\n ? \"skip-existing\"\n : \"copy\";\n\n const backupDir = `${ctx.paths.dir}.bak-${Date.now()}`;\n const willBackup = existsSync(ctx.paths.dir) && readdirSync(ctx.paths.dir).length > 0;\n\n if (opts.dryRun) {\n return {\n ok: true,\n dryRun: true,\n source: sourceRoot,\n profile: ctx.profile,\n backup: willBackup ? backupDir : null,\n subdirs: plans,\n apiKey: { action: apiKeyAction },\n hint: \"迁移前请先停止 openclaw 客户端,避免插件还在写 notifications 导致数据竞争\",\n };\n }\n\n if (willBackup) {\n cpSync(ctx.paths.dir, backupDir, { recursive: true });\n }\n ensureDir(ctx.paths.dir);\n\n const migrated: string[] = [];\n for (const plan of plans) {\n if (!plan.exists) continue;\n cpSync(plan.source, plan.target, { recursive: true });\n migrated.push(plan.name);\n }\n\n let apiKeyResult = apiKeyAction;\n if (apiKeyAction === \"copy\" && srcApiKey) {\n const data = existingShared ?? {};\n data[API_KEY_FIELD] = srcApiKey;\n writeJsonFile(sharedPath, data, SECRET_FILE_MODE);\n apiKeyResult = \"copied\";\n }\n\n return {\n ok: true,\n source: sourceRoot,\n profile: ctx.profile,\n backup: willBackup ? backupDir : null,\n migrated,\n apiKey: { action: apiKeyResult },\n };\n}\n",
|
|
93
|
-
"/**\n * update self —— 查 npm registry
|
|
93
|
+
"/**\n * update self —— 查 npm registry 比对版本并提示。\n * 不做自动替换:升级方式取决于安装来源(CLI_DIST),命令文本相应区分。\n */\nimport { arch as nodeArch, platform as nodePlatform } from \"node:os\";\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { CLI_DIST, CLI_VERSION } from \"../version.js\";\n\nconst PACKAGE = \"@yoooclaw/cli\";\nconst REGISTRY = \"https://registry.npmjs.org\";\nconst INSTALL_SH = \"https://raw.githubusercontent.com/Yoooclaw/openclaw-plugin/master/packages/cli/scripts/install.sh\";\n\ninterface UpdateOpts {\n beta?: boolean;\n json?: boolean;\n}\n\nfunction normalizeOs(p: string): \"darwin\" | \"linux\" | null {\n if (p === \"darwin\") return \"darwin\";\n if (p === \"linux\") return \"linux\";\n return null;\n}\n\nfunction normalizeArch(a: string): \"arm64\" | \"x64\" | null {\n if (a === \"arm64\") return \"arm64\";\n if (a === \"x64\") return \"x64\";\n return null;\n}\n\nfunction nativeTargetName(): string | null {\n const os = normalizeOs(nodePlatform());\n const arch = normalizeArch(nodeArch());\n if (!os || !arch) return null;\n return `yoooclaw-${os}-${arch}`;\n}\n\nfunction upgradeCommand(channel: \"latest\" | \"beta\", latest: string): string {\n if (CLI_DIST === \"native\") {\n const target = nativeTargetName();\n if (!target) {\n return `curl -fsSL ${INSTALL_SH} | sh`;\n }\n return `curl -fsSL ${INSTALL_SH} | sh -s -- --version ${latest}`;\n }\n // npm 与 dev 形态都按 npm 升级(dev 形态走源码,提示文案给用户参考)\n if (channel === \"beta\") return `npm i -g ${PACKAGE}@beta`;\n return `npm update -g ${PACKAGE}`;\n}\n\nfunction compareSemver(a: string, b: string): number {\n const pa = a.split(\"-\")[0].split(\".\").map(Number);\n const pb = b.split(\"-\")[0].split(\".\").map(Number);\n for (let i = 0; i < 3; i += 1) {\n const d = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (d !== 0) return d > 0 ? 1 : -1;\n }\n return 0;\n}\n\nexport async function updateSelf(\n _ctx: CliContext,\n _args: unknown[],\n opts: UpdateOpts,\n): Promise<unknown> {\n const tag = opts.beta ? \"beta\" : \"latest\";\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 8000);\n let latest: string;\n try {\n const res = await fetch(`${REGISTRY}/${encodeURIComponent(PACKAGE)}`, {\n signal: controller.signal,\n headers: { Accept: \"application/vnd.npm.install-v1+json\" },\n });\n if (!res.ok) {\n throw new YoooclawError(\"YOOOCLAW_NETWORK_ERROR\", `npm registry 返回 ${res.status}`);\n }\n const body = (await res.json()) as { \"dist-tags\"?: Record<string, string> };\n const resolved = body[\"dist-tags\"]?.[tag];\n if (!resolved) {\n throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `npm dist-tag \\`${tag}\\` 不存在`);\n }\n latest = resolved;\n } catch (err) {\n if (err instanceof YoooclawError) throw err;\n throw new YoooclawError(\"YOOOCLAW_NETWORK_ERROR\", `查询 npm registry 失败:${(err as Error).message}`);\n } finally {\n clearTimeout(timer);\n }\n\n const updateAvailable = compareSemver(latest, CLI_VERSION) > 0;\n return {\n ok: true,\n package: PACKAGE,\n channel: tag,\n dist: CLI_DIST,\n current: CLI_VERSION,\n latest,\n updateAvailable,\n command: updateAvailable ? upgradeCommand(tag, latest) : null,\n hint: updateAvailable\n ? \"发现新版本;CLI 不做自动更新,请手动执行上面的命令\"\n : \"已是最新版本\",\n };\n}\n",
|
|
94
94
|
"/**\n * doctor —— 环境自检。默认仅做**无网络、无 keychain 也确定性**的本地检查(PRD 可测试性要求)。\n * 网络类自检(relay / OSS 出站可达性)交给 gateway test / tunnel +test。\n */\nimport { accessSync, constants, existsSync, statSync } from \"node:fs\";\nimport type { CliContext } from \"../context.js\";\nimport { ensureDir } from \"../fs-utils.js\";\nimport { rootDir } from \"../paths.js\";\nimport { configExists, loadConfig } from \"../config/store.js\";\nimport { resolveApiKey, resolveGatewayToken } from \"../credentials/store.js\";\nimport { keychainAvailable } from \"../credentials/keychain.js\";\nimport { daemonState } from \"../daemon/lock.js\";\n\ntype CheckStatus = \"ok\" | \"warn\" | \"fail\" | \"skip\";\ninterface Check {\n name: string;\n status: CheckStatus;\n detail: string;\n}\n\nconst MIN_NODE = [22, 12, 0];\n\nfunction checkNode(): Check {\n const parts = process.versions.node.split(\".\").map(Number);\n let ok = true;\n for (let i = 0; i < 3; i += 1) {\n if ((parts[i] ?? 0) > MIN_NODE[i]) break;\n if ((parts[i] ?? 0) < MIN_NODE[i]) { ok = false; break; }\n }\n return {\n name: \"node-version\",\n status: ok ? \"ok\" : \"fail\",\n detail: `Node ${process.versions.node}(要求 >= ${MIN_NODE.join(\".\")})`,\n };\n}\n\nfunction checkDir(name: string, dir: string, fix: boolean): Check {\n if (!existsSync(dir)) {\n if (fix) {\n ensureDir(dir);\n return { name, status: \"ok\", detail: `已创建 ${dir}` };\n }\n return { name, status: \"warn\", detail: `目录不存在:${dir}(--fix 可创建)` };\n }\n try {\n accessSync(dir, constants.R_OK | constants.W_OK);\n } catch {\n return { name, status: \"fail\", detail: `目录不可读写:${dir}` };\n }\n const mode = statSync(dir).mode & 0o777;\n const tooOpen = (mode & 0o077) !== 0;\n return {\n name,\n status: tooOpen ? \"warn\" : \"ok\",\n detail: `${dir}(mode ${mode.toString(8)}${tooOpen ? \",建议收紧到 700\" : \"\"})`,\n };\n}\n\nexport function doctor(\n ctx: CliContext,\n _args: unknown[],\n opts: { json?: boolean; fix?: boolean },\n): unknown {\n const fix = Boolean(opts.fix);\n const checks: Check[] = [checkNode(), checkDir(\"root-dir\", rootDir(), fix)];\n\n // profile 配置\n if (configExists(ctx.paths)) {\n try {\n loadConfig(ctx.paths);\n checks.push({ name: \"profile-config\", status: \"ok\", detail: `${ctx.paths.config} 可解析` });\n } catch (err) {\n checks.push({ name: \"profile-config\", status: \"fail\", detail: (err as Error).message });\n }\n } else {\n checks.push({\n name: \"profile-config\",\n status: \"warn\",\n detail: `profile \\`${ctx.profile}\\` 未初始化(yoooclaw config init)`,\n });\n }\n\n // api-key\n const apiKey = resolveApiKey();\n checks.push({\n name: \"api-key\",\n status: apiKey.value ? \"ok\" : \"warn\",\n detail: apiKey.value ? `来源 ${apiKey.source}` : \"未配置(yoooclaw auth set-api-key)\",\n });\n\n // gateway token\n if (configExists(ctx.paths)) {\n const token = resolveGatewayToken(loadConfig(ctx.paths));\n checks.push({\n name: \"gateway-token\",\n status: token.value ? \"ok\" : \"warn\",\n detail: token.value ? `来源 ${token.source}` : \"未设置(yoooclaw auth token-rotate)\",\n });\n }\n\n // keychain(可选加固,不可用只是 skip)\n checks.push({\n name: \"keychain\",\n status: keychainAvailable() ? \"ok\" : \"skip\",\n detail: keychainAvailable() ? \"可用\" : \"当前平台无可用 keychain,凭据将落文件\",\n });\n\n // daemon(不在跑只是 info/warn)\n const state = daemonState(ctx.paths);\n checks.push({\n name: \"daemon\",\n status: state.running ? \"ok\" : state.stale ? \"warn\" : \"skip\",\n detail: state.running\n ? `运行中(pid ${state.lock?.pid})`\n : state.stale\n ? \"锁文件存在但进程已死(陈旧锁)\"\n : \"未运行\",\n });\n\n const failed = checks.filter((c) => c.status === \"fail\").length;\n const warned = checks.filter((c) => c.status === \"warn\").length;\n return {\n ok: failed === 0,\n profile: ctx.profile,\n summary: { total: checks.length, failed, warned },\n checks,\n note: \"网络类自检(relay / OSS 可达性)请用 yoooclaw gateway test / tunnel +test\",\n };\n}\n",
|
|
95
95
|
"/**\n * skills list / install —— 把随包发布的 SKILL.md 安装到 agent 可发现目录。\n *\n * 背景:这些 Skill 在 openclaw 插件里由 `openclaw.plugin.json` 的 `skills` 字段自动注册;\n * 独立 CLI 形态下它们只随 npm 包躺在 `<pkg>/skills/`,没有宿主帮忙装载。本命令负责把它们\n * 软链(默认)或复制到 agent 的 skills 目录,让 agent 能发现并触发。\n */\nimport {\n cpSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n realpathSync,\n rmSync,\n symlinkSync,\n} from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { CliContext } from \"../context.js\";\nimport { ErrorCode, YoooclawError } from \"../errors.js\";\n\nconst AGENT_IDS = [\"claude\", \"codex\"] as const;\nconst INSTALL_AGENT_IDS = [\"auto\", \"custom\", ...AGENT_IDS] as const;\n\ntype BuiltInAgentId = (typeof AGENT_IDS)[number];\ntype InstallAgentId = (typeof INSTALL_AGENT_IDS)[number];\n\ninterface AgentAdapter {\n id: BuiltInAgentId;\n label: string;\n homeDir(): string;\n skillsDir(): string;\n envHint?: string;\n}\n\nexport interface SkillTargetCandidate {\n agent: BuiltInAgentId;\n label: string;\n homeDir: string;\n target: string;\n detected: boolean;\n reason: string;\n installCommand: string;\n}\n\ninterface TargetSelection {\n agent: BuiltInAgentId | \"custom\";\n agentLabel: string;\n target: string;\n source: \"explicit-target\" | \"agent-default\" | \"auto-detected\";\n detectedTargets?: SkillTargetCandidate[];\n}\n\nfunction trimEnv(name: string): string | undefined {\n const value = process.env[name]?.trim();\n return value ? value : undefined;\n}\n\nfunction claudeHomeDir(): string {\n return join(homedir(), \".claude\");\n}\n\nfunction codexHomeDir(): string {\n return trimEnv(\"CODEX_HOME\") ?? join(homedir(), \".codex\");\n}\n\nconst AGENT_ADAPTERS: AgentAdapter[] = [\n {\n id: \"claude\",\n label: \"Claude Code\",\n homeDir: claudeHomeDir,\n skillsDir: () => join(claudeHomeDir(), \"skills\"),\n },\n {\n id: \"codex\",\n label: \"Codex\",\n homeDir: codexHomeDir,\n skillsDir: () => join(codexHomeDir(), \"skills\"),\n envHint: \"CODEX_HOME\",\n },\n];\n\nfunction getAgentAdapter(id: BuiltInAgentId): AgentAdapter {\n const adapter = AGENT_ADAPTERS.find((a) => a.id === id);\n if (!adapter) {\n throw new YoooclawError(\n ErrorCode.INVALID_ARGUMENT,\n `不支持的 agent:${id}`,\n { hint: `可选值:${INSTALL_AGENT_IDS.join(\" | \")}` },\n );\n }\n return adapter;\n}\n\nfunction normalizeAgent(raw: unknown): InstallAgentId {\n const agent = typeof raw === \"string\" && raw.trim() ? raw.trim() : \"auto\";\n if ((INSTALL_AGENT_IDS as readonly string[]).includes(agent)) {\n return agent as InstallAgentId;\n }\n throw new YoooclawError(\n ErrorCode.INVALID_ARGUMENT,\n `不支持的 agent:${agent}`,\n { hint: `可选值:${INSTALL_AGENT_IDS.join(\" | \")}` },\n );\n}\n\nfunction hasPath(path: string): boolean {\n return existsSync(path);\n}\n\nexport function listSkillTargetCandidates(): SkillTargetCandidate[] {\n return AGENT_ADAPTERS.map((adapter) => {\n const homeDir = adapter.homeDir();\n const target = adapter.skillsDir();\n const hasHome = hasPath(homeDir);\n const hasTarget = hasPath(target);\n const envValue = adapter.envHint ? trimEnv(adapter.envHint) : undefined;\n return {\n agent: adapter.id,\n label: adapter.label,\n homeDir,\n target,\n detected: hasHome || hasTarget || Boolean(envValue),\n reason: hasTarget\n ? \"skills 目录已存在\"\n : hasHome\n ? \"agent 配置目录已存在\"\n : envValue && adapter.envHint\n ? `${adapter.envHint} 已设置`\n : adapter.envHint\n ? `未发现配置目录;可设置 ${adapter.envHint} 或显式传 --agent ${adapter.id}`\n : `未发现配置目录;可显式传 --agent ${adapter.id}`,\n installCommand: `yoooclaw skills install --agent ${adapter.id}`,\n };\n });\n}\n\nfunction resolveTargetSelection(opts: InstallOpts): TargetSelection {\n const explicitTarget = opts.target?.trim();\n const agent = normalizeAgent(opts.agent);\n\n if (explicitTarget) {\n if (agent === \"auto\" || agent === \"custom\") {\n return {\n agent: \"custom\",\n agentLabel: \"Custom\",\n target: explicitTarget,\n source: \"explicit-target\",\n };\n }\n const adapter = getAgentAdapter(agent);\n return {\n agent,\n agentLabel: adapter.label,\n target: explicitTarget,\n source: \"explicit-target\",\n };\n }\n\n if (agent === \"custom\") {\n throw new YoooclawError(\n ErrorCode.INVALID_ARGUMENT,\n \"`--agent custom` 需要同时传 `--target <dir>`\",\n { hint: \"例如:yoooclaw skills install --agent custom --target ~/.config/agent/skills\" },\n );\n }\n\n if (agent !== \"auto\") {\n const adapter = getAgentAdapter(agent);\n return {\n agent,\n agentLabel: adapter.label,\n target: adapter.skillsDir(),\n source: \"agent-default\",\n };\n }\n\n const candidates = listSkillTargetCandidates();\n const detected = candidates.filter((c) => c.detected);\n if (detected.length === 1) {\n const only = detected[0];\n return {\n agent: only.agent,\n agentLabel: only.label,\n target: only.target,\n source: \"auto-detected\",\n detectedTargets: detected,\n };\n }\n\n if (detected.length === 0) {\n throw new YoooclawError(\n ErrorCode.NOT_FOUND,\n \"未检测到可安装 Skill 的 Agent\",\n {\n hint: \"请显式指定 `--agent claude` / `--agent codex`,或使用 `--target <dir>` 指定任意 skills 目录\",\n targets: candidates,\n },\n );\n }\n\n throw new YoooclawError(\n ErrorCode.CONFIRMATION_REQUIRED,\n \"检测到多个 Agent,无法自动判断 Skill 应安装到哪里\",\n {\n hint: \"请显式指定 `--agent claude` / `--agent codex`,或使用 `--target <dir>`\",\n targets: detected,\n },\n );\n}\n\n/**\n * 候选锚点目录,按可靠性排序,用于向上查找随包发布的 `skills/`。\n *\n * 注意:Bun 打包成 cjs 时会把 `__dirname` / `import.meta.url` 替换成**构建期**绝对路径,\n * 在用户机器上无效;因此优先用运行期入口(require.main / argv[1],node 已对其做 realpath),\n * `import.meta.url` 仅作 dev/test(未打包,源码直跑)的兜底。\n */\nfunction candidateAnchorDirs(): string[] {\n const out: string[] = [];\n // 1) cjs 产物:入口模块真实路径(如 <pkg>/dist/bin.cjs)\n try {\n const mainFile = typeof require !== \"undefined\" ? require.main?.filename : undefined;\n if (mainFile) out.push(dirname(mainFile));\n } catch {\n // ESM 下无 require\n }\n // 2) 被执行脚本路径(npm bin 软链 → realpath 还原到真实文件)\n try {\n const argv1 = process.argv[1];\n if (argv1) out.push(dirname(realpathSync(argv1)));\n } catch {\n // ignore\n }\n // 3) dev/test:模块自身路径(源码直跑时有效)\n try {\n const url = import.meta.url;\n if (url) out.push(dirname(fileURLToPath(url)));\n } catch {\n // import.meta 不可用\n }\n return out;\n}\n\n/** 目录下是否存在「子目录/SKILL.md」结构 —— 据此判定它是 skills 根。 */\nfunction looksLikeSkillsDir(dir: string): boolean {\n if (!existsSync(dir)) return false;\n return readdirSync(dir, { withFileTypes: true }).some(\n (e) => e.isDirectory() && existsSync(join(dir, e.name, \"SKILL.md\")),\n );\n}\n\n/**\n * 定位随包发布的 skills 目录:从模块所在目录逐级向上找 `skills/`。\n * - 产物:`<pkg>/dist/bin.cjs` → 上一级 `<pkg>/skills`\n * - 源码(dev/test):`<pkg>/src/commands/skills.ts` → 上溯到 `<pkg>/skills`\n */\nexport function resolveBundledSkillsDir(): string {\n const checked: string[] = [];\n for (const anchor of candidateAnchorDirs()) {\n let cur = anchor;\n for (let i = 0; i < 6; i += 1) {\n const candidate = join(cur, \"skills\");\n checked.push(candidate);\n if (looksLikeSkillsDir(candidate)) return candidate;\n const parent = dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n }\n throw new YoooclawError(\n \"YOOOCLAW_NOT_FOUND\",\n \"找不到随包发布的 skills 目录\",\n {\n hint: \"正常安装的 @yoooclaw/cli 应在包根带 skills/;若从源码运行请先 bun run build\",\n checkedPaths: checked,\n },\n );\n}\n\nexport interface BundledSkill {\n name: string;\n dir: string;\n /** frontmatter 的 name 字段(缺省回落目录名) */\n title: string;\n description: string;\n}\n\n/** 从 SKILL.md frontmatter 抽取 name / description(容忍多行被截断的情况,只取首行)。 */\nfunction parseSkillMeta(skillMd: string): { name?: string; description?: string } {\n const fm = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/.exec(skillMd);\n const block = fm ? fm[1] : skillMd;\n const pick = (key: string): string | undefined => {\n const m = new RegExp(String.raw`^${key}:\\s*(.+)$`, \"m\").exec(block);\n return m ? m[1].trim() : undefined;\n };\n return { name: pick(\"name\"), description: pick(\"description\") };\n}\n\n/** 列出 skills 根下的所有内置 Skill(含 frontmatter 元数据)。 */\nexport function listBundledSkills(skillsDir: string): BundledSkill[] {\n return readdirSync(skillsDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && existsSync(join(skillsDir, e.name, \"SKILL.md\")))\n .map((e) => {\n const dir = join(skillsDir, e.name);\n const meta = parseSkillMeta(readFileSync(join(dir, \"SKILL.md\"), \"utf-8\"));\n return {\n name: e.name,\n dir,\n title: meta.name ?? e.name,\n description: meta.description ?? \"\",\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function skillsList(_ctx: CliContext): unknown {\n const skillsDir = resolveBundledSkillsDir();\n const skills = listBundledSkills(skillsDir);\n return {\n ok: true,\n skillsDir,\n count: skills.length,\n skills: skills.map((s) => ({\n name: s.name,\n title: s.title,\n description: s.description,\n })),\n hint: \"用 `yoooclaw skills targets` 查看可安装目标,再用 `yoooclaw skills install --agent <agent>` 安装\",\n };\n}\n\ninterface InstallOpts {\n agent?: string;\n target?: string;\n copy?: boolean;\n force?: boolean;\n}\n\nexport function skillsTargets(_ctx: CliContext): unknown {\n const targets = listSkillTargetCandidates();\n return {\n ok: true,\n targets,\n hint:\n \"裸 `yoooclaw skills install` 只会在检测到唯一 Agent 时自动安装;否则请显式传 `--agent` 或 `--target`\",\n };\n}\n\ninterface InstallResult {\n name: string;\n status: \"installed\" | \"skipped\";\n /** symlink | copy;skipped 时为跳过原因 */\n via?: \"symlink\" | \"copy\";\n reason?: string;\n dest: string;\n}\n\n/** 现有目标是否已是指向同一来源的软链(幂等:重复安装不报错)。 */\nfunction isSameSymlink(dest: string, source: string): boolean {\n try {\n if (!lstatSync(dest).isSymbolicLink()) return false;\n return realpathSync(dest) === realpathSync(source);\n } catch {\n return false;\n }\n}\n\n/** 把单个 Skill 落到 dest:软链或复制;返回安装/跳过结果。 */\nfunction linkOrCopy(source: string, dest: string, mode: \"symlink\" | \"copy\"): void {\n if (mode === \"copy\") {\n cpSync(source, dest, { recursive: true });\n return;\n }\n try {\n symlinkSync(source, dest, \"dir\");\n } catch (err) {\n const e = err as NodeJS.ErrnoException;\n if (e.code === \"EPERM\" || e.code === \"EACCES\") {\n throw new YoooclawError(\n \"YOOOCLAW_STORAGE_UNAVAILABLE\",\n `创建软链失败(${e.code}):${dest}`,\n { hint: \"Windows 无管理员权限时无法创建软链,请改用 `yoooclaw skills install --copy`\" },\n );\n }\n throw err;\n }\n}\n\nfunction installOne(\n skill: BundledSkill,\n target: string,\n mode: \"symlink\" | \"copy\",\n force: boolean,\n): InstallResult {\n const source = realpathSync(skill.dir);\n const dest = join(target, skill.name);\n\n if (existsSync(dest) || isSymlinkPresent(dest)) {\n // 已是指向同一来源的软链 → 幂等视作已安装\n if (mode === \"symlink\" && isSameSymlink(dest, source)) {\n return { name: skill.name, status: \"installed\", via: \"symlink\", dest };\n }\n if (!force) {\n return { name: skill.name, status: \"skipped\", reason: \"目标已存在,加 --force 覆盖\", dest };\n }\n rmSync(dest, { recursive: true, force: true });\n }\n\n linkOrCopy(source, dest, mode);\n return { name: skill.name, status: \"installed\", via: mode, dest };\n}\n\nexport function skillsInstall(\n _ctx: CliContext,\n _args: unknown[],\n opts: InstallOpts,\n): unknown {\n const skillsDir = resolveBundledSkillsDir();\n const skills = listBundledSkills(skillsDir);\n const selection = resolveTargetSelection(opts);\n const target = selection.target;\n const mode: \"symlink\" | \"copy\" = opts.copy ? \"copy\" : \"symlink\";\n\n mkdirSync(target, { recursive: true });\n\n const results = skills.map((skill) => installOne(skill, target, mode, opts.force ?? false));\n const installed = results.filter((r) => r.status === \"installed\");\n return {\n ok: true,\n agent: selection.agent,\n agentLabel: selection.agentLabel,\n target,\n targetSource: selection.source,\n mode,\n sourceDir: skillsDir,\n installed: installed.map((r) => r.name),\n skipped: results.filter((r) => r.status === \"skipped\"),\n results,\n detectedTargets: selection.detectedTargets,\n hint:\n installed.length > 0\n ? \"重启 agent 会话后即可被发现;试试说\\\"看看最近的通知\\\"触发 yoooclaw-notification-query\"\n : \"没有新安装的 Skill(已存在则加 --force 覆盖)\",\n };\n}\n\n/** existsSync 对断链返回 false,这里补一个 lstat 探测,避免断链残留挡住安装。 */\nfunction isSymlinkPresent(p: string): boolean {\n try {\n lstatSync(p);\n return true;\n } catch {\n return false;\n }\n}\n",
|
|
96
|
-
"/**\n * daemon service —— start / stop / restart / status / logs / run-foreground(🔵)。\n */\nimport { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync, statSync, watchFile } from \"node:fs\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { requireConfig } from \"../config/store.js\";\nimport { daemonState, isProcessAlive, readLock, removeLock } from \"../daemon/lock.js\";\nimport { DaemonClient } from \"../daemon/client.js\";\nimport { runDaemonForeground, type DaemonStartOpts } from \"../daemon/main.js\";\n\ninterface StartOpts {\n bind?: string;\n port?: string;\n detach?: boolean; // commander:--no-detach → false\n logLevel?: string;\n}\n\nfunction startOpts(opts: StartOpts): DaemonStartOpts {\n return {\n bind: opts.bind,\n port: opts.port ? Number(opts.port) : undefined,\n logLevel: opts.logLevel,\n };\n}\n\n/** 内部命令:前台运行 daemon 主循环(detach 子进程入口)。 */\nexport async function daemonRunForeground(\n ctx: CliContext,\n _args: unknown[],\n opts: StartOpts,\n): Promise<unknown> {\n await runDaemonForeground(ctx, startOpts(opts));\n return { ok: true }; // 实际不会到这(runDaemonForeground 不 resolve)\n}\n\nexport async function daemonStart(\n ctx: CliContext,\n _args: unknown[],\n opts: StartOpts,\n): Promise<unknown> {\n requireConfig(ctx.paths);\n const state = daemonState(ctx.paths);\n if (state.running) {\n throw new YoooclawError(\n \"YOOOCLAW_DAEMON_ALREADY_RUNNING\",\n `daemon 已在运行(pid ${state.lock?.pid})`,\n { pid: state.lock?.pid },\n );\n }\n if (state.stale) removeLock(ctx.paths);\n\n // --no-detach:前台运行(systemd/launchd 包装)\n if (opts.detach === false) {\n await runDaemonForeground(ctx, startOpts(opts));\n return { ok: true };\n }\n\n // 默认:fork 子进程跑 run-foreground 并 detach\n const binEntry = process.argv[1];\n const args = [binEntry, \"daemon\", \"run-foreground\", \"--profile\", ctx.profile];\n if (opts.bind) args.push(\"--bind\", opts.bind);\n if (opts.port) args.push(\"--port\", opts.port);\n if (opts.logLevel) args.push(\"--log-level\", opts.logLevel);\n\n const child = spawn(process.execPath, args, {\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n env: process.env,\n });\n child.unref();\n\n // 轮询 lock 确认起来(最多 ~3s)\n for (let i = 0; i < 30; i += 1) {\n await sleep(100);\n const s = daemonState(ctx.paths);\n if (s.running) {\n return { ok: true, pid: s.lock?.pid, bind: s.lock?.bind, port: s.lock?.port, detached: true };\n }\n }\n throw new YoooclawError(\n \"YOOOCLAW_UNKNOWN\",\n \"daemon 启动超时(3s 内未写出 lock)\",\n { hint: \"查看 yoooclaw daemon logs 排查\" },\n );\n}\n\nexport async function daemonStop(ctx: CliContext): Promise<unknown> {\n const lock = readLock(ctx.paths);\n if (!lock || !isProcessAlive(lock.pid)) {\n removeLock(ctx.paths);\n throw new YoooclawError(\"YOOOCLAW_DAEMON_NOT_RUNNING\", \"daemon 未运行\");\n }\n try {\n process.kill(lock.pid, \"SIGTERM\");\n } catch {\n /* 进程可能刚退出 */\n }\n // 等待优雅退出,最多 10s\n for (let i = 0; i < 100; i += 1) {\n await sleep(100);\n if (!isProcessAlive(lock.pid)) {\n removeLock(ctx.paths);\n return { ok: true, stopped: lock.pid, signal: \"SIGTERM\" };\n }\n }\n try {\n process.kill(lock.pid, \"SIGKILL\");\n } catch {\n /* ignore */\n }\n removeLock(ctx.paths);\n return { ok: true, stopped: lock.pid, signal: \"SIGKILL\" };\n}\n\nexport async function daemonRestart(\n ctx: CliContext,\n args: unknown[],\n opts: StartOpts,\n): Promise<unknown> {\n const lock = readLock(ctx.paths);\n const inheritedOpts: StartOpts = {\n ...opts,\n bind: opts.bind ?? lock?.bind,\n port: opts.port ?? (lock?.port ? String(lock.port) : undefined),\n logLevel: opts.logLevel ?? lock?.logLevel,\n };\n if (lock && isProcessAlive(lock.pid)) {\n await daemonStop(ctx);\n }\n return daemonStart(ctx, args, inheritedOpts);\n}\n\nexport async function daemonStatus(ctx: CliContext): Promise<unknown> {\n const state = daemonState(ctx.paths);\n if (!state.running) {\n throw new YoooclawError(\n \"YOOOCLAW_DAEMON_NOT_RUNNING\",\n \"daemon 未运行\",\n { stale: state.stale, hint: \"yoooclaw daemon start\" },\n );\n }\n const client = new DaemonClient(ctx.paths);\n const res = await client.get(\"/daemon/status\");\n return res.body;\n}\n\ninterface LogsOpts {\n follow?: boolean;\n lines?: string;\n level?: string;\n}\n\nfunction tailLines(file: string, n: number): string[] {\n if (!existsSync(file)) return [];\n const content = readFileSync(file, \"utf-8\").split(\"\\n\").filter(Boolean);\n return content.slice(-n);\n}\n\nexport async function daemonLogs(\n ctx: CliContext,\n _args: unknown[],\n opts: LogsOpts,\n): Promise<unknown> {\n const n = opts.lines ? Number(opts.lines) : 100;\n const file = ctx.paths.daemonLog;\n let lines = tailLines(file, n);\n if (opts.level) {\n const want = `[${opts.level.toUpperCase()}]`;\n lines = lines.filter((l) => l.includes(want));\n }\n\n if (!opts.follow) {\n return { ok: true, file, total: lines.length, lines };\n }\n\n // --follow:先打印 tail,再持续输出新增行(raw 到 stdout,不经 --format)\n for (const l of lines) process.stdout.write(l + \"\\n\");\n let size = existsSync(file) ? statSync(file).size : 0;\n await new Promise<void>(() => {\n watchFile(file, { interval: 500 }, () => {\n if (!existsSync(file)) return;\n const cur = statSync(file).size;\n if (cur > size) {\n const chunk = readFileSync(file, \"utf-8\").slice(-(cur - size));\n size = cur;\n process.stdout.write(chunk);\n } else if (cur < size) {\n size = cur; // 轮转\n }\n });\n });\n return { ok: true };\n}\n",
|
|
97
|
-
"/**\n * daemon 主循环(前台运行体)。`daemon start` 默认 fork 一个子进程跑 `daemon run-foreground`,\n * 该命令最终调用这里的 runDaemonForeground。\n *\n * 职责:单实例锁 → 装配 StandaloneRuntime + 存储 + 通知/图片/灯效规则注册 → 起 HTTP server →\n * 起 Relay 隧道 → 写 lock → 捕获信号优雅退出。\n *\n * 关于 Relay:复用 phone-notifications 插件那套托管 Relay 服务(RelayClient + TunnelProxy,见\n * daemon/relay.ts)。daemon 用 account 级 api-key 连上 Relay,手机端经 Relay 转发进来的请求被反代到\n * 本 daemon 的 HTTP server。未设 api-key 时跳过隧道,仍可走直连 HTTP(cloudflared / tailscale serve)。\n */\nimport { createServer, type IncomingMessage, type ServerResponse, type Server } from \"node:http\";\nimport type { CliContext } from \"../context.js\";\nimport { loadConfig } from \"../config/store.js\";\nimport { resolveGatewayToken, resolveApiKey } from \"../credentials/store.js\";\nimport { daemonState, writeLock, removeLock } from \"./lock.js\";\nimport { DaemonLogger } from \"./logger.js\";\nimport { StandaloneRuntime } from \"./runtime.js\";\nimport { startRelayTunnel, type RelayTunnelHandle } from \"./relay.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { ensureDir } from \"../fs-utils.js\";\nimport { ingestImage, type ImageSyncPayload } from \"../image/channel.js\";\nimport { listMonitors, createMonitor, deleteMonitor, setMonitorEnabled } from \"../monitor/store.js\";\nimport { CLI_VERSION } from \"../version.js\";\nimport {\n NotificationStorage,\n registerNotificationInterfaces,\n RecordingStorage,\n registerRecordingInterfaces,\n LightRuleRegistry,\n registerLightRulesGateway,\n type PluginConfig,\n} from \"../shared.js\";\nimport { performLightSend } from \"./light-send.js\";\nimport { RecordingEventLog } from \"./recording-events.js\";\nimport { overrideRecordingSync } from \"./recording-bridge.js\";\nimport { registerDaemonGatewayCompatMethods } from \"./gateway-compat.js\";\n\nexport const PROTOCOL_VERSION = 1;\nexport const CAPABILITIES = [\"notifications\", \"recordings\", \"images\", \"lightrules\"];\n\nexport interface DaemonStartOpts {\n bind?: string;\n port?: number;\n logLevel?: string;\n}\n\ninterface DaemonState {\n startedAt: string;\n lastIngestAt: string | null;\n ingestCount: number;\n}\n\nasync function readBody(req: IncomingMessage): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) chunks.push(chunk as Buffer);\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(body));\n}\n\nexport async function runDaemonForeground(\n ctx: CliContext,\n opts: DaemonStartOpts,\n): Promise<void> {\n const state = daemonState(ctx.paths);\n if (state.running) {\n throw new YoooclawError(\n \"YOOOCLAW_DAEMON_ALREADY_RUNNING\",\n `daemon 已在运行(pid ${state.lock?.pid})`,\n );\n }\n\n const config = loadConfig(ctx.paths);\n const bind = opts.bind ?? config.daemon.bind;\n // 起始端口;listen 时若被占用会自动 +1(见下方 listen 循环),port 最终为实际绑定端口。\n let port = opts.port ?? config.daemon.port;\n const logLevel = (opts.logLevel ?? config.daemon.logLevel) as never;\n const token = resolveGatewayToken(config).value;\n\n // 安全:绑公网必须有 token\n const loopback = bind === \"127.0.0.1\" || bind === \"::1\" || bind === \"localhost\";\n if (!loopback && !token) {\n throw new YoooclawError(\n \"YOOOCLAW_UNAUTHORIZED\",\n `绑定 ${bind} 需要先设置 gateway token`,\n { hint: \"运行 yoooclaw auth token-rotate 或改回 127.0.0.1\" },\n );\n }\n\n ensureDir(ctx.paths.dir);\n const logger = new DaemonLogger(ctx.paths.daemonLog, logLevel, false);\n const runtimeState: DaemonState = {\n startedAt: new Date().toISOString(),\n lastIngestAt: null,\n ingestCount: 0,\n };\n\n const pluginConfig: PluginConfig = {\n retentionDays: config.notification.retentionDays ?? undefined,\n ignoredApps: config.notification.ignoredApps,\n };\n\n const runtime = new StandaloneRuntime(logger, pluginConfig as Record<string, unknown>, ctx.paths.dir);\n\n // 通知存储\n const storage = new NotificationStorage(ctx.paths.notifications, pluginConfig, logger);\n await storage.init();\n\n // 录音存储(接收手机端 recordings.sync / POST /recordings)\n const recordingStorage = new RecordingStorage(ctx.paths.recordings, logger);\n await recordingStorage.init();\n\n // 录音状态事件流:日志 + JSONL(CLI / Agent 通过 `yc recording events` 消费)+ 反向推手机\n const recordingEventLog = new RecordingEventLog(ctx.paths.recordings);\n // pushRecordingStatus 在 relayHandle 启动后才有值;用 mutable 闭包变量延后绑定\n let pushRecordingStatus: ((event: import(\"../shared.js\").RecordingStatusEvent) => void) | undefined;\n const notifyRecordingStatus = (event: import(\"../shared.js\").RecordingStatusEvent) => {\n logger.info(\n `[recording-status] ${event.recordingId} → ${event.transfer_status}${\n event.error ? ` err=${event.error}` : \"\"\n }`,\n );\n try {\n recordingEventLog.append(event);\n } catch (err) {\n logger.warn(`[recording-status] 事件落盘失败: ${(err as Error).message}`);\n }\n // 反向推送到手机端(客户端合同:recording.status event;recordings.status RPC 是兜底)\n try {\n pushRecordingStatus?.(event);\n } catch (err) {\n logger.warn(`[recording-status] event push 失败: ${(err as Error).message}`);\n }\n };\n\n // 灯效规则注册(rules 落 <profile>/tasks/)\n const lightRuleRegistry = new LightRuleRegistry({ workspaceDir: ctx.paths.dir });\n\n const ignored = new Set(config.notification.ignoredApps ?? []);\n registerNotificationInterfaces({\n // 结构兼容 OpenClawPluginApi 的子集\n api: runtime as never,\n logger,\n getStorage: () => storage,\n filterNotifications: (items) => items.filter((n) => !ignored.has(n.app)),\n registerGatewayMethod: (m, h) => runtime.registerGatewayMethod(m, h as never),\n onAfterIngest: (inserted) => {\n runtimeState.lastIngestAt = new Date().toISOString();\n runtimeState.ingestCount += inserted.length;\n },\n });\n registerRecordingInterfaces({\n api: runtime as never,\n logger,\n asrDataDir: ctx.paths.recordings,\n getRecordingStorage: () => recordingStorage,\n notifyRecordingStatus,\n registerGatewayMethod: (m, h) => runtime.registerGatewayMethod(m, h as never),\n shouldBroadcastStatusOnHttp: () => true,\n tunnelService: null,\n });\n // 覆盖 sync:注入本地 asr-config.json + account 级 ock- key fallback\n overrideRecordingSync({\n runtime,\n storage: recordingStorage,\n logger,\n fallbackApiKey: resolveApiKey().value ?? undefined,\n asrConfigDir: ctx.paths.recordings,\n notifyStatus: notifyRecordingStatus,\n });\n registerLightRulesGateway(runtime as never, lightRuleRegistry, logger);\n\n const server = createServer((req, res) => {\n void handleRequest(req, res).catch((err) => {\n logger.error(`请求处理异常:${(err as Error).message}`);\n if (!res.headersSent) sendJson(res, 500, { ok: false, error: { code: \"INTERNAL_ERROR\", message: (err as Error).message } });\n });\n });\n\n function authorized(req: IncomingMessage): boolean {\n if (!token) return true; // 仅 loopback 且未设 token 时\n const header = req.headers[\"authorization\"];\n return header === `Bearer ${token}`;\n }\n\n /** 汇总当前 Relay 状态(隧道未启用/未连时给出可执行提示)。 */\n function relayStatus(): {\n mode: \"relay\" | \"standalone-http\";\n connected: boolean;\n url: string;\n enabled: boolean;\n reconnectAttempt: number;\n lastDisconnectReason?: string;\n note?: string;\n } {\n if (relayHandle) {\n const s = relayHandle.status();\n return {\n mode: \"relay\",\n connected: s.connected,\n url: config.relay.url,\n enabled: config.relay.enabled,\n reconnectAttempt: s.reconnectAttempt,\n lastDisconnectReason: s.lastDisconnectReason,\n note: s.connected ? undefined : \"Relay 重连中\",\n };\n }\n return {\n mode: \"standalone-http\",\n connected: false,\n url: config.relay.url,\n enabled: config.relay.enabled,\n reconnectAttempt: 0,\n note: config.relay.enabled\n ? \"Relay 已启用但未设置 api-key:运行 yc auth set-api-key <ock_…> 后重启 daemon;当前可走直连 HTTP(cloudflared / tailscale serve)\"\n : \"Relay 未启用,走直连 HTTP\",\n };\n }\n\n registerDaemonGatewayCompatMethods(runtime, {\n version: CLI_VERSION,\n protocol: PROTOCOL_VERSION,\n capabilities: CAPABILITIES,\n profile: ctx.profile,\n bind,\n getPort: () => port,\n startedAt: runtimeState.startedAt,\n getLastIngestAt: () => runtimeState.lastIngestAt,\n getIngestCount: () => runtimeState.ingestCount,\n getLightRuleCount: () => lightRuleRegistry.list().length,\n getRelayStatus: relayStatus,\n });\n\n async function handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n const path = url.pathname;\n const method = req.method ?? \"GET\";\n\n // /health 公开(手机端协议协商)\n if (path === \"/health\" && method === \"GET\") {\n sendJson(res, 200, {\n server: \"yoooclaw\",\n version: CLI_VERSION,\n protocol: PROTOCOL_VERSION,\n capabilities: CAPABILITIES,\n });\n return;\n }\n\n if (!authorized(req)) {\n sendJson(res, 401, { ok: false, error: { code: \"YOOOCLAW_UNAUTHORIZED\", message: \"token 不一致或缺失\" } });\n return;\n }\n\n // ── 控制面 ──\n if (path === \"/daemon/status\" && method === \"GET\") {\n sendJson(res, 200, {\n ok: true,\n server: \"yoooclaw\",\n version: CLI_VERSION,\n pid: process.pid,\n profile: ctx.profile,\n bind,\n port,\n startedAt: runtimeState.startedAt,\n lastIngestAt: runtimeState.lastIngestAt,\n ingestCount: runtimeState.ingestCount,\n lightRules: lightRuleRegistry.list().length,\n relay: relayStatus(),\n memoryRssBytes: process.memoryUsage().rss,\n });\n return;\n }\n if (path === \"/daemon/stop\" && method === \"POST\") {\n sendJson(res, 200, { ok: true, stopping: true });\n logger.info(\"收到 /daemon/stop,准备优雅退出\");\n setTimeout(() => void shutdown(\"stop-endpoint\"), 50);\n return;\n }\n if (path === \"/tunnel/status\" && method === \"GET\") {\n const s = relayStatus();\n sendJson(res, 200, {\n ok: true,\n mode: s.mode,\n connected: s.connected,\n relayUrl: config.relay.url,\n enabled: config.relay.enabled,\n reconnectAttempt: s.reconnectAttempt,\n lastDisconnectReason: s.lastDisconnectReason,\n note: s.note,\n });\n return;\n }\n if (path === \"/tunnel/reconnect\" && method === \"POST\") {\n if (!relayHandle) {\n sendJson(res, 200, { ok: true, mode: relayStatus().mode, reconnected: false, note: relayStatus().note });\n return;\n }\n relayHandle.reconnect();\n sendJson(res, 200, { ok: true, mode: \"relay\", reconnected: true });\n return;\n }\n if (path === \"/tunnel/test\" && method === \"POST\") {\n // 回环自检:daemon 自己 POST 一条 echo 通知到本地 /notifications\n const echo = await selfEchoCheck(`http://127.0.0.1:${port}`, token);\n sendJson(res, 200, { ok: echo.ok, mode: relayStatus().mode, loopback: echo });\n return;\n }\n if (path === \"/light/send\" && method === \"POST\") {\n const body = await parseJson(req, res);\n if (body === undefined) return;\n const outcome = await performLightSend(body as Parameters<typeof performLightSend>[0], {\n logger,\n registry: lightRuleRegistry,\n });\n sendJson(res, outcome.status, outcome.body);\n return;\n }\n if (path === \"/images\" && method === \"POST\") {\n const body = await parseJson(req, res);\n if (body === undefined) return;\n try {\n const result = ingestImage(ctx.paths, body as ImageSyncPayload, {\n maxBytes: config.image.maxBytes,\n logger,\n });\n sendJson(res, 200, result);\n } catch (err) {\n sendJson(res, 400, { ok: false, error: { code: \"INVALID_PARAMS\", message: (err as Error).message } });\n }\n return;\n }\n // monitors CRUD(定义存储;本 build 不做 live cron 触发)\n if (path === \"/monitors\" && method === \"GET\") {\n sendJson(res, 200, { ok: true, monitors: listMonitors(ctx.paths) });\n return;\n }\n if (path === \"/monitors\" && method === \"POST\") {\n const body = await parseJson(req, res);\n if (body === undefined) return;\n try {\n sendJson(res, 200, { ok: true, monitor: createMonitor(ctx.paths, body as never) });\n } catch (err) {\n sendJson(res, 400, { ok: false, error: { code: \"INVALID_PARAMS\", message: (err as Error).message } });\n }\n return;\n }\n if (path.startsWith(\"/monitors/\") && method === \"DELETE\") {\n const name = decodeURIComponent(path.slice(\"/monitors/\".length));\n sendJson(res, 200, { ok: true, deleted: deleteMonitor(ctx.paths, name) });\n return;\n }\n if (path.startsWith(\"/monitors/\") && method === \"POST\") {\n const [, , name, action] = path.split(\"/\");\n const enabled = action === \"enable\";\n sendJson(res, 200, { ok: setMonitorEnabled(ctx.paths, decodeURIComponent(name), enabled), name, enabled });\n return;\n }\n\n // gateway 桥:POST /gateway/<method>\n if (path.startsWith(\"/gateway/\") && method === \"POST\") {\n const gwMethod = path.slice(\"/gateway/\".length);\n const body = await parseJson(req, res);\n if (body === undefined) return;\n const result = await runtime.callGateway(gwMethod, body);\n sendJson(res, result.ok ? 200 : 400, result);\n return;\n }\n\n // 注册的 HTTP 路由(如 POST /notifications)\n const route = runtime.httpRoutes.get(path);\n if (route) {\n await route.handler(req, res);\n return;\n }\n\n sendJson(res, 404, { ok: false, error: { code: \"YOOOCLAW_NOT_FOUND\", message: `未知路径:${path}` } });\n }\n\n async function parseJson(req: IncomingMessage, res: ServerResponse): Promise<unknown | undefined> {\n try {\n const raw = await readBody(req);\n return raw ? JSON.parse(raw) : {};\n } catch {\n sendJson(res, 400, { ok: false, error: { code: \"INVALID_PARAMS\", message: \"请求体不是合法 JSON\" } });\n return undefined;\n }\n }\n\n let serverRef: Server | null = null;\n let relayHandle: RelayTunnelHandle | null = null;\n let shuttingDown = false;\n async function shutdown(reason: string): Promise<void> {\n if (shuttingDown) return;\n shuttingDown = true;\n logger.info(`daemon 退出(${reason})`);\n try {\n await relayHandle?.stop(reason);\n } catch {\n /* ignore */\n }\n try {\n await storage.close();\n } catch {\n /* ignore */\n }\n try {\n await recordingStorage.close();\n } catch {\n /* ignore */\n }\n serverRef?.close();\n removeLock(ctx.paths);\n process.exit(0);\n }\n\n // listen;遇 EADDRINUSE(端口被其它进程占用)则端口 +1 重试,port 最终为实际绑定端口。\n const listenOnce = (p: number): Promise<void> =>\n new Promise<void>((resolve, reject) => {\n const onError = (err: NodeJS.ErrnoException) => {\n server.removeListener(\"listening\", onListening);\n reject(err);\n };\n const onListening = () => {\n server.removeListener(\"error\", onError);\n resolve();\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen(p, bind);\n });\n\n const startPort = port;\n for (let attempt = 0; ; attempt += 1) {\n try {\n await listenOnce(port);\n break;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"EADDRINUSE\" && attempt < 64) {\n const next = port + 1;\n logger.warn(`端口 ${port} 被占用,改试 ${next}`);\n port = next;\n continue;\n }\n throw err;\n }\n }\n if (port !== startPort) {\n logger.info(`起始端口 ${startPort} 被占用,最终绑定到 ${port}`);\n }\n serverRef = server;\n writeLock(ctx.paths, {\n pid: process.pid,\n startedAt: runtimeState.startedAt,\n bind,\n port,\n logLevel: String(logLevel),\n });\n logger.info(`yoooclaw daemon 启动:${bind}:${port}(profile=${ctx.profile}, pid=${process.pid})`);\n\n // Relay 隧道:复用插件连接逻辑,反代到本 daemon 自己的 HTTP server。\n if (config.relay.enabled) {\n const apiKey = resolveApiKey();\n if (apiKey.value) {\n relayHandle = startRelayTunnel({\n tunnelUrl: config.relay.url,\n apiKey: apiKey.value,\n runtime,\n httpBaseUrl: `http://127.0.0.1:${port}`,\n httpToken: token,\n heartbeatSec: config.relay.heartbeatSec,\n reconnectBackoffMs: config.relay.reconnectBackoffMs,\n stateDir: ctx.paths.dir,\n logger,\n });\n const handle = relayHandle;\n pushRecordingStatus = (event) => handle.pushEvent(\"recording.status\", event);\n } else {\n logger.warn(\"Relay 已启用但未设置 api-key,跳过隧道连接。运行 yc auth set-api-key <ock_…> 后重启 daemon\");\n }\n } else {\n logger.info(\"Relay 未启用(config.relay.enabled=false),仅走直连 HTTP\");\n }\n\n process.on(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\n process.on(\"SIGINT\", () => void shutdown(\"SIGINT\"));\n\n // 前台保持运行(http server 维持 event loop);返回的 promise 永不 resolve\n await new Promise<void>(() => {});\n}\n\nasync function selfEchoCheck(baseUrl: string, token?: string): Promise<{ ok: boolean; status?: number; error?: string }> {\n try {\n const res = await fetch(`${baseUrl}/notifications`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n },\n body: JSON.stringify({\n notifications: [\n { id: `echo_${Date.now()}`, app: \"yoooclaw.selftest\", title: \"tunnel +test\", body: \"echo\", timestamp: new Date().toISOString() },\n ],\n }),\n });\n return { ok: res.ok, status: res.status };\n } catch (err) {\n return { ok: false, error: (err as Error).message };\n }\n}\n",
|
|
96
|
+
"/**\n * daemon service —— start / stop / restart / status / logs / run-foreground(🔵)。\n */\nimport { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync, statSync, watchFile } from \"node:fs\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { requireConfig } from \"../config/store.js\";\nimport { daemonState, isProcessAlive, readLock, removeLock } from \"../daemon/lock.js\";\nimport { DaemonClient } from \"../daemon/client.js\";\nimport { runDaemonForeground, type DaemonStartOpts } from \"../daemon/main.js\";\n\ninterface StartOpts {\n bind?: string;\n port?: string;\n detach?: boolean; // commander:--no-detach → false\n logLevel?: string;\n}\n\nfunction startOpts(opts: StartOpts): DaemonStartOpts {\n return {\n bind: opts.bind,\n port: opts.port ? Number(opts.port) : undefined,\n logLevel: opts.logLevel,\n };\n}\n\n/** 内部命令:前台运行 daemon 主循环(detach 子进程入口)。 */\nexport async function daemonRunForeground(\n ctx: CliContext,\n _args: unknown[],\n opts: StartOpts,\n): Promise<unknown> {\n await runDaemonForeground(ctx, startOpts(opts));\n return { ok: true }; // 实际不会到这(runDaemonForeground 不 resolve)\n}\n\nexport async function daemonStart(\n ctx: CliContext,\n _args: unknown[],\n opts: StartOpts,\n): Promise<unknown> {\n requireConfig(ctx.paths);\n const state = daemonState(ctx.paths);\n if (state.running) {\n throw new YoooclawError(\n \"YOOOCLAW_DAEMON_ALREADY_RUNNING\",\n `daemon 已在运行(pid ${state.lock?.pid})`,\n { pid: state.lock?.pid },\n );\n }\n if (state.stale) removeLock(ctx.paths);\n\n // --no-detach:前台运行(systemd/launchd 包装)\n if (opts.detach === false) {\n await runDaemonForeground(ctx, startOpts(opts));\n return { ok: true };\n }\n\n // 默认:fork 子进程跑 run-foreground 并 detach\n const binEntry = process.argv[1];\n const args = [binEntry, \"daemon\", \"run-foreground\", \"--profile\", ctx.profile];\n if (opts.bind) args.push(\"--bind\", opts.bind);\n if (opts.port) args.push(\"--port\", opts.port);\n if (opts.logLevel) args.push(\"--log-level\", opts.logLevel);\n\n const child = spawn(process.execPath, args, {\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n env: process.env,\n });\n child.unref();\n\n // 轮询 lock 确认起来(最多 ~3s)\n for (let i = 0; i < 30; i += 1) {\n await sleep(100);\n const s = daemonState(ctx.paths);\n if (s.running) {\n return { ok: true, pid: s.lock?.pid, bind: s.lock?.bind, port: s.lock?.port, detached: true };\n }\n }\n throw new YoooclawError(\n \"YOOOCLAW_UNKNOWN\",\n \"daemon 启动超时(3s 内未写出 lock)\",\n { hint: \"查看 yoooclaw daemon logs 排查\" },\n );\n}\n\nexport async function daemonStop(ctx: CliContext): Promise<unknown> {\n const lock = readLock(ctx.paths);\n if (!lock || !isProcessAlive(lock.pid)) {\n removeLock(ctx.paths);\n throw new YoooclawError(\"YOOOCLAW_DAEMON_NOT_RUNNING\", \"daemon 未运行\");\n }\n try {\n process.kill(lock.pid, \"SIGTERM\");\n } catch {\n /* 进程可能刚退出 */\n }\n // 等待优雅退出,最多 10s\n for (let i = 0; i < 100; i += 1) {\n await sleep(100);\n if (!isProcessAlive(lock.pid)) {\n removeLock(ctx.paths);\n return { ok: true, stopped: lock.pid, signal: \"SIGTERM\" };\n }\n }\n try {\n process.kill(lock.pid, \"SIGKILL\");\n } catch {\n /* ignore */\n }\n removeLock(ctx.paths);\n return { ok: true, stopped: lock.pid, signal: \"SIGKILL\" };\n}\n\nexport async function daemonRestart(\n ctx: CliContext,\n args: unknown[],\n opts: StartOpts,\n): Promise<unknown> {\n const lock = readLock(ctx.paths);\n const inheritedOpts: StartOpts = {\n ...opts,\n bind: opts.bind ?? lock?.bind,\n port: opts.port ?? (lock?.port ? String(lock.port) : undefined),\n logLevel: opts.logLevel ?? lock?.logLevel,\n };\n if (lock && isProcessAlive(lock.pid)) {\n await daemonStop(ctx);\n }\n return daemonStart(ctx, args, inheritedOpts);\n}\n\nexport async function daemonReload(ctx: CliContext): Promise<unknown> {\n const state = daemonState(ctx.paths);\n if (!state.running) {\n return { ok: true, running: false, reloaded: false };\n }\n const client = new DaemonClient(ctx.paths);\n const res = await client.post(\"/daemon/reload\");\n return res.body;\n}\n\nexport async function daemonStatus(ctx: CliContext): Promise<unknown> {\n const state = daemonState(ctx.paths);\n if (!state.running) {\n throw new YoooclawError(\n \"YOOOCLAW_DAEMON_NOT_RUNNING\",\n \"daemon 未运行\",\n { stale: state.stale, hint: \"yoooclaw daemon start\" },\n );\n }\n const client = new DaemonClient(ctx.paths);\n const res = await client.get(\"/daemon/status\");\n return res.body;\n}\n\ninterface LogsOpts {\n follow?: boolean;\n lines?: string;\n level?: string;\n}\n\nfunction tailLines(file: string, n: number): string[] {\n if (!existsSync(file)) return [];\n const content = readFileSync(file, \"utf-8\").split(\"\\n\").filter(Boolean);\n return content.slice(-n);\n}\n\nexport async function daemonLogs(\n ctx: CliContext,\n _args: unknown[],\n opts: LogsOpts,\n): Promise<unknown> {\n const n = opts.lines ? Number(opts.lines) : 100;\n const file = ctx.paths.daemonLog;\n let lines = tailLines(file, n);\n if (opts.level) {\n const want = `[${opts.level.toUpperCase()}]`;\n lines = lines.filter((l) => l.includes(want));\n }\n\n if (!opts.follow) {\n return { ok: true, file, total: lines.length, lines };\n }\n\n // --follow:先打印 tail,再持续输出新增行(raw 到 stdout,不经 --format)\n for (const l of lines) process.stdout.write(l + \"\\n\");\n let size = existsSync(file) ? statSync(file).size : 0;\n await new Promise<void>(() => {\n watchFile(file, { interval: 500 }, () => {\n if (!existsSync(file)) return;\n const cur = statSync(file).size;\n if (cur > size) {\n const chunk = readFileSync(file, \"utf-8\").slice(-(cur - size));\n size = cur;\n process.stdout.write(chunk);\n } else if (cur < size) {\n size = cur; // 轮转\n }\n });\n });\n return { ok: true };\n}\n",
|
|
97
|
+
"/**\n * daemon 主循环(前台运行体)。`daemon start` 默认 fork 一个子进程跑 `daemon run-foreground`,\n * 该命令最终调用这里的 runDaemonForeground。\n *\n * 职责:单实例锁 → 装配 StandaloneRuntime + 存储 + 通知/图片/灯效规则注册 → 起 HTTP server →\n * 起 Relay 隧道 → 写 lock → 捕获信号优雅退出。\n *\n * 关于 Relay:复用 phone-notifications 插件那套托管 Relay 服务(RelayClient + TunnelProxy,见\n * daemon/relay.ts)。daemon 用 account 级 api-key 连上 Relay,手机端经 Relay 转发进来的请求被反代到\n * 本 daemon 的 HTTP server。未设 api-key 时跳过隧道,仍可走直连 HTTP(cloudflared / tailscale serve)。\n */\nimport { watchFile, unwatchFile } from \"node:fs\";\nimport { createServer, type IncomingMessage, type ServerResponse, type Server } from \"node:http\";\nimport type { CliContext } from \"../context.js\";\nimport { loadConfig } from \"../config/store.js\";\nimport { sharedCredentialsPath } from \"../paths.js\";\nimport { resolveGatewayToken } from \"../credentials/store.js\";\nimport { resolveApiKeyEntries, type CredentialSet } from \"../credentials/store.js\";\nimport { daemonState, writeLock, removeLock } from \"./lock.js\";\nimport { DaemonLogger } from \"./logger.js\";\nimport { StandaloneRuntime } from \"./runtime.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { ensureDir } from \"../fs-utils.js\";\nimport { ingestImage, type ImageSyncPayload } from \"../image/channel.js\";\nimport { listMonitors, createMonitor, deleteMonitor, setMonitorEnabled } from \"../monitor/store.js\";\nimport { CLI_VERSION } from \"../version.js\";\nimport {\n NotificationStorage,\n registerNotificationInterfaces,\n RecordingStorage,\n registerRecordingInterfaces,\n LightRuleRegistry,\n registerLightRulesGateway,\n RELAY_INTERNAL_HTTP_HEADER,\n runWithIngestContext,\n type IngestContext,\n type PluginConfig,\n} from \"../shared.js\";\nimport { performLightSend } from \"./light-send.js\";\nimport { RecordingEventLog } from \"./recording-events.js\";\nimport { overrideRecordingSync } from \"./recording-bridge.js\";\nimport { registerDaemonGatewayCompatMethods } from \"./gateway-compat.js\";\nimport { RELAY_INTERNAL_CLIENT_LABEL_HEADER } from \"./relay-dispatcher.js\";\nimport { TunnelSupervisor } from \"./tunnel-supervisor.js\";\n\nexport const PROTOCOL_VERSION = 1;\nexport const CAPABILITIES = [\"notifications\", \"recordings\", \"images\", \"lightrules\", \"multi-apikey\"];\n\nexport interface DaemonStartOpts {\n bind?: string;\n port?: number;\n logLevel?: string;\n}\n\ninterface DaemonState {\n startedAt: string;\n lastIngestAt: string | null;\n ingestCount: number;\n}\n\nasync function readBody(req: IncomingMessage): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) chunks.push(chunk as Buffer);\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(body));\n}\n\nexport async function runDaemonForeground(\n ctx: CliContext,\n opts: DaemonStartOpts,\n): Promise<void> {\n const state = daemonState(ctx.paths);\n if (state.running) {\n throw new YoooclawError(\n \"YOOOCLAW_DAEMON_ALREADY_RUNNING\",\n `daemon 已在运行(pid ${state.lock?.pid})`,\n );\n }\n\n const config = loadConfig(ctx.paths);\n const bind = opts.bind ?? config.daemon.bind;\n // 起始端口;listen 时若被占用会自动 +1(见下方 listen 循环),port 最终为实际绑定端口。\n let port = opts.port ?? config.daemon.port;\n const logLevel = (opts.logLevel ?? config.daemon.logLevel) as never;\n const token = resolveGatewayToken(config).value;\n let credentialSet: CredentialSet = resolveApiKeyEntries();\n\n // 安全:绑公网必须有 token\n const loopback = bind === \"127.0.0.1\" || bind === \"::1\" || bind === \"localhost\";\n if (!loopback && !token) {\n throw new YoooclawError(\n \"YOOOCLAW_UNAUTHORIZED\",\n `绑定 ${bind} 需要先设置 gateway token`,\n { hint: \"运行 yoooclaw auth token-rotate 或改回 127.0.0.1\" },\n );\n }\n\n ensureDir(ctx.paths.dir);\n const logger = new DaemonLogger(ctx.paths.daemonLog, logLevel, false);\n const runtimeState: DaemonState = {\n startedAt: new Date().toISOString(),\n lastIngestAt: null,\n ingestCount: 0,\n };\n\n const pluginConfig: PluginConfig = {\n retentionDays: config.notification.retentionDays ?? undefined,\n ignoredApps: config.notification.ignoredApps,\n };\n\n const runtime = new StandaloneRuntime(logger, pluginConfig as Record<string, unknown>, ctx.paths.dir);\n\n // 通知存储\n const storage = new NotificationStorage(ctx.paths.notifications, pluginConfig, logger);\n await storage.init();\n\n // 录音存储(接收手机端 recordings.sync / POST /recordings)\n const recordingStorage = new RecordingStorage(ctx.paths.recordings, logger);\n await recordingStorage.init();\n\n // 录音状态事件流:日志 + JSONL(CLI / Agent 通过 `yc recording events` 消费)+ 反向推手机\n const recordingEventLog = new RecordingEventLog(ctx.paths.recordings);\n // pushRecordingStatus 在 relayHandle 启动后才有值;用 mutable 闭包变量延后绑定\n let pushRecordingStatus: ((event: import(\"../shared.js\").RecordingStatusEvent) => void) | undefined;\n const notifyRecordingStatus = (event: import(\"../shared.js\").RecordingStatusEvent) => {\n logger.info(\n `[recording-status] ${event.recordingId} → ${event.transfer_status}${\n event.error ? ` err=${event.error}` : \"\"\n }`,\n );\n try {\n recordingEventLog.append(event);\n } catch (err) {\n logger.warn(`[recording-status] 事件落盘失败: ${(err as Error).message}`);\n }\n // 反向推送到手机端(客户端合同:recording.status event;recordings.status RPC 是兜底)\n try {\n pushRecordingStatus?.(event);\n } catch (err) {\n logger.warn(`[recording-status] event push 失败: ${(err as Error).message}`);\n }\n };\n\n // 灯效规则注册(rules 落 <profile>/tasks/)\n const lightRuleRegistry = new LightRuleRegistry({ workspaceDir: ctx.paths.dir });\n\n const ignored = new Set(config.notification.ignoredApps ?? []);\n registerNotificationInterfaces({\n // 结构兼容 OpenClawPluginApi 的子集\n api: runtime as never,\n logger,\n getStorage: () => storage,\n filterNotifications: (items) => items.filter((n) => !ignored.has(n.app)),\n registerGatewayMethod: (m, h) => runtime.registerGatewayMethod(m, h as never),\n onAfterIngest: (inserted) => {\n runtimeState.lastIngestAt = new Date().toISOString();\n runtimeState.ingestCount += inserted.length;\n },\n });\n registerRecordingInterfaces({\n api: runtime as never,\n logger,\n asrDataDir: ctx.paths.recordings,\n getRecordingStorage: () => recordingStorage,\n notifyRecordingStatus,\n registerGatewayMethod: (m, h) => runtime.registerGatewayMethod(m, h as never),\n shouldBroadcastStatusOnHttp: () => true,\n tunnelService: null,\n });\n // 覆盖 sync:注入本地 asr-config.json + account 级 ock- key fallback\n overrideRecordingSync({\n runtime,\n storage: recordingStorage,\n logger,\n fallbackApiKey: () => credentialSet.defaultEntry?.key,\n asrConfigDir: ctx.paths.recordings,\n notifyStatus: notifyRecordingStatus,\n });\n registerLightRulesGateway(runtime as never, lightRuleRegistry, logger);\n\n const server = createServer((req, res) => {\n void handleRequest(req, res).catch((err) => {\n logger.error(`请求处理异常:${(err as Error).message}`);\n if (!res.headersSent) sendJson(res, 500, { ok: false, error: { code: \"INTERNAL_ERROR\", message: (err as Error).message } });\n });\n });\n\n function headerValue(req: IncomingMessage, name: string): string | undefined {\n const value = req.headers[name.toLowerCase()];\n return Array.isArray(value) ? value[0] : value;\n }\n\n function bearerValue(req: IncomingMessage): string | undefined {\n const header = headerValue(req, \"authorization\")?.trim();\n if (!header?.toLowerCase().startsWith(\"bearer \")) return undefined;\n return header.slice(\"Bearer \".length).trim();\n }\n\n function stripBearer(value: string): string {\n return value.startsWith(\"Bearer \") ? value.slice(\"Bearer \".length) : value;\n }\n\n function labelForApiKey(apiKey: string | undefined): string | undefined {\n if (!apiKey) return undefined;\n const raw = stripBearer(apiKey);\n return credentialSet.entries.find((entry) => stripBearer(entry.key) === raw)?.label;\n }\n\n function isIngestPath(path: string): boolean {\n return path === \"/notifications\"\n || path === \"/recordings\"\n || path === \"/images\"\n || path === \"/gateway/notifications.push\"\n || path === \"/gateway/recordings.sync\"\n || path === \"/gateway/images.sync\";\n }\n\n function authContextForRequest(req: IncomingMessage, path: string): { ok: true; context: IngestContext } | { ok: false } {\n const internalRelay = headerValue(req, RELAY_INTERNAL_HTTP_HEADER) === \"1\";\n const internalLabel = headerValue(req, RELAY_INTERNAL_CLIENT_LABEL_HEADER)?.trim();\n const bearer = bearerValue(req);\n const gatewayTokenOk = token ? bearer === token : true;\n\n if (internalRelay && internalLabel && gatewayTokenOk) {\n return { ok: true, context: { clientLabel: internalLabel, authKind: \"relay-api-key\" } };\n }\n\n if (token && bearer === token) {\n return { ok: true, context: { clientLabel: \"local\", authKind: \"gateway-token\" } };\n }\n\n if (isIngestPath(path)) {\n const label = labelForApiKey(bearer);\n if (label) {\n return { ok: true, context: { clientLabel: label, authKind: \"http-api-key\" } };\n }\n }\n\n if (!token) {\n return { ok: true, context: { clientLabel: \"local\", authKind: \"local\" } };\n }\n\n return { ok: false };\n }\n\n /** 汇总当前 Relay 状态(隧道未启用/未连时给出可执行提示)。 */\n function relayStatus(): {\n mode: \"relay\" | \"standalone-http\";\n connected: boolean;\n url: string;\n enabled: boolean;\n reconnectAttempt: number;\n lastDisconnectReason?: string;\n note?: string;\n } {\n if (tunnelSupervisor) {\n const s = tunnelSupervisor.defaultStatus();\n if (s) {\n return {\n mode: \"relay\",\n connected: s.connected,\n url: config.relay.url,\n enabled: config.relay.enabled,\n reconnectAttempt: s.reconnectAttempt,\n lastDisconnectReason: s.lastDisconnectReason,\n note: s.connected ? undefined : \"Relay 重连中\",\n };\n }\n return {\n mode: \"relay\",\n connected: false,\n url: config.relay.url,\n enabled: config.relay.enabled,\n reconnectAttempt: 0,\n note: \"Relay 已启用但当前 CredentialSet 没有可用 api-key\",\n };\n }\n return {\n mode: \"standalone-http\",\n connected: false,\n url: config.relay.url,\n enabled: config.relay.enabled,\n reconnectAttempt: 0,\n note: config.relay.enabled\n ? \"Relay 已启用但未设置 api-key:运行 yc auth set-api-key <ock_…> 后重启 daemon;当前可走直连 HTTP(cloudflared / tailscale serve)\"\n : \"Relay 未启用,走直连 HTTP\",\n };\n }\n\n registerDaemonGatewayCompatMethods(runtime, {\n version: CLI_VERSION,\n protocol: PROTOCOL_VERSION,\n capabilities: CAPABILITIES,\n profile: ctx.profile,\n bind,\n getPort: () => port,\n startedAt: runtimeState.startedAt,\n getLastIngestAt: () => runtimeState.lastIngestAt,\n getIngestCount: () => runtimeState.ingestCount,\n getLightRuleCount: () => lightRuleRegistry.list().length,\n getRelayStatus: relayStatus,\n });\n\n async function handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n const path = url.pathname;\n const method = req.method ?? \"GET\";\n\n // /health 公开(手机端协议协商)\n if (path === \"/health\" && method === \"GET\") {\n sendJson(res, 200, {\n server: \"yoooclaw\",\n version: CLI_VERSION,\n protocol: PROTOCOL_VERSION,\n capabilities: CAPABILITIES,\n });\n return;\n }\n\n const auth = authContextForRequest(req, path);\n if (!auth.ok) {\n sendJson(res, 401, { ok: false, error: { code: \"YOOOCLAW_UNAUTHORIZED\", message: \"token 不一致或缺失\" } });\n return;\n }\n const ingestContext = auth.context;\n\n // ── 控制面 ──\n if (path === \"/daemon/status\" && method === \"GET\") {\n const supervisorStatus = tunnelSupervisor?.status();\n sendJson(res, 200, {\n ok: true,\n server: \"yoooclaw\",\n version: CLI_VERSION,\n pid: process.pid,\n profile: ctx.profile,\n bind,\n port,\n startedAt: runtimeState.startedAt,\n lastIngestAt: runtimeState.lastIngestAt,\n ingestCount: runtimeState.ingestCount,\n lightRules: lightRuleRegistry.list().length,\n relay: relayStatus(),\n tunnels: supervisorStatus?.tunnels ?? [],\n credentialMode: credentialSet.mode,\n defaultLabel: credentialSet.defaultEntry?.label ?? null,\n credentialWarnings: credentialSet.warnings,\n memoryRssBytes: process.memoryUsage().rss,\n });\n return;\n }\n if (path === \"/daemon/reload\" && method === \"POST\") {\n const result = await reloadCredentialsAndTunnels(\"manual\");\n sendJson(res, 200, { ok: true, running: true, reloaded: true, ...result });\n return;\n }\n if (path === \"/daemon/stop\" && method === \"POST\") {\n sendJson(res, 200, { ok: true, stopping: true });\n logger.info(\"收到 /daemon/stop,准备优雅退出\");\n setTimeout(() => void shutdown(\"stop-endpoint\"), 50);\n return;\n }\n if (path === \"/tunnel/status\" && method === \"GET\") {\n const s = relayStatus();\n const supervisorStatus = tunnelSupervisor?.status();\n const clientLabel = url.searchParams.get(\"client\")?.trim();\n const tunnels = clientLabel && clientLabel !== \"all\"\n ? (supervisorStatus?.tunnels ?? []).filter((tunnel) => tunnel.label === clientLabel)\n : supervisorStatus?.tunnels ?? [];\n sendJson(res, 200, {\n ok: true,\n mode: s.mode,\n credentialMode: credentialSet.mode,\n defaultLabel: supervisorStatus?.defaultLabel ?? credentialSet.defaultEntry?.label ?? null,\n connected: s.connected,\n relayUrl: config.relay.url,\n enabled: config.relay.enabled,\n reconnectAttempt: s.reconnectAttempt,\n lastDisconnectReason: s.lastDisconnectReason,\n note: s.note,\n tunnels,\n });\n return;\n }\n if (path === \"/tunnel/reconnect\" && method === \"POST\") {\n if (!tunnelSupervisor) {\n sendJson(res, 200, { ok: true, mode: relayStatus().mode, reconnected: false, note: relayStatus().note });\n return;\n }\n const body = await parseJson(req, res);\n if (body === undefined) return;\n const clientLabel = typeof (body as { client?: unknown }).client === \"string\"\n ? (body as { client: string }).client\n : undefined;\n const result = await tunnelSupervisor.reconnect(clientLabel);\n if (result.missing) {\n sendJson(res, 404, { ok: false, error: { code: \"YOOOCLAW_TUNNEL_LABEL_NOT_FOUND\", message: `隧道不存在:${result.missing}` } });\n return;\n }\n sendJson(res, 200, { ok: true, mode: \"relay\", reconnected: true, labels: result.reconnected });\n return;\n }\n if (path === \"/tunnel/test\" && method === \"POST\") {\n const body = await parseJson(req, res);\n if (body === undefined) return;\n const clientLabel = typeof (body as { client?: unknown }).client === \"string\"\n ? (body as { client: string }).client.trim()\n : undefined;\n const entry = clientLabel && clientLabel !== \"all\"\n ? credentialSet.entries.find((candidate) => candidate.label === clientLabel)\n : undefined;\n if (clientLabel && clientLabel !== \"all\" && !entry) {\n sendJson(res, 404, { ok: false, error: { code: \"YOOOCLAW_TUNNEL_LABEL_NOT_FOUND\", message: `隧道不存在:${clientLabel}` } });\n return;\n }\n // 回环自检:daemon 自己 POST 一条 echo 通知到本地 /notifications\n const echo = await selfEchoCheck(`http://127.0.0.1:${port}`, {\n token: entry ? undefined : token,\n apiKey: entry?.key,\n clientLabel: entry?.label ?? \"local\",\n });\n sendJson(res, 200, { ok: echo.ok, mode: relayStatus().mode, clientLabel: entry?.label ?? \"local\", loopback: echo });\n return;\n }\n if (path === \"/light/send\" && method === \"POST\") {\n const body = await parseJson(req, res);\n if (body === undefined) return;\n const outcome = await performLightSend(body as Parameters<typeof performLightSend>[0], {\n logger,\n registry: lightRuleRegistry,\n });\n sendJson(res, outcome.status, outcome.body);\n return;\n }\n if (path === \"/images\" && method === \"POST\") {\n const body = await parseJson(req, res);\n if (body === undefined) return;\n try {\n const result = runWithIngestContext(ingestContext, () =>\n ingestImage(ctx.paths, body as ImageSyncPayload, {\n maxBytes: config.image.maxBytes,\n logger,\n }));\n sendJson(res, 200, result);\n } catch (err) {\n sendJson(res, 400, { ok: false, error: { code: \"INVALID_PARAMS\", message: (err as Error).message } });\n }\n return;\n }\n // monitors CRUD(定义存储;本 build 不做 live cron 触发)\n if (path === \"/monitors\" && method === \"GET\") {\n sendJson(res, 200, { ok: true, monitors: listMonitors(ctx.paths) });\n return;\n }\n if (path === \"/monitors\" && method === \"POST\") {\n const body = await parseJson(req, res);\n if (body === undefined) return;\n try {\n sendJson(res, 200, { ok: true, monitor: createMonitor(ctx.paths, body as never) });\n } catch (err) {\n sendJson(res, 400, { ok: false, error: { code: \"INVALID_PARAMS\", message: (err as Error).message } });\n }\n return;\n }\n if (path.startsWith(\"/monitors/\") && method === \"DELETE\") {\n const name = decodeURIComponent(path.slice(\"/monitors/\".length));\n sendJson(res, 200, { ok: true, deleted: deleteMonitor(ctx.paths, name) });\n return;\n }\n if (path.startsWith(\"/monitors/\") && method === \"POST\") {\n const [, , name, action] = path.split(\"/\");\n const enabled = action === \"enable\";\n sendJson(res, 200, { ok: setMonitorEnabled(ctx.paths, decodeURIComponent(name), enabled), name, enabled });\n return;\n }\n\n // gateway 桥:POST /gateway/<method>\n if (path.startsWith(\"/gateway/\") && method === \"POST\") {\n const gwMethod = path.slice(\"/gateway/\".length);\n const body = await parseJson(req, res);\n if (body === undefined) return;\n const result = await runtime.callGateway(gwMethod, body, ingestContext);\n sendJson(res, result.ok ? 200 : 400, result);\n return;\n }\n\n // 注册的 HTTP 路由(如 POST /notifications)\n const route = runtime.httpRoutes.get(path);\n if (route) {\n await runWithIngestContext(ingestContext, () => route.handler(req, res));\n return;\n }\n\n sendJson(res, 404, { ok: false, error: { code: \"YOOOCLAW_NOT_FOUND\", message: `未知路径:${path}` } });\n }\n\n async function parseJson(req: IncomingMessage, res: ServerResponse): Promise<unknown | undefined> {\n try {\n const raw = await readBody(req);\n return raw ? JSON.parse(raw) : {};\n } catch {\n sendJson(res, 400, { ok: false, error: { code: \"INVALID_PARAMS\", message: \"请求体不是合法 JSON\" } });\n return undefined;\n }\n }\n\n let serverRef: Server | null = null;\n let tunnelSupervisor: TunnelSupervisor | null = null;\n let credentialWatchTimer: NodeJS.Timeout | null = null;\n let shuttingDown = false;\n\n async function reloadCredentialsAndTunnels(reason: string): Promise<{\n mode: CredentialSet[\"mode\"];\n defaultLabel: string | null;\n started: string[];\n stopped: string[];\n restarted: string[];\n unchanged: string[];\n warnings: string[];\n }> {\n credentialSet = resolveApiKeyEntries();\n const result = tunnelSupervisor\n ? await tunnelSupervisor.apply(credentialSet)\n : { started: [], stopped: [], restarted: [], unchanged: [] };\n logger.info(\n `CredentialSet reload(${reason}): mode=${credentialSet.mode}, default=${credentialSet.defaultEntry?.label ?? \"-\"}, ` +\n `started=${result.started.join(\",\") || \"-\"} stopped=${result.stopped.join(\",\") || \"-\"} restarted=${result.restarted.join(\",\") || \"-\"}`,\n );\n return {\n mode: credentialSet.mode,\n defaultLabel: credentialSet.defaultEntry?.label ?? null,\n warnings: credentialSet.warnings,\n ...result,\n };\n }\n\n function startCredentialWatcher(): void {\n const file = sharedCredentialsPath();\n watchFile(file, { interval: 500 }, () => {\n if (credentialWatchTimer) clearTimeout(credentialWatchTimer);\n credentialWatchTimer = setTimeout(() => {\n void reloadCredentialsAndTunnels(\"watch\").catch((err) => {\n logger.warn(`CredentialSet watch reload failed: ${(err as Error).message}`);\n });\n }, 200);\n });\n }\n\n async function shutdown(reason: string): Promise<void> {\n if (shuttingDown) return;\n shuttingDown = true;\n logger.info(`daemon 退出(${reason})`);\n unwatchFile(sharedCredentialsPath());\n if (credentialWatchTimer) clearTimeout(credentialWatchTimer);\n try {\n await tunnelSupervisor?.stopAll(reason);\n } catch {\n /* ignore */\n }\n try {\n await storage.close();\n } catch {\n /* ignore */\n }\n try {\n await recordingStorage.close();\n } catch {\n /* ignore */\n }\n serverRef?.close();\n removeLock(ctx.paths);\n process.exit(0);\n }\n\n // listen;遇 EADDRINUSE(端口被其它进程占用)则端口 +1 重试,port 最终为实际绑定端口。\n const listenOnce = (p: number): Promise<void> =>\n new Promise<void>((resolve, reject) => {\n const onError = (err: NodeJS.ErrnoException) => {\n server.removeListener(\"listening\", onListening);\n reject(err);\n };\n const onListening = () => {\n server.removeListener(\"error\", onError);\n resolve();\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen(p, bind);\n });\n\n const startPort = port;\n for (let attempt = 0; ; attempt += 1) {\n try {\n await listenOnce(port);\n break;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"EADDRINUSE\" && attempt < 64) {\n const next = port + 1;\n logger.warn(`端口 ${port} 被占用,改试 ${next}`);\n port = next;\n continue;\n }\n throw err;\n }\n }\n if (port !== startPort) {\n logger.info(`起始端口 ${startPort} 被占用,最终绑定到 ${port}`);\n }\n serverRef = server;\n writeLock(ctx.paths, {\n pid: process.pid,\n startedAt: runtimeState.startedAt,\n bind,\n port,\n logLevel: String(logLevel),\n });\n logger.info(`yoooclaw daemon 启动:${bind}:${port}(profile=${ctx.profile}, pid=${process.pid})`);\n\n // Relay 隧道:复用插件连接逻辑,反代到本 daemon 自己的 HTTP server。\n if (config.relay.enabled) {\n tunnelSupervisor = new TunnelSupervisor({\n tunnelUrl: config.relay.url,\n runtime,\n httpBaseUrl: `http://127.0.0.1:${port}`,\n httpToken: token,\n heartbeatSec: config.relay.heartbeatSec,\n reconnectBackoffMs: config.relay.reconnectBackoffMs,\n stateDir: ctx.paths.dir,\n logger,\n });\n const result = await tunnelSupervisor.apply(credentialSet);\n pushRecordingStatus = (event) => tunnelSupervisor?.pushEvent(\"recording.status\", event);\n startCredentialWatcher();\n if (credentialSet.entries.length > 0) {\n logger.info(\n `Relay 多隧道已启动:${result.started.join(\",\") || \"-\"}(mode=${credentialSet.mode}, default=${credentialSet.defaultEntry?.label ?? \"-\"})`,\n );\n } else {\n logger.warn(\"Relay 已启用但未设置 api-key,跳过隧道连接。运行 yc auth set-api-key <ock_…> 或 yc auth add-api-key <ock_…> --label <label>\");\n }\n } else {\n logger.info(\"Relay 未启用(config.relay.enabled=false),仅走直连 HTTP\");\n }\n\n process.on(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\n process.on(\"SIGINT\", () => void shutdown(\"SIGINT\"));\n\n // 前台保持运行(http server 维持 event loop);返回的 promise 永不 resolve\n await new Promise<void>(() => {});\n}\n\nasync function selfEchoCheck(\n baseUrl: string,\n opts: { token?: string; apiKey?: string; clientLabel?: string } = {},\n): Promise<{ ok: boolean; status?: number; clientLabel?: string; error?: string }> {\n try {\n const authValue = opts.apiKey\n ? opts.apiKey.replace(/^Bearer\\s+/i, \"\")\n : opts.token;\n const res = await fetch(`${baseUrl}/notifications`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(authValue ? { Authorization: `Bearer ${authValue}` } : {}),\n },\n body: JSON.stringify({\n notifications: [\n {\n id: `echo_${opts.clientLabel ?? \"local\"}_${Date.now()}`,\n app: \"yoooclaw.selftest\",\n title: \"tunnel +test\",\n body: \"echo\",\n timestamp: new Date().toISOString(),\n },\n ],\n }),\n });\n return { ok: res.ok, status: res.status, clientLabel: opts.clientLabel };\n } catch (err) {\n return { ok: false, clientLabel: opts.clientLabel, error: (err as Error).message };\n }\n}\n",
|
|
98
98
|
"/**\n * daemon 文件 logger —— 写 `daemon.log`,按日期轮转为 `daemon.log.YYYY-MM-DD`。\n * 行格式:`<ISO本地时间> [LEVEL] message`(与 src/log/reader.ts 解析一致)。\n */\nimport { appendFileSync, existsSync, renameSync, statSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { ensureDir } from \"../fs-utils.js\";\nimport type { LogLevel } from \"../config/schema.js\";\n\nconst LEVEL_ORDER: Record<string, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\nfunction isoLocal(d: Date): string {\n const pad = (n: number, w = 2) => String(n).padStart(w, \"0\");\n const off = -d.getTimezoneOffset();\n const sign = off >= 0 ? \"+\" : \"-\";\n const abs = Math.abs(off);\n return (\n `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}` +\n `T${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}.${pad(d.getMilliseconds(), 3)}` +\n `${sign}${pad(Math.floor(abs / 60))}:${pad(abs % 60)}`\n );\n}\n\nfunction dateKey(d: Date): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\nexport class DaemonLogger {\n private currentDay: string;\n\n constructor(\n private readonly logFile: string,\n private readonly level: LogLevel = \"info\",\n private readonly alsoStderr = false,\n ) {\n ensureDir(dirname(logFile));\n this.currentDay = dateKey(new Date());\n this.rotateIfNeeded(new Date());\n }\n\n private enabled(level: string): boolean {\n return (LEVEL_ORDER[level] ?? 2) <= (LEVEL_ORDER[this.level] ?? 2);\n }\n\n private rotateIfNeeded(now: Date): void {\n if (!existsSync(this.logFile)) return;\n let fileDay: string | undefined;\n try {\n fileDay = dateKey(statSync(this.logFile).mtime);\n } catch {\n return;\n }\n const today = dateKey(now);\n if (fileDay !== today) {\n try {\n renameSync(this.logFile, `${this.logFile}.${fileDay}`);\n } catch {\n // 轮转失败不影响写入\n }\n }\n }\n\n private write(level: string, msg: string): void {\n if (!this.enabled(level)) return;\n const now = new Date();\n if (dateKey(now) !== this.currentDay) {\n this.rotateIfNeeded(now);\n this.currentDay = dateKey(now);\n }\n const line = `${isoLocal(now)} [${level.toUpperCase()}] ${msg}\\n`;\n try {\n appendFileSync(this.logFile, line);\n } catch {\n // 忽略写文件失败\n }\n if (this.alsoStderr) process.stderr.write(line);\n }\n\n debug(msg: string): void { this.write(\"debug\", msg); }\n info(msg: string): void { this.write(\"info\", msg); }\n warn(msg: string): void { this.write(\"warn\", msg); }\n error(msg: string): void { this.write(\"error\", msg); }\n}\n",
|
|
99
|
-
"/**\n * StandaloneRuntime —— 对外暴露**结构兼容** OpenClawPluginApi 的子集,\n * 让 phone-notifications 的注册模块(registerNotificationInterfaces /\n * registerLightRulesGateway 等)**不改代码**就能在 daemon 里跑。\n *\n * 实现侧:把注册进来的 HTTP 路由与 gateway 方法收集到 Map,由 daemon HTTP server 派发。\n * 不属于 CLI 形态的能力(registerTool / registerCli / on('before_prompt_build'))做 no-op。\n */\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nexport type HttpAuth = \"gateway\" | \"public\" | string;\nexport interface HttpRouteSpec {\n path: string;\n auth?: HttpAuth;\n handler: (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;\n}\n\nexport type GatewayRespond = (\n ok: boolean,\n data?: unknown,\n error?: { code: string; message: string },\n) => void;\n\nexport interface GatewayOpts {\n params?: unknown;\n respond: GatewayRespond;\n context?: {
|
|
100
|
-
"/**\n *
|
|
101
|
-
"/**\n * RelayDispatcher —— CLI daemon 模式下的 Relay 帧分发器。\n *\n * 为什么不直接复用 phone-notifications/tunnel/proxy 的 TunnelProxy:\n * TunnelProxy 把每个 `req` 帧反代到「本地 OpenClaw 桌面端 gateway WebSocket」,依赖 OpenClaw 自带的\n * `connect.challenge` / `pairing` 协议;daemon 不实现那套,反代会 401 卡死。\n *\n * 本 dispatcher 的取舍:保留与插件**对外完全一致**的 Relay 协议(RelayClient 复用,frame schema 不变),\n * 但**绕过 OpenClaw gateway WS 这一层耦合**,直接把 `req` 帧同进程交给 `runtime.callGateway` 处理。\n * 手机端 / Relay 服务端对此完全无感知。\n *\n * 当前覆盖:\n * - `type: \"req\"` → callGateway → 回 `{type:\"res\", id, ok, payload?, error?}`\n * - `type: \"request\" / ws_*` → 暂不支持,回 proxy_error 或日志 warn(手机端目前只发 req)\n *\n * `pushEvent(event, payload)` —— daemon 主动反向推事件给手机端(recording.status 等)。\n */\nimport type { DaemonLogger } from \"./logger.js\";\nimport type { StandaloneRuntime } from \"./runtime.js\";\nimport {\n RELAY_INTERNAL_HTTP_HEADER,\n mapRelayHttpPath,\n type RelayClient,\n} from \"../shared.js\";\n\ninterface ReqFrame {\n type: \"req\";\n id: string;\n method: string;\n params?: Record<string, unknown>;\n}\n\ninterface RequestFrame {\n type: \"request\";\n id: string;\n method: string;\n path: string;\n headers?: Record<string, string>;\n body?: string;\n}\n\ninterface AnyFrame {\n type: string;\n id?: string;\n [k: string]: unknown;\n}\n\nexport interface RelayDispatcherDeps {\n client: RelayClient;\n runtime: StandaloneRuntime;\n logger: DaemonLogger;\n /**\n * 用于把 RequestFrame(HTTP-style,如 POST /notifications)loopback 到 daemon 自己的 HTTP server。\n * 这样能直接复用现成的路由实现(包括 authorized check、JSON 解析、ingest 逻辑),\n * 不必为每条 frame 重新 mock node:http 的 IncomingMessage/ServerResponse。\n */\n httpBaseUrl: string;\n /** loopback 时带的 gateway token;未设则不加 Authorization(daemon 默认放行无 token 模式)。 */\n httpToken?: string;\n}\n\nexport class RelayDispatcher {\n constructor(private readonly deps: RelayDispatcherDeps) {}\n\n /** 挂上 RelayClient 的 inbound 回调;幂等:重复调只会重新绑定(沿用 onInbound 的覆盖语义)。 */\n start(): void {\n this.deps.client.onInbound((frame) => {\n void this.handleFrame(frame as unknown as AnyFrame);\n });\n }\n\n private async handleFrame(frame: AnyFrame): Promise<void> {\n const { logger } = this.deps;\n switch (frame.type) {\n case \"req\":\n await this.handleReq(frame as unknown as ReqFrame);\n return;\n case \"request\":\n await this.handleRequest(frame as unknown as RequestFrame);\n return;\n case \"ws_open\":\n case \"ws_data\":\n case \"ws_close\":\n logger.warn(\n `[relay-dispatcher] 暂不支持 WS 子通道帧(type=${frame.type}, id=${frame.id ?? \"?\"})`,\n );\n return;\n default:\n logger.warn(`[relay-dispatcher] 未识别帧 type=${frame.type}`);\n }\n }\n\n private async handleRequest(frame: RequestFrame): Promise<void> {\n const { client, logger, httpBaseUrl, httpToken } = this.deps;\n const { id, method, path, headers: srcHeaders, body } = frame;\n const mappedPath = mapRelayHttpPath(path);\n const url = httpBaseUrl + (mappedPath.startsWith(\"/\") ? mappedPath : \"/\" + mappedPath);\n const headers: Record<string, string> = { ...srcHeaders };\n if (httpToken && !headers[\"authorization\"] && !headers[\"Authorization\"]) {\n headers[\"authorization\"] = `Bearer ${httpToken}`;\n }\n headers[RELAY_INTERNAL_HTTP_HEADER] = \"1\";\n\n logger.info(\n `[relay-dispatcher] request id=${id} ${method} ${path} → ${mappedPath} loopback`,\n );\n\n let status = 502;\n let resHeaders: Record<string, string> = {};\n let resBody = \"\";\n try {\n const res = await fetch(url, { method, headers, body });\n status = res.status;\n resHeaders = Object.fromEntries(res.headers.entries());\n resBody = await res.text();\n } catch (err) {\n logger.error(`[relay-dispatcher] loopback 失败 id=${id} ${method} ${path}: ${(err as Error).message}`);\n client.sendRaw(\n JSON.stringify({\n type: \"proxy_error\",\n id,\n status: 502,\n message: `daemon loopback 失败: ${(err as Error).message}`,\n }),\n );\n return;\n }\n\n client.sendRaw(\n JSON.stringify({\n type: \"proxy_response\",\n id,\n status,\n headers: resHeaders,\n body: resBody,\n }),\n );\n }\n\n private async handleReq(frame: ReqFrame): Promise<void> {\n const { client, runtime, logger } = this.deps;\n const { id, method, params } = frame;\n logger.info(`[relay-dispatcher] req id=${id} method=${method}`);\n let ok = false;\n let payload: unknown;\n let error: { code: string; message: string } | undefined;\n try {\n const result = await runtime.callGateway(method, params);\n ok = result.ok;\n payload = result.data;\n error = result.error;\n } catch (err) {\n ok = false;\n error = { code: \"INTERNAL_ERROR\", message: (err as Error).message };\n logger.error(`[relay-dispatcher] callGateway 异常: ${(err as Error).message}`);\n }\n // JSON.stringify 会跳过 value 为 undefined 的键,所以无需手动剔除\n client.sendRaw(JSON.stringify({ type: \"res\", id, ok, payload, error }));\n }\n\n /** daemon → 手机端反向推 Gateway event。 */\n pushEvent(event: string, payload: unknown): void {\n this.deps.client.sendRaw(JSON.stringify({ type: \"event\", event, payload }));\n }\n}\n",
|
|
102
|
-
"/**\n * 图片下发通道 —— 与录音链路同构:先落元数据 + respond(true),再后台从 OSS 下载本体。\n *\n * 入口:daemon 的 HTTP `POST /images` 与 gateway `images.sync` 都调用 ingestImage。\n * 复刻录音的同步状态机:syncing → synced / sync_failed;imageId 幂等去重。\n */\nimport { createWriteStream, existsSync, readFileSync } from \"node:fs\";\nimport { Readable } from \"node:stream\";\nimport { join } from \"node:path\";\nimport { ensureDir, writeJsonFile } from \"../fs-utils.js\";\nimport type { ProfilePaths } from \"../paths.js\";\nimport {\n imagesIndexPath,\n type ImageIndexEntry,\n type ImageMetadata,\n} from \"./storage.js\";\n\nexport interface ImageSyncPayload {\n imageId: string;\n image: ImageMetadata;\n}\n\ninterface ChannelLogger {\n info: (m: string) => void;\n warn: (m: string) => void;\n}\n\nfunction readAll(paths: ProfilePaths): ImageIndexEntry[] {\n const p = imagesIndexPath(paths);\n if (!existsSync(p)) return [];\n try {\n const raw = JSON.parse(readFileSync(p, \"utf-8\"));\n return Array.isArray(raw?.images) ? raw.images : [];\n } catch {\n return [];\n }\n}\n\nfunction writeAll(paths: ProfilePaths, images: ImageIndexEntry[]): void {\n ensureDir(paths.images);\n writeJsonFile(imagesIndexPath(paths), { images });\n}\n\nfunction upsert(paths: ProfilePaths, entry: ImageIndexEntry): void {\n const images = readAll(paths);\n const idx = images.findIndex((i) => i.imageId === entry.imageId);\n if (idx >= 0) images[idx] = entry;\n else images.push(entry);\n writeAll(paths, images);\n}\n\nfunction extFromMime(mime?: string): string {\n if (!mime) return \"jpg\";\n if (mime.includes(\"png\")) return \"png\";\n if (mime.includes(\"webp\")) return \"webp\";\n if (mime.includes(\"gif\")) return \"gif\";\n return \"jpg\";\n}\n\nexport interface IngestImageResult {\n ok: boolean;\n imageId: string;\n status: ImageIndexEntry[\"status\"];\n deduped?: boolean;\n}\n\n/**\n * 接收图片下发:校验必填 → 落 syncing 元数据 → 后台下载(fire-and-forget)。\n * 幂等:imageId 已存在且 oss_image_url 未变化则跳过重复下载。\n */\nexport function ingestImage(\n paths: ProfilePaths,\n payload: ImageSyncPayload,\n opts: { maxBytes: number; logger: ChannelLogger },\n): IngestImageResult {\n const { imageId, image } = payload;\n if (!imageId || !image?.oss_image_url || !image?.created_at) {\n throw new Error(\"imageId / image.oss_image_url / image.created_at 必填\");\n }\n\n const existing = readAll(paths).find((i) => i.imageId === imageId);\n if (existing && existing.metadata.oss_image_url === image.oss_image_url && existing.status === \"synced\") {\n return { ok: true, imageId, status: \"synced\", deduped: true };\n }\n\n const entry: ImageIndexEntry = {\n imageId,\n metadata: image,\n localFile: null,\n thumbnail: null,\n status: \"syncing\",\n lastError: null,\n syncedAt: null,\n };\n upsert(paths, entry);\n\n void downloadInBackground(paths, entry, opts).catch((err) => {\n opts.logger.warn(`image[${imageId}] 后台下载异常:${(err as Error).message}`);\n });\n\n return { ok: true, imageId, status: \"syncing\" };\n}\n\nasync function downloadInBackground(\n paths: ProfilePaths,\n entry: ImageIndexEntry,\n opts: { maxBytes: number; logger: ChannelLogger },\n): Promise<void> {\n const filesDir = join(paths.images, \"files\");\n ensureDir(filesDir);\n const relative = `files/${entry.imageId}.${extFromMime(entry.metadata.mime_type)}`;\n const dest = join(paths.images, relative);\n\n try {\n const res = await fetch(entry.metadata.oss_image_url);\n if (!res.ok || !res.body) {\n throw new Error(`OSS 返回 ${res.status}`);\n }\n const declared = Number(res.headers.get(\"content-length\") ?? \"0\");\n if (declared && declared > opts.maxBytes) {\n throw new Error(`图片超过上限 ${opts.maxBytes} 字节`);\n }\n\n let written = 0;\n const fileStream = createWriteStream(dest);\n const reader = Readable.fromWeb(res.body as never);\n for await (const chunk of reader) {\n written += (chunk as Buffer).length;\n if (written > opts.maxBytes) {\n fileStream.destroy();\n throw new Error(`图片超过上限 ${opts.maxBytes} 字节`);\n }\n fileStream.write(chunk);\n }\n await new Promise<void>((resolve, reject) => {\n fileStream.end((err?: Error | null) => (err ? reject(err) : resolve()));\n });\n\n upsert(paths, {\n ...entry,\n localFile: relative,\n status: \"synced\",\n lastError: null,\n syncedAt: new Date().toISOString(),\n });\n opts.logger.info(`image[${entry.imageId}] 下载完成 (${written} bytes)`);\n } catch (err) {\n upsert(paths, {\n ...entry,\n status: \"sync_failed\",\n lastError: (err as Error).message,\n });\n opts.logger.warn(`image[${entry.imageId}] 下载失败:${(err as Error).message}`);\n }\n}\n",
|
|
99
|
+
"/**\n * StandaloneRuntime —— 对外暴露**结构兼容** OpenClawPluginApi 的子集,\n * 让 phone-notifications 的注册模块(registerNotificationInterfaces /\n * registerLightRulesGateway 等)**不改代码**就能在 daemon 里跑。\n *\n * 实现侧:把注册进来的 HTTP 路由与 gateway 方法收集到 Map,由 daemon HTTP server 派发。\n * 不属于 CLI 形态的能力(registerTool / registerCli / on('before_prompt_build'))做 no-op。\n */\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { runWithIngestContext, type IngestContext } from \"../shared.js\";\n\nexport type HttpAuth = \"gateway\" | \"public\" | string;\nexport interface HttpRouteSpec {\n path: string;\n auth?: HttpAuth;\n handler: (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;\n}\n\nexport type GatewayRespond = (\n ok: boolean,\n data?: unknown,\n error?: { code: string; message: string },\n) => void;\n\nexport interface GatewayOpts {\n params?: unknown;\n respond: GatewayRespond;\n context?: {\n broadcast?: (event: string, payload: unknown) => void;\n } & IngestContext;\n client?: unknown;\n}\nexport type GatewayHandler = (opts: GatewayOpts) => void | Promise<void>;\n\nexport interface GatewayResult {\n ok: boolean;\n data?: unknown;\n error?: { code: string; message: string };\n}\n\ninterface RuntimeLogger {\n debug: (m: string) => void;\n info: (m: string) => void;\n warn: (m: string) => void;\n error: (m: string) => void;\n}\n\nexport class StandaloneRuntime {\n readonly httpRoutes = new Map<string, HttpRouteSpec>();\n readonly gatewayMethods = new Map<string, GatewayHandler>();\n readonly services: string[] = [];\n\n constructor(\n readonly logger: RuntimeLogger,\n readonly pluginConfig: Record<string, unknown>,\n private readonly stateDir: string,\n ) {}\n\n /** runtime.state.resolveStateDir —— 兼容插件读 stateDir 的用法。 */\n readonly runtime = {\n state: {\n resolveStateDir: (): string => this.stateDir,\n },\n };\n\n registerHttpRoute(spec: HttpRouteSpec): void {\n this.httpRoutes.set(spec.path, spec);\n }\n\n registerGatewayMethod(method: string, handler: GatewayHandler): void {\n this.gatewayMethods.set(method, handler);\n }\n\n // ── CLI 形态下的 no-op(PRD「兼容性 shim」)──\n registerService(name: string): void {\n this.services.push(typeof name === \"string\" ? name : \"service\");\n }\n registerCli(): void {\n /* CLI 模式不复用插件 CLI 注册 */\n }\n registerTool(): void {\n /* CLI 不开 MCP,Agent 走 Skill + 直接调命令 */\n }\n on(): void {\n /* before_prompt_build 等宿主事件在 CLI 模式不参与 */\n }\n\n /** 调用一个 gateway 方法,把 respond 收敛成 Promise<GatewayResult>。 */\n callGateway(\n method: string,\n params: unknown,\n context?: IngestContext,\n ): Promise<GatewayResult> {\n const handler = this.gatewayMethods.get(method);\n if (!handler) {\n return Promise.resolve({\n ok: false,\n error: { code: \"METHOD_NOT_FOUND\", message: `未注册的 gateway 方法:${method}` },\n });\n }\n return new Promise<GatewayResult>((resolve) => {\n let settled = false;\n const respond: GatewayRespond = (ok, data, error) => {\n if (settled) return;\n settled = true;\n resolve({ ok, data, error });\n };\n Promise.resolve(runWithIngestContext(context, () => handler({ params, respond, context }))).catch((err) => {\n if (!settled) {\n settled = true;\n resolve({\n ok: false,\n error: { code: \"INTERNAL_ERROR\", message: (err as Error).message },\n });\n }\n });\n });\n }\n}\n",
|
|
100
|
+
"/**\n * 图片下发通道 —— 与录音链路同构:先落元数据 + respond(true),再后台从 OSS 下载本体。\n *\n * 入口:daemon 的 HTTP `POST /images` 与 gateway `images.sync` 都调用 ingestImage。\n * 复刻录音的同步状态机:syncing → synced / sync_failed;imageId 幂等去重。\n */\nimport { createWriteStream, existsSync, readFileSync } from \"node:fs\";\nimport { Readable } from \"node:stream\";\nimport { join } from \"node:path\";\nimport { ensureDir, writeJsonFile } from \"../fs-utils.js\";\nimport type { ProfilePaths } from \"../paths.js\";\nimport { currentClientLabel } from \"../shared.js\";\nimport {\n imagesIndexPath,\n type ImageIndexEntry,\n type ImageMetadata,\n} from \"./storage.js\";\n\nexport interface ImageSyncPayload {\n imageId: string;\n image: ImageMetadata;\n}\n\ninterface ChannelLogger {\n info: (m: string) => void;\n warn: (m: string) => void;\n}\n\nfunction readAll(paths: ProfilePaths): ImageIndexEntry[] {\n const p = imagesIndexPath(paths);\n if (!existsSync(p)) return [];\n try {\n const raw = JSON.parse(readFileSync(p, \"utf-8\"));\n return Array.isArray(raw?.images) ? raw.images : [];\n } catch {\n return [];\n }\n}\n\nfunction writeAll(paths: ProfilePaths, images: ImageIndexEntry[]): void {\n ensureDir(paths.images);\n writeJsonFile(imagesIndexPath(paths), { images });\n}\n\nfunction upsert(paths: ProfilePaths, entry: ImageIndexEntry): void {\n const images = readAll(paths);\n const idx = images.findIndex((i) => i.imageId === entry.imageId);\n if (idx >= 0) images[idx] = entry;\n else images.push(entry);\n writeAll(paths, images);\n}\n\nfunction extFromMime(mime?: string): string {\n if (!mime) return \"jpg\";\n if (mime.includes(\"png\")) return \"png\";\n if (mime.includes(\"webp\")) return \"webp\";\n if (mime.includes(\"gif\")) return \"gif\";\n return \"jpg\";\n}\n\nexport interface IngestImageResult {\n ok: boolean;\n imageId: string;\n status: ImageIndexEntry[\"status\"];\n deduped?: boolean;\n}\n\n/**\n * 接收图片下发:校验必填 → 落 syncing 元数据 → 后台下载(fire-and-forget)。\n * 幂等:imageId 已存在且 oss_image_url 未变化则跳过重复下载。\n */\nexport function ingestImage(\n paths: ProfilePaths,\n payload: ImageSyncPayload,\n opts: { maxBytes: number; logger: ChannelLogger },\n): IngestImageResult {\n const { imageId, image } = payload;\n if (!imageId || !image?.oss_image_url || !image?.created_at) {\n throw new Error(\"imageId / image.oss_image_url / image.created_at 必填\");\n }\n\n const existing = readAll(paths).find((i) => i.imageId === imageId);\n if (existing && existing.metadata.oss_image_url === image.oss_image_url && existing.status === \"synced\") {\n return { ok: true, imageId, status: \"synced\", deduped: true };\n }\n\n const entry: ImageIndexEntry = {\n imageId,\n clientLabel: currentClientLabel(\"default\"),\n metadata: image,\n localFile: null,\n thumbnail: null,\n status: \"syncing\",\n lastError: null,\n syncedAt: null,\n };\n upsert(paths, entry);\n\n void downloadInBackground(paths, entry, opts).catch((err) => {\n opts.logger.warn(`image[${imageId}] 后台下载异常:${(err as Error).message}`);\n });\n\n return { ok: true, imageId, status: \"syncing\" };\n}\n\nasync function downloadInBackground(\n paths: ProfilePaths,\n entry: ImageIndexEntry,\n opts: { maxBytes: number; logger: ChannelLogger },\n): Promise<void> {\n const filesDir = join(paths.images, \"files\");\n ensureDir(filesDir);\n const relative = `files/${entry.imageId}.${extFromMime(entry.metadata.mime_type)}`;\n const dest = join(paths.images, relative);\n\n try {\n const res = await fetch(entry.metadata.oss_image_url);\n if (!res.ok || !res.body) {\n throw new Error(`OSS 返回 ${res.status}`);\n }\n const declared = Number(res.headers.get(\"content-length\") ?? \"0\");\n if (declared && declared > opts.maxBytes) {\n throw new Error(`图片超过上限 ${opts.maxBytes} 字节`);\n }\n\n let written = 0;\n const fileStream = createWriteStream(dest);\n const reader = Readable.fromWeb(res.body as never);\n for await (const chunk of reader) {\n written += (chunk as Buffer).length;\n if (written > opts.maxBytes) {\n fileStream.destroy();\n throw new Error(`图片超过上限 ${opts.maxBytes} 字节`);\n }\n fileStream.write(chunk);\n }\n await new Promise<void>((resolve, reject) => {\n fileStream.end((err?: Error | null) => (err ? reject(err) : resolve()));\n });\n\n upsert(paths, {\n ...entry,\n localFile: relative,\n status: \"synced\",\n lastError: null,\n syncedAt: new Date().toISOString(),\n });\n opts.logger.info(`image[${entry.imageId}] 下载完成 (${written} bytes)`);\n } catch (err) {\n upsert(paths, {\n ...entry,\n status: \"sync_failed\",\n lastError: (err as Error).message,\n });\n opts.logger.warn(`image[${entry.imageId}] 下载失败:${(err as Error).message}`);\n }\n}\n",
|
|
103
101
|
"/**\n * 监控任务定义存储(state/monitors.json)。\n *\n * 本 build 负责定义的 CRUD 与启用状态;cron 实时触发为后续迭代(daemon 当前只持久化定义)。\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ProfilePaths } from \"../paths.js\";\nimport { ensureDir, writeJsonFile } from \"../fs-utils.js\";\n\nexport interface MonitorTask {\n name: string;\n description: string;\n matchRules: unknown;\n schedule: string;\n enabled: boolean;\n createdAt: string;\n updatedAt: string;\n lastRunAt: string | null;\n lastResult: unknown;\n}\n\nexport interface CreateMonitorInput {\n name: string;\n description: string;\n matchRules: unknown;\n schedule: string;\n}\n\nfunction storePath(paths: ProfilePaths): string {\n return join(paths.state, \"monitors.json\");\n}\n\nexport function listMonitors(paths: ProfilePaths): MonitorTask[] {\n const p = storePath(paths);\n if (!existsSync(p)) return [];\n try {\n const raw = JSON.parse(readFileSync(p, \"utf-8\"));\n return Array.isArray(raw?.monitors) ? raw.monitors : [];\n } catch {\n return [];\n }\n}\n\nfunction save(paths: ProfilePaths, monitors: MonitorTask[]): void {\n ensureDir(paths.state);\n writeJsonFile(storePath(paths), { monitors });\n}\n\nexport function createMonitor(paths: ProfilePaths, input: CreateMonitorInput): MonitorTask {\n if (!input.name || !input.description || !input.schedule || input.matchRules === undefined) {\n throw new Error(\"name / description / matchRules / schedule 均必填\");\n }\n const monitors = listMonitors(paths);\n if (monitors.some((m) => m.name === input.name)) {\n throw new Error(`监控任务已存在:${input.name}`);\n }\n const now = new Date().toISOString();\n const task: MonitorTask = {\n name: input.name,\n description: input.description,\n matchRules: input.matchRules,\n schedule: input.schedule,\n enabled: true,\n createdAt: now,\n updatedAt: now,\n lastRunAt: null,\n lastResult: null,\n };\n monitors.push(task);\n save(paths, monitors);\n return task;\n}\n\nexport function deleteMonitor(paths: ProfilePaths, name: string): boolean {\n const monitors = listMonitors(paths);\n const next = monitors.filter((m) => m.name !== name);\n if (next.length === monitors.length) return false;\n save(paths, next);\n return true;\n}\n\nexport function setMonitorEnabled(paths: ProfilePaths, name: string, enabled: boolean): boolean {\n const monitors = listMonitors(paths);\n const task = monitors.find((m) => m.name === name);\n if (!task) return false;\n task.enabled = enabled;\n task.updatedAt = new Date().toISOString();\n save(paths, monitors);\n return true;\n}\n\nexport function getMonitor(paths: ProfilePaths, name: string): MonitorTask | undefined {\n return listMonitors(paths).find((m) => m.name === name);\n}\n",
|
|
104
102
|
"/**\n * daemon /light/send 实际投递路径。\n *\n * 把 { segments | preset | rule } 解析成最终的 segments + repeat_times,再调\n * phone-notifications 的 sendLightEffect 走云 API(需要 LIGHT_APP_KEY /\n * LIGHT_TEMPLATE_ID 进程环境变量 + OPENCLAW_HOST_* 决定的 apiUrl)。\n *\n * 优先级:rule > preset > segments。用户显式传 --repeat / --repeat-times 时\n * 会覆盖 rule/preset 自带的 repeat_times。\n */\nimport {\n LIGHT_PRESETS_V1,\n sendLightEffect,\n validateSegments,\n normalizeRepeatTimes,\n assertAncsRepeatTimes,\n type LightSegment,\n type LightRuleRegistry,\n} from \"../shared.js\";\nimport { resolveApiKey } from \"../credentials/store.js\";\nimport type { DaemonLogger } from \"./logger.js\";\n\n/** 连通性测试用的 preset id(`+blink` shortcut 映射到这里)。 */\nexport const BLINK_PRESET_ID = \"red-strobe-3\";\n\nexport interface LightSendInput {\n segments?: unknown;\n preset?: string;\n rule?: string;\n repeat?: boolean;\n repeat_times?: number;\n}\n\nexport interface LightSendOutcome {\n ok: boolean;\n status: number;\n body: Record<string, unknown>;\n}\n\ninterface ResolvedSource {\n segments: LightSegment[];\n repeat_times: number;\n source: \"segments\" | \"preset\" | \"rule\";\n reason: string;\n title?: string;\n}\n\nexport async function performLightSend(\n input: LightSendInput,\n deps: { logger: DaemonLogger; registry: LightRuleRegistry },\n): Promise<LightSendOutcome> {\n let resolved: ResolvedSource;\n try {\n resolved = resolveSource(input, deps.registry);\n } catch (err) {\n return errorOutcome(400, \"INVALID_PARAMS\", (err as Error).message);\n }\n\n // 用户显式传 --repeat / --repeat-times 时覆盖 rule/preset 自带的值\n const overrideRepeat = input.repeat !== undefined || input.repeat_times !== undefined;\n let repeatTimes = resolved.repeat_times;\n if (overrideRepeat) {\n try {\n repeatTimes = normalizeRepeatTimes({\n repeat: input.repeat,\n repeat_times: input.repeat_times,\n });\n } catch (err) {\n return errorOutcome(400, \"VALIDATION_FAILED\", (err as Error).message);\n }\n }\n try {\n assertAncsRepeatTimes(repeatTimes);\n } catch (err) {\n return errorOutcome(400, \"VALIDATION_FAILED\", (err as Error).message);\n }\n\n const apiKey = resolveApiKey();\n if (!apiKey.value) {\n return errorOutcome(\n 401,\n \"AUTH_REQUIRED\",\n \"未配置 api-key,运行 `yoooclaw auth set-api-key <ock_…>`\",\n );\n }\n\n deps.logger.info(\n `/light/send 解析完成 source=${resolved.source} reason=${resolved.reason} ` +\n `segments=${resolved.segments.length} repeat_times=${repeatTimes}`,\n );\n\n const result = await sendLightEffect(\n apiKey.value,\n resolved.segments,\n deps.logger,\n { repeat_times: repeatTimes },\n resolved.reason,\n resolved.title,\n );\n\n if (!result.ok) {\n return errorOutcome(\n result.status ?? 502,\n \"LIGHT_SEND_FAILED\",\n result.error ?? \"灯效投递失败\",\n );\n }\n\n return {\n ok: true,\n status: 200,\n body: {\n ok: true,\n accepted: true,\n delivered: true,\n source: resolved.source,\n bizUniqueId: result.bizUniqueId,\n segments: resolved.segments,\n repeat_times: repeatTimes,\n response: result.response,\n },\n };\n}\n\nfunction resolveSource(\n input: LightSendInput,\n registry: LightRuleRegistry,\n): ResolvedSource {\n if (input.rule) {\n const meta = registry.get(input.rule);\n if (!meta) throw new Error(`规则不存在:${input.rule}`);\n return {\n segments: meta.segments,\n repeat_times: meta.repeat_times,\n source: \"rule\",\n reason: `rule:${meta.name}`,\n title: meta.title,\n };\n }\n\n if (input.preset) {\n const preset = LIGHT_PRESETS_V1.presets.find((p) => p.presetId === input.preset);\n if (!preset) {\n const available = LIGHT_PRESETS_V1.presets.map((p) => p.presetId).join(\", \");\n throw new Error(`未知 preset:${input.preset}(可用:${available})`);\n }\n return {\n segments: preset.segments,\n repeat_times: preset.repeat_times,\n source: \"preset\",\n reason: `preset:${preset.presetId}`,\n title: preset.displayName,\n };\n }\n\n if (input.segments !== undefined) {\n const validation = validateSegments(input.segments);\n if (!validation.valid) {\n throw new Error(JSON.stringify(validation.errors));\n }\n return {\n segments: validation.segments,\n repeat_times: 1,\n source: \"segments\",\n reason: \"manual\",\n };\n }\n\n throw new Error(\"需要 segments / preset / rule 之一\");\n}\n\nfunction errorOutcome(status: number, code: string, message: string): LightSendOutcome {\n return {\n ok: false,\n status,\n body: { ok: false, error: { code, message } },\n };\n}\n",
|
|
105
103
|
"/**\n * RecordingEventLog —— 录音状态事件 append-only JSONL 日志。\n *\n * 落 ~/.yoooclaw/profiles/<profile>/recordings/state/events.jsonl,每行一个 JSON:\n * { ts: ISO8601, recordingId, transfer_status, audioFile?, transcriptFile?, summary?, error? }\n *\n * 设计取舍:\n * - daemon 没有面向客户端的广播通道,handler 内部状态机变化通过 notifyStatus 回调对外暴露;\n * 把它落成 JSONL 是最简单的「可观察」方案,CLI / Agent / tail -f 都能消费。\n * - 不做轮转 / 不做大小上限:一条录音事件几条,文件很小;轮转策略等真有量再说。\n */\nimport { appendFileSync, existsSync, mkdirSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { RecordingStatusEvent } from \"../shared.js\";\n\nexport interface RecordingEventRecord extends RecordingStatusEvent {\n ts: string;\n}\n\nexport class RecordingEventLog {\n readonly path: string;\n\n constructor(recordingsDir: string) {\n this.path = join(recordingsDir, \"state\", \"events.jsonl\");\n mkdirSync(dirname(this.path), { recursive: true });\n }\n\n append(event: RecordingStatusEvent): void {\n const record: RecordingEventRecord = { ts: new Date().toISOString(), ...event };\n appendFileSync(this.path, JSON.stringify(record) + \"\\n\", \"utf-8\");\n }\n\n /** 读取全部事件(按追加顺序)。文件不存在返回空数组。 */\n readAll(): RecordingEventRecord[] {\n if (!existsSync(this.path)) return [];\n const raw = readFileSync(this.path, \"utf-8\");\n const out: RecordingEventRecord[] = [];\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n out.push(JSON.parse(trimmed) as RecordingEventRecord);\n } catch {\n // 忽略损坏行(理论上 append-only 不应该出现)\n }\n }\n return out;\n }\n}\n",
|
|
106
|
-
"/**\n * daemon 录音桥 —— CLI 独立形态下的 recordings.sync 实现。\n *\n * 为什么不直接用插件 registerRecordingInterfaces 里注册的 sync:\n * - 插件版 sync 要求 caller(手机端)每次把 asr 配置随 params 一起带上来;\n * - CLI 形态下 ASR 配置由 `yc recording setup-asr` 一次性写到 ~/.yoooclaw/<p>/recordings/asr-config.json,\n * 手机端不一定会带 asr —— 没带就要 fallback 读本地配置;\n * - 同时 mode=api 时若用户没填 apiKey,要回退到 account 级 ock- key(resolveApiKey)。\n *\n * 用法:daemon main.ts 先调 registerRecordingInterfaces 装上 list/status/rename/... 一类查询/管理方法,\n * 再调本模块 `overrideRecordingSync` 覆盖 sync 这一项(runtime.gatewayMethods 是 Map,后写覆盖)。\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport {\n handleRecordingSync,\n RecordingStorage,\n validateAsrConfig,\n type AsrConfig,\n type RecordingMetadata,\n type RecordingStatusEvent,\n} from \"../shared.js\";\nimport type { StandaloneRuntime } from \"./runtime.js\";\nimport type { DaemonLogger } from \"./logger.js\";\n\nexport interface RecordingSyncDeps {\n runtime: StandaloneRuntime;\n storage: RecordingStorage;\n logger: DaemonLogger;\n /** account 级 ock- key(mode=api 且未指定 apiKey 时回退) */\n fallbackApiKey?: string;\n /** asr-config.json 所在目录(= ctx.paths.recordings) */\n asrConfigDir: string;\n /** 状态机变化时的回调(写日志 + 落 events.jsonl) */\n notifyStatus: (event: RecordingStatusEvent) => void;\n}\n\ninterface SyncParams {\n recordingId?: unknown;\n recording?: RecordingMetadata;\n asr?: AsrConfig;\n}\n\nconst ASR_CONFIG_FILE = \"asr-config.json\";\n\nfunction trimToString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\n/** 从 asr-config.json 读 AsrConfig;不存在 / 损坏返回 undefined。 */\nexport function loadLocalAsrConfig(asrConfigDir: string): AsrConfig | undefined {\n const path = join(asrConfigDir, ASR_CONFIG_FILE);\n if (!existsSync(path)) return undefined;\n try {\n const raw = JSON.parse(readFileSync(path, \"utf-8\")) as AsrConfig;\n return raw;\n } catch {\n return undefined;\n }\n}\n\n/**\n * 合并 caller 传入的 asr 与本地 fallback:\n * - 优先用 caller 的;\n * - 没传则用本地;\n * - mode=api 且最终 apiKey 仍为空时,用 account 级 fallback。\n */\nexport function resolveAsrConfig(\n callerAsr: AsrConfig | undefined,\n localAsr: AsrConfig | undefined,\n fallbackApiKey?: string,\n): AsrConfig | undefined {\n const chosen = callerAsr ?? localAsr;\n if (!chosen) return undefined;\n if (chosen.mode !== \"api\") return chosen;\n const apiKey = chosen.api?.apiKey ?? fallbackApiKey;\n if (!apiKey) return chosen;\n return { ...chosen, api: { ...(chosen.api ?? {}), apiKey } };\n}\n\n/**\n * 进入「稳定/终态」即认为一轮 sync 流程已结束,可解除 in-flight 标记并清理 lastError 残留。\n * - synced:sync 阶段成功(如果没有 ASR 也就停在这里)\n * - transcribed:ASR 成功(终态)\n * - transcribe_failed / sync_failed:失败终态\n */\nconst TERMINAL_STATUSES = new Set<string>([\n \"synced\",\n \"transcribed\",\n \"transcribe_failed\",\n \"sync_failed\",\n]);\n/** 仅这两个算「最终成功态」—— 终态时若 lastError 还残留是无用噪音,清掉。 */\nconst TERMINAL_SUCCESS_STATUSES = new Set<string>([\"synced\", \"transcribed\"]);\n/** 单条 in-flight 的兜底超时:5 分钟内若没收到终态事件,强制释放(避免句柄泄漏)。 */\nconst INFLIGHT_TIMEOUT_MS = 5 * 60 * 1000;\n\n/** 覆盖注册 recordings.sync gateway + POST /recordings HTTP。 */\nexport function overrideRecordingSync(deps: RecordingSyncDeps): void {\n const { runtime, storage, logger, fallbackApiKey, asrConfigDir, notifyStatus } = deps;\n\n /**\n * 同一 recordingId 在 sync→ASR 全流程中只允许一次 background 跑:\n * 手机端在 OSS 上传过程中常常会以秒级间隔重推同一条 sync,phone-notifications 的 handler 不去重,\n * 两条并行的 runRecordingSyncInBackground 会撞状态机(transcribing → synced 非法)。\n * daemon 层加 in-flight 标记后,第二条直接 short-circuit,仅返回当前 storage 状态。\n */\n const inFlight = new Map<string, NodeJS.Timeout>();\n\n function markInFlight(recordingId: string): void {\n clearTimeout(inFlight.get(recordingId));\n inFlight.set(\n recordingId,\n setTimeout(() => inFlight.delete(recordingId), INFLIGHT_TIMEOUT_MS),\n );\n }\n\n function releaseInFlight(recordingId: string): void {\n const t = inFlight.get(recordingId);\n if (t) {\n clearTimeout(t);\n inFlight.delete(recordingId);\n }\n }\n\n const wrappedNotifyStatus = (event: RecordingStatusEvent): void => {\n notifyStatus(event);\n if (!TERMINAL_STATUSES.has(event.transfer_status)) return;\n releaseInFlight(event.recordingId);\n // 终态成功(synced / transcribed)+ storage lastError 还在 → 清理。\n // 注意:不能用 event.error 做条件,因为 event.error 正是从 storage.lastError 拼出来的,\n // 互为因果。直接看 storage 现状即可。\n if (TERMINAL_SUCCESS_STATUSES.has(event.transfer_status)) {\n const entry = storage.findById(event.recordingId);\n if (entry?.lastError) {\n try {\n storage.setLastError(event.recordingId);\n logger.info(`[recording-sync] 终态 ${event.transfer_status} 清理 lastError 残留: ${event.recordingId}`);\n } catch (err) {\n logger.warn(`[recording-sync] 清理 lastError 失败: ${(err as Error).message}`);\n }\n }\n }\n };\n\n async function doSync(params: SyncParams): Promise<\n | { ok: true; data: Awaited<ReturnType<typeof handleRecordingSync>> }\n | { ok: false; code: string; message: string }\n > {\n const recordingId = trimToString(params.recordingId);\n if (!recordingId) {\n return { ok: false, code: \"INVALID_PARAMS\", message: \"recordingId is required\" };\n }\n const recording = params.recording;\n if (!recording || !recording.oss_audio_url || !recording.created_at) {\n return {\n ok: false,\n code: \"INVALID_PARAMS\",\n message: \"recording with oss_audio_url and created_at is required\",\n };\n }\n if (params.asr) {\n const err = validateAsrConfig(params.asr);\n if (err) return { ok: false, code: \"INVALID_PARAMS\", message: err };\n }\n\n // in-flight 去重:手机重推时直接 short-circuit,返回当前 storage 状态\n if (inFlight.has(recordingId)) {\n const entry = storage.findById(recordingId);\n logger.info(\n `[recording-sync] in-flight 跳过重复 sync: ${recordingId}(当前 ${entry?.status ?? \"unknown\"})`,\n );\n return {\n ok: true,\n data: {\n ok: true,\n recordingId,\n transfer_status: entry?.status ?? \"syncing_openclaw\",\n },\n };\n }\n\n const localAsr = loadLocalAsrConfig(asrConfigDir);\n const asr = resolveAsrConfig(params.asr, localAsr,
|
|
104
|
+
"/**\n * daemon 录音桥 —— CLI 独立形态下的 recordings.sync 实现。\n *\n * 为什么不直接用插件 registerRecordingInterfaces 里注册的 sync:\n * - 插件版 sync 要求 caller(手机端)每次把 asr 配置随 params 一起带上来;\n * - CLI 形态下 ASR 配置由 `yc recording setup-asr` 一次性写到 ~/.yoooclaw/<p>/recordings/asr-config.json,\n * 手机端不一定会带 asr —— 没带就要 fallback 读本地配置;\n * - 同时 mode=api 时若用户没填 apiKey,要回退到 account 级 ock- key(resolveApiKey)。\n *\n * 用法:daemon main.ts 先调 registerRecordingInterfaces 装上 list/status/rename/... 一类查询/管理方法,\n * 再调本模块 `overrideRecordingSync` 覆盖 sync 这一项(runtime.gatewayMethods 是 Map,后写覆盖)。\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport {\n handleRecordingSync,\n RecordingStorage,\n validateAsrConfig,\n type AsrConfig,\n type RecordingMetadata,\n type RecordingStatusEvent,\n} from \"../shared.js\";\nimport type { StandaloneRuntime } from \"./runtime.js\";\nimport type { DaemonLogger } from \"./logger.js\";\n\nexport interface RecordingSyncDeps {\n runtime: StandaloneRuntime;\n storage: RecordingStorage;\n logger: DaemonLogger;\n /** account 级 ock- key(mode=api 且未指定 apiKey 时回退) */\n fallbackApiKey?: string | (() => string | undefined);\n /** asr-config.json 所在目录(= ctx.paths.recordings) */\n asrConfigDir: string;\n /** 状态机变化时的回调(写日志 + 落 events.jsonl) */\n notifyStatus: (event: RecordingStatusEvent) => void;\n}\n\ninterface SyncParams {\n recordingId?: unknown;\n recording?: RecordingMetadata;\n asr?: AsrConfig;\n}\n\nconst ASR_CONFIG_FILE = \"asr-config.json\";\n\nfunction trimToString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\n/** 从 asr-config.json 读 AsrConfig;不存在 / 损坏返回 undefined。 */\nexport function loadLocalAsrConfig(asrConfigDir: string): AsrConfig | undefined {\n const path = join(asrConfigDir, ASR_CONFIG_FILE);\n if (!existsSync(path)) return undefined;\n try {\n const raw = JSON.parse(readFileSync(path, \"utf-8\")) as AsrConfig;\n return raw;\n } catch {\n return undefined;\n }\n}\n\n/**\n * 合并 caller 传入的 asr 与本地 fallback:\n * - 优先用 caller 的;\n * - 没传则用本地;\n * - mode=api 且最终 apiKey 仍为空时,用 account 级 fallback。\n */\nexport function resolveAsrConfig(\n callerAsr: AsrConfig | undefined,\n localAsr: AsrConfig | undefined,\n fallbackApiKey?: string,\n): AsrConfig | undefined {\n const chosen = callerAsr ?? localAsr;\n if (!chosen) return undefined;\n if (chosen.mode !== \"api\") return chosen;\n const apiKey = chosen.api?.apiKey ?? fallbackApiKey;\n if (!apiKey) return chosen;\n return { ...chosen, api: { ...(chosen.api ?? {}), apiKey } };\n}\n\n/**\n * 进入「稳定/终态」即认为一轮 sync 流程已结束,可解除 in-flight 标记并清理 lastError 残留。\n * - synced:sync 阶段成功(如果没有 ASR 也就停在这里)\n * - transcribed:ASR 成功(终态)\n * - transcribe_failed / sync_failed:失败终态\n */\nconst TERMINAL_STATUSES = new Set<string>([\n \"synced\",\n \"transcribed\",\n \"transcribe_failed\",\n \"sync_failed\",\n]);\n/** 仅这两个算「最终成功态」—— 终态时若 lastError 还残留是无用噪音,清掉。 */\nconst TERMINAL_SUCCESS_STATUSES = new Set<string>([\"synced\", \"transcribed\"]);\n/** 单条 in-flight 的兜底超时:5 分钟内若没收到终态事件,强制释放(避免句柄泄漏)。 */\nconst INFLIGHT_TIMEOUT_MS = 5 * 60 * 1000;\n\n/** 覆盖注册 recordings.sync gateway + POST /recordings HTTP。 */\nexport function overrideRecordingSync(deps: RecordingSyncDeps): void {\n const { runtime, storage, logger, fallbackApiKey, asrConfigDir, notifyStatus } = deps;\n const readFallbackApiKey = (): string | undefined =>\n typeof fallbackApiKey === \"function\" ? fallbackApiKey() : fallbackApiKey;\n\n /**\n * 同一 recordingId 在 sync→ASR 全流程中只允许一次 background 跑:\n * 手机端在 OSS 上传过程中常常会以秒级间隔重推同一条 sync,phone-notifications 的 handler 不去重,\n * 两条并行的 runRecordingSyncInBackground 会撞状态机(transcribing → synced 非法)。\n * daemon 层加 in-flight 标记后,第二条直接 short-circuit,仅返回当前 storage 状态。\n */\n const inFlight = new Map<string, NodeJS.Timeout>();\n\n function markInFlight(recordingId: string): void {\n clearTimeout(inFlight.get(recordingId));\n inFlight.set(\n recordingId,\n setTimeout(() => inFlight.delete(recordingId), INFLIGHT_TIMEOUT_MS),\n );\n }\n\n function releaseInFlight(recordingId: string): void {\n const t = inFlight.get(recordingId);\n if (t) {\n clearTimeout(t);\n inFlight.delete(recordingId);\n }\n }\n\n const wrappedNotifyStatus = (event: RecordingStatusEvent): void => {\n notifyStatus(event);\n if (!TERMINAL_STATUSES.has(event.transfer_status)) return;\n releaseInFlight(event.recordingId);\n // 终态成功(synced / transcribed)+ storage lastError 还在 → 清理。\n // 注意:不能用 event.error 做条件,因为 event.error 正是从 storage.lastError 拼出来的,\n // 互为因果。直接看 storage 现状即可。\n if (TERMINAL_SUCCESS_STATUSES.has(event.transfer_status)) {\n const entry = storage.findById(event.recordingId);\n if (entry?.lastError) {\n try {\n storage.setLastError(event.recordingId);\n logger.info(`[recording-sync] 终态 ${event.transfer_status} 清理 lastError 残留: ${event.recordingId}`);\n } catch (err) {\n logger.warn(`[recording-sync] 清理 lastError 失败: ${(err as Error).message}`);\n }\n }\n }\n };\n\n async function doSync(params: SyncParams): Promise<\n | { ok: true; data: Awaited<ReturnType<typeof handleRecordingSync>> }\n | { ok: false; code: string; message: string }\n > {\n const recordingId = trimToString(params.recordingId);\n if (!recordingId) {\n return { ok: false, code: \"INVALID_PARAMS\", message: \"recordingId is required\" };\n }\n const recording = params.recording;\n if (!recording || !recording.oss_audio_url || !recording.created_at) {\n return {\n ok: false,\n code: \"INVALID_PARAMS\",\n message: \"recording with oss_audio_url and created_at is required\",\n };\n }\n if (params.asr) {\n const err = validateAsrConfig(params.asr);\n if (err) return { ok: false, code: \"INVALID_PARAMS\", message: err };\n }\n\n // in-flight 去重:手机重推时直接 short-circuit,返回当前 storage 状态\n if (inFlight.has(recordingId)) {\n const entry = storage.findById(recordingId);\n logger.info(\n `[recording-sync] in-flight 跳过重复 sync: ${recordingId}(当前 ${entry?.status ?? \"unknown\"})`,\n );\n return {\n ok: true,\n data: {\n ok: true,\n recordingId,\n transfer_status: entry?.status ?? \"syncing_openclaw\",\n },\n };\n }\n\n const localAsr = loadLocalAsrConfig(asrConfigDir);\n const asr = resolveAsrConfig(params.asr, localAsr, readFallbackApiKey());\n if (asr && !params.asr) {\n logger.info(\n `[recording-sync] 使用本地 asr-config.json(mode=${asr.mode}${\n asr.mode === \"api\" && asr.api?.apiKey ? \", key=ock-***\" : \"\"\n })`,\n );\n }\n\n markInFlight(recordingId);\n const result = await handleRecordingSync(\n recordingId,\n recording,\n storage,\n asr,\n logger,\n { notifyStatus: wrappedNotifyStatus },\n );\n return { ok: true, data: result };\n }\n\n runtime.registerGatewayMethod(\"recordings.sync\", async ({ params, respond }) => {\n const outcome = await doSync((params ?? {}) as SyncParams);\n if (outcome.ok) {\n respond(outcome.data.ok, outcome.data, outcome.data.ok ? undefined : {\n code: \"SYNC_FAILED\",\n message: outcome.data.error ?? \"Unknown error\",\n });\n } else {\n respond(false, null, { code: outcome.code, message: outcome.message });\n }\n });\n\n runtime.registerHttpRoute({\n path: \"/recordings\",\n auth: \"gateway\",\n async handler(req: IncomingMessage, res: ServerResponse) {\n if (req.method !== \"POST\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Method Not Allowed\" }));\n return;\n }\n const body = await readJsonBody(req);\n if (body === undefined) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"Invalid JSON\" }));\n return;\n }\n const outcome = await doSync(body as SyncParams);\n if (outcome.ok) {\n res.writeHead(outcome.data.ok ? 200 : 500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(outcome.data));\n } else {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: outcome.message }));\n }\n },\n });\n\n logger.info(\"daemon 已覆盖 recordings.sync + POST /recordings(注入本地 ASR 配置)\");\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown | undefined> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) chunks.push(chunk as Buffer);\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\n if (!raw) return {};\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n",
|
|
107
105
|
"import type { StandaloneRuntime } from \"./runtime.js\";\n\nexport interface RelayStatusSnapshot {\n mode: \"relay\" | \"standalone-http\";\n connected: boolean;\n url: string;\n enabled: boolean;\n reconnectAttempt: number;\n lastDisconnectReason?: string;\n note?: string;\n}\n\nexport interface DaemonGatewayCompatOptions {\n version: string;\n protocol: number;\n capabilities: string[];\n profile: string;\n bind: string;\n getPort: () => number;\n startedAt: string;\n getLastIngestAt: () => string | null;\n getIngestCount: () => number;\n getLightRuleCount: () => number;\n getRelayStatus: () => RelayStatusSnapshot;\n}\n\nfunction gatewayMethods(runtime: StandaloneRuntime): string[] {\n return [...runtime.gatewayMethods.keys()].sort();\n}\n\nfunction buildHealthPayload(\n runtime: StandaloneRuntime,\n opts: DaemonGatewayCompatOptions,\n): Record<string, unknown> {\n const relay = opts.getRelayStatus();\n return {\n status: \"ok\",\n healthy: true,\n server: \"yoooclaw\",\n version: opts.version,\n protocol: opts.protocol,\n capabilities: opts.capabilities,\n profile: opts.profile,\n bind: opts.bind,\n port: opts.getPort(),\n startedAt: opts.startedAt,\n lastIngestAt: opts.getLastIngestAt(),\n ingestCount: opts.getIngestCount(),\n lightRules: opts.getLightRuleCount(),\n relay,\n features: {\n methods: gatewayMethods(runtime),\n capabilities: opts.capabilities,\n },\n };\n}\n\nfunction buildChannelsPayload(opts: DaemonGatewayCompatOptions): Record<string, unknown> {\n const relay = opts.getRelayStatus();\n const account = {\n id: `yoooclaw.daemon/${opts.profile}`,\n channel: \"yoooclaw.daemon\",\n accountId: opts.profile,\n label: `YoooClaw daemon (${opts.profile})`,\n enabled: true,\n running: true,\n connected: relay.connected,\n mode: relay.mode,\n url: relay.url,\n reconnectAttempt: relay.reconnectAttempt,\n lastError: relay.lastDisconnectReason ?? relay.note,\n };\n\n return {\n channelOrder: [\"yoooclaw.daemon\"],\n channelMeta: [\n {\n id: \"yoooclaw.daemon\",\n label: \"YoooClaw daemon\",\n type: \"daemon\",\n },\n ],\n channels: [\n {\n id: \"yoooclaw.daemon\",\n label: \"YoooClaw daemon\",\n enabled: true,\n running: true,\n connected: relay.connected,\n accounts: [account],\n },\n ],\n accounts: [account],\n relay,\n };\n}\n\nfunction paramsRecord(params: unknown): Record<string, unknown> {\n return params && typeof params === \"object\"\n ? (params as Record<string, unknown>)\n : {};\n}\n\nexport function registerDaemonGatewayCompatMethods(\n runtime: StandaloneRuntime,\n opts: DaemonGatewayCompatOptions,\n): void {\n runtime.registerGatewayMethod(\"health\", async ({ respond }) => {\n respond(true, buildHealthPayload(runtime, opts));\n });\n\n runtime.registerGatewayMethod(\"channels.status\", async ({ respond }) => {\n respond(true, buildChannelsPayload(opts));\n });\n\n runtime.registerGatewayMethod(\"agents.list\", async ({ respond }) => {\n respond(true, { total: 0, agents: [], items: [] });\n });\n\n runtime.registerGatewayMethod(\"sessions.list\", async ({ respond }) => {\n respond(true, { total: 0, sessions: [], items: [] });\n });\n\n runtime.registerGatewayMethod(\"chat.history\", async ({ params, respond }) => {\n const sessionKey = paramsRecord(params).sessionKey;\n respond(true, {\n sessionKey: typeof sessionKey === \"string\" ? sessionKey : undefined,\n total: 0,\n messages: [],\n });\n });\n\n runtime.registerGatewayMethod(\"usage.cost\", async ({ respond }) => {\n respond(true, {\n totalCost: 0,\n cost: 0,\n currency: \"USD\",\n items: [],\n usage: [],\n });\n });\n\n runtime.registerGatewayMethod(\"cron.list\", async ({ respond }) => {\n respond(true, { total: 0, crons: [], tasks: [], items: [] });\n });\n\n runtime.registerGatewayMethod(\"wake\", async ({ respond }) => {\n respond(true, { ok: true, woken: true });\n });\n}\n",
|
|
108
|
-
"/**\n * 依赖 daemon 的 service(🟡)—— 统一经 DaemonClient 走 localhost HTTP RPC。\n * light / lightrule / tunnel / monitor / gateway / api。\n */\nimport { readFileSync } from \"node:fs\";\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { DaemonClient, assertDaemonRunning } from \"../daemon/client.js\";\nimport { confirm, readStdin } from \"../prompt.js\";\n\nfunction client(ctx: CliContext): DaemonClient {\n assertDaemonRunning(ctx.paths);\n return new DaemonClient(ctx.paths);\n}\n\nfunction parseJsonArg(raw: string | undefined, label: string): unknown {\n if (raw === undefined) return undefined;\n try {\n return JSON.parse(raw);\n } catch {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", `${label} 不是合法 JSON`);\n }\n}\n\n// ── light ──\nexport async function lightSend(\n ctx: CliContext,\n _args: unknown[],\n opts: {\n segments?: string;\n preset?: string;\n rule?: string;\n repeat?: boolean;\n repeatTimes?: string;\n },\n): Promise<unknown> {\n if (!opts.segments && !opts.preset && !opts.rule) {\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n \"需要 --segments / --preset / --rule 之一\",\n );\n }\n const body: Record<string, unknown> = {};\n if (opts.segments) body.segments = parseJsonArg(opts.segments, \"--segments\");\n if (opts.preset) body.preset = opts.preset;\n if (opts.rule) body.rule = opts.rule;\n if (opts.repeat) body.repeat = true;\n if (opts.repeatTimes !== undefined) body.repeat_times = Number(opts.repeatTimes);\n const res = await client(ctx).post(\"/light/send\", body);\n return res.body;\n}\n\n/** +blink shortcut:映射到 presets-v1 的 red-strobe-3,做连通性测试。 */\nexport async function lightBlink(ctx: CliContext): Promise<unknown> {\n const res = await client(ctx).post(\"/light/send\", { preset: \"red-strobe-3\" });\n return res.body;\n}\n\n// ── lightrule ──\nasync function listRules(c: DaemonClient): Promise<Array<Record<string, unknown>>> {\n const res = await c.post<{ data?: { rules?: Array<Record<string, unknown>> } }>(\"/gateway/lightrules.list\", {});\n return res.body?.data?.rules ?? [];\n}\n\nexport async function lightruleList(ctx: CliContext): Promise<unknown> {\n return { ok: true, rules: await listRules(client(ctx)) };\n}\n\nexport async function lightruleShow(ctx: CliContext, args: unknown[]): Promise<unknown> {\n const [id] = args as [string];\n const rule = (await listRules(client(ctx))).find((r) => r.id === id || r.name === id);\n if (!rule) throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `规则不存在:${id}`);\n return { ok: true, rule };\n}\n\ninterface LightRuleOpts {\n fromFile?: string;\n name?: string;\n intent?: string;\n lightAction?: string;\n matchRules?: string;\n}\n\nasync function buildRuleParams(opts: LightRuleOpts, name?: string): Promise<Record<string, unknown>> {\n if (opts.fromFile) {\n const raw = opts.fromFile === \"-\" ? await readStdin() : readFileSync(opts.fromFile, \"utf-8\");\n return JSON.parse(raw) as Record<string, unknown>;\n }\n const params: Record<string, unknown> = {};\n if (name) params.name = name;\n if (opts.name) params.name = opts.name;\n if (opts.intent) params.description = opts.intent;\n const action = parseJsonArg(opts.lightAction, \"--light-action\");\n if (action !== undefined) {\n params.segments = Array.isArray(action) ? action : (action as { segments?: unknown }).segments ?? action;\n }\n const match = parseJsonArg(opts.matchRules, \"--match-rules\");\n if (match !== undefined) params.matchRules = match;\n return params;\n}\n\nexport async function lightruleCreate(\n ctx: CliContext,\n _args: unknown[],\n opts: LightRuleOpts,\n): Promise<unknown> {\n const c = client(ctx);\n const params = await buildRuleParams(opts);\n const res = await c.post(\"/gateway/lightrules.create\", params);\n if (!res.body || (res.body as { ok?: boolean }).ok === false) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", JSON.stringify((res.body as { error?: unknown })?.error ?? res.body));\n }\n return (res.body as { data?: unknown }).data ?? res.body;\n}\n\nexport async function lightruleUpdate(\n ctx: CliContext,\n args: unknown[],\n opts: LightRuleOpts,\n): Promise<unknown> {\n const [id] = args as [string];\n const c = client(ctx);\n const params = await buildRuleParams(opts, id);\n params.name = id;\n const res = await c.post(\"/gateway/lightrules.update\", params);\n return (res.body as { data?: unknown }).data ?? res.body;\n}\n\nexport async function lightruleDelete(\n ctx: CliContext,\n args: unknown[],\n opts: { yes?: boolean },\n): Promise<unknown> {\n const [id] = args as [string];\n if (!opts.yes && !(await confirm(`确认删除规则 \\`${id}\\`?`, false))) {\n throw new YoooclawError(\"YOOOCLAW_CONFIRMATION_REQUIRED\", \"已取消\");\n }\n const res = await client(ctx).post(\"/gateway/lightrules.delete\", { name: id });\n return (res.body as { data?: unknown }).data ?? res.body;\n}\n\nexport async function lightruleEnable(ctx: CliContext, args: unknown[]): Promise<unknown> {\n const [id] = args as [string];\n const res = await client(ctx).post(\"/gateway/lightrules.update\", { name: id, enabled: true });\n return (res.body as { data?: unknown }).data ?? res.body;\n}\n\nexport async function lightruleDisable(ctx: CliContext, args: unknown[]): Promise<unknown> {\n const [id] = args as [string];\n const res = await client(ctx).post(\"/gateway/lightrules.update\", { name: id, enabled: false });\n return (res.body as { data?: unknown }).data ?? res.body;\n}\n\nasync function toggleAll(ctx: CliContext, enabled: boolean): Promise<unknown> {\n const c = client(ctx);\n const rules = await listRules(c);\n const results: Array<{ name: unknown; ok: boolean }> = [];\n for (const rule of rules) {\n const res = await c.post(\"/gateway/lightrules.update\", { name: rule.name, enabled });\n results.push({ name: rule.name, ok: (res.body as { ok?: boolean })?.ok !== false });\n }\n return { ok: true, enabled, count: results.length, results };\n}\n\nexport const lightruleOn = (ctx: CliContext): Promise<unknown> => toggleAll(ctx, true);\nexport const lightruleOff = (ctx: CliContext): Promise<unknown> => toggleAll(ctx, false);\n\n// ── tunnel ──\nexport async function tunnelStatus(ctx: CliContext): Promise<unknown> {\n return (await client(ctx).get(\"/tunnel/status\")).body;\n}\nexport async function tunnelReconnect(ctx: CliContext): Promise<unknown> {\n return (await client(ctx).post(\"/tunnel/reconnect\")).body;\n}\nexport async function tunnelTest(ctx: CliContext): Promise<unknown> {\n return (await client(ctx).post(\"/tunnel/test\")).body;\n}\n\n// ── monitor ──\nexport async function monitorList(ctx: CliContext): Promise<unknown> {\n return (await client(ctx).get(\"/monitors\")).body;\n}\nexport async function monitorShow(ctx: CliContext, args: unknown[]): Promise<unknown> {\n const [name] = args as [string];\n const res = await client(ctx).get<{ monitors?: Array<{ name: string }> }>(\"/monitors\");\n const monitor = res.body?.monitors?.find((m) => m.name === name);\n if (!monitor) throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `监控任务不存在:${name}`);\n return { ok: true, monitor };\n}\nexport async function monitorCreate(\n ctx: CliContext,\n args: unknown[],\n opts: { description?: string; matchRules?: string; schedule?: string },\n): Promise<unknown> {\n const [name] = args as [string];\n if (!opts.description || !opts.matchRules || !opts.schedule) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--description / --match-rules / --schedule 均必填\");\n }\n const res = await client(ctx).post(\"/monitors\", {\n name,\n description: opts.description,\n matchRules: parseJsonArg(opts.matchRules, \"--match-rules\"),\n schedule: opts.schedule,\n });\n return res.body;\n}\nexport async function monitorDelete(\n ctx: CliContext,\n args: unknown[],\n opts: { yes?: boolean },\n): Promise<unknown> {\n const [name] = args as [string];\n if (!opts.yes && !(await confirm(`确认删除监控任务 \\`${name}\\`?`, false))) {\n throw new YoooclawError(\"YOOOCLAW_CONFIRMATION_REQUIRED\", \"已取消\");\n }\n return (await client(ctx).request(\"DELETE\", `/monitors/${encodeURIComponent(name)}`)).body;\n}\nexport async function monitorEnable(ctx: CliContext, args: unknown[]): Promise<unknown> {\n const [name] = args as [string];\n return (await client(ctx).post(`/monitors/${encodeURIComponent(name)}/enable`)).body;\n}\nexport async function monitorDisable(ctx: CliContext, args: unknown[]): Promise<unknown> {\n const [name] = args as [string];\n return (await client(ctx).post(`/monitors/${encodeURIComponent(name)}/disable`)).body;\n}\n\n// ── gateway test ──\nexport async function gatewayTest(\n ctx: CliContext,\n _args: unknown[],\n opts: { fromPhoneIp?: string; viaRelay?: boolean },\n): Promise<unknown> {\n const c = client(ctx);\n if (opts.viaRelay) {\n return { ok: true, viaRelay: true, result: (await c.post(\"/tunnel/test\")).body };\n }\n const probe = {\n notifications: [\n { id: `gwtest_${Date.now()}`, app: \"yoooclaw.gatewaytest\", title: \"gateway test\", body: \"probe\", timestamp: new Date().toISOString() },\n ],\n };\n const res = await c.post(\"/notifications\", probe);\n return {\n ok: res.status >= 200 && res.status < 300,\n fromPhoneIp: opts.fromPhoneIp ?? null,\n status: res.status,\n response: res.body,\n };\n}\n\n// ── raw api ──\nexport async function apiRaw(\n ctx: CliContext,\n args: unknown[],\n opts: { data?: string; header?: string[] | string },\n): Promise<unknown> {\n const [method, path] = args as [string, string];\n let data: unknown;\n if (opts.data) {\n let raw: string;\n if (opts.data === \"-\") raw = await readStdin();\n else if (opts.data.startsWith(\"@\")) raw = readFileSync(opts.data.slice(1), \"utf-8\");\n else raw = opts.data;\n try {\n data = JSON.parse(raw);\n } catch {\n data = raw;\n }\n }\n const headers: Record<string, string> = {};\n const headerList = Array.isArray(opts.header) ? opts.header : opts.header ? [opts.header] : [];\n for (const h of headerList) {\n const idx = h.indexOf(\":\");\n if (idx > 0) headers[h.slice(0, idx).trim()] = h.slice(idx + 1).trim();\n }\n const res = await client(ctx).request(method.toUpperCase(), path, data, headers);\n return { ok: res.status >= 200 && res.status < 300, status: res.status, body: res.body };\n}\n",
|
|
109
|
-
"/**\n *
|
|
106
|
+
"/**\n * RelayDispatcher —— CLI daemon 模式下的 Relay 帧分发器。\n *\n * 为什么不直接复用 phone-notifications/tunnel/proxy 的 TunnelProxy:\n * TunnelProxy 把每个 `req` 帧反代到「本地 OpenClaw 桌面端 gateway WebSocket」,依赖 OpenClaw 自带的\n * `connect.challenge` / `pairing` 协议;daemon 不实现那套,反代会 401 卡死。\n *\n * 本 dispatcher 的取舍:保留与插件**对外完全一致**的 Relay 协议(RelayClient 复用,frame schema 不变),\n * 但**绕过 OpenClaw gateway WS 这一层耦合**,直接把 `req` 帧同进程交给 `runtime.callGateway` 处理。\n * 手机端 / Relay 服务端对此完全无感知。\n *\n * 当前覆盖:\n * - `type: \"req\"` → callGateway → 回 `{type:\"res\", id, ok, payload?, error?}`\n * - `type: \"request\" / ws_*` → 暂不支持,回 proxy_error 或日志 warn(手机端目前只发 req)\n *\n * `pushEvent(event, payload)` —— daemon 主动反向推事件给手机端(recording.status 等)。\n */\nimport type { DaemonLogger } from \"./logger.js\";\nimport type { StandaloneRuntime } from \"./runtime.js\";\nimport {\n RELAY_INTERNAL_HTTP_HEADER,\n mapRelayHttpPath,\n type RelayClient,\n} from \"../shared.js\";\n\nexport const RELAY_INTERNAL_CLIENT_LABEL_HEADER = \"x-yoooclaw-internal-client-label\";\n\ninterface ReqFrame {\n type: \"req\";\n id: string;\n method: string;\n params?: Record<string, unknown>;\n}\n\ninterface RequestFrame {\n type: \"request\";\n id: string;\n method: string;\n path: string;\n headers?: Record<string, string>;\n body?: string;\n}\n\ninterface AnyFrame {\n type: string;\n id?: string;\n [k: string]: unknown;\n}\n\nexport interface RelayDispatcherDeps {\n client: RelayClient;\n runtime: StandaloneRuntime;\n logger: DaemonLogger;\n /**\n * 用于把 RequestFrame(HTTP-style,如 POST /notifications)loopback 到 daemon 自己的 HTTP server。\n * 这样能直接复用现成的路由实现(包括 authorized check、JSON 解析、ingest 逻辑),\n * 不必为每条 frame 重新 mock node:http 的 IncomingMessage/ServerResponse。\n */\n httpBaseUrl: string;\n /** loopback 时带的 gateway token;未设则不加 Authorization(daemon 默认放行无 token 模式)。 */\n httpToken?: string;\n /** 当前 Relay 隧道对应的 api-key label。 */\n clientLabel: string;\n}\n\nexport class RelayDispatcher {\n constructor(private readonly deps: RelayDispatcherDeps) {}\n\n /** 挂上 RelayClient 的 inbound 回调;幂等:重复调只会重新绑定(沿用 onInbound 的覆盖语义)。 */\n start(): void {\n this.deps.client.onInbound((frame) => {\n void this.handleFrame(frame as unknown as AnyFrame);\n });\n }\n\n private async handleFrame(frame: AnyFrame): Promise<void> {\n const { logger } = this.deps;\n switch (frame.type) {\n case \"req\":\n await this.handleReq(frame as unknown as ReqFrame);\n return;\n case \"request\":\n await this.handleRequest(frame as unknown as RequestFrame);\n return;\n case \"ws_open\":\n case \"ws_data\":\n case \"ws_close\":\n logger.warn(\n `[relay-dispatcher] 暂不支持 WS 子通道帧(type=${frame.type}, id=${frame.id ?? \"?\"})`,\n );\n return;\n default:\n logger.warn(`[relay-dispatcher] 未识别帧 type=${frame.type}`);\n }\n }\n\n private async handleRequest(frame: RequestFrame): Promise<void> {\n const { client, logger, httpBaseUrl, httpToken } = this.deps;\n const { id, method, path, headers: srcHeaders, body } = frame;\n const mappedPath = mapRelayHttpPath(path);\n const url = httpBaseUrl + (mappedPath.startsWith(\"/\") ? mappedPath : \"/\" + mappedPath);\n const headers: Record<string, string> = { ...srcHeaders };\n if (httpToken && !headers[\"authorization\"] && !headers[\"Authorization\"]) {\n headers[\"authorization\"] = `Bearer ${httpToken}`;\n }\n headers[RELAY_INTERNAL_HTTP_HEADER] = \"1\";\n headers[RELAY_INTERNAL_CLIENT_LABEL_HEADER] = this.deps.clientLabel;\n\n logger.info(\n `[relay-dispatcher] request id=${id} ${method} ${path} → ${mappedPath} loopback`,\n );\n\n let status = 502;\n let resHeaders: Record<string, string> = {};\n let resBody = \"\";\n try {\n const res = await fetch(url, { method, headers, body });\n status = res.status;\n resHeaders = Object.fromEntries(res.headers.entries());\n resBody = await res.text();\n } catch (err) {\n logger.error(`[relay-dispatcher] loopback 失败 id=${id} ${method} ${path}: ${(err as Error).message}`);\n client.sendRaw(\n JSON.stringify({\n type: \"proxy_error\",\n id,\n status: 502,\n message: `daemon loopback 失败: ${(err as Error).message}`,\n }),\n );\n return;\n }\n\n client.sendRaw(\n JSON.stringify({\n type: \"proxy_response\",\n id,\n status,\n headers: resHeaders,\n body: resBody,\n }),\n );\n }\n\n private async handleReq(frame: ReqFrame): Promise<void> {\n const { client, runtime, logger } = this.deps;\n const { id, method, params } = frame;\n logger.info(`[relay-dispatcher] req id=${id} method=${method}`);\n let ok = false;\n let payload: unknown;\n let error: { code: string; message: string } | undefined;\n try {\n const result = await runtime.callGateway(method, params, {\n clientLabel: this.deps.clientLabel,\n authKind: \"relay-api-key\",\n });\n ok = result.ok;\n payload = result.data;\n error = result.error;\n } catch (err) {\n ok = false;\n error = { code: \"INTERNAL_ERROR\", message: (err as Error).message };\n logger.error(`[relay-dispatcher] callGateway 异常: ${(err as Error).message}`);\n }\n // JSON.stringify 会跳过 value 为 undefined 的键,所以无需手动剔除\n client.sendRaw(JSON.stringify({ type: \"res\", id, ok, payload, error }));\n }\n\n /** daemon → 手机端反向推 Gateway event。 */\n pushEvent(event: string, payload: unknown): void {\n this.deps.client.sendRaw(JSON.stringify({ type: \"event\", event, payload }));\n }\n}\n",
|
|
107
|
+
"/**\n * Relay 隧道接入 —— daemon 模式专用。\n *\n * 与插件的差别(也是这次解耦的核心):\n * - **复用** RelayClient:连接、心跳、重连、frame 协议跟插件完全一致 —— 这部分本来就跟 OpenClaw 无关。\n * - **不复用** TunnelProxy:那玩意把每个 req 反代到 OpenClaw 桌面端的 gateway WS(含 connect.challenge /\n * pairing),daemon 不实现 OpenClaw 那套协议,反代会 401 卡死。\n * - 改用 RelayDispatcher:拿到 req 帧后直接同进程交给 runtime.callGateway 处理,再以 res 帧回写。\n *\n * 对手机端 / Relay 服务端完全透明:协议帧(req/res schema、心跳、认证)都不变,只是 daemon 内部「frame\n * 接到后怎么处理」从「反代给 OpenClaw gateway」换成「in-process dispatch」。\n *\n * 其他保持:api-key 走 CLI 的分层解析(env/keychain/共享文件),锁/状态文件落 profile 目录。\n */\nimport { join } from \"node:path\";\nimport { RelayClient } from \"../shared.js\";\nimport type { DaemonLogger } from \"./logger.js\";\nimport type { StandaloneRuntime } from \"./runtime.js\";\nimport { RelayDispatcher } from \"./relay-dispatcher.js\";\n\nconst DEFAULT_HEARTBEAT_SEC = 10;\nconst DEFAULT_RECONNECT_BACKOFF_MS = 2000;\n\nexport interface RelayTunnelOptions {\n /** api-key label,用于状态文件与日志。 */\n label: string;\n /** Relay Server WebSocket 地址(config.relay.url,默认插件生产地址)。 */\n tunnelUrl: string;\n /** account 级 api-key(CLI resolveApiKey 解析所得)。 */\n apiKey: string;\n /** daemon 的 gateway 路由表,gateway-RPC 帧(type:\"req\")in-process 派发用。 */\n runtime: StandaloneRuntime;\n /** daemon HTTP server base(http://127.0.0.1:port),HTTP-style frame(type:\"request\")loopback 用。 */\n httpBaseUrl: string;\n /** loopback 时带的 gateway token。 */\n httpToken?: string;\n heartbeatSec?: number;\n reconnectBackoffMs?: number;\n /** profile 目录,用于落隧道状态文件与设备身份。 */\n stateDir: string;\n logger: DaemonLogger;\n}\n\nexport interface RelayTunnelHandle {\n stop(reason: string): Promise<void>;\n status(): {\n connected: boolean;\n url: string;\n reconnectAttempt: number;\n lastDisconnectReason?: string;\n };\n /** 反向 push event 给手机端(取决于 Relay 服务端是否支持广播,预留接口)。 */\n pushEvent(event: string, payload: unknown): void;\n}\n\nfunction relayCredential(apiKey: string): { query: { apiKey: string } } {\n const raw = apiKey.startsWith(\"Bearer \") ? apiKey.slice(\"Bearer \".length) : apiKey;\n return { query: { apiKey: raw } };\n}\n\n/**\n * 启动 Relay 隧道。返回句柄用于查询状态 / 优雅停止 / 主动重连。\n * 非阻塞:connectWithAutoReconnect 在内部保持运行并自动重连。\n */\nexport function startRelayTunnel(opts: RelayTunnelOptions): RelayTunnelHandle {\n const { logger } = opts;\n const statusFilePath = join(opts.stateDir, \"state\", \"tunnels\", `${opts.label}.json`);\n\n let abortController = new AbortController();\n let connected = false;\n let reconnectAttempt = 0;\n let lastDisconnectReason: string | undefined;\n\n const client = new RelayClient({\n tunnelUrl: opts.tunnelUrl,\n credentialProvider: async () => relayCredential(opts.apiKey),\n heartbeatSec: opts.heartbeatSec ?? DEFAULT_HEARTBEAT_SEC,\n reconnectBackoffMs: opts.reconnectBackoffMs ?? DEFAULT_RECONNECT_BACKOFF_MS,\n statusFilePath,\n logger: {\n info: (m: string) => logger.info(`[tunnel:${opts.label}] ${m}`),\n warn: (m: string) => logger.warn(`[tunnel:${opts.label}] ${m}`),\n error: (m: string) => logger.error(`[tunnel:${opts.label}] ${m}`),\n },\n });\n\n const dispatcher = new RelayDispatcher({\n client,\n runtime: opts.runtime,\n logger,\n httpBaseUrl: opts.httpBaseUrl,\n httpToken: opts.httpToken,\n clientLabel: opts.label,\n });\n dispatcher.start();\n\n client.onConnected(() => {\n connected = true;\n lastDisconnectReason = undefined;\n });\n client.onDisconnected((reason) => {\n connected = false;\n reconnectAttempt += 1;\n lastDisconnectReason = reason;\n });\n\n const run = (): void => {\n client.connectWithAutoReconnect(abortController.signal).catch((err) => {\n logger.error(`Relay tunnel: 意外退出:${(err as Error).message}`);\n });\n };\n run();\n logger.info(`[tunnel:${opts.label}] Relay tunnel: 已启动(url=${opts.tunnelUrl} → in-process gateway dispatch)`);\n\n return {\n async stop(reason: string) {\n abortController.abort();\n await client.stop(reason);\n },\n status() {\n return {\n connected: connected || client.isConnected(),\n url: opts.tunnelUrl,\n reconnectAttempt,\n lastDisconnectReason,\n };\n },\n pushEvent(event: string, payload: unknown) {\n dispatcher.pushEvent(event, payload);\n },\n };\n}\n",
|
|
108
|
+
"import type { ApiKeyEntry, CredentialSet } from \"../credentials/store.js\";\nimport { startRelayTunnel, type RelayTunnelHandle } from \"./relay.js\";\nimport type { DaemonLogger } from \"./logger.js\";\nimport type { StandaloneRuntime } from \"./runtime.js\";\n\nexport interface TunnelSupervisorOptions {\n tunnelUrl: string;\n runtime: StandaloneRuntime;\n httpBaseUrl: string;\n httpToken?: string;\n heartbeatSec?: number;\n reconnectBackoffMs?: number;\n stateDir: string;\n logger: DaemonLogger;\n}\n\ninterface ManagedTunnel {\n entry: ApiKeyEntry;\n handle: RelayTunnelHandle;\n}\n\nexport interface TunnelApplyResult {\n started: string[];\n stopped: string[];\n restarted: string[];\n unchanged: string[];\n}\n\nexport class TunnelSupervisor {\n private readonly tunnels = new Map<string, ManagedTunnel>();\n private defaultLabel: string | null = null;\n private mode: CredentialSet[\"mode\"] = \"none\";\n\n constructor(private readonly opts: TunnelSupervisorOptions) {}\n\n async apply(set: CredentialSet): Promise<TunnelApplyResult> {\n const started: string[] = [];\n const stopped: string[] = [];\n const restarted: string[] = [];\n const unchanged: string[] = [];\n const next = new Map(set.entries.map((entry) => [entry.label, entry]));\n\n for (const [label, managed] of this.tunnels) {\n const nextEntry = next.get(label);\n if (!nextEntry) {\n await managed.handle.stop(\"removed\");\n this.tunnels.delete(label);\n stopped.push(label);\n continue;\n }\n if (nextEntry.key !== managed.entry.key) {\n await managed.handle.stop(\"key-changed\");\n this.tunnels.set(label, { entry: nextEntry, handle: this.start(nextEntry) });\n restarted.push(label);\n } else {\n managed.entry = nextEntry;\n unchanged.push(label);\n }\n }\n\n for (const entry of set.entries) {\n if (this.tunnels.has(entry.label)) continue;\n this.tunnels.set(entry.label, { entry, handle: this.start(entry) });\n started.push(entry.label);\n }\n\n this.defaultLabel = set.defaultEntry?.label ?? null;\n this.mode = set.mode;\n return { started, stopped, restarted, unchanged };\n }\n\n async stopAll(reason: string): Promise<void> {\n const handles = [...this.tunnels.values()].map((managed) => managed.handle);\n this.tunnels.clear();\n await Promise.all(handles.map((handle) => handle.stop(reason).catch(() => undefined)));\n }\n\n async reconnect(label?: string): Promise<{ reconnected: string[]; missing?: string }> {\n const labels = label ? [label] : [...this.tunnels.keys()];\n const reconnected: string[] = [];\n for (const item of labels) {\n const managed = this.tunnels.get(item);\n if (!managed) return { reconnected, missing: item };\n await managed.handle.stop(\"manual-reconnect\").catch(() => undefined);\n this.tunnels.set(item, { entry: managed.entry, handle: this.start(managed.entry) });\n reconnected.push(item);\n }\n return { reconnected };\n }\n\n pushEvent(event: string, payload: unknown): void {\n for (const managed of this.tunnels.values()) {\n managed.handle.pushEvent(event, payload);\n }\n }\n\n status(): {\n mode: CredentialSet[\"mode\"];\n defaultLabel: string | null;\n tunnels: Array<{\n label: string;\n default: boolean;\n connected: boolean;\n url: string;\n reconnectAttempt: number;\n lastDisconnectReason?: string;\n }>;\n } {\n return {\n mode: this.mode,\n defaultLabel: this.defaultLabel,\n tunnels: [...this.tunnels.values()].map((managed) => {\n const status = managed.handle.status();\n return {\n label: managed.entry.label,\n default: managed.entry.label === this.defaultLabel,\n connected: status.connected,\n url: status.url,\n reconnectAttempt: status.reconnectAttempt,\n lastDisconnectReason: status.lastDisconnectReason,\n };\n }),\n };\n }\n\n defaultStatus() {\n const status = this.status();\n return status.tunnels.find((tunnel) => tunnel.label === status.defaultLabel) ?? status.tunnels[0];\n }\n\n private start(entry: ApiKeyEntry): RelayTunnelHandle {\n return startRelayTunnel({\n label: entry.label,\n tunnelUrl: this.opts.tunnelUrl,\n apiKey: entry.key,\n runtime: this.opts.runtime,\n httpBaseUrl: this.opts.httpBaseUrl,\n httpToken: this.opts.httpToken,\n heartbeatSec: this.opts.heartbeatSec,\n reconnectBackoffMs: this.opts.reconnectBackoffMs,\n stateDir: this.opts.stateDir,\n logger: this.opts.logger,\n });\n }\n}\n",
|
|
109
|
+
"/**\n * 依赖 daemon 的 service(🟡)—— 统一经 DaemonClient 走 localhost HTTP RPC。\n * light / lightrule / tunnel / monitor / gateway / api。\n */\nimport { readFileSync } from \"node:fs\";\nimport type { CliContext } from \"../context.js\";\nimport { YoooclawError } from \"../errors.js\";\nimport { DaemonClient, assertDaemonRunning } from \"../daemon/client.js\";\nimport { confirm, readStdin } from \"../prompt.js\";\n\nfunction client(ctx: CliContext): DaemonClient {\n assertDaemonRunning(ctx.paths);\n return new DaemonClient(ctx.paths);\n}\n\nfunction parseJsonArg(raw: string | undefined, label: string): unknown {\n if (raw === undefined) return undefined;\n try {\n return JSON.parse(raw);\n } catch {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", `${label} 不是合法 JSON`);\n }\n}\n\n// ── light ──\nexport async function lightSend(\n ctx: CliContext,\n _args: unknown[],\n opts: {\n segments?: string;\n preset?: string;\n rule?: string;\n repeat?: boolean;\n repeatTimes?: string;\n },\n): Promise<unknown> {\n if (!opts.segments && !opts.preset && !opts.rule) {\n throw new YoooclawError(\n \"YOOOCLAW_INVALID_ARGUMENT\",\n \"需要 --segments / --preset / --rule 之一\",\n );\n }\n const body: Record<string, unknown> = {};\n if (opts.segments) body.segments = parseJsonArg(opts.segments, \"--segments\");\n if (opts.preset) body.preset = opts.preset;\n if (opts.rule) body.rule = opts.rule;\n if (opts.repeat) body.repeat = true;\n if (opts.repeatTimes !== undefined) body.repeat_times = Number(opts.repeatTimes);\n const res = await client(ctx).post(\"/light/send\", body);\n return res.body;\n}\n\n/** +blink shortcut:映射到 presets-v1 的 red-strobe-3,做连通性测试。 */\nexport async function lightBlink(ctx: CliContext): Promise<unknown> {\n const res = await client(ctx).post(\"/light/send\", { preset: \"red-strobe-3\" });\n return res.body;\n}\n\n// ── lightrule ──\nasync function listRules(c: DaemonClient): Promise<Array<Record<string, unknown>>> {\n const res = await c.post<{ data?: { rules?: Array<Record<string, unknown>> } }>(\"/gateway/lightrules.list\", {});\n return res.body?.data?.rules ?? [];\n}\n\nexport async function lightruleList(ctx: CliContext): Promise<unknown> {\n return { ok: true, rules: await listRules(client(ctx)) };\n}\n\nexport async function lightruleShow(ctx: CliContext, args: unknown[]): Promise<unknown> {\n const [id] = args as [string];\n const rule = (await listRules(client(ctx))).find((r) => r.id === id || r.name === id);\n if (!rule) throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `规则不存在:${id}`);\n return { ok: true, rule };\n}\n\ninterface LightRuleOpts {\n fromFile?: string;\n name?: string;\n intent?: string;\n lightAction?: string;\n matchRules?: string;\n}\n\nasync function buildRuleParams(opts: LightRuleOpts, name?: string): Promise<Record<string, unknown>> {\n if (opts.fromFile) {\n const raw = opts.fromFile === \"-\" ? await readStdin() : readFileSync(opts.fromFile, \"utf-8\");\n return JSON.parse(raw) as Record<string, unknown>;\n }\n const params: Record<string, unknown> = {};\n if (name) params.name = name;\n if (opts.name) params.name = opts.name;\n if (opts.intent) params.description = opts.intent;\n const action = parseJsonArg(opts.lightAction, \"--light-action\");\n if (action !== undefined) {\n params.segments = Array.isArray(action) ? action : (action as { segments?: unknown }).segments ?? action;\n }\n const match = parseJsonArg(opts.matchRules, \"--match-rules\");\n if (match !== undefined) params.matchRules = match;\n return params;\n}\n\nexport async function lightruleCreate(\n ctx: CliContext,\n _args: unknown[],\n opts: LightRuleOpts,\n): Promise<unknown> {\n const c = client(ctx);\n const params = await buildRuleParams(opts);\n const res = await c.post(\"/gateway/lightrules.create\", params);\n if (!res.body || (res.body as { ok?: boolean }).ok === false) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", JSON.stringify((res.body as { error?: unknown })?.error ?? res.body));\n }\n return (res.body as { data?: unknown }).data ?? res.body;\n}\n\nexport async function lightruleUpdate(\n ctx: CliContext,\n args: unknown[],\n opts: LightRuleOpts,\n): Promise<unknown> {\n const [id] = args as [string];\n const c = client(ctx);\n const params = await buildRuleParams(opts, id);\n params.name = id;\n const res = await c.post(\"/gateway/lightrules.update\", params);\n return (res.body as { data?: unknown }).data ?? res.body;\n}\n\nexport async function lightruleDelete(\n ctx: CliContext,\n args: unknown[],\n opts: { yes?: boolean },\n): Promise<unknown> {\n const [id] = args as [string];\n if (!opts.yes && !(await confirm(`确认删除规则 \\`${id}\\`?`, false))) {\n throw new YoooclawError(\"YOOOCLAW_CONFIRMATION_REQUIRED\", \"已取消\");\n }\n const res = await client(ctx).post(\"/gateway/lightrules.delete\", { name: id });\n return (res.body as { data?: unknown }).data ?? res.body;\n}\n\nexport async function lightruleEnable(ctx: CliContext, args: unknown[]): Promise<unknown> {\n const [id] = args as [string];\n const res = await client(ctx).post(\"/gateway/lightrules.update\", { name: id, enabled: true });\n return (res.body as { data?: unknown }).data ?? res.body;\n}\n\nexport async function lightruleDisable(ctx: CliContext, args: unknown[]): Promise<unknown> {\n const [id] = args as [string];\n const res = await client(ctx).post(\"/gateway/lightrules.update\", { name: id, enabled: false });\n return (res.body as { data?: unknown }).data ?? res.body;\n}\n\nasync function toggleAll(ctx: CliContext, enabled: boolean): Promise<unknown> {\n const c = client(ctx);\n const rules = await listRules(c);\n const results: Array<{ name: unknown; ok: boolean }> = [];\n for (const rule of rules) {\n const res = await c.post(\"/gateway/lightrules.update\", { name: rule.name, enabled });\n results.push({ name: rule.name, ok: (res.body as { ok?: boolean })?.ok !== false });\n }\n return { ok: true, enabled, count: results.length, results };\n}\n\nexport const lightruleOn = (ctx: CliContext): Promise<unknown> => toggleAll(ctx, true);\nexport const lightruleOff = (ctx: CliContext): Promise<unknown> => toggleAll(ctx, false);\n\n// ── tunnel ──\nexport async function tunnelStatus(\n ctx: CliContext,\n _args: unknown[],\n opts: { client?: string },\n): Promise<unknown> {\n const query = opts.client ? `?client=${encodeURIComponent(opts.client)}` : \"\";\n return (await client(ctx).get(`/tunnel/status${query}`)).body;\n}\nexport async function tunnelReconnect(\n ctx: CliContext,\n _args: unknown[],\n opts: { client?: string },\n): Promise<unknown> {\n return (await client(ctx).post(\"/tunnel/reconnect\", opts.client ? { client: opts.client } : undefined)).body;\n}\nexport async function tunnelTest(\n ctx: CliContext,\n _args: unknown[],\n opts: { client?: string },\n): Promise<unknown> {\n return (await client(ctx).post(\"/tunnel/test\", opts.client ? { client: opts.client } : undefined)).body;\n}\n\n// ── monitor ──\nexport async function monitorList(ctx: CliContext): Promise<unknown> {\n return (await client(ctx).get(\"/monitors\")).body;\n}\nexport async function monitorShow(ctx: CliContext, args: unknown[]): Promise<unknown> {\n const [name] = args as [string];\n const res = await client(ctx).get<{ monitors?: Array<{ name: string }> }>(\"/monitors\");\n const monitor = res.body?.monitors?.find((m) => m.name === name);\n if (!monitor) throw new YoooclawError(\"YOOOCLAW_NOT_FOUND\", `监控任务不存在:${name}`);\n return { ok: true, monitor };\n}\nexport async function monitorCreate(\n ctx: CliContext,\n args: unknown[],\n opts: { description?: string; matchRules?: string; schedule?: string },\n): Promise<unknown> {\n const [name] = args as [string];\n if (!opts.description || !opts.matchRules || !opts.schedule) {\n throw new YoooclawError(\"YOOOCLAW_INVALID_ARGUMENT\", \"--description / --match-rules / --schedule 均必填\");\n }\n const res = await client(ctx).post(\"/monitors\", {\n name,\n description: opts.description,\n matchRules: parseJsonArg(opts.matchRules, \"--match-rules\"),\n schedule: opts.schedule,\n });\n return res.body;\n}\nexport async function monitorDelete(\n ctx: CliContext,\n args: unknown[],\n opts: { yes?: boolean },\n): Promise<unknown> {\n const [name] = args as [string];\n if (!opts.yes && !(await confirm(`确认删除监控任务 \\`${name}\\`?`, false))) {\n throw new YoooclawError(\"YOOOCLAW_CONFIRMATION_REQUIRED\", \"已取消\");\n }\n return (await client(ctx).request(\"DELETE\", `/monitors/${encodeURIComponent(name)}`)).body;\n}\nexport async function monitorEnable(ctx: CliContext, args: unknown[]): Promise<unknown> {\n const [name] = args as [string];\n return (await client(ctx).post(`/monitors/${encodeURIComponent(name)}/enable`)).body;\n}\nexport async function monitorDisable(ctx: CliContext, args: unknown[]): Promise<unknown> {\n const [name] = args as [string];\n return (await client(ctx).post(`/monitors/${encodeURIComponent(name)}/disable`)).body;\n}\n\n// ── gateway test ──\nexport async function gatewayTest(\n ctx: CliContext,\n _args: unknown[],\n opts: { fromPhoneIp?: string; viaRelay?: boolean },\n): Promise<unknown> {\n const c = client(ctx);\n if (opts.viaRelay) {\n return { ok: true, viaRelay: true, result: (await c.post(\"/tunnel/test\")).body };\n }\n const probe = {\n notifications: [\n { id: `gwtest_${Date.now()}`, app: \"yoooclaw.gatewaytest\", title: \"gateway test\", body: \"probe\", timestamp: new Date().toISOString() },\n ],\n };\n const res = await c.post(\"/notifications\", probe);\n return {\n ok: res.status >= 200 && res.status < 300,\n fromPhoneIp: opts.fromPhoneIp ?? null,\n status: res.status,\n response: res.body,\n };\n}\n\n// ── raw api ──\nexport async function apiRaw(\n ctx: CliContext,\n args: unknown[],\n opts: { data?: string; header?: string[] | string },\n): Promise<unknown> {\n const [method, path] = args as [string, string];\n let data: unknown;\n if (opts.data) {\n let raw: string;\n if (opts.data === \"-\") raw = await readStdin();\n else if (opts.data.startsWith(\"@\")) raw = readFileSync(opts.data.slice(1), \"utf-8\");\n else raw = opts.data;\n try {\n data = JSON.parse(raw);\n } catch {\n data = raw;\n }\n }\n const headers: Record<string, string> = {};\n const headerList = Array.isArray(opts.header) ? opts.header : opts.header ? [opts.header] : [];\n for (const h of headerList) {\n const idx = h.indexOf(\":\");\n if (idx > 0) headers[h.slice(0, idx).trim()] = h.slice(idx + 1).trim();\n }\n const res = await client(ctx).request(method.toUpperCase(), path, data, headers);\n return { ok: res.status >= 200 && res.status < 300, status: res.status, body: res.body };\n}\n",
|
|
110
|
+
"/**\n * 命令实现注册表 —— path(`<service> <subcommand>`,去掉位置参数占位)→ handler。\n *\n * program.ts 按 path 查表;未注册的命令回落 notImplemented 占位。\n * 新增 service 实现时在此登记即可,命令树结构仍以 command-tree.ts 为准。\n */\nimport type { CommandHandler } from \"../program.js\";\nimport { configInit, configShow, configSet, configUnset } from \"./config.js\";\nimport { profileList, profileUse, profileCreate, profileDelete } from \"./profile.js\";\nimport {\n authAddApiKey,\n authListApiKeys,\n authRemoveApiKey,\n authSetApiKey,\n authSetDefaultApiKey,\n authStatus,\n authTokenRotate,\n authCheck,\n} from \"./auth.js\";\nimport {\n notificationSearch,\n notificationSummary,\n notificationStats,\n notificationStoragePath,\n notificationToday,\n notificationRecent,\n notificationUnread,\n} from \"./notification.js\";\nimport { syncScan, syncFetch, syncCommit } from \"./sync.js\";\nimport {\n recordingList,\n recordingStatus,\n recordingStoragePath,\n recordingLatest,\n recordingSetupAsr,\n recordingEvents,\n} from \"./recording.js\";\nimport {\n imageList,\n imageStatus,\n imagePath,\n imageStoragePath,\n imageLatest,\n} from \"./image.js\";\nimport { logSearch, logErrors } from \"./log.js\";\nimport { migrateFromOpenclaw } from \"./migrate.js\";\nimport { updateSelf } from \"./update.js\";\nimport { doctor } from \"./doctor.js\";\nimport { skillsList, skillsTargets, skillsInstall } from \"./skills.js\";\nimport {\n daemonStart,\n daemonStop,\n daemonRestart,\n daemonReload,\n daemonStatus,\n daemonLogs,\n daemonRunForeground,\n} from \"./daemon.js\";\nimport {\n lightSend,\n lightBlink,\n lightruleList,\n lightruleShow,\n lightruleCreate,\n lightruleUpdate,\n lightruleDelete,\n lightruleEnable,\n lightruleDisable,\n lightruleOn,\n lightruleOff,\n tunnelStatus,\n tunnelReconnect,\n tunnelTest,\n monitorList,\n monitorShow,\n monitorCreate,\n monitorDelete,\n monitorEnable,\n monitorDisable,\n gatewayTest,\n apiRaw,\n} from \"./daemon-services.js\";\n\nexport const HANDLERS: Record<string, CommandHandler> = {\n \"config init\": configInit,\n \"config show\": configShow,\n \"config set\": configSet,\n \"config unset\": configUnset,\n\n \"profile list\": profileList,\n \"profile use\": profileUse,\n \"profile create\": profileCreate,\n \"profile delete\": profileDelete,\n\n \"auth set-api-key\": authSetApiKey,\n \"auth add-api-key\": authAddApiKey,\n \"auth list-api-keys\": authListApiKeys,\n \"auth remove-api-key\": authRemoveApiKey,\n \"auth set-default-api-key\": authSetDefaultApiKey,\n \"auth status\": authStatus,\n \"auth token-rotate\": authTokenRotate,\n \"auth check\": authCheck,\n\n \"notification search\": notificationSearch,\n \"notification summary\": notificationSummary,\n \"notification stats\": notificationStats,\n \"notification storage-path\": notificationStoragePath,\n \"notification +today\": notificationToday,\n \"notification +recent\": notificationRecent,\n \"notification +unread\": notificationUnread,\n\n \"sync scan\": syncScan,\n \"sync fetch\": syncFetch,\n \"sync commit\": syncCommit,\n\n \"recording list\": recordingList,\n \"recording status\": recordingStatus,\n \"recording storage-path\": recordingStoragePath,\n \"recording setup-asr\": recordingSetupAsr,\n \"recording events\": recordingEvents,\n \"recording +latest\": recordingLatest,\n\n \"image list\": imageList,\n \"image status\": imageStatus,\n \"image path\": imagePath,\n \"image storage-path\": imageStoragePath,\n \"image +latest\": imageLatest,\n\n log: logSearch,\n \"log +errors\": logErrors,\n\n \"migrate from-openclaw\": migrateFromOpenclaw,\n \"update self\": updateSelf,\n \"skills list\": skillsList,\n \"skills targets\": skillsTargets,\n \"skills install\": skillsInstall,\n doctor,\n\n \"daemon start\": daemonStart,\n \"daemon stop\": daemonStop,\n \"daemon restart\": daemonRestart,\n \"daemon reload\": daemonReload,\n \"daemon status\": daemonStatus,\n \"daemon logs\": daemonLogs,\n \"daemon run-foreground\": daemonRunForeground,\n\n \"light send\": lightSend,\n \"light +blink\": lightBlink,\n\n \"lightrule list\": lightruleList,\n \"lightrule show\": lightruleShow,\n \"lightrule create\": lightruleCreate,\n \"lightrule update\": lightruleUpdate,\n \"lightrule delete\": lightruleDelete,\n \"lightrule enable\": lightruleEnable,\n \"lightrule disable\": lightruleDisable,\n \"lightrule +on\": lightruleOn,\n \"lightrule +off\": lightruleOff,\n\n \"tunnel status\": tunnelStatus,\n \"tunnel reconnect\": tunnelReconnect,\n \"tunnel +test\": tunnelTest,\n\n \"monitor list\": monitorList,\n \"monitor show\": monitorShow,\n \"monitor create\": monitorCreate,\n \"monitor delete\": monitorDelete,\n \"monitor enable\": monitorEnable,\n \"monitor disable\": monitorDisable,\n\n \"gateway test\": gatewayTest,\n api: apiRaw,\n};\n",
|
|
110
111
|
"/**\n * `@yoooclaw/cli` 程序化入口。\n *\n * - `run(argv)` 解析并执行命令(bin.ts 调用)。\n * - 同时再导出核心模块,供测试与未来的程序化集成使用。\n */\nimport { buildProgram } from \"./program.js\";\n\nexport async function run(argv: string[] = process.argv): Promise<void> {\n const program = buildProgram();\n await program.parseAsync(argv);\n}\n\nexport { buildProgram } from \"./program.js\";\nexport { COMMAND_TREE } from \"./command-tree.js\";\nexport { CLI_VERSION } from \"./version.js\";\nexport { ErrorCode, YoooclawError } from \"./errors.js\";\nexport {\n renderResult,\n renderError,\n resolveFormat,\n type OutputFormat,\n} from \"./output/format.js\";\nexport {\n buildContext,\n resolveActiveProfile,\n type CliContext,\n type GlobalFlags,\n} from \"./context.js\";\nexport * as paths from \"./paths.js\";\n",
|
|
111
112
|
"/**\n * yoooclaw CLI 可执行入口。\n * package.json#bin(yoooclaw / yc)指向构建产物 dist/bin.cjs。\n */\nimport { run } from \"./index.js\";\n\nvoid run(process.argv);\n"
|
|
112
113
|
],
|
|
113
|
-
"mappings": "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",
|
|
114
|
-
"debugId": "
|
|
114
|
+
"mappings": "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,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAC7C;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IA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",
|
|
115
|
+
"debugId": "D7C9AB27D5C0797F64756E2164756E21",
|
|
115
116
|
"names": []
|
|
116
117
|
}
|