Browse Source

release: 平台 2.4.9 + 各包只保留最新版本(重建精简历史,去除历代大包)

wangshuo 1 ngày trước cách đây
commit
5b6495764a
38 tập tin đã thay đổi với 1602 bổ sung và 0 xóa
  1. 3 0
      .gitignore
  2. 142 0
      README.md
  3. 6 0
      auto-update.json
  4. 1154 0
      index.json
  5. BIN
      packages/base/Plugins.DeepLearning/Plugins.DeepLearning-1.3.4.zip
  6. BIN
      packages/base/Plugins.Feeder/Plugins.Feeder-1.0.1.zip
  7. BIN
      packages/base/Plugins.Halcon/Plugins.Halcon-1.1.11.zip
  8. BIN
      packages/base/Plugins.OpenCv/Plugins.OpenCv-1.2.7.zip
  9. BIN
      packages/base/Plugins.Script/Plugins.Script-1.1.30.zip
  10. BIN
      packages/base/Plugins.Vm/Plugins.Vm-1.2.9.zip
  11. BIN
      packages/base/Plugins.Vpp/Plugins.Vpp-1.2.20.zip
  12. BIN
      packages/cameras/Plugins.Camera.Ahua/Plugins.Camera.Ahua-1.0.7.zip
  13. BIN
      packages/cameras/Plugins.Camera.Basler/Plugins.Camera.Basler-1.0.6.zip
  14. BIN
      packages/cameras/Plugins.Camera.Hikvision/Plugins.Camera.Hikvision-1.0.14.zip
  15. BIN
      packages/communication/Plugins.Mqtt/Plugins.Mqtt-1.0.2.zip
  16. BIN
      packages/communication/Plugins.Plc.Mitsubishi/Plugins.Plc.Mitsubishi-1.0.6.zip
  17. BIN
      packages/communication/Plugins.Plc.OpcUa/Plugins.Plc.OpcUa-1.0.6.zip
  18. BIN
      packages/communication/Plugins.Plc.Siemens/Plugins.Plc.Siemens-1.0.6.zip
  19. BIN
      packages/communication/Plugins.WebApi/Plugins.WebApi-1.0.4.zip
  20. BIN
      packages/contracts/TeamPLT.Contracts/TeamPLT.Contracts-3.0.2.zip
  21. BIN
      packages/contracts/TeamPLT.Hosting/TeamPLT.Hosting-1.0.2.zip
  22. BIN
      packages/platform/Ext.AiAssistant/Ext.AiAssistant-1.0.10.zip
  23. BIN
      packages/platform/Ext.Cameras/Ext.Cameras-1.1.0.zip
  24. BIN
      packages/platform/Ext.ColorSchemes/Ext.ColorSchemes-1.1.0.zip
  25. BIN
      packages/platform/Ext.Communication/Ext.Communication-1.2.0.zip
  26. BIN
      packages/platform/Ext.Database/Ext.Database-1.0.3.zip
  27. BIN
      packages/platform/Ext.Feeder/Ext.Feeder-1.2.11.zip
  28. BIN
      packages/platform/Ext.FlowWork/Ext.FlowWork-1.2.24.zip
  29. BIN
      packages/platform/Ext.Hmi/Ext.Hmi-1.0.2.zip
  30. BIN
      packages/platform/Ext.Light/Ext.Light-1.2.0.zip
  31. BIN
      packages/platform/Ext.Navigation.Classic/Ext.Navigation.Classic-1.0.5.zip
  32. BIN
      packages/platform/Ext.Robots/Ext.Robots-1.2.4.zip
  33. BIN
      packages/platform/Ext.Vision/Ext.Vision-1.3.0.zip
  34. BIN
      packages/platform/Ext.Welcome/Ext.Welcome-1.1.0.zip
  35. BIN
      packages/platform/TeamPLT.Platform.Debug/TeamPLT.Platform.Debug-2.4.9.zip
  36. BIN
      packages/platform/TeamPLT.Platform/TeamPLT.Platform-2.4.9.zip
  37. 215 0
      regen-index.ps1
  38. 82 0
      sync-index.ps1

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+
+# Mimosa 安全扫描台账(会话产物,不入库)
+.mimosa/

+ 142 - 0
README.md

@@ -0,0 +1,142 @@
+# TeamPLT Gallery
+
+TeamPLT / TeamAAS 2.1 平台的扩展包仓库。
+
+## TeamAAS 2.1 是什么
+
+TeamAAS 2.1 是一套面向 3C 电子制造、精密组装、检测分拣场景的工业自动化控制与机器视觉软件。它把相机、机械手、运动控制卡、光源控制器、震动盘、PLC 通讯等硬件整合到一个主控进程里,通过流程图(Flow)编排生产工序:
+
+- **硬件层**:统一管理相机(海康/巴斯勒等)、机械手(Epson/雅马哈/国产)、运动控制卡、光源、震动盘、PLC(Modbus/TCP/Serial)
+- **视觉层**:集成多种视觉算法引擎(定位、缺陷、测量、OCR)
+- **流程层**:拖拽式流程图编排工序,节点连线即逻辑,支持单步调试、监控运行
+- **生产层**:产品配方管理、生产计数、OK/NG 统计、良率报表
+
+TeamPLT 是它的微内核外壳,负责插件加载、界面框架、扩展管理。本仓库(Gallery)就是给这个微内核喂扩展包的源。
+
+## Gallery 是什么
+
+Gallery 是 TeamPLT 的扩展包源(package source)。平台内置"扩展管理"页,配置本地址后可以浏览、下载、安装扩展,下载后按 sha256 强校验。
+
+仓库结构:
+
+```
+index.json                                    # 包索引(平台只认这个文件)
+regen-index.ps1                               # 自动生成 index.json 的脚本
+packages\<host>\<id>\<id>-<version>.zip       # 扩展包
+```
+
+`host` 是扩展挂载位置:
+
+| host | 说明 |
+|------|------|
+| `platform` | 平台级扩展(扩展主界面、工具条、AI 等) |
+| `vision` | 视觉算法插件 |
+| `cameras` | 相机驱动子插件 |
+| `communication` | 通讯/PLC 驱动子插件 |
+| `base` | 基础库/共享组件 |
+
+## 配置为平台包源
+
+编辑平台 `Config\gallery-sources.json`,加一条:
+
+```json
+{
+  "id": "teamplt",
+  "name": "TeamPLT Gallery",
+  "location": "http://49.235.130.76/TeamPLT/Gallery/raw/master/index.json",
+  "enabled": true
+}
+```
+
+重启平台 → 扩展管理页即可看到包列表,点安装自动下载、校验、加载。
+
+## 如何提交自己的扩展
+
+### 1. 编译扩展
+
+扩展工程引用 `TeamPLT.SDK.dll` 和 `TeamPLT.Contracts.dll`,编译产出目录(含 `manifest.json`、dll、本地化文件)整体就是一个扩展。
+
+### 2. 打 zip
+
+把产出目录的内容**直接压成 zip**(不要多套一层文件夹)。zip 根目录应该长这样:
+
+```
+manifest.json
+Ext.XXX.dll
+Localization\zh-CN.json
+```
+
+### 3. 放到仓库
+
+路径规则:`packages\<host>\<id>\<id>-<version>.zip`
+
+例如:`packages/platform/Ext.AiAssistant/Ext.AiAssistant-1.0.0.zip`
+
+### 4. 更新 index.json(推荐用脚本)
+
+把 zip 放进 `packages/` 对应目录后,在仓库根目录跑:
+
+```powershell
+powershell -NoProfile -ExecutionPolicy Bypass -File .\regen-index.ps1
+```
+
+脚本会自动扫描所有 zip、读包内 manifest.json、算 sha256/size,生成与平台 `GalleryPackage` 类对齐的 index.json(含多版本 `versions[]`)。旧 index 里的版本历史会自动继承。
+
+也可以手动编辑 index.json,字段格式如下:
+
+```json
+{
+  "id": "Ext.YourExt",
+  "name": "扩展显示名",
+  "version": "1.0.0",
+  "publisher": "TeamAAS",
+  "kind": "extension",
+  "host": "platform",
+  "description": "一句话说明扩展做什么",
+  "notes": "• 功能点一\n• 功能点二",
+  "downloadUrl": "packages/platform/Ext.YourExt/Ext.YourExt-1.0.0.zip",
+  "sha256": "zip 文件的 sha256",
+  "size": 123456,
+  "references": [ "TeamPLT.SDK", "TeamPLT.Contracts" ],
+  "targetFramework": "net48",
+  "requiresHost": "TeamPLT>=2.1.0",
+  "arch": [ "x64" ],
+  "dependencies": [],
+  "versions": [
+    {
+      "version": "1.0.0",
+      "downloadUrl": "packages/platform/Ext.YourExt/Ext.YourExt-1.0.0.zip",
+      "sha256": "zip 文件的 sha256",
+      "size": 123456,
+      "releasedAt": "2026-09-24",
+      "status": "stable",
+      "notes": "首个版本"
+    }
+  ]
+}
+```
+
+发新版本时:顶层 `version`/`downloadUrl`/`sha256`/`size` 更新到最新版,`versions` 数组追加一条。`status` 可选 `stable` / `beta` / `deprecated`。
+
+### 5. 提交推送
+
+```bash
+git add -A
+git commit -m "Gallery: 收录 Ext.YourExt 1.0.0"
+git push origin master
+```
+
+## 当前收录
+
+| Id | 名称 | 版本 | host | 说明 |
+|---|---|---|---|---|
+| Ext.AiAssistant | AI 助手 | 1.0.0 | platform | 流式对话 + Function Calling,支持电脑控制与平台命令桥 |
+| Ext.Cameras | 相机 | 1.0.0 | platform | 相机设备管理、实时预览、曝光增益调节(内置 UVC/仿真) |
+| Ext.ColorSchemes | 配色 | 1.0.0 | platform | 七套种子色配色主题,外观→配色切换 |
+| Ext.Light | 光源 | 1.0.0 | platform | 多通道亮度控制、全开全关,内置仿真和 KCS 串口驱动 |
+| Ext.FlowWork | 流程画布 | 1.0.0 | platform | 数据库、流程引擎与画布、产品管理、安全域 |
+| Ext.Navigation.Classic | 导航(经典顶部) | 1.0.0 | platform | 经典顶部横条导航壳,支持外观参数即时调整 |
+| Ext.Welcome | 首页 | 1.0.0 | platform | 产品栏/画面区 + 生产统计与运行日志面板 |
+| Plugins.Camera.Hikvision | 海康相机驱动 | 1.0.0 | cameras | 海康机器人(Hikrobot MVS)相机驱动 |
+| Plugins.Camera.Basler | Basler 相机驱动 | 1.0.0 | cameras | Basler Pylon 相机驱动 |
+| Plugins.Camera.Ahua | 华睿相机驱动 | 1.0.0 | cameras | 华睿(iRayple MVSDK)相机驱动 |

+ 6 - 0
auto-update.json

@@ -0,0 +1,6 @@
+{
+  "allowAutoUpdate": true,
+  "allowPlatformUpdate": false,
+  "updatedAt": "2026-11-01 15:10:00",
+  "note": "allowAutoUpdate=true 才允许平台自动安装扩展;allowPlatformUpdate=true 才允许自动替换 TeamPLT.exe(会退出重启)。任一改 false 即可全网冻结对应项 —— 平台每 60 秒会现读本文件。"
+}

+ 1154 - 0
index.json

@@ -0,0 +1,1154 @@
+{
+    "schemaVersion":  1,
+    "generatedAt":  "2026-11-03T08:20:05Z",
+    "packages":  [
+                     {
+                         "id":  "Plugins.DeepLearning",
+                         "name":  "深度学习模型匹配",
+                         "version":  "1.3.4",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "base",
+                         "description":  "深度学习推理节点:用 ONNX 模型(YOLO 一类)对标准图像帧做检测/分类,输出类别、分数与坐标;内置 ONNX Runtime,CPU / DirectML 显卡两用(无显卡自动回退 CPU),试跑预览由视觉扩展(Ext.Vision)提供。",
+                         "notes":  "ONNX 会话线程池从默认每会话 16 线程改为 IntraOp=4 / InterOp=1(含 GPU 回退 CPU 的两次会话创建),首次推理后常驻线程约 32→8;单次推理耗时基本不变。",
+                         "downloadUrl":  "packages/base/Plugins.DeepLearning/Plugins.DeepLearning-1.3.4.zip",
+                         "sha256":  "c9e3c2b19c2560e107004629a2494f4cd08d71f163a9caff8445069780ecd851",
+                         "size":  15049766,
+                         "versions":  [
+                                          {
+                                              "version":  "1.3.4",
+                                              "downloadUrl":  "packages/base/Plugins.DeepLearning/Plugins.DeepLearning-1.3.4.zip",
+                                              "sha256":  "c9e3c2b19c2560e107004629a2494f4cd08d71f163a9caff8445069780ecd851",
+                                              "size":  15049766,
+                                              "releasedAt":  "2026-10-27",
+                                              "status":  "stable",
+                                              "notes":  "ONNX 会话线程池从默认每会话 16 线程改为 IntraOp=4 / InterOp=1(含 GPU 回退 CPU 的两次会话创建),首次推理后常驻线程约 32→8;单次推理耗时基本不变。"
+                                          }
+                                      ],
+                         "category":  "Utility",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "Ext.Vision"
+                                        ],
+                         "dependencies":  [
+                                              "Ext.FlowWork",
+                                              "Ext.Vision"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Plugins.Feeder",
+                         "name":  "震料器控制",
+                         "version":  "1.0.1",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "base",
+                         "description":  "震料器流程节点:振动(A~K 11 组振动集 + 时长,时长 0=连续振动,>0 等振动走完再往下走)、停止振动、背光开/关/切换、等待停振(轮询超时);设备未连接自动连接,失败返回中文原因。",
+                         "notes":  "1.0.1: 振动节点从“正转/反转”扩到 A~K 11 组振动集(对齐 Team 协议与旧项目 StartAction(Function, Duration)):振幅/频率/相位在震料器调试页调好后下载到设备,节点只选组;时长 >0 时节点等振动走完再返回,避免拍照节点抢在振动中途触发。1.0.0: 设备只走契约 IFeederService / IFeederDevice,四语言语言包随插件自注册。",
+                         "downloadUrl":  "packages/base/Plugins.Feeder/Plugins.Feeder-1.0.1.zip",
+                         "sha256":  "07dadf4849d106311ba80478972ab8736c0308d1df9ea744d7a4d29760436a89",
+                         "size":  51011,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.1",
+                                              "downloadUrl":  "packages/base/Plugins.Feeder/Plugins.Feeder-1.0.1.zip",
+                                              "sha256":  "07dadf4849d106311ba80478972ab8736c0308d1df9ea744d7a4d29760436a89",
+                                              "size":  51011,
+                                              "releasedAt":  "2026-10-29",
+                                              "status":  "stable",
+                                              "notes":  "1.0.1: 振动节点从“正转/反转”扩到 A~K 11 组振动集(对齐 Team 协议与旧项目 StartAction(Function, Duration)):振幅/频率/相位在震料器调试页调好后下载到设备,节点只选组;时长 >0 时节点等振动走完再返回,避免拍照节点抢在振动中途触发。1.0.0: 设备只走契约 IFeederService / IFeederDevice,四语言语言包随插件自注册。"
+                                          }
+                                      ],
+                         "category":  "Utility",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "Ext.FlowWork"
+                                        ],
+                         "dependencies":  [
+                                              "Ext.FlowWork",
+                                              "Ext.Feeder"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.24",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Plugins.Halcon",
+                         "name":  "HALCON 视觉节点",
+                         "version":  "1.1.11",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "base",
+                         "description":  "HALCON 视觉流程节点:Halcon流程 容器节点与 HALCON 算子集(区域面积分析 / 卡尺测量 / 圆测量 / 形状模板匹配 / 图像预处理 / 添加文字 / 图像保存 / 图像显示 / 格式转换),运行时向平台扩展 Ext.Vision 申请 IVisionEngineService 引擎。按 HALCON 23.11(halcondotnet 23.11 + 原生 halcon.dll 23.11)编译,运行库随包内 HalconSdk\\ 目录分发,现场无需另装 HALCON。",
+                         "notes":  "宿主已内嵌的 HandyControl 等程序集不再随包分发,统一由宿主提供(避免与宿主那份类型身份分裂);服务定位改用 SDK 的 Api 门面。",
+                         "downloadUrl":  "packages/base/Plugins.Halcon/Plugins.Halcon-1.1.11.zip",
+                         "sha256":  "5a12f891a187727a8ca250beb2722d430c8aae2cfa325a0e77220963c3e978e4",
+                         "size":  230641,
+                         "versions":  [
+                                          {
+                                              "version":  "1.1.11",
+                                              "downloadUrl":  "packages/base/Plugins.Halcon/Plugins.Halcon-1.1.11.zip",
+                                              "sha256":  "5a12f891a187727a8ca250beb2722d430c8aae2cfa325a0e77220963c3e978e4",
+                                              "size":  230641,
+                                              "releasedAt":  "2026-10-26",
+                                              "status":  "stable",
+                                              "notes":  "宿主已内嵌的 HandyControl 等程序集不再随包分发,统一由宿主提供(避免与宿主那份类型身份分裂);服务定位改用 SDK 的 Api 门面。"
+                                          }
+                                      ],
+                         "category":  "流程画布拓展",
+                         "engine":  "halcon",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts",
+                                            "Ext.FlowWork",
+                                            "Ext.Vision"
+                                        ],
+                         "dependencies":  [
+                                              "Ext.FlowWork",
+                                              "Ext.Vision"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.25",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Plugins.OpenCv",
+                         "name":  "OpenCV 视觉节点",
+                         "version":  "1.2.7",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "base",
+                         "description":  "OpenCV 视觉流程节点:OpenCV流程 容器节点与常用 OpenCV 算子(斑点检测 / 模板匹配 / 卡尺测量 / 创建字体)及图像转码节点,运行时向平台扩展 Ext.Vision 申请 IVisionEngineService 引擎。基于 OpenCvSharp5(OpenCV 4.x)托管封装编译,托管与 win-x64 原生运行库随插件分发,现场无需另装 OpenCV。",
+                         "notes":  "OpenCvSharp 原生库归入包内 OpenCv4.x\\ 子目录(带版本标注),引擎 PATH 探测加插件目录候选。",
+                         "downloadUrl":  "packages/base/Plugins.OpenCv/Plugins.OpenCv-1.2.7.zip",
+                         "sha256":  "d15b776a4294a461d4eb3a5f463730569998cdfb3ab30d306f5d0df41a8d4504",
+                         "size":  44341660,
+                         "versions":  [
+                                          {
+                                              "version":  "1.2.7",
+                                              "downloadUrl":  "packages/base/Plugins.OpenCv/Plugins.OpenCv-1.2.7.zip",
+                                              "sha256":  "d15b776a4294a461d4eb3a5f463730569998cdfb3ab30d306f5d0df41a8d4504",
+                                              "size":  44341660,
+                                              "releasedAt":  "2026-10-26",
+                                              "status":  "stable",
+                                              "notes":  "OpenCvSharp 原生库归入包内 OpenCv4.x\\ 子目录(带版本标注),引擎 PATH 探测加插件目录候选。"
+                                          }
+                                      ],
+                         "category":  "流程画布拓展",
+                         "engine":  "opencv",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "Ext.Vision"
+                                        ],
+                         "dependencies":  [
+                                              "Ext.Vision"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.25",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Plugins.Script",
+                         "name":  "C#脚本",
+                         "version":  "1.1.30",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "base",
+                         "description":  "C# 脚本节点:用 CodeForge 完整编辑器编写 C# 脚本类(继承 BasePlugin<ScriptToolModel>),智能补全/编译诊断/添加 DLL 引用,拥有普通插件全部能力,由流程画布(Ext.FlowWork)加载。",
+                         "notes":  "脚本编辑器代码提示修复(CodeForge 1.5.16):可见方法体的光标偏移被按 CRLF 文本误用于归一化文本,导致成员访问 TeamPLT.SDK. 退化成全局大列表、if 块内输入标识符只剩关键字兜底;现按行折算偏移,成员/命名空间提示恢复正常。",
+                         "downloadUrl":  "packages/base/Plugins.Script/Plugins.Script-1.1.30.zip",
+                         "sha256":  "e4d568e10525aa4e740348c59912dc0807b4d9d0b13cd8b041ebadd873b45c13",
+                         "size":  17479074,
+                         "versions":  [
+                                          {
+                                              "version":  "1.1.30",
+                                              "downloadUrl":  "packages/base/Plugins.Script/Plugins.Script-1.1.30.zip",
+                                              "sha256":  "e4d568e10525aa4e740348c59912dc0807b4d9d0b13cd8b041ebadd873b45c13",
+                                              "size":  17479074,
+                                              "releasedAt":  "2026-10-29",
+                                              "status":  "stable",
+                                              "notes":  "脚本编辑器代码提示修复(CodeForge 1.5.16):可见方法体的光标偏移被按 CRLF 文本误用于归一化文本,导致成员访问 TeamPLT.SDK. 退化成全局大列表、if 块内输入标识符只剩关键字兜底;现按行折算偏移,成员/命名空间提示恢复正常。"
+                                          }
+                                      ],
+                         "category":  "Utility",
+                         "targetFramework":  "net10.0",
+                         "requiresHost":  "TeamPLT>=2.3.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Plugins.Vm",
+                         "name":  "VisionMaster 视觉节点",
+                         "version":  "1.2.9",
+                         "publisher":  "TeamAAS",
+                         "kind":  "extension",
+                         "host":  "base",
+                         "description":  "海康 VisionMaster 视觉节点:VM工具块(外部 net48 执行器 VmHost.exe 承载 VM SDK,平台进程零 VM 依赖)、图像显示、图像保存。界面文案支持 zh-CN/zh-TW/en-US/ja-JP 四语言,语言包与 VmSdk 引擎运行库随包分发。",
+                         "notes":  "修复包缺 VmHost.exe:1.2.8 只带 net10 TeamPLT.Hosting.dll,被安装器按平台版本去重跳过,net48 外部宿主 VmHost.exe 从未进包,装完双击 VM 工具块起不来。现随包平铺分发 VmHost.exe、VmHost.exe.config、net48 TeamPLT.Hosting.dll、net48 Newtonsoft.Json.dll(manifest 补 dependencies/nativeDependencies 声明);VM SDK 程序集仍在 Vm4.4\\ 子目录。",
+                         "downloadUrl":  "packages/base/Plugins.Vm/Plugins.Vm-1.2.9.zip",
+                         "sha256":  "cc969ae07df99f46baa409970fed8d887222531e522fe5870bd96a482aa2d50a",
+                         "size":  3540481,
+                         "versions":  [
+                                          {
+                                              "version":  "1.2.9",
+                                              "downloadUrl":  "packages/base/Plugins.Vm/Plugins.Vm-1.2.9.zip",
+                                              "sha256":  "cc969ae07df99f46baa409970fed8d887222531e522fe5870bd96a482aa2d50a",
+                                              "size":  3540481,
+                                              "releasedAt":  "2026-10-28",
+                                              "status":  "stable",
+                                              "notes":  "修复包缺 VmHost.exe:1.2.8 只带 net10 TeamPLT.Hosting.dll,被安装器按平台版本去重跳过,net48 外部宿主 VmHost.exe 从未进包,装完双击 VM 工具块起不来。现随包平铺分发 VmHost.exe、VmHost.exe.config、net48 TeamPLT.Hosting.dll、net48 Newtonsoft.Json.dll(manifest 补 dependencies/nativeDependencies 声明);VM SDK 程序集仍在 Vm4.4\\ 子目录。"
+                                          }
+                                      ],
+                         "category":  "流程画布拓展",
+                         "engine":  "vm",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts",
+                                            "Ext.FlowWork",
+                                            "Ext.Vision"
+                                        ],
+                         "dependencies":  [
+                                              "TeamPLT.Hosting",
+                                              "Ext.FlowWork",
+                                              "Ext.Vision"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.25",
+                         "arch":  [
+                                      "x64"
+                                  ],
+                         "nativeDependencies":  [
+                                                    "TeamPLT.Hosting.dll",
+                                                    "VmHost.exe"
+                                                ]
+                     },
+                     {
+                         "id":  "Plugins.Vpp",
+                         "name":  "VisionPro 视觉节点",
+                         "version":  "1.2.20",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "base",
+                         "description":  "VisionPro 视觉流程节点:VPP工具块节点(内嵌 VisionPro ToolBlock 编辑器,配置输入映射后执行 VPP 工具链),运行时向平台扩展 Ext.Vision 申请 IVisionEngineService 引擎。平台进程不加载 Cognex 程序集——序列化与算法全部在随插件部署的 VpEditorHost.exe(net48)进程执行;包内 Vpp9.0\\ 随带 VisionPro 9.0 核心族托管 DLL,原生库与授权仍需本机安装 VisionPro 9.0。",
+                         "notes":  "输出图上的叠加标注(文字/框/线/点标)随图像宽度自动放大:2448 宽约 3×、5472 宽约 6.7×(820px 视口基准),文字对 Regular 字重自动加粗、线宽同步放大(上限 12px),20MP 大图上不再又细又小看不清。",
+                         "downloadUrl":  "packages/base/Plugins.Vpp/Plugins.Vpp-1.2.20.zip",
+                         "sha256":  "9012e67e746416fc3641ca8d3ba8f28115d57502f6174037308d932daba88493",
+                         "size":  19068610,
+                         "versions":  [
+                                          {
+                                              "version":  "1.2.20",
+                                              "downloadUrl":  "packages/base/Plugins.Vpp/Plugins.Vpp-1.2.20.zip",
+                                              "sha256":  "9012e67e746416fc3641ca8d3ba8f28115d57502f6174037308d932daba88493",
+                                              "size":  19068610,
+                                              "releasedAt":  "2026-10-29",
+                                              "status":  "stable",
+                                              "notes":  "输出图上的叠加标注(文字/框/线/点标)随图像宽度自动放大:2448 宽约 3×、5472 宽约 6.7×(820px 视口基准),文字对 Regular 字重自动加粗、线宽同步放大(上限 12px),20MP 大图上不再又细又小看不清。"
+                                          }
+                                      ],
+                         "category":  "流程画布拓展",
+                         "engine":  "vpp",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts",
+                                            "Ext.FlowWork",
+                                            "Ext.Vision"
+                                        ],
+                         "dependencies":  [
+                                              "TeamPLT.Hosting",
+                                              "Ext.FlowWork",
+                                              "Ext.Vision"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.24",
+                         "arch":  [
+                                      "x64"
+                                  ],
+                         "nativeDependencies":  [
+                                                    "TeamPLT.Hosting.dll"
+                                                ]
+                     },
+                     {
+                         "id":  "Plugins.Camera.Ahua",
+                         "name":  "华睿相机驱动",
+                         "version":  "1.0.7",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "cameras",
+                         "description":  "华睿(iRayple MVSDK_Net)相机驱动(kind=ahua):由相机扩展的驱动宿主(CameraPluginHost)加载,提供 ICameraDevice + IFrameSource。",
+                         "notes":  "1.0.7 触发与取像整改:改用 SDK FrameCallBack 回调取图,不在采集线程轮询,软触发命令不再被取图等待卡住;触发模式切换顺序改为 TriggerMode=Off → TriggerSelector/TriggerSource → On,兼容 On 状态下不可写的机型;触发模式等帧 100ms 短超时,避免长占控制锁;环形缓冲槽位 2(按 PixelFormat 精确算容量);软触发失败日志节流(首条 + 每 300 条)。",
+                         "downloadUrl":  "packages/cameras/Plugins.Camera.Ahua/Plugins.Camera.Ahua-1.0.7.zip",
+                         "sha256":  "c12cc54febd76933efd2956a7f664ab6644b54a02bc5c02ed9f1523354c3dcd6",
+                         "size":  34974,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.7",
+                                              "downloadUrl":  "packages/cameras/Plugins.Camera.Ahua/Plugins.Camera.Ahua-1.0.7.zip",
+                                              "sha256":  "c12cc54febd76933efd2956a7f664ab6644b54a02bc5c02ed9f1523354c3dcd6",
+                                              "size":  34974,
+                                              "releasedAt":  "2026-11-02",
+                                              "status":  "stable",
+                                              "notes":  "1.0.7 触发与取像整改:改用 SDK FrameCallBack 回调取图,不在采集线程轮询,软触发命令不再被取图等待卡住;触发模式切换顺序改为 TriggerMode=Off → TriggerSelector/TriggerSource → On,兼容 On 状态下不可写的机型;触发模式等帧 100ms 短超时,避免长占控制锁;环形缓冲槽位 2(按 PixelFormat 精确算容量);软触发失败日志节流(首条 + 每 300 条)。"
+                                          }
+                                      ],
+                         "category":  "Camera",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.Contracts",
+                                            "Ext.Cameras"
+                                        ],
+                         "requiresHost":  "TeamPLT>=2.3.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Plugins.Camera.Basler",
+                         "name":  "Basler 相机驱动",
+                         "version":  "1.0.6",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "cameras",
+                         "description":  "Basler Pylon 相机驱动(kind=basler):由相机扩展的驱动宿主(CameraPluginHost)加载,提供 ICameraDevice + IFrameSource。",
+                         "notes":  "1.0.6 触发与取像整改:改用 Pylon ImageGrabbed 事件驱动取图(不在调用线程轮询 RetrieveResult),软触发命令不再排队;触发源切换顺序改为先 TriggerMode=Off,再写 TriggerSource/TriggerActivation,最后 On;打开中途失败释放半开相机句柄防止泄漏;触发模式等帧 100ms 短超时;环形缓冲槽位 2(按实际像素格式算容量)。",
+                         "downloadUrl":  "packages/cameras/Plugins.Camera.Basler/Plugins.Camera.Basler-1.0.6.zip",
+                         "sha256":  "a97202b6436aa3653485322227f68f67931f08ef889a81b0e845a243f317d19b",
+                         "size":  464829,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.6",
+                                              "downloadUrl":  "packages/cameras/Plugins.Camera.Basler/Plugins.Camera.Basler-1.0.6.zip",
+                                              "sha256":  "a97202b6436aa3653485322227f68f67931f08ef889a81b0e845a243f317d19b",
+                                              "size":  464829,
+                                              "releasedAt":  "2026-11-02",
+                                              "status":  "stable",
+                                              "notes":  "1.0.6 触发与取像整改:改用 Pylon ImageGrabbed 事件驱动取图(不在调用线程轮询 RetrieveResult),软触发命令不再排队;触发源切换顺序改为先 TriggerMode=Off,再写 TriggerSource/TriggerActivation,最后 On;打开中途失败释放半开相机句柄防止泄漏;触发模式等帧 100ms 短超时;环形缓冲槽位 2(按实际像素格式算容量)。"
+                                          }
+                                      ],
+                         "category":  "Camera",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.Contracts",
+                                            "Ext.Cameras"
+                                        ],
+                         "requiresHost":  "TeamPLT>=2.3.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Plugins.Camera.Hikvision",
+                         "name":  "海康相机驱动",
+                         "version":  "1.0.14",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "cameras",
+                         "description":  "海康机器人(Hikrobot MVS)相机驱动(kind=hikvision):由相机扩展的驱动宿主(CameraPluginHost)加载,提供 ICameraDevice + IFrameSource。",
+                         "notes":  "1.0.14 触发与取像整改:改用 SDK 图像回调取图(回调委托由字段持有防 GC 回收),取图不再长时间占用控制锁,软触发命令不再排队;触发模式切换顺序改为 TriggerMode=Off → TriggerSelector/TriggerSource → On;回调注册失败才回退轮询;触发模式等帧 100ms 短超时;环形缓冲槽位 2(按 PixelFormat 精确算容量);软触发失败日志节流(首条 + 每 300 条)。",
+                         "downloadUrl":  "packages/cameras/Plugins.Camera.Hikvision/Plugins.Camera.Hikvision-1.0.14.zip",
+                         "sha256":  "55ce145b13380f6870c6a67eac17f7cb34e590b321d44d5888adc1d05c5f23fa",
+                         "size":  98797,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.14",
+                                              "downloadUrl":  "packages/cameras/Plugins.Camera.Hikvision/Plugins.Camera.Hikvision-1.0.14.zip",
+                                              "sha256":  "55ce145b13380f6870c6a67eac17f7cb34e590b321d44d5888adc1d05c5f23fa",
+                                              "size":  98797,
+                                              "releasedAt":  "2026-11-02",
+                                              "status":  "stable",
+                                              "notes":  "1.0.14 触发与取像整改:改用 SDK 图像回调取图(回调委托由字段持有防 GC 回收),取图不再长时间占用控制锁,软触发命令不再排队;触发模式切换顺序改为 TriggerMode=Off → TriggerSelector/TriggerSource → On;回调注册失败才回退轮询;触发模式等帧 100ms 短超时;环形缓冲槽位 2(按 PixelFormat 精确算容量);软触发失败日志节流(首条 + 每 300 条)。"
+                                          }
+                                      ],
+                         "category":  "Camera",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.Contracts",
+                                            "Ext.Cameras"
+                                        ],
+                         "requiresHost":  "TeamPLT>=2.3.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Plugins.Mqtt",
+                         "name":  "MQTT",
+                         "version":  "1.0.2",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "communication",
+                         "description":  "MQTT 5 通讯驱动(HslCommunication 13):一个设备可作服务端(本机起 Broker)或客户端;接口库在调试页配置并保存,收发流水落独立日志文件;自带画布「MQTT」调用节点(通讯模块分组)。",
+                         "notes":  "子插件独立成源后的首个新版:与新版父扩展(同一 SDK 基线)配套发布。此前独立包仍是旧版,与新版父扩展 API 不匹配,装插件时报 missing method。",
+                         "downloadUrl":  "packages/communication/Plugins.Mqtt/Plugins.Mqtt-1.0.2.zip",
+                         "sha256":  "d40d806e47333149c2d9ccac1f5df125abe335a4df2ee7b7f18bd39bab4ab0ed",
+                         "size":  1697156,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.2",
+                                              "downloadUrl":  "packages/communication/Plugins.Mqtt/Plugins.Mqtt-1.0.2.zip",
+                                              "sha256":  "d40d806e47333149c2d9ccac1f5df125abe335a4df2ee7b7f18bd39bab4ab0ed",
+                                              "size":  1697156,
+                                              "releasedAt":  "2026-10-26",
+                                              "status":  "stable",
+                                              "notes":  "子插件独立成源后的首个新版:与新版父扩展(同一 SDK 基线)配套发布。此前独立包仍是旧版,与新版父扩展 API 不匹配,装插件时报 missing method。"
+                                          }
+                                      ],
+                         "category":  "Hardware",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts",
+                                            "Ext.Communication",
+                                            "Ext.FlowWork"
+                                        ],
+                         "dependencies":  [
+                                              "TeamPLT.Contracts",
+                                              "Ext.FlowWork"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Plugins.Plc.Mitsubishi",
+                         "name":  "三菱 PLC",
+                         "version":  "1.0.6",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "communication",
+                         "description":  "三菱 MC 协议 PLC 通讯驱动(HslCommunication):通讯扩展子插件,直接导出 IPlcDriverProvider,由通讯宿主反射登记。",
+                         "notes":  "子插件独立成源后的首个新版:与新版父扩展(同一 SDK 基线)配套发布。此前独立包仍是旧版,与新版父扩展 API 不匹配,装插件时报 missing method。",
+                         "downloadUrl":  "packages/communication/Plugins.Plc.Mitsubishi/Plugins.Plc.Mitsubishi-1.0.6.zip",
+                         "sha256":  "c02d354325e165ff1a4b4d007ff8739366a7fee2d9cf6b3902608e818a07eae0",
+                         "size":  1647355,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.6",
+                                              "downloadUrl":  "packages/communication/Plugins.Plc.Mitsubishi/Plugins.Plc.Mitsubishi-1.0.6.zip",
+                                              "sha256":  "c02d354325e165ff1a4b4d007ff8739366a7fee2d9cf6b3902608e818a07eae0",
+                                              "size":  1647355,
+                                              "releasedAt":  "2026-10-26",
+                                              "status":  "stable",
+                                              "notes":  "子插件独立成源后的首个新版:与新版父扩展(同一 SDK 基线)配套发布。此前独立包仍是旧版,与新版父扩展 API 不匹配,装插件时报 missing method。"
+                                          }
+                                      ],
+                         "category":  "Hardware",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts",
+                                            "Ext.Communication"
+                                        ],
+                         "dependencies":  [
+                                              "TeamPLT.Contracts"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Plugins.Plc.OpcUa",
+                         "name":  "OPC UA 客户端",
+                         "version":  "1.0.6",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "communication",
+                         "description":  "OPC UA 客户端驱动(OPC Foundation UA-.NETStandard:匿名身份 / SecurityPolicy=None):通讯扩展子插件,直接导出 IPlcDriverProvider,由通讯宿主反射登记。",
+                         "notes":  "子插件独立成源后的首个新版:与新版父扩展(同一 SDK 基线)配套发布。此前独立包仍是旧版,与新版父扩展 API 不匹配,装插件时报 missing method。",
+                         "downloadUrl":  "packages/communication/Plugins.Plc.OpcUa/Plugins.Plc.OpcUa-1.0.6.zip",
+                         "sha256":  "b3738c5bb580c7adf6ad3f1e9e7b44e310e2ed2363e6547886d367ffe4917fa9",
+                         "size":  6420768,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.6",
+                                              "downloadUrl":  "packages/communication/Plugins.Plc.OpcUa/Plugins.Plc.OpcUa-1.0.6.zip",
+                                              "sha256":  "b3738c5bb580c7adf6ad3f1e9e7b44e310e2ed2363e6547886d367ffe4917fa9",
+                                              "size":  6420768,
+                                              "releasedAt":  "2026-10-26",
+                                              "status":  "stable",
+                                              "notes":  "子插件独立成源后的首个新版:与新版父扩展(同一 SDK 基线)配套发布。此前独立包仍是旧版,与新版父扩展 API 不匹配,装插件时报 missing method。"
+                                          }
+                                      ],
+                         "category":  "Hardware",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts"
+                                        ],
+                         "dependencies":  [
+                                              "TeamPLT.Contracts"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Plugins.Plc.Siemens",
+                         "name":  "西门子 PLC",
+                         "version":  "1.0.6",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "communication",
+                         "description":  "西门子 S7 协议 PLC 通讯驱动(HslCommunication):通讯扩展子插件,直接导出 IPlcDriverProvider,由通讯宿主反射登记。",
+                         "notes":  "子插件独立成源后的首个新版:与新版父扩展(同一 SDK 基线)配套发布。此前独立包仍是旧版,与新版父扩展 API 不匹配,装插件时报 missing method。",
+                         "downloadUrl":  "packages/communication/Plugins.Plc.Siemens/Plugins.Plc.Siemens-1.0.6.zip",
+                         "sha256":  "7e48a7032f96b1fee29279ffe4f9ac4d2ee7c5e1a615823ba5ce87436ff8b222",
+                         "size":  1647050,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.6",
+                                              "downloadUrl":  "packages/communication/Plugins.Plc.Siemens/Plugins.Plc.Siemens-1.0.6.zip",
+                                              "sha256":  "7e48a7032f96b1fee29279ffe4f9ac4d2ee7c5e1a615823ba5ce87436ff8b222",
+                                              "size":  1647050,
+                                              "releasedAt":  "2026-10-26",
+                                              "status":  "stable",
+                                              "notes":  "子插件独立成源后的首个新版:与新版父扩展(同一 SDK 基线)配套发布。此前独立包仍是旧版,与新版父扩展 API 不匹配,装插件时报 missing method。"
+                                          }
+                                      ],
+                         "category":  "Hardware",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts",
+                                            "Ext.Communication"
+                                        ],
+                         "dependencies":  [
+                                              "TeamPLT.Contracts"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Plugins.WebApi",
+                         "name":  "WebAPI",
+                         "version":  "1.0.4",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "communication",
+                         "description":  "WebAPI 通讯驱动(HTTP/JSON):接口库在调试页配置并保存(方法/路径/请求头/报文模板/取值路径),调用流水落独立日志文件;自带画布「WebAPI」调用节点(通讯模块分组)。",
+                         "notes":  "子插件独立成源后的首个新版:与新版父扩展(同一 SDK 基线)配套发布。此前独立包仍是旧版,与新版父扩展 API 不匹配,装插件时报 missing method。",
+                         "downloadUrl":  "packages/communication/Plugins.WebApi/Plugins.WebApi-1.0.4.zip",
+                         "sha256":  "cb80870fc6b7ba809cb807dba6e047a35d05f9a27c4bfdc2ba5486f6f5bb0710",
+                         "size":  83359,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.4",
+                                              "downloadUrl":  "packages/communication/Plugins.WebApi/Plugins.WebApi-1.0.4.zip",
+                                              "sha256":  "cb80870fc6b7ba809cb807dba6e047a35d05f9a27c4bfdc2ba5486f6f5bb0710",
+                                              "size":  83359,
+                                              "releasedAt":  "2026-10-26",
+                                              "status":  "stable",
+                                              "notes":  "子插件独立成源后的首个新版:与新版父扩展(同一 SDK 基线)配套发布。此前独立包仍是旧版,与新版父扩展 API 不匹配,装插件时报 missing method。"
+                                          }
+                                      ],
+                         "category":  "Hardware",
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts",
+                                            "Ext.Communication",
+                                            "Ext.FlowWork"
+                                        ],
+                         "dependencies":  [
+                                              "TeamPLT.Contracts",
+                                              "Ext.FlowWork"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.24",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "TeamPLT.Contracts",
+                         "name":  "TeamPLT 契约层",
+                         "version":  "3.0.2",
+                         "publisher":  "TeamAAS",
+                         "kind":  "contract",
+                         "host":  "contracts",
+                         "description":  "平台与扩展之间的契约接口层(TeamAAS.Contracts.*)。由平台按扩展 manifest 的 requiresContracts 自动安装到 Runtime\\Contracts,全进程唯一一份。",
+                         "notes":  "契约环境包 3.0.2:新增 ProductMeta.HomeFrameOddPosition(单数画面位置:居前/居中/居后);供 Ext.FlowWork 产品属性与 Ext.Vision 主页布局使用,平台 EXE 无需重编",
+                         "downloadUrl":  "packages/contracts/TeamPLT.Contracts/TeamPLT.Contracts-3.0.2.zip",
+                         "sha256":  "b14fc000d9f7b82e99c8a7d0f6a7f3df9441bc2340acec4532e31bc5f832a098",
+                         "size":  25223,
+                         "versions":  [
+                                          {
+                                              "version":  "3.0.2",
+                                              "downloadUrl":  "packages/contracts/TeamPLT.Contracts/TeamPLT.Contracts-3.0.2.zip",
+                                              "sha256":  "b14fc000d9f7b82e99c8a7d0f6a7f3df9441bc2340acec4532e31bc5f832a098",
+                                              "size":  25223,
+                                              "releasedAt":  "2026-11-02",
+                                              "status":  "stable",
+                                              "notes":  "契约环境包 3.0.2:新增 ProductMeta.HomeFrameOddPosition(单数画面位置:居前/居中/居后);供 Ext.FlowWork 产品属性与 Ext.Vision 主页布局使用,平台 EXE 无需重编"
+                                          }
+                                      ],
+                         "targetFramework":  "netstandard2.0"
+                     },
+                     {
+                         "id":  "TeamPLT.Hosting",
+                         "name":  "TeamPLT 外置宿主通道",
+                         "version":  "1.0.2",
+                         "publisher":  "TeamAAS",
+                         "kind":  "contract",
+                         "host":  "contracts",
+                         "description":  "平台侧外置宿主通道(命名管道 + 行 JSON,多会话/共享宿主)。VPP/VM 等插件运行期依赖,按插件 dependencies 自动安装到 Runtime\\Contracts。",
+                         "notes":  "1.0.2:清理宿主内部细节日志(PID/句柄/队列/窗口尺寸),只保留起停与故障;1.0.1 起共享宿主多会话、断电/崩溃自愈,net48 宿主侧副本随插件包分发。",
+                         "downloadUrl":  "packages/contracts/TeamPLT.Hosting/TeamPLT.Hosting-1.0.2.zip",
+                         "sha256":  "33a12ecd075a70bc9b3f41c74cfca039ea2d9fb0863b888cfd467e504576c556",
+                         "size":  27282,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.2",
+                                              "downloadUrl":  "packages/contracts/TeamPLT.Hosting/TeamPLT.Hosting-1.0.2.zip",
+                                              "sha256":  "33a12ecd075a70bc9b3f41c74cfca039ea2d9fb0863b888cfd467e504576c556",
+                                              "size":  27282,
+                                              "releasedAt":  "2026-11-01",
+                                              "status":  "stable",
+                                              "notes":  "1.0.2:清理宿主内部细节日志(PID/句柄/队列/窗口尺寸),只保留起停与故障;1.0.1 起共享宿主多会话、断电/崩溃自愈,net48 宿主侧副本随插件包分发。"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0"
+                     },
+                     {
+                         "id":  "Ext.AiAssistant",
+                         "name":  "AI 助手",
+                         "version":  "1.0.10",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "平台 AI 助手(标题栏右侧入口):流式对话 + Function Calling,内置默认模型开箱即用;具备文件/命令/进程/窗口/桌面控制、联网搜索与平台命令桥,并提供 MCP 双向能力(内置 MCP Server + 可接入外部 stdio/http MCP 服务器)。",
+                         "notes":  "去掉 net48 时代的框架裸引用(System.Net.Http / System.Drawing):net10 下它们由共享框架与 WindowsForms 带入,裸引用只会让 VS 依赖项报黄色感叹号;产物与运行行为不变",
+                         "downloadUrl":  "packages/platform/Ext.AiAssistant/Ext.AiAssistant-1.0.10.zip",
+                         "sha256":  "8314a076691affb473f13a169bba81aae50958a14b92817f651b22f0ddceb12b",
+                         "size":  363614,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.10",
+                                              "downloadUrl":  "packages/platform/Ext.AiAssistant/Ext.AiAssistant-1.0.10.zip",
+                                              "sha256":  "8314a076691affb473f13a169bba81aae50958a14b92817f651b22f0ddceb12b",
+                                              "size":  363614,
+                                              "releasedAt":  "2026-11-01",
+                                              "status":  "stable",
+                                              "notes":  "去掉 net48 时代的框架裸引用(System.Net.Http / System.Drawing):net10 下它们由共享框架与 WindowsForms 带入,裸引用只会让 VS 依赖项报黄色感叹号;产物与运行行为不变"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts"
+                                        ],
+                         "requiresHost":  "TeamPLT>=2.3.24",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Ext.Cameras",
+                         "name":  "相机",
+                         "version":  "1.1.0",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "相机设备管理与图像采集:连接、曝光/增益、实时预览。内置 USB 相机与仿真相机,其他品牌以子插件接入。",
+                         "notes":  "1.1.0 触发与取像整改:硬触发在开流前预置触发模式、硬件模式保持待触发不断流、按上次取像序号判新帧,避免丢脉冲与旧帧;软触发改为 10ms 轮询 + 1s 补发命令,去掉固定 400ms 等待,一次性触发结束还原原触发模式;取像超时 0 = 不限时(可被流程停止取消),负数 = 默认 3000ms;节点与调试日志改结构化模板,英文日志不再残留中文;UVC 属性重排为 I~VI 六组,调试页状态行去掉帧序号;语言包补齐并随语言切换刷新。要求平台 ≥ 2.4.7。",
+                         "downloadUrl":  "packages/platform/Ext.Cameras/Ext.Cameras-1.1.0.zip",
+                         "sha256":  "af36c48311cd25980c2e00f5f06cead4853f2c0504efee902369038777af9fa7",
+                         "size":  614768,
+                         "versions":  [
+                                          {
+                                              "version":  "1.1.0",
+                                              "downloadUrl":  "packages/platform/Ext.Cameras/Ext.Cameras-1.1.0.zip",
+                                              "sha256":  "af36c48311cd25980c2e00f5f06cead4853f2c0504efee902369038777af9fa7",
+                                              "size":  614768,
+                                              "releasedAt":  "2026-11-02",
+                                              "status":  "stable",
+                                              "notes":  "1.1.0 触发与取像整改:硬触发在开流前预置触发模式、硬件模式保持待触发不断流、按上次取像序号判新帧,避免丢脉冲与旧帧;软触发改为 10ms 轮询 + 1s 补发命令,去掉固定 400ms 等待,一次性触发结束还原原触发模式;取像超时 0 = 不限时(可被流程停止取消),负数 = 默认 3000ms;节点与调试日志改结构化模板,英文日志不再残留中文;UVC 属性重排为 I~VI 六组,调试页状态行去掉帧序号;语言包补齐并随语言切换刷新。要求平台 ≥ 2.4.7。"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts"
+                                        ],
+                         "dependencies":  [
+                                              "Ext.Vision"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.4.7",
+                         "arch":  [
+                                      "x64"
+                                  ],
+                         "nativeDependencies":  [
+                                                    "OpenCvSharpExtern.dll"
+                                                ]
+                     },
+                     {
+                         "id":  "Ext.ColorSchemes",
+                         "name":  "配色示例",
+                         "version":  "1.1.0",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "配色方案包:11 套种子色配色,菜单「外观 → 配色」随选随换,选择会被记住。",
+                         "notes":  "1.1.0 新增晨雾、赤陶、靛蓝、橄榄四套,并补齐四语言名称与说明。1.0.5 及以前是青灰、工业橙、深海蓝、松林绿、紫晶、暖砂、高对比七套。",
+                         "downloadUrl":  "packages/platform/Ext.ColorSchemes/Ext.ColorSchemes-1.1.0.zip",
+                         "sha256":  "bc9f7d0b1ac3766c4a2272114a2bdca9e2b006b14ae186f060903889a527c1c2",
+                         "size":  20260,
+                         "versions":  [
+                                          {
+                                              "version":  "1.1.0",
+                                              "downloadUrl":  "packages/platform/Ext.ColorSchemes/Ext.ColorSchemes-1.1.0.zip",
+                                              "sha256":  "bc9f7d0b1ac3766c4a2272114a2bdca9e2b006b14ae186f060903889a527c1c2",
+                                              "size":  20260,
+                                              "releasedAt":  "2026-11-01",
+                                              "status":  "stable",
+                                              "notes":  "1.1.0 新增晨雾、赤陶、靛蓝、橄榄四套,并补齐四语言名称与说明。1.0.5 及以前是青灰、工业橙、深海蓝、松林绿、紫晶、暖砂、高对比七套。"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts"
+                                        ],
+                         "requiresHost":  "TeamPLT>=2.3.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Ext.Communication",
+                         "name":  "通讯",
+                         "version":  "1.2.0",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "通讯设备管理:TCP / UDP / 串口透传、Modbus TCP 与品牌 PLC,支持地址读写与报文记录;通用通讯节点(PLC读取/写入/等待、通讯等待/写入)随本扩展自带,无需单独安装。",
+                         "notes":  "1.2.0: 通用通讯节点包 Plugins.CommIo 改为随本扩展分发(包内 Plugins\\Plugins.CommIo\\,内容与 1.2.11 一致,程序集名未变、老流程不受影响),独立节点包下架。1.1.11: ①修复「启用通讯记录」开关不落盘——communication.json 只存记录目录不存开关,安装/更新其它扩展导致平台重启或通讯服务重建后恢复默认 false;现在随配置保存/恢复(品牌 PLC 走反射)。②通讯记录时间顺序修正——合并行只在它仍是文件最后一行时原位回写;中间插入过 WRITE/NOTE/别的读取行时另起一段追加,日志严格按时间递增、最新在下(不再出现 06 分的 READ 排在 02 分 WRITE 上面)。1.1.10: 读取流水合并。",
+                         "downloadUrl":  "packages/platform/Ext.Communication/Ext.Communication-1.2.0.zip",
+                         "sha256":  "717b6853c0fffb30f33b5d6f5c77a0b5453afc1d62efbb56e6bfebcc8eb7c508",
+                         "size":  2312105,
+                         "versions":  [
+                                          {
+                                              "version":  "1.2.0",
+                                              "downloadUrl":  "packages/platform/Ext.Communication/Ext.Communication-1.2.0.zip",
+                                              "sha256":  "717b6853c0fffb30f33b5d6f5c77a0b5453afc1d62efbb56e6bfebcc8eb7c508",
+                                              "size":  2312105,
+                                              "releasedAt":  "2026-10-30",
+                                              "status":  "stable",
+                                              "notes":  "1.2.0: 通用通讯节点包 Plugins.CommIo 改为随本扩展分发(包内 Plugins\\Plugins.CommIo\\,内容与 1.2.11 一致,程序集名未变、老流程不受影响),独立节点包下架。1.1.11: ①修复「启用通讯记录」开关不落盘——communication.json 只存记录目录不存开关,安装/更新其它扩展导致平台重启或通讯服务重建后恢复默认 false;现在随配置保存/恢复(品牌 PLC 走反射)。②通讯记录时间顺序修正——合并行只在它仍是文件最后一行时原位回写;中间插入过 WRITE/NOTE/别的读取行时另起一段追加,日志严格按时间递增、最新在下(不再出现 06 分的 READ 排在 02 分 WRITE 上面)。1.1.10: 读取流水合并。"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts"
+                                        ],
+                         "dependencies":  [
+                                              "TeamPLT.Contracts"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.38",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Ext.Database",
+                         "name":  "数据库",
+                         "version":  "1.0.3",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "数据库连接与查询:SQL Server / MySQL / SQLite,含查询台与流程节点。",
+                         "notes":  "• 连接配置统一管理,支持参数化 SQL、结果导出 CSV\n• 驱动以子插件接入(DbProviders)\n• 流程节点:查询 / 执行 / 取单值 / 写入记录",
+                         "downloadUrl":  "packages/platform/Ext.Database/Ext.Database-1.0.3.zip",
+                         "sha256":  "9cbd41e3c40e8fbe0c08a0160820817cee15fb192daa5739394bc5bc1a79ada0",
+                         "size":  3258877,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.3",
+                                              "downloadUrl":  "packages/platform/Ext.Database/Ext.Database-1.0.3.zip",
+                                              "sha256":  "9cbd41e3c40e8fbe0c08a0160820817cee15fb192daa5739394bc5bc1a79ada0",
+                                              "size":  3258877,
+                                              "releasedAt":  "2026-10-29",
+                                              "status":  "stable",
+                                              "notes":  "• 连接配置统一管理,支持参数化 SQL、结果导出 CSV\n• 驱动以子插件接入(DbProviders)\n• 流程节点:查询 / 执行 / 取单值 / 写入记录"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts"
+                                        ],
+                         "dependencies":  [
+                                              "Ext.FlowWork"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Ext.Feeder",
+                         "name":  "震料器",
+                         "version":  "1.2.11",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "震料器模块:设备管理、振动启停与背光控制(内置 Team 震料盘 TCP 驱动与仿真震料器;其他品牌驱动以扩展插件接入)。",
+                         "notes":  "1.2.11: 振动方向对齐 Team 协议 11 组振动集(A~K,契约 FeederRunMode 追加 9 个方向;正转/反转仍是 F/A,老流程行为不变)。1.2.10: 修复“启动时自动连接震料器”不生效——平台只回调显式实现 IUiReadyExtension 的扩展,此前类声明漏了这个接口,OnUiReady 从未被调用;现在启动后按设置后台连接全部震料器。1.2.9: 序列集按步骤时长串行执行并重排序号;序列/振动集落盘。1.2.8: 设备列表上移/下移/保存配置与保存状态。1.2.7: 振动集参数可从设备读取。1.2.6/1.2.5: 修复空闲误判断线。1.2.4: 状态栏设备清单。1.2.3: 动作/背光卡 UI 修复。1.2.2: 去属性列。1.2.1: 调试页简化。1.2.0: 升级 net10。",
+                         "downloadUrl":  "packages/platform/Ext.Feeder/Ext.Feeder-1.2.11.zip",
+                         "sha256":  "54d2928c31f7685eae435f670200f7ce0bb51ab363b6fcd0655ad4d4686d6877",
+                         "size":  96112,
+                         "versions":  [
+                                          {
+                                              "version":  "1.2.11",
+                                              "downloadUrl":  "packages/platform/Ext.Feeder/Ext.Feeder-1.2.11.zip",
+                                              "sha256":  "54d2928c31f7685eae435f670200f7ce0bb51ab363b6fcd0655ad4d4686d6877",
+                                              "size":  96112,
+                                              "releasedAt":  "2026-10-29",
+                                              "status":  "stable",
+                                              "notes":  "1.2.11: 振动方向对齐 Team 协议 11 组振动集(A~K,契约 FeederRunMode 追加 9 个方向;正转/反转仍是 F/A,老流程行为不变)。1.2.10: 修复“启动时自动连接震料器”不生效——平台只回调显式实现 IUiReadyExtension 的扩展,此前类声明漏了这个接口,OnUiReady 从未被调用;现在启动后按设置后台连接全部震料器。1.2.9: 序列集按步骤时长串行执行并重排序号;序列/振动集落盘。1.2.8: 设备列表上移/下移/保存配置与保存状态。1.2.7: 振动集参数可从设备读取。1.2.6/1.2.5: 修复空闲误判断线。1.2.4: 状态栏设备清单。1.2.3: 动作/背光卡 UI 修复。1.2.2: 去属性列。1.2.1: 调试页简化。1.2.0: 升级 net10。"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts"
+                                        ],
+                         "dependencies":  [
+                                              "TeamPLT.Contracts"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.24",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Ext.FlowWork",
+                         "name":  "流程画布",
+                         "version":  "1.2.24",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "流程画布与执行引擎:节点编排、运行调试、变量与产品管理,同时也是流程节点插件的宿主。",
+                         "notes":  "轮末内存回收改为按本流程(含组合模块子流程)精确释放:多相机并行时不再互相清掉对方本轮正在用的图像,修复 VPP 刚出图、下游变量设置/图像显示/图像保存偶发解析不到值并报“String / 解析不到值”的问题。组合模块输入:上游公式本轮解析不到值时按空值传入,不再把公式原文当字符串送进子流程。自动备份多选:读盘按替换语义并按名去重,已存的重复项读一次自动收敛(只勾 5 项不再显示已选 10 项)。",
+                         "downloadUrl":  "packages/platform/Ext.FlowWork/Ext.FlowWork-1.2.24.zip",
+                         "sha256":  "ba9c38b18454f1d50cfe8e3540b9c18aef19a7a6221d5f75a2228c67ae997b36",
+                         "size":  2788544,
+                         "versions":  [
+                                          {
+                                              "version":  "1.2.24",
+                                              "downloadUrl":  "packages/platform/Ext.FlowWork/Ext.FlowWork-1.2.24.zip",
+                                              "sha256":  "ba9c38b18454f1d50cfe8e3540b9c18aef19a7a6221d5f75a2228c67ae997b36",
+                                              "size":  2788544,
+                                              "releasedAt":  "2026-10-29",
+                                              "status":  "stable",
+                                              "notes":  "轮末内存回收改为按本流程(含组合模块子流程)精确释放:多相机并行时不再互相清掉对方本轮正在用的图像,修复 VPP 刚出图、下游变量设置/图像显示/图像保存偶发解析不到值并报“String / 解析不到值”的问题。组合模块输入:上游公式本轮解析不到值时按空值传入,不再把公式原文当字符串送进子流程。自动备份多选:读盘按替换语义并按名去重,已存的重复项读一次自动收敛(只勾 5 项不再显示已选 10 项)。"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts"
+                                        ],
+                         "requiresHost":  "TeamPLT>=2.3.24",
+                         "arch":  [
+                                      "x64"
+                                  ],
+                         "nativeDependencies":  [
+                                                    "OpenCvSharpExtern.dll"
+                                                ]
+                     },
+                     {
+                         "id":  "Ext.Hmi",
+                         "name":  "HMI 介面",
+                         "version":  "1.0.2",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "機台 HMI 介面扩展:AutomationCenter 三級權限介面(全屏運行時窗口 + 屏模型 + 角色代稱 + 事件通道)。",
+                         "notes":  "1.0.2: 視覺對齊客戶 PDF —— ENG 量測參數表固定淺色前景與交替底色且五列不再裁切、OP 運行中標題置中加粗、底欄角色代稱改顯示分級角色名。1.0.1: Dev 開發者視圖改為全屏綠底(對齊客戶 PDF p09),參數表改白底卡片承載以保證可讀性。1.0.0: 首版 —— 機台 HMI 三級權限介面(AutomationCenter 全屏運行時窗口 + 屏模型 + 角色代稱 + 事件通道 + 10 個流程節點)。",
+                         "downloadUrl":  "packages/platform/Ext.Hmi/Ext.Hmi-1.0.2.zip",
+                         "sha256":  "6d14f91b430642de3ef2af0d95593c2654bdb24506f00c3516953466fd4c295e",
+                         "size":  93880,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.2",
+                                              "downloadUrl":  "packages/platform/Ext.Hmi/Ext.Hmi-1.0.2.zip",
+                                              "sha256":  "6d14f91b430642de3ef2af0d95593c2654bdb24506f00c3516953466fd4c295e",
+                                              "size":  93880,
+                                              "releasedAt":  "2026-10-29",
+                                              "status":  "stable",
+                                              "notes":  "1.0.2: 視覺對齊客戶 PDF —— ENG 量測參數表固定淺色前景與交替底色且五列不再裁切、OP 運行中標題置中加粗、底欄角色代稱改顯示分級角色名。1.0.1: Dev 開發者視圖改為全屏綠底(對齊客戶 PDF p09),參數表改白底卡片承載以保證可讀性。1.0.0: 首版 —— 機台 HMI 三級權限介面(AutomationCenter 全屏運行時窗口 + 屏模型 + 角色代稱 + 事件通道 + 10 個流程節點)。"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts"
+                                        ],
+                         "dependencies":  [
+                                              "TeamPLT.Contracts"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.24",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Ext.Light",
+                         "name":  "光源",
+                         "version":  "1.2.0",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "光源模块:通道亮度控制与全开全关,内置仿真光源与 KCS 串口真机驱动;流程控制节点由 Plugins.Light 提供(随本扩展自带,无需单独安装)。",
+                         "notes":  "1.2.0: 流程节点包 Plugins.Light 改为随本扩展分发(包内 Plugins\\Plugins.Light\\),不再单独发布;节点内容与 1.0.8 一致,已装旧版的不受影响",
+                         "downloadUrl":  "packages/platform/Ext.Light/Ext.Light-1.2.0.zip",
+                         "sha256":  "d7030a026410ef8204c8d2fa9ed00cdb7c763223b7f4f084b18c160728faa808",
+                         "size":  510088,
+                         "versions":  [
+                                          {
+                                              "version":  "1.2.0",
+                                              "downloadUrl":  "packages/platform/Ext.Light/Ext.Light-1.2.0.zip",
+                                              "sha256":  "d7030a026410ef8204c8d2fa9ed00cdb7c763223b7f4f084b18c160728faa808",
+                                              "size":  510088,
+                                              "releasedAt":  "2026-10-30",
+                                              "status":  "stable",
+                                              "notes":  "1.2.0: 流程节点包 Plugins.Light 改为随本扩展分发(包内 Plugins\\Plugins.Light\\),不再单独发布;节点内容与 1.0.8 一致,已装旧版的不受影响"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts"
+                                        ],
+                         "dependencies":  [
+                                              "Ext.FlowWork"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.24",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Ext.Navigation.Classic",
+                         "name":  "导航(经典顶部)",
+                         "version":  "1.0.5",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "经典顶部导航:把左侧活动栏换成 2.0 形态的顶部横条。",
+                         "notes":  "注册导航规则服务:平台按活动 id 与显示标题取进入权限级别,规则仍只存在本扩展的设置里",
+                         "downloadUrl":  "packages/platform/Ext.Navigation.Classic/Ext.Navigation.Classic-1.0.5.zip",
+                         "sha256":  "9f755ef1648e30360704830974a508b69401dee847b4d5ab72f4320ab250b6d0",
+                         "size":  473013,
+                         "versions":  [
+                                          {
+                                              "version":  "1.0.5",
+                                              "downloadUrl":  "packages/platform/Ext.Navigation.Classic/Ext.Navigation.Classic-1.0.5.zip",
+                                              "sha256":  "9f755ef1648e30360704830974a508b69401dee847b4d5ab72f4320ab250b6d0",
+                                              "size":  473013,
+                                              "releasedAt":  "2026-10-26",
+                                              "status":  "stable",
+                                              "notes":  "注册导航规则服务:平台按活动 id 与显示标题取进入权限级别,规则仍只存在本扩展的设置里"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts"
+                                        ],
+                         "requiresHost":  "TeamPLT>=2.3.24",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Ext.Robots",
+                         "name":  "机械手",
+                         "version":  "1.2.4",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "机械手设备接入:点位示教、三种运动、状态与 IO 控制。",
+                         "notes":  "机械手服务改走 Api.Service,不再依赖画布扩展内部实现",
+                         "downloadUrl":  "packages/platform/Ext.Robots/Ext.Robots-1.2.4.zip",
+                         "sha256":  "cc0e717161bd4f325b4ab037e8c4a69ccf17d040ec6adbf83578b7f6f292d95a",
+                         "size":  115400,
+                         "versions":  [
+                                          {
+                                              "version":  "1.2.4",
+                                              "downloadUrl":  "packages/platform/Ext.Robots/Ext.Robots-1.2.4.zip",
+                                              "sha256":  "cc0e717161bd4f325b4ab037e8c4a69ccf17d040ec6adbf83578b7f6f292d95a",
+                                              "size":  115400,
+                                              "releasedAt":  "2026-10-26",
+                                              "status":  "stable",
+                                              "notes":  "机械手服务改走 Api.Service,不再依赖画布扩展内部实现"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts"
+                                        ],
+                         "dependencies":  [
+                                              "Ext.FlowWork"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.24",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "Ext.Vision",
+                         "name":  "视觉",
+                         "version":  "1.3.0",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "视觉引擎宿主:HALCON / VM / VisionPro / OpenCV 四套引擎的注册与切换,视觉算子以子插件接入;自带 OpenCV 运行库三件套(全平台唯一分发源)。",
+                         "notes":  "1.3.0:图像保存新增每条规则「保留天数」——保存成功后后台清理超过 N 天的图片并删除空目录(同目录 1 小时节流,保存根目录保留,非图片文件不动);节点名/描述、引擎与视口日志、设置中心状态栏补齐中英日繁四语言。1.2.26:图像显示节点「目标画面」改为按名称持久化——画面列表增删/换序后无需重新配置(名称解析不到才回退旧序号,旧流程自动迁移)。1.2.25:图像显示节点不再把每项图像对象作为输出(执行结果里不再挂 GenImage,20MP 图不会随结果/注册表长期驻留),只保留「显示画面数/结果/Error」;图像仍推到主页画面框,显示控件只留位图副本,节点侧引用显示后立即断开。注意:下游若绑定了 &{图像显示.画面名} 获取图像,需改绑上游图像输出。1.2.24:图像保存自定义变量取值按任意类型 ToString。",
+                         "downloadUrl":  "packages/platform/Ext.Vision/Ext.Vision-1.3.0.zip",
+                         "sha256":  "9702f77e9117b3db5cce93cf027b1b4d6618b506787d2facb860035bca1a0974",
+                         "size":  47420215,
+                         "versions":  [
+                                          {
+                                              "version":  "1.3.0",
+                                              "downloadUrl":  "packages/platform/Ext.Vision/Ext.Vision-1.3.0.zip",
+                                              "sha256":  "9702f77e9117b3db5cce93cf027b1b4d6618b506787d2facb860035bca1a0974",
+                                              "size":  47420215,
+                                              "releasedAt":  "2026-11-02",
+                                              "status":  "stable",
+                                              "notes":  "1.3.0:图像保存新增每条规则「保留天数」——保存成功后后台清理超过 N 天的图片并删除空目录(同目录 1 小时节流,保存根目录保留,非图片文件不动);节点名/描述、引擎与视口日志、设置中心状态栏补齐中英日繁四语言。1.2.26:图像显示节点「目标画面」改为按名称持久化——画面列表增删/换序后无需重新配置(名称解析不到才回退旧序号,旧流程自动迁移)。1.2.25:图像显示节点不再把每项图像对象作为输出(执行结果里不再挂 GenImage,20MP 图不会随结果/注册表长期驻留),只保留「显示画面数/结果/Error」;图像仍推到主页画面框,显示控件只留位图副本,节点侧引用显示后立即断开。注意:下游若绑定了 &{图像显示.画面名} 获取图像,需改绑上游图像输出。1.2.24:图像保存自定义变量取值按任意类型 ToString。"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts",
+                                            "Ext.FlowWork",
+                                            "TeamPLT.Contracts.Imaging.IFrameService",
+                                            "TeamPLT.Contracts.Cameras.ICameraService"
+                                        ],
+                         "dependencies":  [
+                                              "Ext.FlowWork"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.39",
+                         "arch":  [
+                                      "x64"
+                                  ],
+                         "nativeDependencies":  [
+                                                    "OpenCvSharpExtern.dll"
+                                                ]
+                     },
+                     {
+                         "id":  "Ext.Welcome",
+                         "name":  "首页",
+                         "version":  "1.1.0",
+                         "publisher":  "TeamPLT",
+                         "kind":  "extension",
+                         "host":  "platform",
+                         "description":  "首页:产品栏、画面区、生产统计与运行日志。",
+                         "notes":  "• 常用入口与最近工程\n• 画面区跟随当前视觉引擎\n• 可整体停用",
+                         "downloadUrl":  "packages/platform/Ext.Welcome/Ext.Welcome-1.1.0.zip",
+                         "sha256":  "7ea073b6f911fe6437155bee167b1cfb9327b0ef794c5b43d0f8e89b0006a375",
+                         "size":  501707,
+                         "versions":  [
+                                          {
+                                              "version":  "1.1.0",
+                                              "downloadUrl":  "packages/platform/Ext.Welcome/Ext.Welcome-1.1.0.zip",
+                                              "sha256":  "7ea073b6f911fe6437155bee167b1cfb9327b0ef794c5b43d0f8e89b0006a375",
+                                              "size":  501707,
+                                              "releasedAt":  "2026-10-29",
+                                              "status":  "stable",
+                                              "notes":  "• 常用入口与最近工程\n• 画面区跟随当前视觉引擎\n• 可整体停用"
+                                          }
+                                      ],
+                         "targetFramework":  "net10.0",
+                         "references":  [
+                                            "TeamPLT.SDK",
+                                            "TeamPLT.Contracts",
+                                            "TeamPLT.Contracts.Products.IProductService",
+                                            "TeamPLT.Contracts.Flow.IFlowRunService",
+                                            "TeamPLT.Contracts.Flow.IGlobalVariableService"
+                                        ],
+                         "dependencies":  [
+                                              "Ext.FlowWork"
+                                          ],
+                         "requiresHost":  "TeamPLT>=2.3.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "TeamPLT.Platform",
+                         "name":  "TeamPLT 平台本体",
+                         "version":  "2.4.9",
+                         "publisher":  "TeamAAS",
+                         "kind":  "platform",
+                         "host":  "platform",
+                         "description":  "平台本体正式版(net10 单文件 + 配置 + Runtime/Refs.zip)。",
+                         "notes":  "2.4.9:隐藏顶部对普通/最大化窗口真正生效(与全屏同机制:换 WindowStyle,而非只把非客户区高度归零);设置中心「系统」页新增 10.隐藏顶部 开关,顶部藏起来后也能从 F10 改回;新增 F9 打开扩展管理。",
+                         "downloadUrl":  "packages/platform/TeamPLT.Platform/TeamPLT.Platform-2.4.9.zip",
+                         "sha256":  "2c71394bea7dec5613cf64347bbe9763a85f5aa9e5a04e278c0a30e4e4cf5ed2",
+                         "size":  82523666,
+                         "versions":  [
+                                          {
+                                              "version":  "2.4.9",
+                                              "downloadUrl":  "packages/platform/TeamPLT.Platform/TeamPLT.Platform-2.4.9.zip",
+                                              "sha256":  "2c71394bea7dec5613cf64347bbe9763a85f5aa9e5a04e278c0a30e4e4cf5ed2",
+                                              "size":  82523666,
+                                              "releasedAt":  "2026-11-03",
+                                              "status":  "stable",
+                                              "notes":  "2.4.9:隐藏顶部对普通/最大化窗口真正生效(与全屏同机制:换 WindowStyle,而非只把非客户区高度归零);设置中心「系统」页新增 10.隐藏顶部 开关,顶部藏起来后也能从 F10 改回;新增 F9 打开扩展管理。"
+                                          }
+                                      ],
+                         "category":  "平台",
+                         "targetFramework":  "net10.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     },
+                     {
+                         "id":  "TeamPLT.Platform.Debug",
+                         "name":  "TeamPLT 平台本体(调试版)",
+                         "version":  "2.4.9",
+                         "publisher":  "TeamAAS",
+                         "kind":  "platform",
+                         "host":  "platform",
+                         "description":  "平台本体调试版(net10 单文件 + 配置 + Runtime/Refs.zip)。",
+                         "notes":  "2.4.9:与正式版同一代码(单文件压缩,约 80MB)。隐藏顶部普通/最大化窗口生效 + 设置中心开关 + F9 扩展管理。",
+                         "downloadUrl":  "packages/platform/TeamPLT.Platform.Debug/TeamPLT.Platform.Debug-2.4.9.zip",
+                         "sha256":  "d0d6b273d43294bc88e4db5e06112f02d17124769274602cf89ccc26b79254f8",
+                         "size":  82594939,
+                         "versions":  [
+                                          {
+                                              "version":  "2.4.9",
+                                              "downloadUrl":  "packages/platform/TeamPLT.Platform.Debug/TeamPLT.Platform.Debug-2.4.9.zip",
+                                              "sha256":  "d0d6b273d43294bc88e4db5e06112f02d17124769274602cf89ccc26b79254f8",
+                                              "size":  82594939,
+                                              "releasedAt":  "2026-11-03",
+                                              "status":  "stable",
+                                              "notes":  "2.4.9:与正式版同一代码(单文件压缩,约 80MB)。隐藏顶部普通/最大化窗口生效 + 设置中心开关 + F9 扩展管理。"
+                                          }
+                                      ],
+                         "category":  "平台",
+                         "flavor":  "Debug",
+                         "targetFramework":  "net10.0",
+                         "arch":  [
+                                      "x64"
+                                  ]
+                     }
+                 ]
+}

BIN
packages/base/Plugins.DeepLearning/Plugins.DeepLearning-1.3.4.zip


BIN
packages/base/Plugins.Feeder/Plugins.Feeder-1.0.1.zip


BIN
packages/base/Plugins.Halcon/Plugins.Halcon-1.1.11.zip


BIN
packages/base/Plugins.OpenCv/Plugins.OpenCv-1.2.7.zip


BIN
packages/base/Plugins.Script/Plugins.Script-1.1.30.zip


BIN
packages/base/Plugins.Vm/Plugins.Vm-1.2.9.zip


BIN
packages/base/Plugins.Vpp/Plugins.Vpp-1.2.20.zip


BIN
packages/cameras/Plugins.Camera.Ahua/Plugins.Camera.Ahua-1.0.7.zip


BIN
packages/cameras/Plugins.Camera.Basler/Plugins.Camera.Basler-1.0.6.zip


BIN
packages/cameras/Plugins.Camera.Hikvision/Plugins.Camera.Hikvision-1.0.14.zip


BIN
packages/communication/Plugins.Mqtt/Plugins.Mqtt-1.0.2.zip


BIN
packages/communication/Plugins.Plc.Mitsubishi/Plugins.Plc.Mitsubishi-1.0.6.zip


BIN
packages/communication/Plugins.Plc.OpcUa/Plugins.Plc.OpcUa-1.0.6.zip


BIN
packages/communication/Plugins.Plc.Siemens/Plugins.Plc.Siemens-1.0.6.zip


BIN
packages/communication/Plugins.WebApi/Plugins.WebApi-1.0.4.zip


BIN
packages/contracts/TeamPLT.Contracts/TeamPLT.Contracts-3.0.2.zip


BIN
packages/contracts/TeamPLT.Hosting/TeamPLT.Hosting-1.0.2.zip


BIN
packages/platform/Ext.AiAssistant/Ext.AiAssistant-1.0.10.zip


BIN
packages/platform/Ext.Cameras/Ext.Cameras-1.1.0.zip


BIN
packages/platform/Ext.ColorSchemes/Ext.ColorSchemes-1.1.0.zip


BIN
packages/platform/Ext.Communication/Ext.Communication-1.2.0.zip


BIN
packages/platform/Ext.Database/Ext.Database-1.0.3.zip


BIN
packages/platform/Ext.Feeder/Ext.Feeder-1.2.11.zip


BIN
packages/platform/Ext.FlowWork/Ext.FlowWork-1.2.24.zip


BIN
packages/platform/Ext.Hmi/Ext.Hmi-1.0.2.zip


BIN
packages/platform/Ext.Light/Ext.Light-1.2.0.zip


BIN
packages/platform/Ext.Navigation.Classic/Ext.Navigation.Classic-1.0.5.zip


BIN
packages/platform/Ext.Robots/Ext.Robots-1.2.4.zip


BIN
packages/platform/Ext.Vision/Ext.Vision-1.3.0.zip


BIN
packages/platform/Ext.Welcome/Ext.Welcome-1.1.0.zip


BIN
packages/platform/TeamPLT.Platform.Debug/TeamPLT.Platform.Debug-2.4.9.zip


BIN
packages/platform/TeamPLT.Platform/TeamPLT.Platform-2.4.9.zip


+ 215 - 0
regen-index.ps1

@@ -0,0 +1,215 @@
+# Regenerate index.json for THIS gallery repository (PLT\Gallery).
+#
+# 为什么自带一份:
+#   主仓库 build\regen-gallery-index.ps1 写死了 "<脚本父目录的父目录>\gallery",
+#   只能服务 TeamAAS-2.1\gallery,无法指向这里。
+#
+# 格式:对齐远端 Gallery 仓库的 GalleryPackage schema(含多版本 versions[]),
+#   以保持内容为准:字段全部来自包内 manifest.json,不再手写,避免 index 与包不一致。
+#   版本历史会继承旧 index 中同 id 的其它版本条目(releasedAt / status / notes 不丢)。
+#
+# 用法(改了 packages\ 下任何 zip 之后执行):
+#   powershell -NoProfile -ExecutionPolicy Bypass -File .\regen-index.ps1
+#
+# 布局约定:packages\<host>\<id>\<id>-<version>.zip(zip 根目录必须含 manifest.json)
+$ErrorActionPreference = 'Stop'
+
+$galleryDir  = $PSScriptRoot
+$packagesDir = Join-Path $galleryDir 'packages'
+$indexPath   = Join-Path $galleryDir 'index.json'
+
+if (-not (Test-Path $packagesDir)) {
+    throw "packages directory not found: $packagesDir"
+}
+
+Add-Type -AssemblyName System.IO.Compression.FileSystem
+
+# 旧 index:仅用于继承版本历史
+$history = @{}
+if (Test-Path $indexPath) {
+    try {
+        $old = (Get-Content $indexPath -Raw -Encoding UTF8) | ConvertFrom-Json
+        foreach ($p in $old.packages) {
+            foreach ($v in $p.versions) {
+                $history["$($p.id)@$($v.version)"] = @{
+                    releasedAt = $v.releasedAt
+                    status     = if ($v.status) { $v.status } else { 'stable' }
+                    notes      = $v.notes
+                }
+            }
+        }
+    } catch {
+        Write-Warning "旧 index.json 解析失败,版本历史不继承:$($_.Exception.Message)"
+    }
+}
+
+$today   = (Get-Date).ToString('yyyy-MM-dd')
+$sha     = [System.Security.Cryptography.SHA256]::Create()
+$entries = New-Object System.Collections.Generic.List[object]
+$seen    = @{}
+
+foreach ($zipFile in (Get-ChildItem -Path $packagesDir -Recurse -Filter '*.zip' | Sort-Object FullName)) {
+    $zip = [System.IO.Compression.ZipFile]::OpenRead($zipFile.FullName)
+    try {
+        $manifestEntry = $zip.Entries |
+            Where-Object { $_.FullName -replace '\\', '/' -eq 'manifest.json' } |
+            Select-Object -First 1
+        if (-not $manifestEntry) {
+            Write-Warning "skip (no manifest.json at root): $($zipFile.Name)"
+            continue
+        }
+
+        $reader = New-Object System.IO.StreamReader($manifestEntry.Open(), [System.Text.Encoding]::UTF8)
+        try { $manifest = $reader.ReadToEnd() } finally { $reader.Dispose() }
+
+        $j = $manifest | ConvertFrom-Json
+        if (-not $j.id -or -not $j.version) {
+            Write-Warning "skip (manifest missing id/version): $($zipFile.Name)"
+            continue
+        }
+
+        $key = "$($j.id)@$($j.version)"
+        if ($seen.ContainsKey($key)) {
+            Write-Warning "skip duplicate: $key ($($zipFile.Name))"
+            continue
+        }
+        $seen[$key] = $true
+
+        $fs = [System.IO.File]::OpenRead($zipFile.FullName)
+        try {
+            $hashBytes = $sha.ComputeHash($fs)
+            $size = $fs.Length
+        } finally { $fs.Dispose() }
+        $hashHex = ([System.BitConverter]::ToString($hashBytes) -replace '-', '').ToLowerInvariant()
+
+        # downloadUrl 存相对路径:GalleryClient 会按实际源根拼接,源换域名也不用改包。
+        $relativeUrl = $zipFile.FullName.Substring($galleryDir.Length + 1) -replace '\\', '/'
+
+        $hostName = if ($j.host) { [string]$j.host } else { 'platform' }
+        $kind     = if ($j.kind) { [string]$j.kind } else { 'extension' }
+        $requires = $null
+        if ($j.requiresHost) {
+            $requires = if ($j.requiresHost.minVersion) {
+                "$($j.requiresHost.id)>=$($j.requiresHost.minVersion)"
+            } else { [string]$j.requiresHost.id }
+        }
+
+        $prev = $history[$key]
+        $versionEntry = [ordered]@{
+            version     = [string]$j.version
+            downloadUrl = $relativeUrl
+            sha256      = $hashHex
+            size        = $size
+            releasedAt  = if ($prev) { $prev.releasedAt } else { $today }
+            status      = if ($prev) { $prev.status } else { 'stable' }
+            # 本版特性优先取被发布物料自己的 manifest.notes(每个版本各自的说明),
+            # 其次继承旧 index 里的同版本记录,最后才是兜底文案。
+            notes       = if ($j.notes) { [string]$j.notes } elseif ($prev -and $prev.notes) { $prev.notes } else { '首次收录' }
+        }
+
+        $entry = [ordered]@{
+            id              = [string]$j.id
+            name            = [string]$j.name
+            version         = [string]$j.version
+            publisher       = if ($j.publisher) { [string]$j.publisher } else { $null }
+            kind            = $kind
+            host            = $hostName
+            description     = if ($j.description) { [string]$j.description } else { $null }
+            notes           = if ($j.notes) { [string]$j.notes } else { $null }
+            downloadUrl     = $relativeUrl
+            sha256          = $hashHex
+            size            = $size
+            versions        = @($versionEntry)
+        }
+        # 以下字段"有才写":与平台仓 build\regen-gallery-index.ps1 保持同一套口径,
+        # 也避免给不声明这些项的包留一堆 null(消费方按"缺省"处理更干净)。
+        if ($j.category) { $entry['category'] = [string]$j.category }
+        if ($j.engine) { $entry['engine'] = [string]$j.engine }
+        # 构建形态(platform 包区分 Debug/Release 用;缺省不带该字段 → 消费方按 Release 处理)
+        if ($j.flavor) { $entry['flavor'] = [string]$j.flavor }
+        if ($j.guid) { $entry['guid'] = [string]$j.guid }
+        if ($j.targetFramework) { $entry['targetFramework'] = [string]$j.targetFramework }
+        if ($j.references -and @($j.references).Count -gt 0) { $entry['references'] = @($j.references) }
+        if ($j.dependencies -and @($j.dependencies).Count -gt 0) { $entry['dependencies'] = @($j.dependencies) }
+        if ($requires) { $entry['requiresHost'] = $requires }
+        if ($j.arch -and @($j.arch).Count -gt 0) { $entry['arch'] = @($j.arch) }
+        # 随包原生库:安装时这些文件必须落地(厂商原生库版本要严格跟随插件),
+        # 缺了会沿用"平台已有同名则跳过"的去重策略,装上新版插件却还是旧原生库。
+        if ($j.nativeDependencies -and @($j.nativeDependencies).Count -gt 0) { $entry['nativeDependencies'] = @($j.nativeDependencies) }        if ($j.flavor) { $entry['flavor'] = [string]$j.flavor }
+
+        $entries.Add([PSCustomObject]$entry)
+        Write-Host ("indexed {0} {1} [{2}]  {3} bytes  {4}" -f $j.id, $j.version, $hostName, $size, $hashHex)
+    } finally {
+        $zip.Dispose()
+    }
+}
+$sha.Dispose()
+
+# ---------------------------------------------------------------------------
+# 合并同 id 的多条为单一条目:
+#   index.json 的契约是 packages[] 每个 id 只出现一次,多版本装在 versions[] 里
+#   (SDK 侧 GalleryPackage.AllVersions 就按这个读)。
+#   若同 id 各版本各占一条,平台按 id 取一条展示 —— 表现为"版本下拉只有最新一版",
+#   旧版本永远选不到。这里按 id 归并,并把顶层字段对齐到最高版本。
+# ---------------------------------------------------------------------------
+function Get-VersionKey([string]$v) {
+    $parsed = $null
+    if ([version]::TryParse($v, [ref]$parsed)) { return $parsed }
+    return [version]'0.0'
+}
+
+$byId = [ordered]@{}
+foreach ($e in $entries) {
+    $id = [string]$e.id
+    if ($byId.Contains($id)) {
+        $cur = $byId[$id]
+        $mergedVersions = @($cur.versions) + @($e.versions)
+
+        # 顶层字段必须对齐到"更高的版本",而不是沿用先遇到的那条。
+        # dependencies / references / kind / description 等各版本可能不同 ——
+        # 例如 1.0.0 依赖后来废弃的契约包,1.0.1 改依赖新契约包。
+        # 若顶层留在旧版(文件序通常旧版在前),平台按 id 读到的就是旧依赖,
+        # 表现为"明明装了新版,却提示旧依赖未安装"。故版本更高时整体替换,再挂回累计版本列表。
+        if ((Get-VersionKey $e.version) -gt (Get-VersionKey $cur.version)) {
+            $cur = $e.PSObject.Copy()
+        }
+        $cur.versions = $mergedVersions
+        if (-not $cur.notes -and $e.notes) { $cur.notes = $e.notes }
+        $byId[$id] = $cur
+    } else {
+        $byId[$id] = $e
+    }
+}
+
+$merged = New-Object System.Collections.Generic.List[object]
+foreach ($id in $byId.Keys) {
+    $p = $byId[$id]
+    $versions = @($p.versions | Sort-Object -Property @{ Expression = {
+        $v = $null
+        if ([version]::TryParse([string]$_.version, [ref]$v)) { $v } else { [version]'0.0' }
+    } } -Descending)
+    if ($versions.Count -eq 0) { continue }
+    $top = $versions[0]
+    $p.versions    = $versions
+    $p.version     = [string]$top.version
+    $p.downloadUrl = $top.downloadUrl
+    $p.sha256      = $top.sha256
+    $p.size        = $top.size
+    $p.notes       = if ($p.notes) { $p.notes } else { $top.notes }
+    $merged.Add([PSCustomObject]$p)
+}
+
+# Stable order: host (platform first), then id.
+$sorted = @($merged | Sort-Object @{ Expression = { $_.host } }, @{ Expression = { $_.id } })
+
+$index = [ordered]@{
+    schemaVersion = 1
+    generatedAt   = (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
+    packages      = $sorted
+}
+
+$json = $index | ConvertTo-Json -Depth 12
+# ConvertTo-Json 会把 ">" 转义成 \u003e(合法 JSON 但可读性差,且与线上文件不一致),还原。
+$json = $json -replace '\\u003e', '>' -replace '\\u003c', '<' -replace '\\u0026', '&'
+[System.IO.File]::WriteAllText($indexPath, $json, (New-Object System.Text.UTF8Encoding($false)))
+Write-Host "REGEN DONE: $($sorted.Count) package(s) -> $indexPath"

+ 82 - 0
sync-index.ps1

@@ -0,0 +1,82 @@
+<#
+.SYNOPSIS
+    按【发布仓里真实存在的包】重算 index.json 的 size / sha256。
+
+.DESCRIPTION
+    为什么必须有这一步:
+      构建机上的 gallery 源(TeamAAS-2.1\gallery)与发布仓(本目录)是两个独立的目录,
+      长期各自打包、各自推送 —— 两边同名包常常不是同一份文件。
+      而打包时会按【本地源】全量 REGEN 索引,若把这份索引直接推到发布仓,
+      客户端就会拿本地源记录的 size/sha256 去校验发布仓里的另一个文件,
+      安装时报 "大小不匹配:期望 X 字节,实际 Y 字节"。
+
+      因此:每次往发布仓放包之后、提交索引之前,必须跑一次本脚本,
+      让索引里的 size/sha256 与发布仓里实际的文件严格一致。
+
+    用法:
+      .\sync-index.ps1            # 校正并打印改动数量
+      .\sync-index.ps1 -Check     # 只检查,不写文件(适合在提交前做校验/输出不符条目数)
+
+.NOTES
+    只改 size / sha256 两个字段,其余元数据(名称/描述/依赖/版本历史)保持原样。
+    编码按原文件的 BOM 状态原样写回,避免把 UTF-8 内容写坏。
+#>
+param(
+    [switch]$Check
+)
+
+$ErrorActionPreference = 'Stop'
+
+$root = $PSScriptRoot
+$idxPath = Join-Path $root 'index.json'
+
+if (-not (Test-Path $idxPath)) { throw "未找到索引文件:$idxPath" }
+
+# 原样保持 BOM 状态
+$bytes = [IO.File]::ReadAllBytes($idxPath)
+$hasBom = ($bytes.Length -ge 3 -and $bytes[0] -eq 239 -and $bytes[1] -eq 187 -and $bytes[2] -eq 191)
+$text = [IO.File]::ReadAllText($idxPath, [Text.Encoding]::UTF8)
+
+# 发布仓里真实存在的包
+$files = @{}
+foreach ($p in (Get-ChildItem (Join-Path $root 'packages') -Recurse -Filter '*.zip' -ErrorAction SilentlyContinue)) {
+    $rel = $p.FullName.Substring($root.Length).TrimStart('\', '/') -replace '\\', '/'
+    $files[$rel] = $p
+}
+
+# 索引里引用到的包路径
+$refs = [regex]::Matches($text, '"downloadUrl":\s*"([^"]+)"') |
+        ForEach-Object { $_.Groups[1].Value } | Sort-Object -Unique
+
+$fixed = 0
+$missing = @()
+
+foreach ($rel in $refs) {
+    if (-not $files.ContainsKey($rel)) { $missing += $rel; continue }
+
+    $f = $files[$rel]
+    $sha = (Get-FileHash $f.FullName -Algorithm SHA256).Hash.ToLower()
+    $size = $f.Length
+    $esc = [regex]::Escape($rel)
+
+    # 结构固定为:downloadUrl → sha256 → size
+    $pattern = '("downloadUrl":\s*"' + $esc + '",\s*"sha256":\s*")[0-9a-fA-F]*(",\s*"size":\s*)\d+'
+    $new = [regex]::Replace($text, $pattern, ('${1}' + $sha + '${2}' + $size))
+    if ($new -ne $text) { $fixed++ }
+    $text = $new
+}
+
+if ($Check) {
+    Write-Host ("不符条目: " + $fixed + " 处")
+} else {
+    [IO.File]::WriteAllText($idxPath, $text, (New-Object Text.UTF8Encoding($hasBom)))
+    Write-Host ("索引已按发布仓实际包校正: " + $fixed + " 处(BOM=" + $hasBom + ")")
+}
+
+if ($missing.Count -gt 0) {
+    Write-Host "警告:索引中有 $($missing.Count) 个条目指向发布仓不存在的包(客户端安装会 404):" -ForegroundColor Yellow
+    $missing | Sort-Object -Unique | ForEach-Object { Write-Host ("   " + $_) -ForegroundColor Yellow }
+}
+
+if ($Check -and $fixed -gt 0) { exit 1 }
+exit 0