From 3466b507c6b9fead209a7239e073d17fa0ee8c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B0=E6=9C=94?= <565183519@qq.com> Date: Thu, 3 Sep 2026 16:25:43 +0800 Subject: [PATCH] feat(knowledge): restore complete human rendering layer --- .../audit/FIDELITY-LEDGER-20260903.md | 4 + ...KE-CLEAN-V1-LOCAL-ACCEPTANCE-20260903.json | 5 +- ...LAKE-CLEAN-V1-LOCAL-ACCEPTANCE-20260903.md | 2 +- ...olake-knowledge-human-render-1536x1024.png | Bin 0 -> 44126 bytes .../docs/ARCHITECTURE.md | 2 +- .../hololake-clean-desktop/package-lock.json | 30 +++ .../hololake-clean-desktop/package.json | 2 + .../registries/donor-registry.json | 2 +- .../registries/module-registry.json | 4 +- .../scripts/audit-clean-v1.py | 6 + .../hololake-clean-desktop/src/App.tsx | 155 ++++++++++-- .../src/modules/knowledge-render/index.tsx | 223 +++++++++++++++++ .../src/modules/knowledge-render/manifest.ts | 27 +++ .../hololake-clean-desktop/src/styles.css | 224 ++++++++++++++++++ routing/hololake-current-architecture.json | 2 + 15 files changed, 665 insertions(+), 23 deletions(-) create mode 100644 product-source/hololake-clean-desktop/design/concepts/hololake-knowledge-human-render-1536x1024.png create mode 100644 product-source/hololake-clean-desktop/src/modules/knowledge-render/index.tsx create mode 100644 product-source/hololake-clean-desktop/src/modules/knowledge-render/manifest.ts diff --git a/product-source/hololake-clean-desktop/audit/FIDELITY-LEDGER-20260903.md b/product-source/hololake-clean-desktop/audit/FIDELITY-LEDGER-20260903.md index b2c56faa0..fc208e28f 100644 --- a/product-source/hololake-clean-desktop/audit/FIDELITY-LEDGER-20260903.md +++ b/product-source/hololake-clean-desktop/audit/FIDELITY-LEDGER-20260903.md @@ -14,3 +14,7 @@ 有意差异:概念图中的人格回复和日历执行是视觉示例;运行产品没有绑定人格模型和日历能力,因此不显示也不伪造这些结果。实现改为明确的 `WAITING_PERSONA` 回执。 首屏可见文字来自冰朔本轮要求或产品登记名,没有新增营销口号、指标、徽章或模型选择器。 + +## 知识库人类视觉渲染层纠正 + +冰朔指出首轮只有 Markdown 文本编辑器,不能称为完整知识库模块。现已从只读旧产品供体精确拆入 `knowledge-render` 切片,并在新壳中重新接线:目录、阅读渲染、frontmatter、标签、大纲、wikilink、callout、代码块、表格、来源证据、编辑/阅读切换均可见。验收截图为 `design/concepts/hololake-knowledge-human-render-1536x1024.png`;旧产品其他模块未合并。 diff --git a/product-source/hololake-clean-desktop/audit/HOLOLAKE-CLEAN-V1-LOCAL-ACCEPTANCE-20260903.json b/product-source/hololake-clean-desktop/audit/HOLOLAKE-CLEAN-V1-LOCAL-ACCEPTANCE-20260903.json index 13cae11fa..62d68c098 100644 --- a/product-source/hololake-clean-desktop/audit/HOLOLAKE-CLEAN-V1-LOCAL-ACCEPTANCE-20260903.json +++ b/product-source/hololake-clean-desktop/audit/HOLOLAKE-CLEAN-V1-LOCAL-ACCEPTANCE-20260903.json @@ -18,12 +18,13 @@ "rust_clippy_denied_warnings": "PASS_100", "production_dependency_audit": "0_VULNERABILITIES", "browser_channel_create_message_separation_knowledge_create_edit_save": "PASS_100", + "knowledge_human_visual_rendering_frontmatter_outline_wikilink_callout_table_code_evidence": "PASS_100", "responsive_viewports": ["1536x1024_PASS", "820x900_PASS"], "developer_id_signature": "PASS_100", "installed_application": "/Applications/HoloLake.app", "installed_version": "1.0.0", - "installed_binary_sha256": "f3cd899f99bf7667cd70a897c98ef82ea862567409f61ed6f0a485fe9bc3a96e", - "updater_archive_sha256": "87ae061b942e631a55d7a83002686f1be939431a4cfae62986e2d637c91ffefe", + "installed_binary_sha256": "50e6206be32ce7c70d42998b6217956aaa99687976e3d9ee383d3671e03c250d", + "updater_archive_sha256": "b126efa723415beacfad916621dbecceff7ea3ff24c79e6adacabd5bb343736a", "installed_process_readback": "PASS_100", "updater_artifact_signature": "PASS_100", "update_endpoint_http": 204, diff --git a/product-source/hololake-clean-desktop/audit/HOLOLAKE-CLEAN-V1-LOCAL-ACCEPTANCE-20260903.md b/product-source/hololake-clean-desktop/audit/HOLOLAKE-CLEAN-V1-LOCAL-ACCEPTANCE-20260903.md index 7e579e248..f512c8b90 100644 --- a/product-source/hololake-clean-desktop/audit/HOLOLAKE-CLEAN-V1-LOCAL-ACCEPTANCE-20260903.md +++ b/product-source/hololake-clean-desktop/audit/HOLOLAKE-CLEAN-V1-LOCAL-ACCEPTANCE-20260903.md @@ -2,7 +2,7 @@ 结论:新的独立干净产品根已经建立,HoloLake 1.0.0 已签名安装并在本机运行。它不是公众发行完成回执。 -已通过:TCS→GIR 编译与双语投影、模块编号唯一性、七种来源分流、前端生产构建、Rust 测试与严格 Clippy、生产依赖审计、频道建立、语言/回执分离、知识页新建编辑保存、1536×1024 与 820×900 视口、Developer ID 签名、更新包签名、`/Applications/HoloLake.app` 进程读回。更新入口现场返回 HTTP 204,即服务在线且暂无更新。 +已通过:TCS→GIR 编译与双语投影、模块编号唯一性、七种来源分流、前端生产构建、Rust 测试与严格 Clippy、生产依赖审计、频道建立、语言/回执分离、知识页新建编辑保存、完整人类视觉阅读渲染(frontmatter、大纲、wikilink、callout、表格、代码块、来源证据)、1536×1024 与 820×900 视口、Developer ID 签名、更新包签名、`/Applications/HoloLake.app` 进程读回。更新入口现场返回 HTTP 204,即服务在线且暂无更新。 企业服务器读回:蓝环境保存 5 个中央仓和 5 个负责人工作仓;团队域权限尚未分配,公共切换尚未发生。冰朔语言主控工作仓没有独立编号与登记,因此本轮没有猜名创建。 diff --git a/product-source/hololake-clean-desktop/design/concepts/hololake-knowledge-human-render-1536x1024.png b/product-source/hololake-clean-desktop/design/concepts/hololake-knowledge-human-render-1536x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..6a96095005203127b172fc680d6758b4de7afc89 GIT binary patch literal 44126 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

r8eFp7<<#{!N~hq$ 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

{@b*Cx0mPx)^~r!-c0?vFMlfru)XN+ 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 literal 0 HcmV?d00001 diff --git a/product-source/hololake-clean-desktop/docs/ARCHITECTURE.md b/product-source/hololake-clean-desktop/docs/ARCHITECTURE.md index 7648246d6..565951112 100644 --- a/product-source/hololake-clean-desktop/docs/ARCHITECTURE.md +++ b/product-source/hololake-clean-desktop/docs/ARCHITECTURE.md @@ -18,7 +18,7 @@ HoloLake 是公众个人初始化频道语言驱动操作系统。第一版只 - 对话和执行事实使用不同来源类型,不把系统文字塞进用户或人格消息。 - 公共四域由企业门户和企业服务器承载,不嵌入个人频道。 - 第五域、冰朔私人核 `TCS-iZero∞` 及私人语料不进入公众发行。 -- 当前知识库可处理 Markdown 和纯文本文件夹;PDF、Office、网页结构化转换尚未实现。 +- 当前知识库具备人类视觉阅读层:安全 Markdown 渲染、frontmatter、页面大纲、callout、表格、代码块与 wikilink 跳转;可处理 Markdown 和纯文本文件夹。PDF、Office、网页结构化转换尚未实现。 - 当前外部 AI 入口是本机来源明确的 inbox/outbox;实时加密通信尚未实现。 - 更新客户端只信任光湖控制的 HTTPS 清单与签名;服务器发行清单尚未发布。 diff --git a/product-source/hololake-clean-desktop/package-lock.json b/product-source/hololake-clean-desktop/package-lock.json index 491a181e2..257625876 100644 --- a/product-source/hololake-clean-desktop/package-lock.json +++ b/product-source/hololake-clean-desktop/package-lock.json @@ -12,6 +12,8 @@ "@tauri-apps/plugin-dialog": "2.7.2", "@tauri-apps/plugin-process": "2.3.1", "@tauri-apps/plugin-updater": "2.10.0", + "dompurify": "^3.4.13", + "marked": "^16.4.1", "react": "19.2.0", "react-dom": "19.2.0" }, @@ -1509,6 +1511,13 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, "node_modules/@vitejs/plugin-react": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.1.tgz", @@ -1630,6 +1639,15 @@ } } }, + "node_modules/dompurify": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.13.tgz", + "integrity": "sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.420", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.420.tgz", @@ -1775,6 +1793,18 @@ "yallist": "^3.0.2" } }, + "node_modules/marked": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.1.tgz", + "integrity": "sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", diff --git a/product-source/hololake-clean-desktop/package.json b/product-source/hololake-clean-desktop/package.json index 086a8b2d3..de623511e 100644 --- a/product-source/hololake-clean-desktop/package.json +++ b/product-source/hololake-clean-desktop/package.json @@ -14,6 +14,8 @@ "@tauri-apps/plugin-dialog": "2.7.2", "@tauri-apps/plugin-process": "2.3.1", "@tauri-apps/plugin-updater": "2.10.0", + "dompurify": "^3.4.13", + "marked": "^16.4.1", "react": "19.2.0", "react-dom": "19.2.0" }, diff --git a/product-source/hololake-clean-desktop/registries/donor-registry.json b/product-source/hololake-clean-desktop/registries/donor-registry.json index db371de29..34a4c35bc 100644 --- a/product-source/hololake-clean-desktop/registries/donor-registry.json +++ b/product-source/hololake-clean-desktop/registries/donor-registry.json @@ -9,6 +9,6 @@ {"donor_id":"HLP-DONOR-GROK-BUILD-0001","path":"/Volumes/JZAO/HoloLake/reference-materials/grok-build-v-780d138","allowed_use":"BUILD_EXECUTOR_RESEARCH_ONLY","imported":false}, {"donor_id":"HLP-DONOR-GUADA-0001","path":"/Volumes/JZAO/HoloLake/reference-materials/guada-v0.5.6","allowed_use":"KNOWLEDGE_UX_BEHAVIOR_ONLY","imported":false}, {"donor_id":"HLP-DONOR-OUTLINE-0001","path":"/Volumes/JZAO/HoloLake/reference-materials/outline","allowed_use":"KNOWLEDGE_MODEL_AND_IMPORT_RESEARCH_ONLY","imported":false}, - {"donor_id":"HLP-DONOR-HOLOLAKE-LEGACY-0001","path":"product-source/hololake-native-desktop","allowed_use":"TAURI_SIGNING_UPDATE_AND_ACCEPTANCE_ORACLE_ONLY","imported":false} + {"donor_id":"HLP-DONOR-HOLOLAKE-LEGACY-0001","path":"product-source/hololake-native-desktop","allowed_use":"TAURI_SIGNING_UPDATE_ACCEPTANCE_ORACLE_AND_KNOWLEDGE_RENDER_SLICE_ONLY","imported":true,"extracted_slices":["src/modules/knowledge-render/index.tsx","src/modules/knowledge-render/manifest.ts"],"whole_product_merge":false} ] } diff --git a/product-source/hololake-clean-desktop/registries/module-registry.json b/product-source/hololake-clean-desktop/registries/module-registry.json index 2a1a16893..2e210533e 100644 --- a/product-source/hololake-clean-desktop/registries/module-registry.json +++ b/product-source/hololake-clean-desktop/registries/module-registry.json @@ -7,7 +7,7 @@ "module_id": "HLP-MOD-CHANNEL-0001", "name_zh": "个人初始化频道", "kind": "SYSTEM_FOUNDATION", - "state": "LOCAL_INSTALLED_VERIFIED", + "state": "LOCAL_INSTALLED_VERIFIED_WITH_HUMAN_VISUAL_RENDERING", "source": "src-tauri/src/lib.rs#create_channel", "data_owner": "CURRENT_LOCAL_USER" }, @@ -17,7 +17,7 @@ "kind": "PREINSTALLED_USER_MODULE", "state": "LOCAL_INSTALLED_VERIFIED", "source": "src-tauri/src/lib.rs#knowledge", - "capabilities": ["CREATE", "READ", "EDIT", "IMPORT_FOLDER", "EXPORT", "MOVE_TO_TRASH", "PRIVATE_GIT_COMMIT"] + "capabilities": ["CREATE", "READ", "EDIT", "HUMAN_MARKDOWN_RENDERING", "FRONTMATTER", "OUTLINE", "WIKILINK_NAVIGATION", "IMPORT_FOLDER", "EXPORT", "MOVE_TO_TRASH", "PRIVATE_GIT_COMMIT"] }, { "module_id": "HLP-MOD-GLP-BRIDGE-0001", diff --git a/product-source/hololake-clean-desktop/scripts/audit-clean-v1.py b/product-source/hololake-clean-desktop/scripts/audit-clean-v1.py index cac2213a0..0e99dea14 100644 --- a/product-source/hololake-clean-desktop/scripts/audit-clean-v1.py +++ b/product-source/hololake-clean-desktop/scripts/audit-clean-v1.py @@ -25,6 +25,12 @@ package = json.loads((ROOT / "package.json").read_text()) for forbidden in ("openai", "anthropic", "@google/generative-ai", "langchain"): if forbidden in package.get("dependencies", {}): errors.append(f"internal model dependency forbidden: {forbidden}") +for required in ("marked", "dompurify"): + if required not in package.get("dependencies", {}): + errors.append(f"knowledge human renderer dependency missing: {required}") +renderer = ROOT / "src/modules/knowledge-render/index.tsx" +if not renderer.exists() or "MarkdownDocument" not in renderer.read_text(): + errors.append("knowledge human visual renderer missing") tauri = json.loads((ROOT / "src-tauri/tauri.conf.json").read_text()) endpoints = tauri["plugins"]["updater"]["endpoints"] diff --git a/product-source/hololake-clean-desktop/src/App.tsx b/product-source/hololake-clean-desktop/src/App.tsx index 14ea28703..e1b0cfeb1 100644 --- a/product-source/hololake-clean-desktop/src/App.tsx +++ b/product-source/hololake-clean-desktop/src/App.tsx @@ -4,6 +4,12 @@ import { relaunch } from "@tauri-apps/plugin-process"; import { Icon } from "./icons"; import * as api from "./runtime"; import type { KnowledgeDocument, SourceKind, SystemSnapshot } from "./types"; +import { + MarkdownDocument, + documentOutline, + jumpToHeading, + splitFrontmatter, +} from "./modules/knowledge-render"; type View = | "channel" @@ -248,9 +254,10 @@ function Channel({

公共更新

- {data.publicDistributionState === "SIGNED_UPDATE_FEED_READY_NO_RELEASE" - ? "更新入口在线 · 暂无发行" - : data.publicDistributionState} + {data.publicDistributionState === + "SIGNED_UPDATE_FEED_READY_NO_RELEASE" + ? "更新入口在线 · 暂无发行" + : data.publicDistributionState}

只接收签名发行,不自动执行普通 Git 拉取。

@@ -310,12 +317,15 @@ function Knowledge({ [doc, setDoc] = useState(null), [body, setBody] = useState(""), [query, setQuery] = useState(""), - [newTitle, setNewTitle] = useState(null); + [newTitle, setNewTitle] = useState(null), + [editing, setEditing] = useState(false), + [inspectorOpen, setInspectorOpen] = useState(true); useEffect(() => { if (selected) api.readDocument(selected).then((d) => { setDoc(d); setBody(d.body); + setEditing(false); }); }, [selected]); const list = useMemo( @@ -337,6 +347,8 @@ function Knowledge({ const save = async () => { if (doc) { await api.saveDocument(doc.path, body); + setDoc({ ...doc, body }); + setEditing(false); refresh(); } }; @@ -348,6 +360,20 @@ function Knowledge({ refresh(); } }; + const parsed = useMemo(() => splitFrontmatter(doc?.body ?? ""), [doc?.body]); + const outline = useMemo(() => documentOutline(doc?.body ?? ""), [doc?.body]); + const stats = useMemo(() => { + const chars = parsed.content.replace(/\s/g, "").length; + return { chars, minutes: Math.max(1, Math.ceil(chars / 450)) }; + }, [parsed.content]); + const openWiki = (target: string) => { + const normalized = target.replace(/[\s·•・\-_|*`]/g, "").toLowerCase(); + const hit = data.documents.find( + (item) => + item.title.replace(/[\s·•・\-_|*`]/g, "").toLowerCase() === normalized, + ); + if (hit) setSelected(hit.path); + }; return (
@@ -368,8 +394,14 @@ function Knowledge({
-
-