feat: expand companion platform, device controls, and memoir workflows
ci / verify (push) Canceled after 0s

Add customer and operator login, BLE provisioning, device fleet controls, call memory, memoir generation, and refreshed family and maintenance portals. Include API contracts, migrations, firmware sources, tests, assets, and deployment documentation.
This commit is contained in:
Codex Local
2026-10-08 10:06:44 +08:00
parent 98fb2965d0
commit bf1233d5df
861 changed files with 94614 additions and 3209 deletions
@@ -0,0 +1,265 @@
{
"schema_version": 1,
"diagram_type": "architecture",
"meta": {
"title": "火山语音陪聊 · 小智思路适配",
"locale": "zh-CN",
"quality_profile": "showcase",
"views": [
{
"id": "voice",
"label": "实时语音",
"focus": [
"device",
"volcano"
],
"note": "设备与火山继续承担实时收音、理解和发声。"
},
{
"id": "before",
"label": "开聊前",
"focus": [
"device",
"start",
"compile",
"prepare",
"volcano",
"context"
],
"note": "平台为每次新会话编译角色、开场和授权的续聊背景。"
},
{
"id": "after",
"label": "通话后",
"focus": [
"volcano",
"callback",
"summarize",
"context"
],
"note": "字幕排空后异步整理记忆和话题状态,供下次开聊使用。"
}
]
},
"components": [
{
"id": "device",
"type": "frontend",
"label": "EchoEar 设备",
"sublabel": "收音 · 播放 · 打断",
"tag": "已有",
"pos": [
50,
70
],
"size": [
180,
82
]
},
{
"id": "volcano",
"type": "cloud",
"label": "火山 RTC / S2S",
"sublabel": "长者专属 Bot · 会话内接话",
"tag": "已有",
"pos": [
950,
70
],
"size": [
190,
82
]
},
{
"id": "start",
"type": "backend",
"label": "开聊接口",
"sublabel": "身份 · 授权 · 长者互斥",
"tag": "已有",
"pos": [
50,
300
],
"size": [
180,
82
]
},
{
"id": "compile",
"type": "backend",
"label": "陪聊背景编译",
"sublabel": "角色 + 开场 + 续聊线索",
"tag": "拟扩展",
"pos": [
350,
300
],
"size": [
180,
82
]
},
{
"id": "prepare",
"type": "backend",
"label": "专属 Bot 准备",
"sublabel": "AibotUpdate · 会话快照",
"tag": "已有 / 拟扩展",
"pos": [
650,
300
],
"size": [
180,
82
]
},
{
"id": "context",
"type": "database",
"label": "陪聊资料",
"sublabel": "角色版本 · 授权记忆 · 话题状态",
"tag": "已有 / 拟扩展",
"pos": [
350,
530
],
"size": [
180,
82
]
},
{
"id": "summarize",
"type": "backend",
"label": "通话后整理",
"sublabel": "Managed Viking + 摘要提取",
"tag": "已有 / 拟扩展",
"pos": [
650,
530
],
"size": [
180,
82
]
},
{
"id": "callback",
"type": "backend",
"label": "字幕回调入库",
"sublabel": "按会话保存 · 等待排空",
"tag": "已有",
"pos": [
950,
530
],
"size": [
190,
82
]
}
],
"boundaries": [
{
"kind": "region",
"label": "现有 Go 平台 · 扩展陪聊能力",
"wraps": [
"start",
"compile",
"prepare",
"context",
"summarize",
"callback"
],
"pad": 30
}
],
"connections": [
{
"id": "audio",
"from": "device",
"to": "volcano",
"label": "双向实时语音",
"variant": "emphasis"
},
{
"id": "start",
"from": "device",
"to": "start",
"label": "申请会话",
"labelDy": 70
},
{
"id": "compile",
"from": "start",
"to": "compile"
},
{
"id": "prepare",
"from": "compile",
"to": "prepare"
},
{
"id": "configure",
"from": "prepare",
"to": "volcano",
"label": "开聊前配置",
"variant": "security"
},
{
"id": "callback",
"from": "volcano",
"to": "callback",
"label": "字幕 / 结束事件",
"labelDy": 70,
"variant": "dashed"
},
{
"id": "summarize",
"from": "callback",
"to": "summarize"
},
{
"id": "save",
"from": "summarize",
"to": "context",
"label": "异步保存"
},
{
"id": "context",
"from": "context",
"to": "compile",
"label": "本地读取"
}
],
"cards": [
{
"dot": "cyan",
"title": "先做:聊得自然",
"items": [
"短回应、具体接话,允许没有追问",
"故事 / 怀旧 / 猜物件,少量玩法写入角色"
]
},
{
"dot": "emerald",
"title": "再做:记得进展",
"items": [
"每次新会话最多带入一条续聊线索",
"拒绝、已完成和冷却状态避免反复提问"
]
},
{
"dot": "amber",
"title": "待验证:会话中工具",
"items": [
"火山 RTC / S2S 通用工具协议先实测",
"验证后再接提醒和设备表现"
]
}
]
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,40 @@
{
"diagram_type": "architecture",
"output": "E:/Codex/story/platform/docs/diagrams/volc-companion-xiaozhi-20261001.html",
"specification": {
"path": "E:/Codex/story/platform/docs/diagrams/volc-companion-xiaozhi-20261001.architecture.json",
"sha256": "de41d4825b866007d8b2abbdd1b26d232e6d81bdb99eb9c59e00dfa71a0c74a8",
"bytes": 5276
},
"artifact": {
"sha256": "c69dd15e311db9e6a7b1c505b89b5465060504eed6c0f8df042afe01c9ecca7b",
"bytes": 713303
},
"validation": {
"profile": "showcase",
"checks_passed": 9,
"checks_total": 9,
"errors": 0,
"warnings": 0
},
"visual_review": "passed",
"visual_review_evidence": {
"viewports": [
"1440x900",
"1600x1000",
"1920x1080",
"2048x1320"
],
"containment": "passed",
"screenshots_inspected": [
"1440x900.light",
"1440x900.dark",
"2048x1320.light",
"2048x1320.dark"
],
"notes": "已核对本次备注更新后的浅色和深色主题,节点与连线无重叠,首屏内容完整;待验证卡片仅保留提醒和设备表现,图结构与布局未改变。"
},
"correction_rounds": 0,
"visual_correction_rounds": 0,
"scope": "设计文档及架构图。未修改生产代码、设备配置或部署;结构与视觉检查不代表运行时陪聊效果验证。"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

@@ -0,0 +1,32 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Archify visual-check · volc-companion-xiaozhi-20261001.html</title>
<style>
*{box-sizing:border-box}body{margin:0;padding:24px;background:#e9eef5;color:#172033;font:14px/1.5 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}header{max-width:1500px;margin:0 auto 18px}h1{margin:0 0 6px;font-size:20px}p{margin:0;color:#526176}.grid{max-width:1500px;margin:auto;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}figure{margin:0;padding:10px;background:white;border:1px solid #c9d4e3;border-radius:12px;box-shadow:0 10px 30px rgba(15,23,42,.08)}img{display:block;width:100%;height:auto;border:1px solid #e2e8f0}figcaption{padding:9px 4px 2px;color:#526176}@media(max-width:900px){.grid{grid-template-columns:1fr}}
</style>
</head>
<body>
<header><h1>Archify visual-check</h1><p>volc-companion-xiaozhi-20261001.html · automated containment pass · visual review pending</p></header>
<main class="grid">
<figure>
<img src="volc-companion-xiaozhi-20261001.visual-check.1440x900.light.png" alt="light 1440 by 900">
<figcaption><strong>LIGHT</strong> · 1440×900 · containment pass</figcaption>
</figure>
<figure>
<img src="volc-companion-xiaozhi-20261001.visual-check.1440x900.dark.png" alt="dark 1440 by 900">
<figcaption><strong>DARK</strong> · 1440×900 · containment pass</figcaption>
</figure>
<figure>
<img src="volc-companion-xiaozhi-20261001.visual-check.2048x1320.light.png" alt="light 2048 by 1320">
<figcaption><strong>LIGHT</strong> · 2048×1320 · containment pass</figcaption>
</figure>
<figure>
<img src="volc-companion-xiaozhi-20261001.visual-check.2048x1320.dark.png" alt="dark 2048 by 1320">
<figcaption><strong>DARK</strong> · 2048×1320 · containment pass</figcaption>
</figure>
</main>
</body>
</html>
@@ -0,0 +1,547 @@
{
"schemaVersion": 1,
"ok": true,
"command": "visual-check",
"status": "pass",
"visualReview": "pending",
"artifact": {
"path": "E:\\Codex\\story\\platform\\docs\\diagrams\\volc-companion-xiaozhi-20261001.html",
"sha256": "c69dd15e311db9e6a7b1c505b89b5465060504eed6c0f8df042afe01c9ecca7b",
"bytes": 713303
},
"state": {
"detail": "read",
"motion": "still"
},
"chrome": {
"status": "available",
"executable": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
},
"diagnostics": [],
"containment": {
"status": "pass",
"viewports": [
{
"width": 1440,
"height": 900,
"theme": "light",
"innerWidth": 1440,
"innerHeight": 900,
"scrollWidth": 1440,
"scrollHeight": 900,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1038,
"diagramWidth": 1008,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 7.497520661157025,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 51,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light"
},
{
"width": 1600,
"height": 1000,
"theme": "light",
"innerWidth": 1600,
"innerHeight": 1000,
"scrollWidth": 1600,
"scrollHeight": 1000,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1069,
"diagramWidth": 1039,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 7.728099173553719,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 51,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light"
},
{
"width": 1920,
"height": 1080,
"theme": "light",
"innerWidth": 1920,
"innerHeight": 1080,
"scrollWidth": 1920,
"scrollHeight": 1080,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1207,
"diagramWidth": 1177,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 8.754545454545456,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 51,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light"
},
{
"width": 2048,
"height": 1320,
"theme": "light",
"innerWidth": 2048,
"innerHeight": 1320,
"scrollWidth": 2048,
"scrollHeight": 1320,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1570,
"diagramWidth": 1520,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 9,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 41,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light"
}
]
},
"readability": {
"status": "pass",
"minimumProjectedNodeTextPx": 6,
"viewports": [
{
"width": 1440,
"height": 900,
"theme": "light",
"innerWidth": 1440,
"innerHeight": 900,
"scrollWidth": 1440,
"scrollHeight": 900,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1038,
"diagramWidth": 1008,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 7.497520661157025,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 51,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light"
},
{
"width": 1600,
"height": 1000,
"theme": "light",
"innerWidth": 1600,
"innerHeight": 1000,
"scrollWidth": 1600,
"scrollHeight": 1000,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1069,
"diagramWidth": 1039,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 7.728099173553719,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 51,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light"
},
{
"width": 1920,
"height": 1080,
"theme": "light",
"innerWidth": 1920,
"innerHeight": 1080,
"scrollWidth": 1920,
"scrollHeight": 1080,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1207,
"diagramWidth": 1177,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 8.754545454545456,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 51,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light"
},
{
"width": 2048,
"height": 1320,
"theme": "light",
"innerWidth": 2048,
"innerHeight": 1320,
"scrollWidth": 2048,
"scrollHeight": 1320,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1570,
"diagramWidth": 1520,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 9,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 41,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light"
}
]
},
"viewerChrome": {
"status": "pass",
"viewports": [
{
"width": 1440,
"height": 900,
"theme": "light",
"innerWidth": 1440,
"innerHeight": 900,
"scrollWidth": 1440,
"scrollHeight": 900,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1038,
"diagramWidth": 1008,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 7.497520661157025,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 51,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light"
},
{
"width": 1600,
"height": 1000,
"theme": "light",
"innerWidth": 1600,
"innerHeight": 1000,
"scrollWidth": 1600,
"scrollHeight": 1000,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1069,
"diagramWidth": 1039,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 7.728099173553719,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 51,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light"
},
{
"width": 1920,
"height": 1080,
"theme": "light",
"innerWidth": 1920,
"innerHeight": 1080,
"scrollWidth": 1920,
"scrollHeight": 1080,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1207,
"diagramWidth": 1177,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 8.754545454545456,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 51,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light"
},
{
"width": 2048,
"height": 1320,
"theme": "light",
"innerWidth": 2048,
"innerHeight": 1320,
"scrollWidth": 2048,
"scrollHeight": 1320,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1570,
"diagramWidth": 1520,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 9,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 41,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light"
}
]
},
"captures": {
"status": "pass",
"screenshots": [
{
"width": 1440,
"height": 900,
"theme": "light",
"innerWidth": 1440,
"innerHeight": 900,
"scrollWidth": 1440,
"scrollHeight": 900,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1038,
"diagramWidth": 1008,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 7.497520661157025,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 51,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light",
"file": "volc-companion-xiaozhi-20261001.visual-check.1440x900.light.png"
},
{
"width": 1440,
"height": 900,
"theme": "dark",
"innerWidth": 1440,
"innerHeight": 900,
"scrollWidth": 1440,
"scrollHeight": 900,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1038,
"diagramWidth": 1008,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 7.497520661157025,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 51,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "dark",
"file": "volc-companion-xiaozhi-20261001.visual-check.1440x900.dark.png"
},
{
"width": 2048,
"height": 1320,
"theme": "light",
"innerWidth": 2048,
"innerHeight": 1320,
"scrollWidth": 2048,
"scrollHeight": 1320,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1570,
"diagramWidth": 1520,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 9,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 41,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "light",
"file": "volc-companion-xiaozhi-20261001.visual-check.2048x1320.light.png"
},
{
"width": 2048,
"height": 1320,
"theme": "dark",
"innerWidth": 2048,
"innerHeight": 1320,
"scrollWidth": 2048,
"scrollHeight": 1320,
"overflowX": false,
"overflowY": false,
"ok": true,
"readerWidth": 1570,
"diagramWidth": 1520,
"viewBoxWidth": 1210,
"minimumProjectedNodeTextPx": 9,
"minimumProjectedNodeText": "收音 · 播放 · 打断",
"minimumProjectedNodeTextDetail": "context",
"minimumRequiredNodeTextPx": 6,
"readabilityOk": true,
"hasLegend": true,
"hasNavigationDock": true,
"legendDockIntersectionArea": 0,
"dockStageIntersectionArea": 0,
"dockStageGap": 10.21875,
"requiredDockStageGap": 10,
"viewerChromeStageOk": true,
"viewerChromeReserve": 41,
"viewerChromeActive": true,
"viewerChromeOk": true,
"resolvedTheme": "dark",
"file": "volc-companion-xiaozhi-20261001.visual-check.2048x1320.dark.png"
}
],
"contactSheet": "volc-companion-xiaozhi-20261001.visual-check.html"
},
"sidecars": {
"receipt": "volc-companion-xiaozhi-20261001.visual-check.json",
"contactSheet": "volc-companion-xiaozhi-20261001.visual-check.html"
}
}