dsh-monaco:为 DeepSeek Harness 插件提供本地 Monaco 编辑器分发

前言

DeepSeek Harness(DSH)的浏览器插件通道将每个插件打包为单个文件(/plugins/<id>/client.js),且动态打包器不会生成额外的 chunk 或资源。Monaco 编辑器是一种多文件分发——包含 loader、按语言分组的模块和样式表——因此无法通过插件 channel 送达。

dsh-monaco 插件挂载其自身的路由来提供这些文件。编辑器保持本地化:运行时无需 CDN,且工具读取操作员源码树时不会出现第三方域名。

安装与启用

通过官方命令安装插件,安装后重启 dsh 使分发生效。

dsh plugin --profile web add github:DevViking-Persike/dsh-monaco

安装完成后,Monaco 编辑器分发将挂载在 /monaco 路径下。

典型用法

Monaco 通过其自身的 AMD loader 发布。在客户端插件中,按以下顺序加载并配置:

// 1. 加载 loader 脚本
await loadScript('/monaco/loader.js')

// 2. 配置路径,指向挂载点
window.require.config({ paths: { vs: '/monaco' } })

// 3. 加载编辑器主模块并创建实例
window.require(['vs/editor/editor.main'], () => {
  window.monaco.editor.create(host, { value: '', language: 'typescript' })
})

配置

通过 route 字段自定义挂载路径。默认为 /monaco。

- id: dsh-monaco
  name: 'dsh-monaco'
  config:
    route: /vendor/monaco

安全性与限制

插件在服务静态字节时不会注册工具、提示部分或会话事件,因此不消耗模型上下文。

安全机制包括:
* 路径遍历防护: 每个请求路径均解析到分发根目录并进行检查。resolve 会先折叠 ..,因此包括百分号编码在内的逃逸尝试都会被包含性测试捕获。
* 错误处理: 根目录下读取失败返回 404,与未知路径相同,浏览器无法通过错误区分文件是否存在。
* 方法限制: 仅支持 GET 和 HEAD,其他方法返回 405。
* 内容类型: 内容类型表中未匹配的扩展名默认返回 application/octet-stream,防止浏览器将文件误判为脚本。

已知限制:
* Web Workers: 插件不配置 Monaco web workers。想要使用它们的消费者必须提供自己的 worker 入口并设置 MonacoEnvironment。
* 缓存: 响应包含一周不可变的 cache-control。分发由已安装的包版本固定,但 Monaco 升级需要缓存破坏(更改路由)或硬刷新。
* 分发: 路由服务完整分发,包括页面可能从不加载的语言模块。

总结

该插件解决了 DSH 插件在页面内使用真实代码编辑器时需要 CDN 的痛点。通过在 host HTTP 路由上提供 Monaco 编辑器分发,它保持了编辑器在本地。

  • 目录页: https://www.skillhub.cn/plugins/DevViking-Persike/dsh-monaco
  • GitHub: https://github.com/DevViking-Persike/dsh-monaco
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜