ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

deepseek-harness-desktop 插件市场(Community Market)架构解析:安装流程与卸载边界如何工作

deepseek-harness-desktop 插件市场(Community Market)架构解析:安装流程与卸载边界如何工作 deepseek-harness-desktop 插件市场Community Market架构解析安装流程与卸载边界如何工作【免费下载链接】deepseek-harness-desktop为 DeepSeek Harness (DSH) 插件生态打造的现代化桌面端解决方案。万物皆「插件」桌面本身也是「插件」。项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness-desktop本文基于 deepseek-harness-desktop 仓库内的文档与源码拆解dsh-community-market包的插件市场架构目录来源如何归一化、npmlatest如何成为安装唯一信任锚、一次性确认令牌如何约束写操作以及故障恢复的唯一入口帮助不熟悉项目内部结构的开发者理解其读写边界并做二次开发。它要解决什么问题插件市场本质上要回答三个问题插件从哪来、一次安装凭什么被信任、卸载为什么不能直接执行一条包名命令。从哪来目录来源既可以是实现标准 cursor 分页契约的匿名 JSON 服务也可以是内置经审查的 provider 适配器DSH 1024Store、dshfind还可以由用户自行添加 manifest URL。各来源的 wire format 完全不同界面层只能消费一种归一化形状。凭什么信任安装来源自己标注的版本、徽章、验证标记都不算数。真正决定能否进入安装预览的是 npm 官方 registry 返回的latestmanifest 是否满足一组最小条件。卸载为什么谨慎Installed 视图列出的插件可能由本市场、其他市场或 DSH CLI 安装。卸载前 Host 会两次对照当前 Profile 清单复核目标而不是相信界面提交的字符串。职责与接口边界只读能力永远可用写操作只有在对应能力被注入时才存在——这是入口文件dsh-community-market/src/index.ts落地的分工契约。Market 拥有来源配置、来源适配器、归一化发现normalized discovery、Client 界面、npmlatest预览、围绕 Profile 包操作的一次性确认。它不拥有Profile 存储、包执行、恢复 checkpoint、终端窗口docs/market-shell.md。依赖注入的形态如下依赖注入方式带来的能力缺失时的降级行为webServer硬性注入inject [webServer]注册全部/api/community-market/*路由包无法工作storageDomain软注入按需动态import来源选择持久化状态仅存活于会话重启不保留仅写 warn 日志desktopActions可选注入失败对话框里打开 DSH Terminal按钮按钮不显示pluginManagerprofileContext可选注入二者同时在场才创建MarketInstallService安装 / 卸载 / 启停编排安装类路由返回 503Discover、Sources 照常浏览npm registry 请求走一个独立受限 client其代理例外主机名是编译期常量而非用户输入const npmRegistryHttp createRestrictedHttpClient({ // This is a compiled-in official registry hostname, never provider input. syntheticProxyHostnames: [registry.npmjs.org], })一次完整操作的时间线从浏览到卸载选定一条插件走完全流程数据形态依次经历provider 原始 JSON →CatalogSnapshot归一化条目 → 安装候选candidate→ 一次性令牌previewId→ manager 变更结果。浏览标准 cursor 来源被 Host 扫描进有界本地索引扫描结果缓存 5 分钟DEFAULT_CATALOG_SCAN_CACHE_TTL_MSdsh-community-market/src/catalog/service.ts第 74 行搜索、多分类 OR 筛选、50 条/页的 UI 分页都在本地执行用户的搜索词从不发给 provider。dshfindadapter 固定per_page100DSHFIND_PAGE_SIZE条目上限 20000MAX_DSHFIND_ITEMS数据集必须带sha256:前缀的 64 位 hexdata_version任一校验失败整批拒绝不发布部分索引dsh-community-market/src/adapters/dshfind.ts第 17-18、240-241 行。1024Storeprovider 的分页 v2 API/api/v2/plugins直连每一次查询页大小上限 200 条BROWSE_PAGE_SIZE/MAX_PROVIDER_PAGE_SIZEInstallable 路由构造limit: 200的查询每批只物化一个 provider 页dsh-community-market/src/host/routes.ts第 941-946 行。预览POST /api/community-market/operations/preview只接受这两种精确形状字段经boundedIdentifier校验1–240 字符且不含\0{ action: install, sourceRecordId, itemId } { action: uninstall, packageName }Host 从本地候选表取回先前观察到的条目observeCatalog在每次快照到达时登记请求https://registry.npmjs.org/package/latest核对包名一致、精确稳定版本、dsh.bundle.patch安全相对路径后签发一个 32 字节随机 token 作为previewId。 5.执行POST /api/community-market/operations/execute只接受{ previewId }。令牌一次性消费Host 校验 Profile 未变化再以精确nameversion目标调用installBundle(target, { enabled: true, saveExact: true })并断言 manager 回报的已安装包与验证过的包名一致dsh-community-market/src/install/service.ts第 574-585 行。 6.卸载preview 阶段调用removableBundle对照当前listBundles复核removable标志执行前再复核一次然后removeBundle——先取消选择并卸载 bundle再由 pnpm 移除依赖。Renderer Host (market) pluginManager | GET catalog (cursor) | | |-------------------------| adapter - CatalogSnapshot | | POST preview {ids} | | |-------------------------| npm latest - verify - previewId | POST execute {previewId} | | |-------------------------| installBundle(nameversion) --| | |---------------- ChangeResult | |----- {packageName,version, application} |边界与安全条件每一条为什么不能都对应一个具体常量或校验函数而不是约定俗成。来源命令一律丢弃。1024Store 适配器只解析一种精确的惰性命令形状dsh plugin --profile p add npm-package恰好 6 个 token提取 npm 包名后立即丢弃命令本身注释明确 The command itself is never retained or executeddsh-community-market/src/adapters/dsh-1024store.ts第 120-139 行dshfind 只接受kind npm且verification verified的单个结构化目标dshfind.ts第 142-167 行。来源不能声明凭据或选择权。标准来源 manifest URL 与目录端点必须是无凭据的 HTTPS 443 端口readStandardSourceManifest显式拒绝username、password、port、search、hashroutes.ts第 469-472 行provider 重定向最多 3 跳且逐跳校验 origin 未漂移dsh-community-market/src/network/restricted-http.ts第 11、190-212 行。版本只认 npm 官方latest。stableExactVersion要求 semver 严格合法且无 prerelease 段manifest.name必须与候选包名完全相同来源列出的版本永不参与目标构造service.ts第 197-201、258 行。令牌短时且一次性。关键常量service.ts第 25-33 行const INSTALL_INTENT_TTL_MS 5 * 60 * 1000 // 意图 5 分钟过期 const CANDIDATE_TTL_MS 30 * 60 * 1000 const MAX_INTENTS 256 const ACTIVATION_GRACE_MS 5000consumeIntent消费即删除sameProfile在 preview 后 Profile 变化时抛conflict映射为 HTTP 409过期令牌映射 410见routes.ts第 90-96 行。入口仅限本机回环。marketAuthority要求源地址属于127.0.0.0/8或::1、Host主机名恰好是127.0.0.1、端口与 webserver 一致、sec-fetch-site非cross-site写操作额外要求Origin与 Host 完全同源routes.ts第 283-328 行。请求体上限 16 KiBMAX_BODY_BYTES。内置 provider 的例外不扩散。两个内置 HTTP client 各自持有独立体积上限——1024Store 2 MiBMAX_DSH_1024STORE_BODY_BYTES、dshfind 16 MiBMAX_DSHFIND_BODY_BYTES——主机名是编译进 adapter 的常量用户添加的来源绝不继承这些本地代理例外routes.ts第 53-74 行。产品自有包被禁装。BLOCKED_PRODUCT_PACKAGESdsh-plugin-desktop、dsh-plugin-desktop-beta、dsh-desktop-next、dsh-community-market在任何安装入口都会被marketManagedPackage拒绝service.ts第 34-39、207-209 行。失败与恢复市场自身不做回滚降级路径与拒绝路径被明确划分恢复的唯一显式入口是恢复页面。触发条件系统行为用户可见结果pluginManager未注入安装/卸载/启停路由返回 503浏览路由不受影响Discover、Sources 可用安装按钮不可用routes.ts第 907-910 行目录请求超时catalog-timeoutHTTP 504失败附着在所选来源上提供 Retry不回退其他来源routes.ts第 104-118 行响应违反契约catalog-invalid-responseHTTP 502同上其他来源不可用catalog-unavailableHTTP 502同上preview 后 Profile 变化conflict409重复使用令牌返回intent-expired410需重新预览manager 报告失败或取消保留 manager 的有界 pnpm 输出写入 Desktop 日志绝不自动重试失败对话框展示同一份诊断与精确命令可手动打开终端install-and-uninstall.md失败行为表安装结果与验证包不符抛错上报已装依赖保留在 Installed 视图供人工处理service.ts第 579-585 行条目仍可见启用后行未即刻激活5 秒宽限期内每 250 ms 轮询行状态全部 active 才判成功awaitActivationACTIVATION_GRACE_MS/ACTIVATION_POLL_MS宽限结束仍 pending 则维持失败Renderer 在确认后关闭Host 持有generationController.signal继续执行仅响应可能丢失routes.ts第 1046-1048 行结果在下次读取时可见恢复语义分两层manager 负责还原它自己快照过的 Profile manifest 与 lockfile其余一切由 Desktop 的健康启动 Profile checkpoint 覆盖恢复永远是恢复页面中的显式动作dsh-community-market/docs/market-shell.mdFailure boundary 一节。工程约束与延伸阅读契约生成、类型检查、单元测试、包构建、export 验证、Loader smoke test 必须全部 headless-safe任何一步都不得启动 Electron——这是市场能稳定进入 DSH Desktop 发布链的前提dsh-community-market/docs/market-shell.mdHeadless requirements 一节。dsh-community-market/tests/下的套件在同样约束下运行覆盖点包括无默认来源且不预选、显式单来源选择、来源失败不回退、安装候选 fail-closed、1024Store 命令丢弃、dshfind 数据集整批拒绝等验收行为如contracts.spec.ts、host-routes.spec.ts、market-install.spec.ts、dshfind-adapter.spec.ts。如需本地阅读可用git clone https://gitcode.com/gh_mirrors/de/deepseek-harness-desktop获取仓库。延伸阅读均为仓库相对路径dsh-community-market/docs/market-shell.md模块归属、运行时形态与故障边界的权威摘要。dsh-community-market/docs/install-and-uninstall.md安装/卸载分步流程与完整失败行为表。dsh-community-market/docs/catalog-provider-contract.md公开 v1 provider 契约、Schema 权威与安全边界。dsh-community-market/src/install/service.ts验证器、一次性令牌与 manager 编排的完整实现。dsh-community-market/src/host/routes.ts路由注册、回环鉴权与错误码映射。【免费下载链接】deepseek-harness-desktop为 DeepSeek Harness (DSH) 插件生态打造的现代化桌面端解决方案。万物皆「插件」桌面本身也是「插件」。项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness-desktop创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表