Skip to content

Commit 0a64123

Browse files
committed
feat(rich-content): complete r4 local GeoJSON maps
1 parent ee6eea7 commit 0a64123

21 files changed

Lines changed: 778 additions & 9 deletions

File tree

docs/design/frontend-ui-guidelines.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
- **按钮、下拉菜单、Popover、Select、Dialog、Tooltip 等控件的细节与变体**:编写或调整时须同时对照 [button-menu-design-spec.md](./button-menu-design-spec.md)
99
- **可复刻参考(CodePilot)**[`docs/ui/02-chat.md`](../ui/02-chat.md)[`docs/ui/03-workspace.md`](../ui/03-workspace.md)[`docs/ui/04-settings.md`](../ui/04-settings.md)[`docs/ui/06-markdown-message-tools.md`](../ui/06-markdown-message-tools.md)(视觉与能力对齐;IA 以 shell 规范本期边界为准)。
1010

11-
**最后审阅 / Last reviewed:** 2026-08-09(v33
11+
**最后审阅 / Last reviewed:** 2026-08-09(v34
1212

1313
## 1. 设计理念 (Design Philosophy)
1414

@@ -214,6 +214,7 @@ MisakaX 的目标是打造一个**现代化、专业、克制的桌面端 Agent
214214
- 图表、地图、文件预览必须惰性加载,并提供受控的文本/数据/下载降级路径;块级失败只能显示局部 notice,不能中断相邻 Markdown、工具调用或消息 footer。
215215
- 文件预览使用共享 `Dialog`,始终标明“只读”;二进制资源仅经窄 IPC 获取,禁止在 JSX 注入 HTML、任意 URL、`file:` 路径或未验证 SVG。所有可见标签、状态、`aria-label` 和错误文案必须走 `chat.richContent.*` i18n key。
216216
- 图表和地图的辅助操作(数据表、要素列表、复制、导出)必须键盘可达;颜色不是唯一信息来源,库加载/WebGL 失败时显示等价文本数据。
217+
- R4a 地图只渲染经校验的本地 GeoJSON:不得接收 tile URL、外部样式或其他远程资源;地图区域保持中性底色、固定可读高度和加载态,渲染失败时回退为要素列表。长要素列表默认最多显示 200 项,并明确告知截断。
217218

218219
### 4.6.y 工具调用状态行(ToolActionsGroup)
219220

docs/planning/rich-content-delivery/06-implementation-log.md

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
> **用途:** 记录实际实施、验证、决策变更、风险与下一步,保证人类和 AI Agent 接手时可追溯。
44
> **受众:** 所有实施者与评审者。
55
> **最后审阅 / Last reviewed:** 2026-08-09
6-
> **状态:** R0、R1、R2 已通过远程全量 CI。R3 图表已完成本地验证,待阶段提交、推送与远程 CI;R4 尚未开始阶段提交
6+
> **状态:** R0–R3 已通过远程全量 CI。R4 地图已完成本地验证,待阶段提交、推送与远程 CI。
77
88
---
99

@@ -23,8 +23,8 @@
2323
| R0 契约/安全基线 | 已完成 | 当前实施者 | 2026-08-09 | 2026-08-09 | `b1ed884`[CI #31271639940](https://github.com/knqiufan/MisakaX/actions/runs/31271639940) 的 8 项检查全绿 |
2424
| R1 ArtifactService/图片/下载 | 已完成 | 当前实施者 | 2026-08-09 | 2026-08-09 | `53a079d`[CI #31272842590](https://github.com/knqiufan/MisakaX/actions/runs/31272842590) 的 8 项检查全绿 |
2525
| R2 文件预览 | 已完成 | 当前实施者 | 2026-08-09 | 2026-08-09 | `2e979e1`[CI #31285793427](https://github.com/knqiufan/MisakaX/actions/runs/31285793427) 的 8 项检查全绿 |
26-
| R3 图表 | 本地验证完成,待门禁 | 当前实施者 | 2026-08-09 | | 受限 ChartSpec、ECharts richText、可访问数据表和 ArtifactService CSV 导出;待 commit/push/CI |
27-
| R4 地图 | 未开始阶段门禁 | 待分配 | || 候选工作区改动未提交、未验证、未推送;R4b 不在范围内 |
26+
| R3 图表 | 已完成 | 当前实施者 | 2026-08-09 | 2026-08-09 | `ee6eea7`[CI #31287278455](https://github.com/knqiufan/MisakaX/actions/runs/31287278455) 的 8 项检查全绿 |
27+
| R4 地图 | 本地验证完成,待门禁 | 当前实施者 | 2026-08-09 || 受限本地 GeoJSON、MapLibre fallback 与 ArtifactService 导出;待 commit/push/CI,R4b 不在范围内 |
2828
| R5 Agent/Sidecar/MCP | 未开始 | 待分配 ||| 依赖 Phase 4 真正对话链路;通过阶段门禁后完成 |
2929
| R6 加固/发布 | 未开始 | 待分配 ||| 三平台/沙箱 gate;通过阶段门禁后完成 |
3030

@@ -199,6 +199,20 @@
199199
- **风险/回滚:** 回退本 commit 即恢复 `chart` 的不可执行 notice fallback;不会影响 R0–R2 或 R4 候选改动。
200200
- **下一步:** 审查该独立切片、非强制推送并等待全部远程检查成功后再继续 R4。
201201

202+
### 2026-08-09 — R4a:受限本地 GeoJSON 地图与导出
203+
204+
- **范围:** 启用 `map` 块的 MapLibre renderer、要素列表/复制/GeoJSON 导出和局部降级;只使用内嵌的空数据源 style 及已持久化的 GeoJSON。R4b 的远程瓦片、provider registry、网络代理、隐私提示和 CSP 扩展均不在范围内。
205+
- **修改:** 新增防御性 MapSpec parser(10,000 要素/marker、24 properties、512 字符标签、有限且有界坐标);地图加载失败时展示要素列表,最多渲染 200 条列表项;增加 `map_export_geojson` Rust command、受管 artifact 导出、窄 IPC、AppManifest/权限/schema 同步、MapLibre 依赖、双语文案及 parser 回归测试。
206+
- **安全影响:** parser 与 Rust `MapSpecV1` 同时拒绝 `tile_source_id`;没有 tile URL、外部 style、HTML、`file:` 路径或任意网络输入。导出只序列化 `feature_collection`,先验证 feature flag、MapSpec 和消息的 session 归属,再通过 ArtifactService 写入 `application/geo+json`;未添加 FS/HTTP/Shell capability 或 CSP 放宽。
207+
- **代码审查:** 核对 renderer registry 已指向 `MapBlockRenderer`,动态加载只发生在块渲染时;数据来源/attribution 位于卡片 header,视图可复位;WebGL/MapLibre 错误不会影响相邻块;Clipboard 使用 Tauri 插件;导出临时 artifact 在保存流程结束后 expire。命令已同时出现在 `invoke_handler`、AppManifest 和最小权限白名单,权限基线测试覆盖该集合。
208+
- **验证:** `cargo fmt --check` ⇒ pass;`cargo test --all-features --lib map` ⇒ 3 passed;`cargo test --all-features --lib artifact` ⇒ 8 passed;`cargo test --all-features --test security_config_baseline_tests` ⇒ 5 passed;`cargo clippy --all-targets --all-features -- -D warnings` ⇒ pass;`npm test -- --run` ⇒ 39 files / 273 passed;`npm run build` ⇒ pass(既有大动态 chunk warning)。
209+
- **未验证:** 未在三平台真实 GPU/WebGL、屏幕阅读器、窗口缩放或实际保存对话框中手工回归;JSDOM 的 canvas diagnostic 不影响测试 exit 0。远程 CI 尚未执行。
210+
- **Git:** 待以独立 R4a commit 推送至 `codex/rich-content-r0-r4`
211+
- **远程 CI:** 待非强制 push 后触发并完成 8 项 required checks;在全绿前 R4 不标记完成。
212+
- **风险/回滚:** 回退 R4a commit 即恢复 `map` 的不可执行 notice fallback;不会放宽 CSP 或现有通用文件/网络能力。MapLibre bundle 增量仅在地图 renderer 动态加载时下载。
213+
- **文档同步:** `docs/design/frontend-ui-guidelines.md` §4.6.x.1;本实施记录。
214+
- **下一步:** 审查 R4a 暂存差异、提交、非强制推送并等待远程 CI 全绿;随后更新阶段看板与 R0–R4 交接文档。
215+
202216
## 后续记录模板
203217

204218
```markdown

package-lock.json

Lines changed: 203 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"i18next": "^26.0.8",
3737
"lucide-react": "^1.14.0",
3838
"mammoth": "^1.12.0",
39+
"maplibre-gl": "^6.2.0",
3940
"monaco-editor": "^0.55.1",
4041
"next-themes": "^0.4.6",
4142
"pdfjs-dist": "^6.2.108",

src-tauri/build.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ const COMMANDS: &[&str] = &[
111111
"append_content_block",
112112
"get_message_blocks",
113113
"chart_export_csv",
114+
"map_export_geojson",
114115
];
115116

116117
fn main() {

src-tauri/gen/schemas/acl-manifests.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)