@a9i5k4/dsh-auto-memory 2.3.1 → 2.4.1

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.
@@ -0,0 +1,200 @@
1
+ # dsh-auto-memory 界面现状盘点(只读调查)
2
+
3
+ 盘点对象:`lib/client.js`(4,493 行)、`lib/index.js`(8,067 行);行号一律写 `文件:行`。
4
+
5
+ ## 1. 界面表层清单
6
+
7
+ | 类别 | 名称(中文原文) | 行 | 触发 |
8
+ |---|---|---|---|
9
+ | 注册面 | 侧栏入口「记忆 (pre)」`SidebarButton` | client.js:1295 / 注册 4462 | 常驻(侧栏 footer) |
10
+ | 注册面 | 记忆浮层面板 `MemoryPanel` | client.js:2886 / 注册 4465 | 点击侧栏入口开合 |
11
+ | 注册面 | 弹窗宿主 `DialogHost` | client.js:3076 / 注册 4468 | 状态驱动(7 种 kind) |
12
+ | 注册面 | 自动接续宿主 `AutoContinueHost` | client.js:3562 / 注册 4471 | 水位 ≥ 阈值且宿主 armed |
13
+ | 注册面 | 设置页「自动记忆 (pre)」`SettingsPage` | client.js:3667 / 注册 4474 | 从 DSH 设置面板进入 |
14
+ | 面板头 | 标题「自动记忆」+ 版本徽标 | client.js:2969-2970 | 常驻 |
15
+ | 面板头 | 悬浮钉 / ⤾ 重置位置 / ⟳ 刷新 / ✕ 关闭 / 页签条 `TabScroller` / 右下缩放手柄 | client.js:2973-2982、2840、2983、2985 | 常驻 |
16
+ | 概览页 | 时段总结卡 `GreetingCard`(含二级折叠) / 工作区概览折叠 / 展开技术细节 / 关系图 | client.js:1313、1397、1410、1574、1600、2383 | 有缓存摘要时 / 点击 |
17
+ | 日志页 | 「查看」/「返回」 | client.js:1774 / 1768 | 点击切换正文 |
18
+ | 唤起回顾页 | A / P / S / H / E 打分按钮 | client.js:1650-1652 | 点击提交 |
19
+ | 记忆中枢页 | 弃用 / 置顶 / 晋升 / 直接激活 / 取消置顶 | client.js:1839-1840、1853-1856 | 点击 |
20
+ | 存储管理页 | 重新扫描 / 修复 / 删除(下拉+输入+确认) | client.js:1947、1948、1954-1960 | 点击 |
21
+ | 笔记页 | 编辑框 + 保存 | client.js:2004 / 1995-2000 | 点击 |
22
+ | 白板页 | 一键接续 / 版本列表 / 账本时间线 / 自动接续开关+阈值 | client.js:2182、2225+、2215、2256、2258 | 点击 |
23
+ | 检索页 | 检索 / 智能检索 | client.js:2355 / 2361 | 点击 |
24
+ | 接续页 | 查看 / 导入 / 移除 | client.js:2732 / 2719 / 2744 | 点击 |
25
+ | 其余页 | 反思页 / 日历页 / 工作区页 | client.js:2283 / 2513 / 2462 | 页签切换 |
26
+ | 设置页 | 8 分组:自动记忆引擎/记忆中枢/外观/存储/记忆窗口/自动化/上下文管理/维护 | client.js:3952-3959、3970/4118/4133/4158/4175/4194/4218/4229 | 常驻(锚点跳转 3961) |
27
+ | 设置页 | 「🧩 安装向导」按钮 + `PySetupWizard` | client.js:3994-3995 / 1431 | 点击 |
28
+ | 设置页 | 环境检测面板 ⟳ / 引擎未就绪警告条 | client.js:4005-4006 / 4004 | 点击 / 仅资产缺失时 |
29
+ | 设置页 | 目录浏览器 / 模型抽屉 | client.js:4163 / 3754、4216 | 原生选择器不可用 / 点模型 |
30
+ | 设置页 | 保存栏 / 调试中心折叠 + `DebugCenter` | client.js:4239-4242 / 4245-4246、2989 | 有改动 / 点击 |
31
+ | 弹窗 | `update` / `welcomeTour`(内联开关 3196-3234)/ `modelDownload` / `notice` / `summary` / `welcomeBack` / `semSetup` | client.js:809-816、3319、4358(触发 4407、4330、4331、4426) | 版本变化 / 首启或手动重看 4140 / 状态驱动 |
32
+ | **补丁** | 「🧩 安装向导」+ 环境检测 ⟳ 都嵌在语义区块 semMode 同一行 | client.js:3994-3995、4005-4006 | 无独立入口,注释自称"美学对齐安装向导卡"(4005) |
33
+ | **补丁** | 调试中心挂在设置页最末、保存栏之后 | client.js:4244-4246 | 自带 borderTop,与设置分组体系并列 |
34
+ | **补丁** | 悬浮钉插在面板 header 四按钮之间 | client.js:2973-2979 | 注释标注"2026-09-08"后期追加 |
35
+ | **补丁** | 「接续」页签整块为后期模块 | client.js:2024-2147 | 4 个平级函数(`continueCreateArgs`/`refreshOldSession`/`waitForRefresh`/`executeContinue`)挂在页签外 |
36
+
37
+ **12 个页签**(定义 client.js:2942,分派 2930-2941):概览 2930 / 日志 2931 / 唤起回顾 2932 / 记忆中枢 2933 / 存储管理 2934 / 笔记 2935 / 白板 2936 / 反思 2937 / 接续 2938 / 日历 2939 / 检索 2941 / 工作区 2940。
38
+
39
+ ## 2. 配置键清单
40
+
41
+ 来源 `DEFAULT_CONFIG`(index.js:197-425)。**总键数 85**(另有嵌套对象 `externalSources` 含 13 子键,index.js:331-346)。「界面可改」列写出写入点;"仅文件"= client.js 全文无该键写路径。
42
+
43
+ | 键 | 默认值 | 含义 | 界面可改 |
44
+ |---|---|---|---|
45
+ | userMemoryDir | `~/.dsh/memory` | 用户级记忆目录 | 存储 4158 |
46
+ | projectMemoryDir | `.dsh-memory` | 项目记忆目录名 | 存储 4159 |
47
+ | memoryRoot | `~/.dsh/memory/workspaces` | 集中式记忆根 | 存储 4161/4172/3738 |
48
+ | injectEnabled | true | 注入记忆上下文 | 记忆窗口 4175 |
49
+ | injectBudgetChars | 1600 | 注入总预算(字符) | 记忆窗口 4176 |
50
+ | recentDaysInjected | 1 | 注入最近日志天数 | 记忆窗口 4179 |
51
+ | subagentModel | `''` | 子代理模型 | 存储 3763/3768/3782 |
52
+ | subagentProvider | `''` | 子代理 provider | 存储 3763/3768/3782 |
53
+ | subagentReasoningEffort | `''` | 子代理推理强度 | 存储 3801 |
54
+ | noteCapacityChars | 12000 | 项目笔记容量上限 | 存储 4177 |
55
+ | userCapacityChars | 12000 | 用户级记忆容量上限 | 存储 4178 |
56
+ | memoryFileIndexEnabled | false | M3a 只读记忆索引 | 仅文件 |
57
+ | memoryAnchorEnabled | false | M3b Anchor 写入 | 自动记忆引擎 3972 |
58
+ | autoConsolidate | true | 每轮自动沉淀 | 自动化 4195 / 向导 3233 |
59
+ | autoConsolidateMinChars | 240 | 寒暄跳过门槛 | 自动化 4194 |
60
+ | autoConsolidateCooldownMinutes | 30 | 沉淀冷却(分钟) | 自动化 4196 |
61
+ | autoConsolidateDailyMax | 8 | 每日沉淀上限 | 自动化 4197 |
62
+ | consolidateScheduleEnabled | true | 定时做梦式固化 | 自动化 4205 |
63
+ | consolidateScheduleTime | `09:30` | 固化触发时刻 | 自动化 4206 |
64
+ | consolidateScheduleDays | 7 | 固化回看天数 | 自动化 4207 |
65
+ | maintainScheduleEnabled | true | 定时 30 天蒸馏 | 自动化 4208 |
66
+ | maintainScheduleTime | `10:00` | 蒸馏触发时刻 | 自动化 4209 |
67
+ | handoffEnabled | false | 交接白板总开关 | 自动化 4218 |
68
+ | handoffPlanChars | 1200 | PLAN.md 注入预算 | 自动化 4219 |
69
+ | handoffLedgerChars | 800 | 账本注入预算 | 自动化 4220 |
70
+ | waterLevelWindowTokens | 0 | 窗口 token(0=自动) | 上下文 4221 |
71
+ | waterLevelThreshold | 0.75 | 水位建议阈值 | 上下文 4222 |
72
+ | waterLevelAdvisory | true | 水位建议注入 | 上下文 4223 |
73
+ | waterLevelAutoHandoff | true | 越阈自动写骨架账本 | 上下文 4224 |
74
+ | autoContinueEnabled | true | 自动接续 | 白板页 2256 |
75
+ | autoContinueThreshold | 0.75 | 自动接续阈值 | 白板页 2258 |
76
+ | autoContinueConfirmSeconds | 35 | 确认卡倒计时秒 | 仅文件 |
77
+ | autoContinueRefreshRitual | true | 接续前刷新仪式 | 仅文件(2136 只读) |
78
+ | autoContinueRefreshTimeoutSeconds | 90 | 刷新仪式超时 | 仅文件(2065 只读) |
79
+ | autoContinueCooldownMinutes | 30 | 接续冷却 | 仅文件 |
80
+ | subagentGcEnabled | true | 子代理痕迹回收 | 自动化 4225 |
81
+ | subagentGcKeepDays | 3 | 痕迹兜底保留天数 | 自动化 4227 |
82
+ | awayMinutes | 60 | 暂离判定阈值 | 自动化 4201 |
83
+ | unattendedMode | false | 无人值守模式 | 自动化 4199 |
84
+ | unattendedAuto | false | 无人值守自动检测 | 自动化 4200 / 向导 3205 |
85
+ | unattendedAutoHours | `['22:00-08:00']` | 非工作时段窗 | 仅文件(266/417 只读) |
86
+ | snapshotMinGapRounds | 5 | 快照最小注入间隔轮数 | 记忆窗口 4181 |
87
+ | snapshotReinjectOnCompact | true | 压缩后强制重注入 | 记忆窗口 4182 |
88
+ | promptLayerOverrides | `{}` | 自定义 prompt 层覆盖 | 记忆窗口 4189/4192 |
89
+ | autoPopupEnabled | true | 暂离回来自动弹面板 | 自动化 4198 / 向导 3204 |
90
+ | welcomeTourEnabled | true | 首启欢迎向导 | 外观 4139 |
91
+ | autoSummaryTimes | `[]` | 定时总结时刻表 | 自动化 4202 / 向导 3213 |
92
+ | dayBoundaryMinutes | 450 | 日界(分钟) | 自动化 4203 |
93
+ | reflectEnabled | true | 每日反思 | 自动化 4204 / 向导 3212 |
94
+ | reflectStyle | `auto` | 反思风格 | 自动化 4210 |
95
+ | locale | `system` | UI 语言 | 外观 4149 |
96
+ | externalInjectionChars | 1400 | 外部记忆注入预算 | 记忆窗口 4180 |
97
+ | externalSources | 13 子键全 true | 外部记忆源开关 | 首启向导 3292-3300 |
98
+ | associativeMemoryEnabled | false | 主动联想记忆总开关 | 自动记忆引擎 3971 / 向导 3196 |
99
+ | shadowRetrievalEnabled | false | Shadow Retrieval | 仅文件 |
100
+ | contextBridgeEnabled | false | M5 上下文桥 | 仅文件 |
101
+ | contextSinkMode | `'null'` | M5 sink 类型 | 自动记忆引擎(引擎联动 3935-3937) |
102
+ | activationInboxEnabled | false | M6 Activation Inbox | 仅文件 |
103
+ | activationSource | `js` | M6 激活来源 | 自动记忆引擎(引擎联动 3935-3937) |
104
+ | jsDecideCooldownRounds | 1 | JS 判定冷却轮数 | 自动记忆引擎 3973 |
105
+ | jsDecideDeltaExp | 0.01 | JS 档 margin 阈值 | 自动记忆引擎 3974 |
106
+ | jsDecideExcerptChars | 40 | 唤起 excerpt 长度 | 自动记忆引擎 3975 |
107
+ | jsDecideCandidateScheme | `balanced` | 候选方案档位 | 自动记忆引擎 3980 |
108
+ | jsDecideCandidatesN | 4 | custom 档候选条数 | 自动记忆引擎 3984 |
109
+ | pythonBackendWorkerPath | `''` | Python worker 路径 | 仅文件 |
110
+ | pythonBackendExecutable | `''` | Python 可执行文件 | 仅文件 |
111
+ | semanticEngineMode | `auto` | 语义引擎档位 | 自动记忆引擎 3986 |
112
+ | softInjectionEnabled | false | pre-step 软注入 | 仅文件 |
113
+ | contextBridgeObserveChildSessions | true | 是否观测子会话 | 自动记忆引擎 4113 |
114
+ | pythonBackendEnabled | false | Python sidecar | 仅文件 |
115
+ | reasoningObserverEnabled | true | 思维链观察器 | 自动记忆引擎 4112 / 向导 3225 |
116
+ | procedurePromotionEnabled | false | Procedure 自动晋升 | 首启向导 3234 |
117
+ | memoryHubEnabled | true | 记忆中枢总开关 | 记忆中枢 4120 |
118
+ | episodicMinSegments | 2 | episode 最少段数 | 记忆中枢 4121 |
119
+ | episodicRetention | 256 | episode 保留上限 | 记忆中枢 4122 |
120
+ | procedureMinSessions | 3 | 晋升所需会话数 | 记忆中枢 4123 |
121
+ | procedureMinSuccess | 2 | 晋升所需成功次数 | 记忆中枢 4124 |
122
+ | procedureCorrectionCap | 0.3 | correction 占比上限 | 记忆中枢 4125 |
123
+ | procedureHighRiskApproval | true | 高风险需批准 | 记忆中枢 4126 |
124
+ | procedureActiveLevel | `checklist` | active 注入级别 | 记忆中枢 4127 |
125
+ | streamingInterruptionEnabled | false | 流式中断/恢复实验 | 仅文件 |
126
+ | maxPacketItems | 2 | MemoryPacket 条目上限 | 仅文件 |
127
+ | maxPacketChars | 800 | MemoryPacket 字符预算 | 仅文件 |
128
+ | packetTtlSteps | 2 | MemoryPacket 存活步数 | 仅文件 |
129
+ | injectionCooldownSteps | 3 | 注入冷却步数 | 仅文件 |
130
+
131
+ **统计:总键数 85 / 界面可改 67 / 仅文件 18。**
132
+ 界面可改 67 = `SettingsPage.set()` 60(client.js:3971-4227)+ 白板页 `autoSave` 2(2256/2258)+ 引擎联动草稿 3(`semanticEngineMode`/`activationSource`/`contextSinkMode`,3935-3937)+ 首启向导 2(`externalSources` 3299、`procedurePromotionEnabled` 3234)。
133
+ 仅文件 18 = 全文零引用 15(memoryFileIndexEnabled、autoContinueConfirmSeconds、autoContinueCooldownMinutes、shadowRetrievalEnabled、contextBridgeEnabled、activationInboxEnabled、pythonBackendWorkerPath、pythonBackendExecutable、softInjectionEnabled、pythonBackendEnabled、streamingInterruptionEnabled、maxPacketItems、maxPacketChars、packetTtlSteps、injectionCooldownSteps)+ 仅只读引用 3(autoContinueRefreshRitual 2136、autoContinueRefreshTimeoutSeconds 2065、unattendedAutoHours 266/417)。
134
+ 另注:client.js:4106 会写 `pythonGpu`,该键**不在** DEFAULT_CONFIG 中。
135
+
136
+ ## 3. HTTP 端点清单
137
+
138
+ 常量表 `API`(index.js:129-176,46 条);路由注册 `const routes = [`(index.js:7052-7990)。**端点数 46,常量与注册 1:1**,全部 loopback-only。
139
+
140
+ | 路径(前缀 `/api/dsh-auto-memory-pre/`) | 注册行 | 用途 | 服务界面 |
141
+ |---|---|---|---|
142
+ | `/state` | 7554 | 记忆状态快照 | 概览 / 日志 / 笔记页 |
143
+ | `/list` | 7569 | 日志文件列表 | 日志页 |
144
+ | `/file` | 7590 | 读单个记忆文件 | 日志页「查看」 |
145
+ | `/recall` | 7610 | 检索本地记忆 | 检索页 |
146
+ | `/smart-recall` | 7621 | 分层语义检索 | 检索页「智能检索」 |
147
+ | `/workspaces` | 7636 | 工作区清单+关系图 | 概览 / 工作区页 |
148
+ | `/debug` | 7648 | 诊断信息 | 设置页调试中心 |
149
+ | `/scan-dirty` | 7657 | 扫描脏文件 | 设置页(裸 fetch) |
150
+ | `/browse-dir` | 7678 | 列目录 | 设置页目录浏览器 |
151
+ | `/pick-dir` | 7701 | 原生目录选择器 | 设置页存储 |
152
+ | `/update-check` | 7723 | 版本检查 | 面板头徽标 / 设置页维护 |
153
+ | `/update` | 7736 | 执行更新 | 设置页维护「立即更新」 |
154
+ | `/config` | 7762 | 读写全部配置 | 设置页保存 / 白板页 / 首启向导 |
155
+ | `/reflect` | 7871 | 手动写反思 | 反思页 |
156
+ | `/reflect-auto` | 7882 | AI 一键反思 | 概览页 1564 / 反思页 2314 |
157
+ | `/note` | 7791 | 保存项目笔记 | 笔记页 |
158
+ | `/external` | 7814 | 外部源清单 | 接续页 / 首启向导 |
159
+ | `/external-view` | 7823 | 查看外部源内容 | 接续页 |
160
+ | `/external-import` | 7857 | 导入外部源 | 接续页 / 向导批量 2764 |
161
+ | `/external-remove` | 7843 | 移除已导入内容 | 接续页 |
162
+ | `/calendar` | 7891 | 日历读写 | 日历页 |
163
+ | `/summarize` | 7915 | 生成时段总结 | 概览页总结卡 |
164
+ | `/greet` | 7931 | 生成问候语 | 概览页 |
165
+ | `/notices` | 7945 | 拉取动态通知 | 通知弹窗 |
166
+ | `/activation-inbox-pre` | 7536 | M6 激活收件箱 | **对不上界面**(client.js 零引用) |
167
+ | `/semantic-status` | 7109 | 语义资产就绪状态 | 设置页语义区块 / 首启向导 |
168
+ | `/semantic-deep-detect` | 7154 | 快检+深扫+热接入 | 设置页环境检测面板 |
169
+ | `/semantic-download` | 7264 | 下载 JS 语义模型 | 设置页 / 向导 |
170
+ | `/semantic-emit` | 7284 | 唤起注入档位 | 设置页 emit 下拉 / 向导 3286 |
171
+ | `/python-setup/detect` | 7063 | 检测 Python 环境 | 安装向导 |
172
+ | `/python-setup/venv` | 7071 | 建 venv | 安装向导 |
173
+ | `/python-setup/deps` | 7081 | 装依赖 | 安装向导 |
174
+ | `/python-setup/model` | 7091 | 下载模型 | 安装向导 |
175
+ | `/python-setup/cancel` | 7100 | 取消下载 | 安装向导 |
176
+ | `/python-setup/status` | 7055 | 安装进度 | 安装向导轮询 |
177
+ | `/handoff-state` | 7163 | 白板+账本数据 | 白板页 |
178
+ | `/handoff-continue` | 7175 | 构造接续材料 | 白板页一键接续 |
179
+ | `/handoff-permission` | 7191 | 权限预设继承 | 接续流程(无独立 UI) |
180
+ | `/auto-continue-state` | 7207 | 接续宿主状态 | 自动接续宿主轮询 |
181
+ | `/auto-continue-decide` | 7216 | 同意/拒绝接续 | 自动接续确认卡 |
182
+ | `/subagent-gc` | 7230 | 子代理痕迹回收 | **对不上界面**(client.js 零引用) |
183
+ | `/shadow-recent` | 7309 | shadow 观测记录 | 唤起回顾页 |
184
+ | `/review-feedback` | 7395 | 唤起决策打分 | 唤起回顾页 A/P/S/H/E |
185
+ | `/memory-hub` | 7463 | 三层记忆中枢数据 | 记忆中枢页 |
186
+ | `/storage-manage` | 7502 | 存储扫描/修复/删除 | 存储管理页 |
187
+ | `/models` | 7960 | provider/模型目录 | 设置页模型抽屉 |
188
+
189
+ ## 4. 代码结构体感
190
+
191
+ **最长 5 个函数/组件**(client.js,按行跨度;全文具名函数 125 个):`SettingsPage` 582 行(3667-4248)、`DialogHost` 478 行(3076-3553)、`apply` 237 行(4251-4487)、`CalendarTab` 168 行(2513-2680)、`PlanTab` 134 行(2148-2281)。
192
+
193
+ **重复实现**
194
+ 1. 两套 HTTP 常量表手工同步:index.js:129-176(46 条)与 client.js:858-897(40 条,键名风格不同)各维护一份同一批路径;另有 20 处裸字符串 `fetch('/api/dsh-auto-memory-pre/...')` 绕过常量表(client.js:1626、1629、1635、1804、1812、1906、1914、1924、3092、3105、3110、3117、3127、3855、3865、3891、3924、3944、3976、4079)。
195
+ 2. RefineTab 内 `badge`/`reasonChip`/`apeRow` 逐字重复两份:client.js:1644-1662 与 1682-1699。
196
+ 3. 写配置有 4 条互不相同的路径:`SettingsPage.save()` 3888-3893(整对象 POST)、`PlanTab.autoSave` 2178-2181(patch 直发)、向导 `tourToggleClick` 3272-3290、向导 `tourExtToggle` 3292-3300。
197
+
198
+ **巨型函数**:`SettingsPage`(582 行)单函数装下 8 个设置分组、目录浏览器、模型抽屉、环境检测面板、安装向导挂载、更新检查、调试中心;`DialogHost`(478 行)单组件装下 7 种弹窗 + 首启向导状态机(含 10 个内联开关定义 3196-3234)。
199
+
200
+ 本次盘点读取的文件:`D:\dsh-auto-memory\lib\client.js`(全文 4,493 行)、`D:\dsh-auto-memory\lib\index.js`(API 常量表 120-176、`DEFAULT_CONFIG` 190-425、`DEFAULT_PROMPT_LAYERS` 427-454、路由注册 7052-7990)。未读取其他文件,未修改除本文件外的任何文件。
@@ -0,0 +1,222 @@
1
+ # UI / 设置 重构 · 预调研
2
+
3
+ > 状态:**预调研 + 第 0 步「止血」已落地**(见 §7;改动仅在 pre 线本地,未提交未发布)。这份文档的用途不是"决定怎么改",而是把现状量清楚、把可选路径摆开,**由你决定走哪条路、先走哪一步**。
4
+ > 生成时间:2026-09-10 · 对应版本 v2.4.0
5
+
6
+ ---
7
+
8
+ ## 0. 你提出这个问题时说的话(作为验收标准)
9
+
10
+ > "现在的 UI 和设置的版本还是从最开始一步一步累加的,非常繁琐,以至于已经到了需要在 README 里贴项目文档教用户做事的地步了。"
11
+
12
+ 拆成两条可验收的目标:
13
+
14
+ 1. **界面不再需要 README 教**:README 里"点这里、勾选那里"的段落应当消失(不是挪走,是不需要)。
15
+ 2. **设置不再繁琐**:找得到、看得懂、改得动,且知道改了会发生什么。
16
+
17
+ ---
18
+
19
+ ## 1. 现状测量(硬数据)
20
+
21
+ ### 1.1 代码体量
22
+
23
+ | 文件 | 行数 | 体积 | 说明 |
24
+ | --- | --- | --- | --- |
25
+ | `lib/index.js`(宿主半边) | 7,825 | 468 KB | 记忆引擎 + 配置表 + 全部 HTTP 路由 |
26
+ | `lib/client.js`(界面半边) | 4,450 | 409 KB | 全部界面组件(React + 原生 DOM API,零依赖) |
27
+ | `README.md` / `README.zh-CN.md` | 308 / 309 | 34 / 31 KB | 面向用户的首页 |
28
+ | `docs/USER-GUIDE.{en,zh-CN}.md` | 289 / 289 | 34 / 32 KB | 用户手册(两份共 66 KB) |
29
+
30
+ ### 1.2 README 的结构(这就是"界面速览"长成什么样)
31
+
32
+ `README.zh-CN.md` 的 `## 界面速览` 一节下,列了 **9 个并列子节**:
33
+
34
+ ```
35
+ ### 记忆面板 · 概览(暂离问候 + AI 时段总结)
36
+ ### 记忆中枢 · 三层记忆店与技能晋升审批
37
+ ### 唤起回顾 · 每次激活决策可打分
38
+ ### 欢迎向导 · 功能开关与引擎检测
39
+ ### 外部记忆扫描(欢迎向导内)
40
+ ### 连接其他 AI 工具
41
+ ### 日历视图
42
+ ### 工作区关系图
43
+ ### 设置页
44
+ ```
45
+
46
+ (另有 8 个"她怎么 X"章节 + 安装/配置/结构/架构/限制 —— 全文 20+ 一级二级标题。)
47
+
48
+ ### 1.3 "文档在替界面导航"的量化证据
49
+
50
+ 在 README 正文里检索"教用户操作"的词汇,出现次数:
51
+
52
+ | 词 | 次数 | 含义 |
53
+ | --- | --- | --- |
54
+ | 向导 | 16 | 流程入口靠文档指路 |
55
+ | 开关 | 12 | 配置项靠文档点名 |
56
+ | 设置页 | 10 | 功能位置靠文档定位 |
57
+ | 面板 | 8 | 界面区域靠文档描述 |
58
+ | 点击 | 6 | 操作步骤靠文档背书 |
59
+ | 按钮 / 勾选 | 2 / 2 | 同上 |
60
+
61
+ **判据**:一个自解释的界面,其 README 里这类词应该趋近于 0(因为界面上自己写着)。
62
+
63
+ ### 1.4 界面与配置的真实规模(逐条带行号,见附录)
64
+
65
+ | 指标 | 数值 | 说明 |
66
+ | --- | --- | --- |
67
+ | 面板页签 | **12** | 概览 / 日志 / 唤起回顾 / 记忆中枢 / 存储管理 / 笔记 / 白板 / 反思 / 接续 / 日历 / 检索 / 工作区 |
68
+ | 设置页分组 | **8** | 自动记忆引擎 / 记忆中枢 / 外观 / 存储 / 记忆窗口 / 自动化 / 上下文管理 / 维护 |
69
+ | 配置键总数 | **85** | 另有嵌套 `externalSources` 13 个子键 |
70
+ | 界面可改 | **67** | = 设置页 60 + 白板页 2 + 引擎联动草稿 3 + 首启向导 2 |
71
+ | **仅文件可改** | **18** | 15 个全文零引用(`pythonBackendExecutable`、`shadowRetrievalEnabled`、`maxPacketChars`…)+ 3 个只读引用(`autoContinueRefreshRitual`、`autoContinueRefreshTimeoutSeconds`、`unattendedAutoHours`) |
72
+ | 弹窗种类 | 7 | 更新说明 / 首启向导 / 模型下载 / 通知 / 总结 / 暂别回来 / 语义安装 |
73
+ | **HTTP 端点** | **46** | 全部 loopback-only;其中 **2 个对不上任何界面**:`/activation-inbox-pre`、`/subagent-gc`(`client.js` 零引用,但**不是死端点**:`activation-inbox-pre` 有契约测试与注入入口消费者,`subagent-gc` 有 CLI 消费者 `tools/subagent-gc.mjs`;**别删**,见 §7 更正) |
74
+ | `client.js` 具名函数 | 125 | 单文件 4,493 行 |
75
+ | 补丁式入口 | **4 处 / 5 个物件** | 见下 |
76
+
77
+ **4 个被盘点明确标为"补丁"的地方**(原文注释自己写着"后期追加""美学对齐"):
78
+
79
+ 1. 「🧩 安装向导」+ 环境检测 ⟳ **挤在语义引擎区块的同一行**,没有独立入口;
80
+ 2. 调试中心 **挂在设置页最末、保存栏之后**,自带 borderTop,与 8 个分组体系并列;
81
+ 3. 面板标题栏的"悬浮钉" **插在原有 4 个按钮中间**(原注释标着 2026-09-08);
82
+ 4. 「接续」页签整块是后期模块,4 个平级函数挂在页签体系之外。
83
+
84
+ **这四条比任何主观描述都更能说明"逐步累加"**:新功能没有位置,只能往既有缝隙里塞。
85
+
86
+ ### 1.5 结构体感(真正的病根)
87
+
88
+ 盘点里最扎眼的不是"界面多",而是**加一个功能要动好几处、而且没有任何机制保证它们同步**:
89
+
90
+ | 现象 | 证据 | 后果 |
91
+ | --- | --- | --- |
92
+ | **两套路径表手工同步** | `index.js:129-176`(46 条)与 `client.js:858-897`(40 条,键名风格还不同)各存一份同一批路径 | 改一个端点要记得改两处 |
93
+ | **20 处裸字符串绕过常量表** | `client.js:1626/1629/1804/1906/3092/3110/3944/3976…` 直接写 `fetch('/api/dsh-auto-memory-pre/…')` | 路径表**形同虚设**,改端点必漏。**2026-09-10 已归零(28 处 → 0,口径含 `apiPost` 形态;先前的"20 处"只数了 `fetch(` 形态),并由路径表一致性锁常驻看守 —— 见 §7** |
94
+ | **4 条互不相同的写配置路径** | `SettingsPage.save()`(整对象 POST)、`PlanTab.autoSave`(patch 直发)、首启向导两处 | **加一个配置项要改四个地方** |
95
+ | **巨型函数** | `SettingsPage` **582 行**装下 8 分组 + 目录浏览器 + 模型抽屉 + 环境检测 + 向导挂载 + 更新检查 + 调试中心;`DialogHost` **478 行**装下 7 种弹窗 + 首启向导状态机 | 想改一个分组,得在一屏滚不完的函数里找 |
96
+ | **逐字重复的实现** | `RefineTab` 的 `badge`/`reasonChip`/`apeRow` 两份逐字相同(`client.js:1644-1662` / `1682-1699`) | 改一处忘一处 |
97
+ | **幽灵配置键** | `client.js:4106` 写 `pythonGpu`,而 `DEFAULT_CONFIG` 里没有这个键 | 界面上能改、宿主端不认 |
98
+
99
+ **结论**:这解释了为什么"只能一步步累加"——**新增功能的边际成本不是 1 处,而是 3-5 处**,于是最省事的做法永远是往现有缝隙里塞。UI 重排如果不动这层,做完还是散的。
100
+
101
+ ---
102
+
103
+ ## 2. 问题解剖:为什么会有"繁琐"的体感
104
+
105
+ 不是"东西多",是**三类异质内容被平铺在同一层**:
106
+
107
+ | 类别 | 例子 | 用户的心智模式 |
108
+ | --- | --- | --- |
109
+ | **状态展示** | 水位/用量、记忆条数、接续倒计时 | "瞄一眼,别烦我" |
110
+ | **内容管理** | 三层记忆店、技能晋升审批、日历、关系图 | "我要翻、要找、要改" |
111
+ | **流程操作** | 一键接续、外部记忆扫描、安装向导、权限继承 | "我要做一件事,做完就走" |
112
+
113
+ 三者混装后产生三个具体症状:
114
+
115
+ 1. **入口混装**:想改一个开关的人,要先路过"技能审批""关系图"这些一辈子点一次的界面。
116
+ 2. **配置混装**:37 个键里,一部分是**用户该懂的政策**(开关、阈值、容量),一部分是**实现细节**(文件路径、模型文件名、目录名)。README 必须解释后者 → 文档被实现细节绑架。
117
+ 3. **文档替界面说话**:README 用"在设置页勾选…"的方式描述界面 —— 这等价于承认界面自己没说清楚。
118
+
119
+ ---
120
+
121
+ ## 3. 判定判据(建议用这四条选路)
122
+
123
+ | 判据 | 现状 | 目标 |
124
+ | --- | --- | --- |
125
+ | J1 新用户冷启动 | 需要读 README 才会开引擎/连接 | **不看文档** 5 分钟内完成"开启 → 选引擎 → 看见记忆在工作" |
126
+ | J2 老用户找开关 | 靠记忆位置 / 靠 README 索引 | **2 次点击**内到达上次改过的开关 |
127
+ | J3 文档负担 | README 大量操作指引 | README 只留"这是什么/为什么值得装",操作指引归零 |
128
+ | J4 交付节奏 | — | **每一步都能单独发版**,不出现"重构期间不可用" |
129
+
130
+ ---
131
+
132
+ ## 4. 四条可选路径
133
+
134
+ | 路线 | 做什么 | 动到的面 | 成本 | 风险 | 收益 |
135
+ | --- | --- | --- | --- | --- | --- |
136
+ | **A. IA 重排** | 按"状态 / 内容 / 配置"三层重组入口;一级导航(状态条 → 中枢 → 设置);把 9 个并列面板收进 3 个容器 | `client.js` 结构性重排(约 40-60% 的界面代码) | 高 | 中(易在重排中丢功能) | 最高:一次性解决"入口混装" |
137
+ | **B. 设置台重构** | 37 键分 3-5 组(记忆/引擎/接续/界面/高级);加"场景预设"(省心/平衡/激进);仅文件项折叠进"高级";每项配一句"改了会怎样" | 设置页 + 配置表元数据(宿主加键描述,界面读元数据渲染) | 中 | 低(不碰引擎逻辑) | 高:直接消灭"设置繁琐" |
138
+ | **C. 向导优先** | 把"首次使用 3 步"做成默认首屏;老用户可关;引擎安装/权限/连接外部工具都从这里走 | 向导组件 + 首屏路由 | 中 | 中(向导已存在,重做信息层级,改动易被已装用户忽略) | 中:解决 J1,不解决 J2/J3 |
139
+ | **D. 最小增量** | 只加:全局搜索(设置项 + 功能跳转)、说明性 tooltip、危险项二次确认 | `client.js` 局部 | 低 | 低 | 低-中:改善可发现性,但架构不变,README 仍要教 |
140
+
141
+ ### 4.1 我倾向的顺序(供你否决)
142
+
143
+ **B 打底 → A 收口**,理由:
144
+
145
+ - 设置是**改错成本最低、用户感知最强**的一块:不需要动引擎语义,就能让"繁琐"体感下降最多。
146
+ - IA 重排的价值依赖"分组成型":分组没定就重排,等于把混乱换个地方摆,后面还要再洗一次。
147
+ - 两者都能拆成可单独发版的小步(符合 J4)。
148
+
149
+ **不建议**先做 C:你现在的痛点不是"新用户进不来",而是"老用户在里面绕"。向导优化的是另一批人。
150
+
151
+ **D 可作为任意路线的第 0 步**(成本极低、立即可发),但它不构成路线。
152
+
153
+ ---
154
+
155
+ ## 5. 若走 B:第一步的具体形态(等你拍板)
156
+
157
+ **第 0 步(前置,可与 B 同批做,也可以先单独发一版)—— 先止血,否则 B 做完还是散的**(**2026-09-10 已执行,见 §7;其中第 1、3 条的机制已在 §7.2 更正**):
158
+
159
+ 1. **路径表单一化**:把 `client.js:858-897` 那份删掉,只留 `index.js` 一份,并把 20 处裸 `fetch('/api/…')` 全部改成走常量。
160
+ 2. **写配置路径收敛成 1 条**:现在有 4 条(`SettingsPage.save` / `PlanTab.autoSave` / 向导两处),收敛后"加一个配置项"才只需改一处。
161
+ 3. **顺手清两个死端点**:`/activation-inbox-pre`、`/subagent-gc` 界面上没有任何引用 —— 要么接上界面,要么删掉。
162
+
163
+ **B 主体(三件事,一次发版):**
164
+
165
+ 1. **配置分组**:85 键归到 记忆 / 引擎 / 接续 / 界面 / 高级 五组(**分组规则写在宿主 `DEFAULT_CONFIG` 的元数据里,界面按元数据渲染** —— 以后加键自动归位,不再改界面)。
166
+ 2. **场景预设**:三档(省心 / 平衡 / 激进)一键写入一组值,用户仍可逐项微调并看到"已偏离预设"。
167
+ 3. **仅文件项**:18 个键默认折叠,展开时明确标注"改这里可能让插件不工作";同时修掉幽灵键 `pythonGpu`(界面能写、宿主不认)。
168
+
169
+ **不做**:不改任何引擎行为、不改水位/接续判据、不改端点语义。
170
+
171
+ **为什么先做第 0 步**:B 的核心价值是"以后加东西不用改 4 个地方"。如果只把界面重排一遍、底下还是 4 条写配置路径 + 3 份路径清单,**下一轮累加会把刚整理好的结构再冲散一次**。
172
+
173
+ ---
174
+
175
+ ## 6. 需要你回答的三个问题
176
+
177
+ 1. **痛点是"找得到但太杂",还是"根本找不到某个开关"?**(前者指向 B,后者指向 D+A)
178
+ 2. **目标用户是谁**:只有你自己 / 少数朋友 / npm 上的公开用户?(决定要不要为"陌生用户"付向导成本)
179
+ 3. **可接受的改动规模**:一次大重构(可能几天不可用)/ 连续小步(每步可发版)?
180
+
181
+ ---
182
+
183
+ ## 附录
184
+
185
+ - `docs/UI-INVENTORY-RAW.md` —— 界面表层 / 配置键 / 端点逐条盘点(带行号)
186
+
187
+ ---
188
+
189
+ ## 7. 第 0 步「止血」执行记录(2026-09-10)
190
+
191
+ **状态**:已落地并验证,**仅 pre 线本地,未提交、未发布**(改宿主/界面两个半边后需重启 dsh web 才生效)。
192
+ 改动文件:`lib/client.js`;新增 `tests/smoke/smoke-test-api-paths-pre.mjs`。
193
+
194
+ ### 7.1 做了什么
195
+
196
+ | # | 动作 | 结果 |
197
+ | --- | --- | --- |
198
+ | 1 | 客户端路径表改前缀常量 + 补键 | `var ROUTE_PREFIX` 为唯一前缀;表从 40 键补到 **44 键**(补 `semanticStatus` / `semanticEmit` / `shadowRecent` / `reviewFeedback` / `memoryHub` / `storageManage`) |
199
+ | 2 | 裸路径字面量归零 | **28 处 → 0 处**(口径含 `apiPost(...)` 形态;§1.5 记的「20 处」只数了 `fetch(` 形态) |
200
+ | 3 | 写配置路径收敛 | 4 条 → **1 个 `saveConfigPatch()`**(设置页整对象 POST / 接续页 patch / 向导两处 patch 全部经它) |
201
+ | 4 | 顺带去重 | 10 处逐字重复的「刷新语义状态」收敛成 **`refreshSem()`** |
202
+ | 5 | 加回归锁 | 新增 `tests/smoke/smoke-test-api-paths-pre.mjs`,4 条断言全绿 |
203
+
204
+ ### 7.2 更正两处早先判断(重要,别照着旧文做)
205
+
206
+ 1. **「2 个死端点」不成立。** 它们只是**界面零引用**,不是没人用:
207
+ - `activation-inbox-pre` —— 契约测试与注入入口(`docs/M6-CONTRACT.md`、`tests/smoke/smoke-test-m63/m70`);
208
+ - `subagent-gc` —— CLI 消费者 `tools/subagent-gc.mjs`。
209
+
210
+ **删掉会打断它们。** 处理方式改为:在锁里写成显式白名单(宿主独有路径只允许这 2 条),以后谁新增宿主独有端点,谁就得改白名单并注明消费者。
211
+ 2. **「把 `client.js` 那份路径表删掉、只留宿主一份」做不到。** `client.js` 是 `__ModuleLoader__` 手写 bundle,不能 `import` 宿主模块 —— 两个半边之间没有可共享的模块层。所以「只有一份事实」的正确机制是**测试锁**(客户端 ⊆ 宿主 + 表外无裸字面量),不是删代码。
212
+
213
+ ### 7.3 验证
214
+
215
+ - 改动文件 `node --check` 通过、**无 BOM**、CRLF 行尾未变;
216
+ - 会读 `lib/client.js` 的 6 个 smoke 全绿(autocont-host 50/50、away-popup 12/12、continue-chain 58/58、handoff 53/53、startup-dispatch 12/12、新增路径锁 4/4);
217
+ - 全量 smoke 69 个文件 —— 结果见本轮汇报。
218
+
219
+ ### 7.4 仍未做(留给 B 主体,等路线拍板)
220
+
221
+ 配置分组元数据(宿主 `DEFAULT_CONFIG` 带分组/说明字段,界面按元数据渲染)、场景预设三档、18 个仅文件键折叠、幽灵键 `pythonGpu`、以及任何界面层面的重排 —— 都属 §5「B 主体」。
222
+
@@ -0,0 +1,181 @@
1
+ # 美术方向与动效规格(线框稿 · EVA 式克制线描 · 24fps)
2
+
3
+ > 生成时间:2026-09-10 · 配套:`docs/internal/DESIGN-OVERHAUL-PRE-RESEARCH.md`(排期与边界)
4
+ > 本文用途:把「线框稿 + 克制线描 + 动漫人物 + 24 帧动效」翻译成**可施工的规格**;其中 §5 是**可直接交给 Astra 的交付契约**。
5
+ > 待补输入:官方 DSH 网页的确切 URL/截图(你提供后并入 §1.1)。
6
+
7
+ ---
8
+
9
+ ## 1. 参考系(三层,已核实)
10
+
11
+ ### 1.1 官方 DSH(代码级)
12
+ - 品牌元件:`@deepseek-ai/dsh-client-ui-primitives` 的 **`FishLogo`(鲸鱼标)** + **`BrandWordmark`(字标)**;官方品牌插件 `dsh-client-ui-brand-official` 只注册侧栏的 `sidebar.brand.mark` / `sidebar.brand.name` 两个插槽。
13
+ - 视觉底座:`dsh-client-ui-theme` 定义 **`--dsw-*` 令牌**(79 个公开语义别名,纯颜色层,亮/暗自动切换)。
14
+ - 结论:**官方语言 = 记号(鲸鱼)+ 克制排版 + 令牌化配色**——与"线框稿 + 克制色"的方向天然一致。
15
+
16
+ ### 1.2 本项目首页现有令牌(可复用,别推翻)
17
+ `docs/landing/index.html` 的 `:root`:暖纸 `#F4F1EB` / 次纸 `#ECE8DF` / 墨 `#17171A` / 灰墨 `#5A5A60` / 浅墨 `#9B9BA0` / 实线 `#17171A` / 软线 `rgba(23,23,26,.16)` / **信号橙 `#E9470C`** / 橙墨 `#B23708`;`--max:1240px`、`--gutter:24px`;自述"现代主义·国际主义:纯色底+墨字、单一信号橙、12 列网格、1px 细线、无渐变无圆角"。
18
+
19
+ **关键判断:这套配色本身就是「线描 + 克制色」的现成实现。** 你新给的方向不需要推翻它,而是**从它长出来**——把水彩插画换成线稿插画,把动效从"渐显上浮"换成"24fps 线描绘制"。这是本次首页改造工作量可控的根本原因。
20
+
21
+ ### 1.3 现有角色资产
22
+ - 定妆:`docs/banner.jpg`(1672×941)——**蓝发蓝眼的水彩/厚涂动漫少女**,深蓝底、金线星图、手中书本与记忆卡匣。
23
+ - 六幕宣传图:`docs/screenshots/promo/promo-1..6-*.png`(1280×720,共 3.11 MB)。
24
+ - 生图规范:`artifacts/logo/BANNER-SERIES-PROMPTS.md`(含"角色辨识内核:蓝发蓝眼的动漫少女"与逐幕 prompt)。
25
+
26
+ ---
27
+
28
+ ## 2. 风格定义:线框稿(Wireframe)× EVA 式克制线描
29
+
30
+ ### 2.1 可执行色板(4 主色 + 3 灰阶)
31
+
32
+ | 角色 | 值 | 用途 | 占比 |
33
+ | --- | --- | --- | --- |
34
+ | 纸 | `#F4F1EB` | 底 | — |
35
+ | 墨 | `#17171A` | 结构线、正文 | 线为主 |
36
+ | 灰墨 / 浅墨 | `#5A5A60` / `#9B9BA0` | 标注、次级线、禁用态 | ~15% |
37
+ | **信号橙** | `#E9470C`(墨版 `#B23708`) | **唯一强调色**:焦点、当前态、关键数字 | **≤5%** |
38
+ | 警示黄 | `#E8C584`(仅警示条) | 限制/已知问题 | 极少量 |
39
+ | 蓝(仅角色) | 发丝 `#2B4A8B`→`#6E8FD8`、瞳孔 `#2B6FD8` | **只给角色**,不参与 UI | 极少量 |
40
+
41
+ **铁律**:任一屏内「信号橙」出现面积不超过 5%;蓝**只属于角色**,若 UI 里出现蓝,视觉上就会被读成"另一个角色"。
42
+
43
+ ### 2.2 线宽层级(工程图语言)
44
+
45
+ | 层级 | 线宽 | 用在哪 |
46
+ | --- | --- | --- |
47
+ | 网格/标注线 | 0.75px(`stroke-width:.75`) | 坐标网格、尺寸线、引线 |
48
+ | 结构线 | 1px | 分区、卡片边、表头 |
49
+ | 轮廓线 | 1.5px | 角色外轮廓、图标主形 |
50
+ | 重点线 | 2.5px | 标题下划线、当前页签、CTA 边框 |
51
+
52
+ ### 2.3 工程图元素(把"可审计/有证据链"的产品性格画出来)
53
+
54
+ - **尺寸标注**:`|←—— 128k ——→|` 形式的 token 配额标注;
55
+ - **剖面线**:45° 细排线(`repeating-linear-gradient`)用于"归档/压缩"这类被压缩过的区域;
56
+ - **编号圆点**:`①②③` 与模块编号(M1–M7 已有叙事基础);
57
+ - **CAUTION 条**:黄底黑字的横条,用于"已知限制""默认关闭";
58
+ - **图注**:等宽小字 `FIG.03 — 三层记忆的数据流`。
59
+
60
+ ### 2.4 禁止项(与现有 landing 自述一致,写成硬约束)
61
+ 渐变、投影、玻璃(`backdrop-filter`)、圆角卡片、装饰性光效、emoji 堆砌、"营销腔"形容词。
62
+
63
+ ---
64
+
65
+ ## 3. 角色规范(水彩 → 线稿)
66
+
67
+ - **辨识内核不可丢**:蓝发蓝眼。(沿用 `BANNER-SERIES-PROMPTS.md` 已确立的口径)
68
+ - **迁移要点**:①以轮廓线为主,蓝色只保留在**发丝高光与瞳孔**两处(着色面积 ≤ 角色面积 12%);②服装从厚涂简化为 **3-4 组结构线**(衣领/袖口/裙摆/腰带);③去掉水彩晕染与星光粒子,改用**工程图排线**做阴影;④手中的书本/记忆卡匣保留——它们是"记忆"的具象道具。
69
+ - **表情/姿态最小集**(每套都要出定妆):①静立持书(Hero 基准)②呼吸(3 帧循环)③眨眼(3 帧)④侧目看屏幕 ⑤抬手点化(技能固化)⑥翻页(日志/检索)。
70
+ - **定妆图先出**:一张正面全身 + 一张 3/4 侧(线稿,透明底 PNG,2x)。**这是后续所有素材的基准**,也是 Astra 的输入。
71
+
72
+ ---
73
+
74
+ ## 4. 动效规范(24fps)
75
+
76
+ ### 4.1 帧率与时序表
77
+
78
+ | 场景 | 时长 | 帧数(24fps) | 循环 | 优先级 |
79
+ | --- | --- | --- | --- | --- |
80
+ | Hero 线稿自绘(线条从 0 画出) | 1.5s | 36 | 一次性 | P0 |
81
+ | 角色呼吸 | 3s | 72 | 循环 | P0 |
82
+ | 角色眨眼 | 0.25s | 6 | 每 4-8s 随机触发 | P0 |
83
+ | 数据流动线(观察→检索→注入→证据) | 2s | 48 | 循环 | P1 |
84
+ | 章节转场(出现/擦除) | 0.6s | 14 | 一次性 | P1 |
85
+ | 六幕宣传图轮播 | 每幕 5s | — | 循环 | P2 |
86
+
87
+ ### 4.2 技术形态与分工(关键:可拼装)
88
+
89
+ | 形态 | 谁做 | 优点 | 代价 |
90
+ | --- | --- | --- | --- |
91
+ | **SVG 路径自绘**(`stroke-dashoffset`) | **我** | 矢量无极缩放、体积小(KB 级)、可随主题变色、可无障碍降级 | 画不了手绘角色细节 |
92
+ | **PNG 序列帧**(24fps,透明底) | **Astra** | 手绘质感最好、逐帧可控 | 体积大(需严格预算)、要用 JS 播放器 |
93
+ | **WebM / MP4**(无音轨,循环点对齐) | Astra(或我压缩) | 体积/质量平衡好 | 兼容与自动播放需处理,不能透明(可用 chroma/遮罩近似) |
94
+ | **CSS `steps()` 逐帧** | 我 | 实现简单、无 JS | 只适合短循环 |
95
+
96
+ **推荐组合(分工清晰、可并行)**:角色表演 = **Astra 出 PNG 序列(透明底)**;线条/网格/数据流/版式动效 = **我出 SVG + CSS**;最后由我在 `index.html` 里合成并做性能与无障碍降级。
97
+
98
+ ### 4.3 性能与无障碍预算(硬指标)
99
+
100
+ - 首屏动效总体积:**≤400 KB 原始 / ≤250 KB gzip**;移动端首屏只允许 **2 个动效同屏**。
101
+ - **LCP 不退化**:动效资源在 `load` 之后启动(`requestIdleCallback`),首帧静态图先行(`<img>` 占位,尺寸写死避免 CLS)。
102
+ - **`prefers-reduced-motion: reduce` 必须降级为静态首帧**(现有 landing 已有该分支,扩展即可)。
103
+ - 24fps 序列帧播放器:预解码前 N 帧后立即播放,其余流式解码;切到后台标签页暂停。
104
+
105
+ ---
106
+
107
+ ## 5. 交给 Astra 的交付契约(可直接转发)
108
+
109
+ **任务**:为 `dsh-auto-memory` 官网首页制作 **24fps 角色动画**(线框稿 + EVA 式克制线描风)。
110
+
111
+ **风格约束**
112
+ 1. 线描为主,纸白底(`#F4F1EB`)+ 墨线(`#17171A`);允许的彩色只有两处:发丝与瞳孔的蓝(`#2B4A8B`–`#6E8FD8` / `#2B6FD8`),以及**面积 ≤5%** 的信号橙(`#E9470C`)点缀。
113
+ 2. 禁止:渐变、投影、玻璃质感、圆角卡片、水彩晕染、星光粒子。阴影用 45° 工程排线表达。
114
+ 3. 角色辨识内核:**蓝发蓝眼的动漫少女**(参考 `docs/banner.jpg`),服装简化为 3-4 组结构线。
115
+
116
+ **交付物清单**
117
+ 1. **定妆图 2 张**:正面全身 + 3/4 侧;线稿;透明底 PNG;2x(角色高 ≥1600px)。
118
+ 2. **动画序列帧**(三段,各自独立目录):
119
+ - `hero/` Hero 线稿自绘:36 帧,一次性,末帧=完整静帧;
120
+ - `idle/` 呼吸+眨眼:呼吸 72 帧循环(首尾帧必须一致)+ 眨眼 6 帧(独立段,随机触发);
121
+ - `gaze/` 侧目/抬手点化:可选,24-48 帧。
122
+ 3. **格式**:PNG-24 + alpha,sRGB,**不烘焙背景**;命名 `hero_0000.png … hero_0035.png`(4 位补零,从 0000 起)。
123
+ 4. **分层**:角色层与道具层(书/卡匣)分开导出,便于我做视差与合成。
124
+ 5. **可选**:整段 WebM(VP9,无音轨,`yuv420p`),循环段首尾帧对齐。
125
+
126
+ **验收清单**
127
+ - [ ] 循环段首尾帧**逐像素一致**(无跳帧感)
128
+ - [ ] 透明边缘无白边/灰边(导出前做 1px 收缩)
129
+ - [ ] 锚点固定:角色脚底中线在每帧同一像素坐标(我会给画布与锚点坐标)
130
+ - [ ] 单帧 ≤150 KB(2x、透明);单段总 ≤8 MB
131
+ - [ ] 线条粗细与 §2.2 的线宽层级一致(轮廓 1.5px / 结构 1px @1x)
132
+ - [ ] 无渐变、无投影、无玻璃(对照 §5 风格约束逐条)
133
+ - [ ] 提供一张"动效节拍表":每段的关键帧号与其含义(便于我对齐 SVG 图层)
134
+
135
+ **画布与锚点(我这边定的)**
136
+ - 画布:`1200×1200` @1x(导出 2x = 2400×2400),透明底;
137
+ - 角色锚点:脚底中线位于 `(600, 1080)` @1x;角色高约 900px;
138
+ - 头顶安全区:上留 120px(给标注线与编号圆点)。
139
+
140
+ **我这边的集成点**
141
+ - 挂载位:`docs/landing/index.html` 的 `<section id="hero">` → `<div data-dam-anim="hero">`(占位与回退首帧 `<img>` 已预留);
142
+ - 播放策略:IntersectionObserver 进入视口才启动;`prefers-reduced-motion` 直接显示静态首帧;
143
+ - 体积超预算时我会先做 WebP/AVIF 转码或降帧(24→12fps)处理,并同步告知。
144
+
145
+ ---
146
+
147
+ ## 6. 分工与我的能力边界(诚实评估)
148
+
149
+ | 工作 | 谁 | 说明 |
150
+ | --- | --- | --- |
151
+ | 版式、网格、线稿风格的系统化(SVG/CSS) | **我** | 这是我的强项:矢量线条、自绘动画、响应式与双语、性能预算 |
152
+ | 数据流/标注/网格/转场等**非角色**动效 | **我** | SVG `stroke-dashoffset` + CSS `steps()`,体积 KB 级 |
153
+ | 角色**手绘逐帧表演**(呼吸/眨眼/发丝/翻页) | **Astra** | 逐帧手绘的质感与"高级感"目前更靠得住;我给规格、给画布、给锚点、负责合成 |
154
+ | 角色**线稿化再设计**(水彩→线稿) | Astra(或你指定的画师/模型) | 若你另有角色设定图,以你的为准 |
155
+ | 页面工程、集成、性能与无障碍降级 | **我** | 与 §4.3 预算绑定 |
156
+
157
+ 一句话:**"24 帧动效"里,线条与版式部分我现在就能做;角色的逐帧表演交给 Astra 更稳——我把交接契约写好了,两边可以并行。**
158
+
159
+ ---
160
+
161
+ ## 7. 时间线重估(AI 协作节奏)
162
+
163
+ | 阶段 | 内容 | AI 协作下的现实耗时 | 卡点 |
164
+ | --- | --- | --- | --- |
165
+ | D0 | 设计令牌冻结(色板/线宽/间距/字号)+ 定妆图线稿化 | 0.5 天 | 需要你 1 次评审 |
166
+ | D1-D2 | 界面一期:令牌落地 + 7 个组件原语 + 设置台分组 + 幽灵键/焦点态修复 | **2 天**(可发版) | 我能连续产出;你目视签收 |
167
+ | D3 | 面板 IA 重排(插槽 spike → 侧栏面板/右侧文档页/对话内状态条) | 1 天 | spike 结果未知(有回退) |
168
+ | D4 | 首页线稿版**静态稿**(版式 + 线稿插画位 + 工程图元素) | 1 天 | 需要角色线稿就位(可先用占位) |
169
+ | D5 | 动效叠加:SVG 自绘 + 数据流 + 转场(我做) ⊕ Astra 序列帧(到货即插) | 1 天 + 等 Astra | **美术排期是外部依赖** |
170
+ | D6 | 22 张界面图重拍 + 六幕宣传图更新 | 0.5 天 | 需 UI 冻结 + 重启 dsh web(你操作) |
171
+ | D7 | 文档终校(此刻才对功能说明逐条核对)+ 发版 | 1 天 | 你说的"最后再核对功能说明"就在这一步 |
172
+
173
+ **结论**:**「两三天」对界面一期(D1-D3)成立**;整套(含首页美术、动效、重拍、文档终校)串行约 **7 天**,其中真正的外部依赖是 **Astra 的动画排期** 与 **你的评审轮次**,不是我写代码的速度。
174
+
175
+ ---
176
+
177
+ ## 8. 现在需要你给的 3 件东西
178
+
179
+ 1. **官方 DSH 网页的确切 URL 或截图**(我全网搜到的都是第三方介绍文,没有官方落地页;拿到后我把它的版式/色彩并入 §1)。
180
+ 2. **角色基准**:用 `docs/banner.jpg` 这张水彩版去线稿化,还是你另有角色设定图/三视图?(有的话给我文件路径)
181
+ 3. **是否现在就出风格探针**:我可以立刻生成 2-3 张探针图(线稿 + EVA 色板 + 工程图元素,含"角色站在线框稿舞台上"的 Hero 构图),先定调再进入 D1——需要你在「Ark9 生图」面板点一次批准。