插件扩展与安全边界
工作台既要开放扩展,也要控制本地文件、终端和网页嵌入带来的风险。mytable-service.ts 和服务端路由分别承担了这两部分职责。
对其他插件开放的注册表
客户端通过 ctx.mytable 暴露两类注册能力:
registerPaneType:注册新的工作台窗口,可以返回 iframe URL,也可以直接挂载 React 节点或 DOM 节点;registerFileViewer:按扩展名注册文件预览器,并通过优先级决定命中顺序。
每次注册都会返回 disposer。插件卸载或热更新时,Cordis 可以调用 disposer 清理注册项,避免旧窗口类型残留。注册表还会拒绝空 id、重复 id 和占用内置名称的 id。
用户可以在设置页禁用某个扩展。禁用后入口从选择器消失,文件预览则回落到内置行为,而不是破坏已有数据。
本地资源边界
服务端文件接口以会话工作目录为首选边界,并对目录枚举、递归搜索和响应大小设置上限。例如搜索会限制命中数量、扫描数量和深度,同时跳过 node_modules、.git、构建产物与缓存目录。
这些限制既是性能策略,也是安全策略:一个工作台搜索不应该因为误选磁盘根目录就无限遍历整个文件系统。
浏览器嵌入策略
浏览器窗格不能假设所有网页都允许 iframe。服务端会探测目标站点的 Content-Security-Policy 与 X-Frame-Options,客户端再据此决定嵌入、外部打开或提示用户。
远程部署 DSH 时也不应直接把本地端口暴露到公网。仓库文档推荐使用 SSH 端口转发,并提醒额外配置 HTTPS、身份认证、反向代理和可信主机。
依赖与发布
插件把适配后的 dsh-flowglass 作为打包依赖放进 vendor/,发布包因此不依赖相邻仓库。版本发布采用不可变的 Git 标签和 Release .tgz,可以避免下载地址内容变化后触发 pnpm 缓存完整性问题。
这套取舍的核心是:让扩展点足够开放,但让高权限能力仍然经过明确的宿主服务、边界检查和可回收的生命周期。
阿源的知识库