# Reasonix Batch B / Worker D3:3-20 insertUploadedAssetIntoEditor 外置候选实现 Project root:`/mnt/Data1T/mnote-worktrees/0525-b3-upload-insert-runtime` ## 目标 在独立 worktree 中产出候选 patch:把 `SIDEBAR_TREE_JS` 中 `insertUploadedAssetIntoEditor(asset, targetRoot)` 的主体同构迁入 `rust/crates/mnote-web/browser/local-upload-runtime.js`,`layout.rs` 只保留委托 wrapper 和 inline fallback。不得改变上传落盘、资源归属、OnlyOffice URL 或 editor 插入行为。 ## 允许修改 - `rust/crates/mnote-web/browser/local-upload-runtime.js` - `rust/crates/mnote-web/src/ssr/pages/layout.rs` 必要时只更新 `layout.rs` 中现有字符串断言测试。不要修改设计文档、AGENTS、其它源码、generated wasm、git 状态或提交。 ## 实现要求 - `local-upload-runtime.js` 新增 `insertUploadedAssetIntoEditor(asset, targetRoot, deps)`,并导出到 `window.__mnoteLocalUploadRuntime.insertUploadedAssetIntoEditor`。 - `layout.rs` 中原 `insertUploadedAssetIntoEditor(asset, targetRoot)` 优先委托: `localUploadRuntimeFunction('insertUploadedAssetIntoEditor')`。 - 外置 runtime 不复制 resource/open 长期业务语义,必须通过 `deps` 接收以下既有 helper: - `uploadedAssetTitle` - `localAssetOpenUrl` - `uploadedAssetUrl` - `uploadedAssetType` - `isLocalUploadedAsset` - `buildOnlyOfficeAssetOpenUrl` - `fetchCurrentOnlyOfficeUserId` - `buildOnlyOfficeOpenPath` - `inferOnlyOfficeFileType` - `currentDocumentId` - `uploadedAttachmentClass` - `uploadedFileSize` - `cssEscape` - `enhanceEditorAttachmentLinks` - 保持以下 DOM attribute 行为完全不变: - `data-mnote-last-upload-inserted` - `data-mnote-last-upload-asset-id` - `data-mnote-last-upload-insert-error` - 保持 image 分支 `setImage({ src, alt, title })` 行为不变。 - 保持附件 link content、`storedHref`、`class`、`target`、`rel`、后续 `setTimeout` enhance 行为不变。 - runtime 不存在时,inline fallback 必须继续执行原实现。 ## 禁止事项 - 不迁 `uploadFileToMediaAsset` / `uploadFilesWithResolvedTarget` 编排流程。 - 不改 `/api/local-folder/assets/upload` 合同。 - 不改 resource open / OnlyOffice URL 语义。 - 不做格式化之外的邻近重构。 - 不提交 git。 ## 验收命令 ```bash node --check rust/crates/mnote-web/browser/local-upload-runtime.js cargo fmt --manifest-path rust/Cargo.toml --all --check cargo check --manifest-path rust/Cargo.toml -p mnote-web cargo test --manifest-path rust/Cargo.toml -p mnote-web local_upload_runtime_contains_editor_upload_context_helpers -- --test-threads=1 cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_upload_runtime_routes_local_markdown_assets_to_local_folder -- --test-threads=1 ``` ## 输出要求 handoff 必须列出: - 修改文件。 - 委托 deps 清单。 - 是否保持 fallback。 - 验收命令和结果。 - 未覆盖风险。 - `git diff --stat`。