dsh-vscode-mode 0.1.53 → 0.1.55

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.
Files changed (210) hide show
  1. package/README.md +11 -0
  2. package/assets/vendor/pdfjs/build/pdf.mjs +26370 -0
  3. package/assets/vendor/pdfjs/build/pdf.worker.mjs +61080 -0
  4. package/assets/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  5. package/assets/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  6. package/assets/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
  7. package/assets/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  8. package/assets/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  9. package/assets/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
  10. package/assets/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  11. package/assets/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  12. package/assets/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  13. package/assets/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  14. package/assets/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  15. package/assets/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  16. package/assets/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  17. package/assets/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  18. package/assets/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  19. package/assets/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
  20. package/assets/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  21. package/assets/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  22. package/assets/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
  23. package/assets/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  24. package/assets/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  25. package/assets/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  26. package/assets/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  27. package/assets/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  28. package/assets/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  29. package/assets/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  30. package/assets/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  31. package/assets/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  32. package/assets/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  33. package/assets/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  34. package/assets/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  35. package/assets/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  36. package/assets/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  37. package/assets/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  38. package/assets/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  39. package/assets/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  40. package/assets/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  41. package/assets/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  42. package/assets/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  43. package/assets/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  44. package/assets/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  45. package/assets/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  46. package/assets/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  47. package/assets/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  48. package/assets/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  49. package/assets/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  50. package/assets/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
  51. package/assets/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
  52. package/assets/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  53. package/assets/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  54. package/assets/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  55. package/assets/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  56. package/assets/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  57. package/assets/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  58. package/assets/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  59. package/assets/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  60. package/assets/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  61. package/assets/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  62. package/assets/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  63. package/assets/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  64. package/assets/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  65. package/assets/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  66. package/assets/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
  67. package/assets/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
  68. package/assets/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
  69. package/assets/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  70. package/assets/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  71. package/assets/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
  72. package/assets/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  73. package/assets/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  74. package/assets/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
  75. package/assets/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
  76. package/assets/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  77. package/assets/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  78. package/assets/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  79. package/assets/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  80. package/assets/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  81. package/assets/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  82. package/assets/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  83. package/assets/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  84. package/assets/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
  85. package/assets/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
  86. package/assets/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  87. package/assets/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  88. package/assets/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  89. package/assets/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  90. package/assets/vendor/pdfjs/cmaps/H.bcmap +0 -0
  91. package/assets/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  92. package/assets/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  93. package/assets/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  94. package/assets/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  95. package/assets/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  96. package/assets/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  97. package/assets/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  98. package/assets/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  99. package/assets/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  100. package/assets/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  101. package/assets/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  102. package/assets/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  103. package/assets/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
  104. package/assets/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
  105. package/assets/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  106. package/assets/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  107. package/assets/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
  108. package/assets/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  109. package/assets/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  110. package/assets/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
  111. package/assets/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  112. package/assets/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  113. package/assets/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  114. package/assets/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  115. package/assets/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  116. package/assets/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  117. package/assets/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
  118. package/assets/vendor/pdfjs/cmaps/LICENSE +36 -0
  119. package/assets/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
  120. package/assets/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
  121. package/assets/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  122. package/assets/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  123. package/assets/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
  124. package/assets/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  125. package/assets/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  126. package/assets/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  127. package/assets/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  128. package/assets/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  129. package/assets/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  130. package/assets/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  131. package/assets/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  132. package/assets/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  133. package/assets/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  134. package/assets/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  135. package/assets/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  136. package/assets/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  137. package/assets/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  138. package/assets/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  139. package/assets/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  140. package/assets/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  141. package/assets/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  142. package/assets/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  143. package/assets/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  144. package/assets/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  145. package/assets/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  146. package/assets/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  147. package/assets/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  148. package/assets/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  149. package/assets/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  150. package/assets/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  151. package/assets/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  152. package/assets/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  153. package/assets/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  154. package/assets/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  155. package/assets/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  156. package/assets/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  157. package/assets/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  158. package/assets/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  159. package/assets/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  160. package/assets/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  161. package/assets/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  162. package/assets/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  163. package/assets/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  164. package/assets/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  165. package/assets/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  166. package/assets/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  167. package/assets/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  168. package/assets/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  169. package/assets/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  170. package/assets/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  171. package/assets/vendor/pdfjs/cmaps/V.bcmap +0 -0
  172. package/assets/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  173. package/assets/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  174. package/assets/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  175. package/assets/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  176. package/assets/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  177. package/assets/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  178. package/assets/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  179. package/assets/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  180. package/assets/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  181. package/assets/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  182. package/assets/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  183. package/assets/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  184. package/assets/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +102 -0
  185. package/assets/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  186. package/assets/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  187. package/assets/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  188. package/assets/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  189. package/assets/vendor/pdfjs/web/pdf_viewer.css +6989 -0
  190. package/assets/vendor/pdfjs/web/pdf_viewer.mjs +9459 -0
  191. package/lib/client.js +852 -13
  192. package/lib/client.js.map +1 -1
  193. package/lib/index.js +137 -17
  194. package/lib/index.js.map +1 -1
  195. package/package.json +1 -1
  196. package/src/client/compat.ts +31 -0
  197. package/src/client/imagePreview.ts +45 -0
  198. package/src/client/index.ts +46 -8
  199. package/src/client/pdf/pdfLoader.ts +82 -0
  200. package/src/client/pdf/pdfPanel.ts +239 -0
  201. package/src/client/pdfPreview.ts +48 -0
  202. package/src/client/remoteOpenRouter.ts +78 -0
  203. package/src/client/styles/editor.css +17 -0
  204. package/src/client/ui/EditorView.ts +221 -2
  205. package/src/compat.ts +1 -1
  206. package/src/dshVersion.ts +1 -0
  207. package/src/routes.ts +3 -0
  208. package/src/rpc.ts +65 -13
  209. package/src/shared/rpc.ts +50 -2
  210. package/src/store.ts +2 -0
package/lib/index.js CHANGED
@@ -556,6 +556,7 @@ function inDshRange(version, range) {
556
556
  function familyLabel(input) {
557
557
  const version = parseDshVersion(input);
558
558
  if (!version) return "未知";
559
+ if (inDshRange(version, { from: "0.1.3-alpha.1" })) return "0.1.3-alpha 及更新(对话文件链接=remote.session.openWorkspacePath)";
559
560
  if (inDshRange(version, { from: "0.1.2-alpha.1" })) return "0.1.2-alpha 及更新(设置 API=settings.installSection)";
560
561
  return "0.1.0/0.1.1 rc 线(设置 API=installSettingsSection)";
561
562
  }
@@ -586,6 +587,48 @@ function detectDshVersion() {
586
587
  //#region src/shared/rpc.ts
587
588
  /** webServer 精确路由。 */
588
589
  const RPC_PATH = "/edrv/rpc";
590
+ /**
591
+ * 图片扩展名(小写、无点)→ MIME。edrv.read base64 响应与 client 图片预览共用,
592
+ * 收敛在此避免 host/client 两处漂移。
593
+ * @author ddj 2026年09月08号
594
+ */
595
+ const IMAGE_MIME = {
596
+ png: "image/png",
597
+ jpg: "image/jpeg",
598
+ jpeg: "image/jpeg",
599
+ gif: "image/gif",
600
+ webp: "image/webp",
601
+ bmp: "image/bmp",
602
+ ico: "image/x-icon",
603
+ avif: "image/avif",
604
+ svg: "image/svg+xml"
605
+ };
606
+ /**
607
+ * 路径 → 图片 MIME:按 basename 扩展名小写查 {@link IMAGE_MIME},未命中回退 application/octet-stream。
608
+ * @author ddj 2026年09月08号
609
+ * @param path 文件路径(`/` 或 `\` 分隔均可)
610
+ * @returns MIME 字符串
611
+ */
612
+ function imageMimeOf(path) {
613
+ const base = String(path || "").split(/[\\/]/).pop() || "";
614
+ const dot = base.lastIndexOf(".");
615
+ const ext = dot > 0 ? base.slice(dot + 1).toLowerCase() : "";
616
+ return IMAGE_MIME[ext] ?? "application/octet-stream";
617
+ }
618
+ /** PDF 统一 MIME(host base64 响应与 client PDF 面板同源,避免两处漂移)。 */
619
+ const PDF_MIME = "application/pdf";
620
+ /**
621
+ * 路径 → 二进制预览 MIME:PDF 特判 {@link PDF_MIME},其余走图片表回退 octet-stream。
622
+ * @author ddj 2026年09月22号
623
+ * @param path 文件路径(`/` 或 `\` 分隔均可)
624
+ * @returns MIME 字符串
625
+ */
626
+ function binaryMimeOf(path) {
627
+ const base = String(path || "").split(/[\\/]/).pop() || "";
628
+ const dot = base.lastIndexOf(".");
629
+ if (dot > 0 && base.slice(dot + 1).toLowerCase() === "pdf") return PDF_MIME;
630
+ return imageMimeOf(path);
631
+ }
589
632
  //#endregion
590
633
  //#region src/paths.ts
591
634
  /**
@@ -959,7 +1002,7 @@ function detectGuards(ctx) {
959
1002
  }];
960
1003
  }
961
1004
  /** 已实测覆盖的最高 DSH 版本(适配矩阵上界,超过则提示,见 buildReport)。 */
962
- const TESTED_DSH_MAX = "0.1.2-alpha.4";
1005
+ const TESTED_DSH_MAX = "0.1.3-alpha.2";
963
1006
  /** 版本适配机制状态行:DSH 版本探测 + 设置 section 安装策略。 */
964
1007
  function versionAdapters(dshVersion) {
965
1008
  const adapters = [];
@@ -1005,7 +1048,7 @@ async function buildReport(ctx, options) {
1005
1048
  if (settingsInstallStrategy() === "none") warnings.push("设置 section 安装不可用:" + settingsInstallNote());
1006
1049
  const parsed = parseDshVersion(dshVersion);
1007
1050
  const testedMax = parseDshVersion(TESTED_DSH_MAX);
1008
- if (parsed && testedMax && compareDshVersions(parsed, testedMax) > 0) warnings.push("DSH " + dshVersion + " 高于已实测版本(0.1.2-alpha.4):设置 API 按能力探测运行,异常时请回报适配矩阵");
1051
+ if (parsed && testedMax && compareDshVersions(parsed, testedMax) > 0) warnings.push("DSH " + dshVersion + " 高于已实测版本(0.1.3-alpha.2):设置 API 按能力探测运行,异常时请回报适配矩阵");
1009
1052
  for (const guard of guards) if (!guard.active && guard.note) warnings.push(guard.note);
1010
1053
  return {
1011
1054
  pluginVersion: options?.version ?? pluginVersionOf(),
@@ -1034,6 +1077,7 @@ const IMG_ROUTES = [{
1034
1077
  /** Monaco AMD 构建静态资源(随包发布,离线可用;前缀路由 /edrv/vendor/*)。 */
1035
1078
  const VENDOR_MIME = {
1036
1079
  ".js": "text/javascript; charset=utf-8",
1080
+ ".mjs": "text/javascript; charset=utf-8",
1037
1081
  ".css": "text/css; charset=utf-8",
1038
1082
  ".json": "application/json",
1039
1083
  ".map": "application/json",
@@ -1046,7 +1090,9 @@ const VENDOR_MIME = {
1046
1090
  ".woff2": "font/woff2",
1047
1091
  ".ttf": "font/ttf",
1048
1092
  ".html": "text/html; charset=utf-8",
1049
- ".md": "text/markdown"
1093
+ ".md": "text/markdown",
1094
+ ".bcmap": "application/octet-stream",
1095
+ ".pfb": "application/octet-stream"
1050
1096
  };
1051
1097
  /** 图标目录(paths.ts 统一解析:config.imageDir 覆盖优先,否则插件包 assets/)。 */
1052
1098
  const imgDirOf = (config) => imageDirOf(config, import.meta.url);
@@ -1569,6 +1615,8 @@ function archiveEntryFor(recs, cwd, reason) {
1569
1615
  }))
1570
1616
  };
1571
1617
  }
1618
+ /** 二进制预览/写回上限(PDF 等整文件 base64 传输;文本侧仍用 READ_CAP)。 */
1619
+ const BINARY_READ_CAP = 33554432;
1572
1620
  /** 会话沙箱策略(policyOf):可能不存在,调用方需容忍 undefined。 */
1573
1621
  function policyOf(ctx, session) {
1574
1622
  const svc = ctx.get("sandboxPolicy");
@@ -5877,6 +5925,31 @@ async function requireSession(ctx, sessionId) {
5877
5925
  };
5878
5926
  }
5879
5927
  /**
5928
+ * 手动保存收尾(edrv.save / edrv.saveBinary 共用):目录树失效 + 该路径 pending
5929
+ * 文本差异记录标记 superseded 并归档(旧文本 diff 不得再应用到新内容上)。
5930
+ * @author ddj 2026年09月22号
5931
+ * @param ctx DSH 上下文
5932
+ * @param registry 差异记录桶注册表
5933
+ * @param sc requireSession 成功结果(session + cwd)
5934
+ * @param path 保存的文件路径
5935
+ */
5936
+ async function afterManualSave(ctx, registry, sc, path) {
5937
+ invalidateIndex(ctx, sc.cwd, path);
5938
+ const bucket = await bucketOf(registry, ctx, sc.cwd);
5939
+ let changed = false;
5940
+ for (const rec of bucket.values()) if (rec.path === path && rec.superseded !== true) {
5941
+ rec.superseded = true;
5942
+ rec.at = (/* @__PURE__ */ new Date()).toISOString();
5943
+ changed = true;
5944
+ }
5945
+ if (changed) {
5946
+ const done = [];
5947
+ for (const rec of bucket.values()) if (rec.path === path && rec.superseded) done.push(rec);
5948
+ if (done.length) await archiveRecords(ctx, sc.session, sc.cwd, bucket, done, "被手动编辑覆盖");
5949
+ else await saveBucket(ctx, sc.cwd, bucket, sc.session);
5950
+ }
5951
+ }
5952
+ /**
5880
5953
  * 批量决策核心:一次会话/桶解析 + 逐项处理 + 统一落盘(accept/reject 单条与 decideBatch 共用)。
5881
5954
  * rejected 项先做回滚,失败记入该项 error 且不改决策;本批次新增"已解决"记录一次性归档,
5882
5955
  * 有任何成功项则整桶只写盘一次,避免逐条读写整个 sidecar。
@@ -6055,6 +6128,20 @@ function buildHandlers(ctx, registry, searcher = newSearcher(ctx), contentSearch
6055
6128
  error: "文件不存在",
6056
6129
  resolvedPath: fs.processPath(target)
6057
6130
  };
6131
+ if ((info.size ?? 0) > 33554432) return {
6132
+ ok: false,
6133
+ error: "文件过大(>32MB),不支持整文件预览"
6134
+ };
6135
+ if (args.encoding === "base64") {
6136
+ const bytes = await fs.readBytes(target, void 0, BINARY_READ_CAP);
6137
+ return {
6138
+ ok: true,
6139
+ content: Buffer.from(bytes).toString("base64"),
6140
+ size: bytes.byteLength,
6141
+ encoding: "base64",
6142
+ mime: binaryMimeOf(args.path)
6143
+ };
6144
+ }
6058
6145
  if ((info.size ?? 0) > 8388608) return {
6059
6146
  ok: false,
6060
6147
  error: "文件过大(>8MB),不支持整文件预览"
@@ -6139,20 +6226,7 @@ function buildHandlers(ctx, registry, searcher = newSearcher(ctx), contentSearch
6139
6226
  try {
6140
6227
  const target = await resolveTarget(ctx, sc.session, args.path);
6141
6228
  await fs.writeText(target, args.content, void 0, void 0, policyOf(ctx, sc.session));
6142
- invalidateIndex(ctx, sc.cwd, args.path);
6143
- const bucket = await bucketOf(registry, ctx, sc.cwd);
6144
- let changed = false;
6145
- for (const rec of bucket.values()) if (rec.path === args.path && rec.superseded !== true) {
6146
- rec.superseded = true;
6147
- rec.at = (/* @__PURE__ */ new Date()).toISOString();
6148
- changed = true;
6149
- }
6150
- if (changed) {
6151
- const done = [];
6152
- for (const rec of bucket.values()) if (rec.path === args.path && rec.superseded) done.push(rec);
6153
- if (done.length) await archiveRecords(ctx, sc.session, sc.cwd, bucket, done, "被手动编辑覆盖");
6154
- else await saveBucket(ctx, sc.cwd, bucket, sc.session);
6155
- }
6229
+ await afterManualSave(ctx, registry, sc, args.path);
6156
6230
  return { ok: true };
6157
6231
  } catch (error) {
6158
6232
  return {
@@ -6161,6 +6235,52 @@ function buildHandlers(ctx, registry, searcher = newSearcher(ctx), contentSearch
6161
6235
  };
6162
6236
  }
6163
6237
  },
6238
+ "edrv.saveBinary": async (args) => {
6239
+ if (args.encoding !== "base64") return {
6240
+ ok: false,
6241
+ error: "仅支持 base64 编码"
6242
+ };
6243
+ const sc = await requireSession(ctx, args.sessionId);
6244
+ if ("err" in sc) return {
6245
+ ok: false,
6246
+ error: sc.err
6247
+ };
6248
+ const fs = ctx.get("fs");
6249
+ if (!fs) return {
6250
+ ok: false,
6251
+ error: "缺少 fs"
6252
+ };
6253
+ try {
6254
+ const target = await resolveTarget(ctx, sc.session, args.path);
6255
+ const info = await fs.stat(target);
6256
+ if (!info || info.type !== "file") return {
6257
+ ok: false,
6258
+ error: "文件不存在"
6259
+ };
6260
+ const rootTarget = await fs.resolve(policyOf(ctx, sc.session)?.workspaceRoot ?? ".", {});
6261
+ if (!fs.contains(rootTarget, target)) return {
6262
+ ok: false,
6263
+ error: "拒绝保存:目标不在会话工作区内"
6264
+ };
6265
+ const bytes = Buffer.from(args.content, "base64");
6266
+ if (bytes.byteLength === 0) return {
6267
+ ok: false,
6268
+ error: "内容为空,拒绝写回"
6269
+ };
6270
+ if (bytes.byteLength > 33554432) return {
6271
+ ok: false,
6272
+ error: "内容过大(>32MB),拒绝写回"
6273
+ };
6274
+ await writeFile(fs.processPath(target), bytes);
6275
+ await afterManualSave(ctx, registry, sc, args.path);
6276
+ return { ok: true };
6277
+ } catch (error) {
6278
+ return {
6279
+ ok: false,
6280
+ error: "二进制保存失败:" + String(error)
6281
+ };
6282
+ }
6283
+ },
6164
6284
  "edrv.archiveList": async (args) => {
6165
6285
  const sc = await requireSession(ctx, args.sessionId);
6166
6286
  if ("err" in sc) return {