agentworkshop 0.7.33 → 0.7.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (945) hide show
  1. package/.output/.AgentWorkShop/aml-python/aml_eval.py +171 -0
  2. package/.output/.AgentWorkShop/aml-python/amlkit.py +120 -0
  3. package/.output/.AgentWorkShop/aml-python/requirements.txt +7 -0
  4. package/.output/.AgentWorkShop/aml-python/train-example.py +92 -0
  5. package/.output/.AgentWorkShop/schema.json +2 -1
  6. package/.output/nitro.json +1 -1
  7. package/.output/public/_nuxt/{DLljr7g0.js → 45zuyAso.js} +1 -1
  8. package/.output/public/_nuxt/4sIEbgcl.js +42 -0
  9. package/.output/public/_nuxt/8NMOXZOV.js +1 -0
  10. package/.output/public/_nuxt/BCGafdXT.js +2 -0
  11. package/.output/public/_nuxt/BDNMzG2s2.js +1 -0
  12. package/.output/public/_nuxt/{C-mDhyEd.js → BDmh31hl.js} +1 -1
  13. package/.output/public/_nuxt/BFkgkW8u.js +4 -0
  14. package/.output/public/_nuxt/BG8sCcwx.js +14 -0
  15. package/.output/public/_nuxt/{D8CqF0yy.js → BHA40aHa.js} +1 -1
  16. package/.output/public/_nuxt/BJHKLJJU.js +1 -0
  17. package/.output/public/_nuxt/{DoTdlVVe2.js → BN6iuJEg2.js} +1 -1
  18. package/.output/public/_nuxt/BNT8gYU92.js +4 -0
  19. package/.output/public/_nuxt/BU83-NnX.js +106 -0
  20. package/.output/public/_nuxt/BYhEUx8t.js +17 -0
  21. package/.output/public/_nuxt/BzHEilTt.js +1 -0
  22. package/.output/public/_nuxt/{Ct-WOVr4.js → C3J6FYKa.js} +1 -1
  23. package/.output/public/_nuxt/C3gwHTz0.js +1 -0
  24. package/.output/public/_nuxt/C4DWUZ6d2.js +1 -0
  25. package/.output/public/_nuxt/C5gUkRwn.js +1 -0
  26. package/.output/public/_nuxt/CClOy-Hz2.js +1 -0
  27. package/.output/public/_nuxt/{CUXCQXjG.js → CM12FuB42.js} +1 -1
  28. package/.output/public/_nuxt/{BSCpFtzG.js → CSkxz2NX.js} +1 -1
  29. package/.output/public/_nuxt/CWoJjWmZ.js +1 -0
  30. package/.output/public/_nuxt/CY9LbPCI.js +1 -0
  31. package/.output/public/_nuxt/CYWVXZTS.js +7 -0
  32. package/.output/public/_nuxt/CZiw7sEV.js +1 -0
  33. package/.output/public/_nuxt/C_OLzD09.js +1 -0
  34. package/.output/public/_nuxt/C__m4EhR.js +1 -0
  35. package/.output/public/_nuxt/Cbq-mryP.js +1 -0
  36. package/.output/public/_nuxt/{C4OAdbVK2.js → Cc_9VzD42.js} +1 -1
  37. package/.output/public/_nuxt/{BASN8nZ0.js → CdPzkOMV.js} +1 -1
  38. package/.output/public/_nuxt/Cec0Ua3F.js +1 -0
  39. package/.output/public/_nuxt/{DYKVPzN-.js → CoNpEq5X.js} +1 -1
  40. package/.output/public/_nuxt/CojCTLKD.js +1 -0
  41. package/.output/public/_nuxt/{B7wL3pDk.js → Crod5z2f.js} +1 -1
  42. package/.output/public/_nuxt/CzlMDL5H.js +13 -0
  43. package/.output/public/_nuxt/{G0qIw7Gq2.js → D0ZBQrN_2.js} +1 -1
  44. package/.output/public/_nuxt/{Lp7Ll94I.js → D1YDxZpZ.js} +1 -1
  45. package/.output/public/_nuxt/{Bc0AmjfT.js → D20Yamr4.js} +1 -1
  46. package/.output/public/_nuxt/D6uzXueg.js +2 -0
  47. package/.output/public/_nuxt/D9Oidm5I.js +1 -0
  48. package/.output/public/_nuxt/DAe0h2MB.js +1 -0
  49. package/.output/public/_nuxt/DBHNsT1Y.js +23 -0
  50. package/.output/public/_nuxt/DDShH71m.js +1 -0
  51. package/.output/public/_nuxt/DDgJcSET.js +19 -0
  52. package/.output/public/_nuxt/DHFrCUxA2.js +13 -0
  53. package/.output/public/_nuxt/{BcrN7QEl2.js → DIaZ2PTo2.js} +1 -1
  54. package/.output/public/_nuxt/DPnwL14Y.js +1 -0
  55. package/.output/public/_nuxt/DR12_WCA.js +3 -0
  56. package/.output/public/_nuxt/{B9nXmjSB.js → DUrecWPx.js} +4 -4
  57. package/.output/public/_nuxt/DVsjtsvZ2.js +1 -0
  58. package/.output/public/_nuxt/DYr1VMiQ.js +6 -0
  59. package/.output/public/_nuxt/DZtm4l-P2.js +1 -0
  60. package/.output/public/_nuxt/DdD9mCHM.js +1 -0
  61. package/.output/public/_nuxt/DeJykBFf.js +9 -0
  62. package/.output/public/_nuxt/{DoMxCWN52.js → DeyBFhKH2.js} +1 -1
  63. package/.output/public/_nuxt/DkGQ7lnb2.js +1 -0
  64. package/.output/public/_nuxt/DmqknNvV.js +18 -0
  65. package/.output/public/_nuxt/DnUuIR83.js +1 -0
  66. package/.output/public/_nuxt/DrYV5i68.js +1 -0
  67. package/.output/public/_nuxt/{B5S_UyaC.js → DtYHUi5Z.js} +1 -1
  68. package/.output/public/_nuxt/Dz_Q3Lpw2.js +1 -0
  69. package/.output/public/_nuxt/DzbFpZRk.js +3 -0
  70. package/.output/public/_nuxt/HBLJ-wei.js +1 -0
  71. package/.output/public/_nuxt/JCoYF4IJ.js +31 -0
  72. package/.output/public/_nuxt/JTLM-kqr2.js +1 -0
  73. package/.output/public/_nuxt/{BeIfu4N3.js → KZQX7xoM.js} +2 -2
  74. package/.output/public/_nuxt/S_fVQwJK.js +1 -0
  75. package/.output/public/_nuxt/TownView.0oLiQgTC.css +1 -0
  76. package/.output/public/_nuxt/YnQxK3eG.js +1 -0
  77. package/.output/public/_nuxt/_id_.D-SYuyZb.css +1 -0
  78. package/.output/public/_nuxt/_id_.hma_BU6T.css +1 -0
  79. package/.output/public/_nuxt/_wsId_.B12v3PhY.css +1 -0
  80. package/.output/public/_nuxt/aLLjF2K-2.js +1 -0
  81. package/.output/public/_nuxt/aWWIh8YL.js +24 -0
  82. package/.output/public/_nuxt/ahgEJu2R.js +1 -0
  83. package/.output/public/_nuxt/aml.COEKNNqK.css +1 -0
  84. package/.output/public/_nuxt/builds/latest.json +1 -1
  85. package/.output/public/_nuxt/builds/meta/a66fdef7-dcfd-453b-b1f6-543c7dfd98d5.json +1 -0
  86. package/.output/public/_nuxt/daq.B3265ZDn.css +1 -0
  87. package/.output/public/_nuxt/dcw.DLYZqEhT.css +1 -0
  88. package/.output/public/_nuxt/default.DE_vT238.css +1 -0
  89. package/.output/public/_nuxt/entry.BB-Eeh-J.css +1 -0
  90. package/.output/public/_nuxt/jZsY8yYz.js +1 -0
  91. package/.output/public/_nuxt/logs.CqFyMrJw.css +1 -0
  92. package/.output/public/_nuxt/pages.ooEzrMm9.css +1 -0
  93. package/.output/public/_nuxt/pdk8jLGT.js +1 -0
  94. package/.output/public/_nuxt/plugins.5e5chZ67.css +1 -0
  95. package/.output/public/_nuxt/pz2JDAM7.js +2 -0
  96. package/.output/public/_nuxt/settings.Dm3M0RLy.css +1 -0
  97. package/.output/public/_nuxt/town.DKIAhKnx.css +1 -0
  98. package/.output/public/_nuxt/users.CXnP2E08.css +1 -0
  99. package/.output/public/_nuxt/vRTjoWqd.js +1 -0
  100. package/.output/public/_nuxt/workshop.Jk5HxWPE.css +1 -0
  101. package/.output/public/_nuxt/zIGh7R49.js +75 -0
  102. package/.output/public/_nuxt/zq5t1vyX.js +1 -0
  103. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  104. package/.output/server/chunks/_/entity.mjs +174 -0
  105. package/.output/server/chunks/_/entity.mjs.map +1 -0
  106. package/.output/server/chunks/_/env-manager.mjs +162 -0
  107. package/.output/server/chunks/_/env-manager.mjs.map +1 -0
  108. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  109. package/.output/server/chunks/_/nitro.mjs +1568 -1043
  110. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  111. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  112. package/.output/server/chunks/build/{TownView-BdHnAilw.mjs → TownView-jVazYOjN.mjs} +141 -141
  113. package/.output/server/chunks/build/{TownView-BdHnAilw.mjs.map → TownView-jVazYOjN.mjs.map} +1 -1
  114. package/.output/server/chunks/build/{_id_-Cb845FHR.mjs → _id_-CfVosNg3.mjs} +136 -136
  115. package/.output/server/chunks/build/{_id_-Cb845FHR.mjs.map → _id_-CfVosNg3.mjs.map} +1 -1
  116. package/.output/server/chunks/build/{_id_-fadFPl2i.mjs → _id_-Hwr4rZpr.mjs} +32 -32
  117. package/.output/server/chunks/build/{_id_-fadFPl2i.mjs.map → _id_-Hwr4rZpr.mjs.map} +1 -1
  118. package/.output/server/chunks/build/{_wsId_-CTZswnm5.mjs → _wsId_-BVg3bB77.mjs} +175 -165
  119. package/.output/server/chunks/build/{_wsId_-CTZswnm5.mjs.map → _wsId_-BVg3bB77.mjs.map} +1 -1
  120. package/.output/server/chunks/build/aml-BCSJCdX7.mjs +588 -0
  121. package/.output/server/chunks/build/aml-BCSJCdX7.mjs.map +1 -0
  122. package/.output/server/chunks/build/{daq-BvihjQyW.mjs → daq-C03Uu5UE.mjs} +108 -106
  123. package/.output/server/chunks/build/daq-C03Uu5UE.mjs.map +1 -0
  124. package/.output/server/chunks/build/{dcw-Ks2vJ4PF.mjs → dcw-6vEYVeje.mjs} +44 -44
  125. package/.output/server/chunks/build/{dcw-Ks2vJ4PF.mjs.map → dcw-6vEYVeje.mjs.map} +1 -1
  126. package/.output/server/chunks/build/{default-GgHt4O2R.mjs → default-hseyOqBT.mjs} +30 -27
  127. package/.output/server/chunks/build/{default-GgHt4O2R.mjs.map → default-hseyOqBT.mjs.map} +1 -1
  128. package/.output/server/chunks/build/{logs-CYBhkQwh.mjs → logs-B-xhuqln.mjs} +35 -35
  129. package/.output/server/chunks/build/{logs-CYBhkQwh.mjs.map → logs-B-xhuqln.mjs.map} +1 -1
  130. package/.output/server/chunks/build/{pages-C-6BRtv8.mjs → pages-BO7yZsXA.mjs} +18 -27
  131. package/.output/server/chunks/build/pages-BO7yZsXA.mjs.map +1 -0
  132. package/.output/server/chunks/build/{plugins-dZRegC7m.mjs → plugins-CUWmMdyt.mjs} +17 -17
  133. package/.output/server/chunks/build/{plugins-dZRegC7m.mjs.map → plugins-CUWmMdyt.mjs.map} +1 -1
  134. package/.output/server/chunks/build/{settings-CgDLkP3s.mjs → settings-DoQ2Oq3P.mjs} +43 -43
  135. package/.output/server/chunks/build/{settings-CgDLkP3s.mjs.map → settings-DoQ2Oq3P.mjs.map} +1 -1
  136. package/.output/server/chunks/build/{town-DJ-V5G9U.mjs → town-BOl6hs9B.mjs} +7 -7
  137. package/.output/server/chunks/build/{town-DJ-V5G9U.mjs.map → town-BOl6hs9B.mjs.map} +1 -1
  138. package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs +1 -1
  139. package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs +1 -1
  140. package/.output/server/chunks/build/{useWorkshopWs-CprkZEdq.mjs → useWorkshopWs-C_I7q9As.mjs} +110 -32
  141. package/.output/server/chunks/build/{useWorkshopWs-CprkZEdq.mjs.map → useWorkshopWs-C_I7q9As.mjs.map} +1 -1
  142. package/.output/server/chunks/build/{users-4nzxTjFT.mjs → users-fohSmF-J.mjs} +6 -6
  143. package/.output/server/chunks/build/{users-4nzxTjFT.mjs.map → users-fohSmF-J.mjs.map} +1 -1
  144. package/.output/server/chunks/build/{workshop-81xhz368.mjs → workshop-DX5-ldc4.mjs} +15 -15
  145. package/.output/server/chunks/build/{workshop-81xhz368.mjs.map → workshop-DX5-ldc4.mjs.map} +1 -1
  146. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +21 -8
  147. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  148. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  149. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +58 -0
  150. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs.map +1 -0
  151. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +27 -6
  152. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -1
  153. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +49 -0
  154. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs.map +1 -0
  155. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs +45 -0
  156. package/.output/server/chunks/routes/api/workshop/aml/entities/prune.post.mjs.map +1 -0
  157. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +30 -0
  158. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs.map +1 -0
  159. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +40 -0
  160. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs.map +1 -0
  161. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +42 -0
  162. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs.map +1 -0
  163. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  164. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  165. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs +4 -22
  166. package/.output/server/chunks/routes/api/workshop/aml/index2.get.mjs.map +1 -1
  167. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  168. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +4 -16
  169. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs.map +1 -1
  170. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +19 -34
  171. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs.map +1 -1
  172. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +41 -0
  173. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs.map +1 -0
  174. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +62 -0
  175. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs.map +1 -0
  176. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  177. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  178. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  179. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +63 -0
  180. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs.map +1 -0
  181. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +54 -0
  184. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs.map +1 -0
  185. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +46 -0
  186. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs.map +1 -0
  187. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  190. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  193. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  194. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +4 -4
  197. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  205. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  213. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  226. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  229. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  232. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  235. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  237. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  238. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  239. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  241. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  242. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  243. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  244. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  245. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  246. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  247. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  248. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  249. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  250. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  251. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  252. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  253. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  254. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  255. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  256. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +12 -1
  257. package/.output/server/chunks/routes/api/workshop/index2.get.mjs.map +1 -1
  258. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  259. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  260. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  261. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  262. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  263. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  265. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  269. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  270. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  272. package/.output/server/chunks/routes/renderer.mjs +2 -2
  273. package/.output/server/chunks/virtual/entry.mjs +103 -17
  274. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  275. package/.output/server/package.json +1 -1
  276. package/README-zh.md +578 -507
  277. package/README.md +125 -51
  278. package/app/assets/css/main.css +329 -22
  279. package/app/components/AppHeader.vue +5 -4
  280. package/app/components/AppSidebar.vue +5 -4
  281. package/app/components/AwChart.vue +17 -0
  282. package/app/components/workshop/AgentLanesView.vue +2 -2
  283. package/app/components/workshop/ChannelSessionList.vue +3 -3
  284. package/app/components/workshop/CommandPalette.vue +1 -2
  285. package/app/components/workshop/Composer.vue +4 -4
  286. package/app/components/workshop/DaqNodeRow.vue +20 -1
  287. package/app/components/workshop/EventBlock.vue +3 -3
  288. package/app/components/workshop/MentionHoverCard.vue +1 -1
  289. package/app/components/workshop/MultiChannelView.vue +1 -1
  290. package/app/components/workshop/TaskBoardView.vue +5 -5
  291. package/app/components/workshop/TranscriptTimeline.vue +3 -3
  292. package/app/components/workshop/blocks/ClusterRoute.vue +3 -3
  293. package/app/components/workshop/blocks/ClusterStream.vue +1 -1
  294. package/app/components/workshop/blocks/ClusterTool.vue +1 -1
  295. package/app/components/workshop/lanes/LaneBlocks.vue +5 -2
  296. package/app/components/workshop/town/TownView.vue +0 -7
  297. package/app/composables/workshop/useClusteredBlocks.ts +22 -3
  298. package/app/composables/workshop/useEscClose.ts +44 -0
  299. package/app/config/index.ts +2 -1
  300. package/app/layouts/default.vue +25 -8
  301. package/app/pages/aml/index.vue +626 -4
  302. package/app/pages/daq/[id].vue +1 -1
  303. package/app/pages/daq/index.vue +10 -12
  304. package/app/pages/dcw/[id].vue +2 -2
  305. package/app/pages/dcw/index.vue +7 -11
  306. package/app/pages/index.vue +24 -6
  307. package/app/pages/logs/index.vue +2 -6
  308. package/app/pages/plugins/index.vue +1 -1
  309. package/app/pages/settings.vue +2 -2
  310. package/app/pages/town.vue +0 -2
  311. package/app/pages/users.vue +1 -1
  312. package/app/pages/workshop/index.vue +2 -2
  313. package/app/plugins/esc-close.client.ts +31 -0
  314. package/app/stores/workshop/events.ts +186 -36
  315. package/bin/aw.mjs +7 -2
  316. package/cli/aw.mjs +19 -34
  317. package/cli/commands/build.mjs +18 -1
  318. package/cli/commands/config.mjs +2 -0
  319. package/cli/commands/plugin.mjs +45 -18
  320. package/cli/commands/register.mjs +6 -2
  321. package/cli/commands/status.mjs +2 -1
  322. package/cli/commands/update.mjs +1 -1
  323. package/cli/commands/version.mjs +1 -1
  324. package/cli/core/args.mjs +76 -4
  325. package/cli/core/help.mjs +3 -1
  326. package/cli/core/meta.mjs +38 -0
  327. package/cli/core/post-build.mjs +96 -0
  328. package/cli/core/registry.mjs +6 -3
  329. package/config.yml +28 -26
  330. package/docs/aml.md +99 -0
  331. package/docs/cli.en.md +445 -0
  332. package/docs/cli.md +410 -220
  333. package/docs/full-test-plan.md +174 -0
  334. package/docs/multi-harness-architecture.md +248 -0
  335. package/docs/plugins.en.md +534 -0
  336. package/docs/plugins.md +531 -179
  337. package/docs/sdk.en.md +922 -0
  338. package/docs/sdk.md +725 -129
  339. package/i18n/dicts/aml.json +43 -1
  340. package/i18n/locales/en.ts +1928 -1885
  341. package/i18n/locales/zh-CN.ts +1928 -1885
  342. package/nuxt.config.ts +27 -2
  343. package/package.json +164 -153
  344. package/scripts/.mimosa/hook-status/sess_aeaecb58-8833-4b83-b93c-050467d21e03-d944d71bb3.json +14 -0
  345. package/scripts/_audit/aml-layout-diag.mjs +83 -0
  346. package/scripts/_audit/bump-version.mjs +51 -0
  347. package/scripts/_audit/channel-inspect.mjs +49 -0
  348. package/scripts/_audit/cleanup-apply.mjs +89 -0
  349. package/scripts/_audit/cleanup-plan.mjs +82 -0
  350. package/scripts/_audit/contrast-check.mjs +43 -0
  351. package/scripts/_audit/dcw-unrecorded-write.ts +1 -1
  352. package/scripts/_audit/design-shots.mjs +145 -0
  353. package/scripts/_audit/docs-font-probe.mjs +68 -0
  354. package/scripts/_audit/docs-probe.mjs +107 -0
  355. package/scripts/_audit/docs-shots.mjs +171 -0
  356. package/scripts/_audit/docs-v3-verify.mjs +255 -0
  357. package/scripts/_audit/docs-vue-lint.mjs +81 -0
  358. package/scripts/_audit/docs-vue-lint2.mjs +91 -0
  359. package/scripts/_audit/exp-cost-scaling.mjs +4 -1
  360. package/scripts/_audit/exp-envelope-and-png.mjs +2 -1
  361. package/scripts/_audit/exp-sweep-fairness.mjs +4 -2
  362. package/scripts/_audit/fix-settings-count.mjs +57 -0
  363. package/scripts/_audit/glass-verify.mjs +155 -0
  364. package/scripts/_audit/hydration-diff.mjs +104 -0
  365. package/scripts/_audit/hydration-head.mjs +36 -0
  366. package/scripts/_audit/hydration-probe.mjs +59 -0
  367. package/scripts/_audit/lead-matrix-test.mjs +172 -0
  368. package/scripts/_audit/plc-agent-task.mjs +74 -0
  369. package/scripts/_audit/plc-clean-scenario.mjs +434 -0
  370. package/scripts/_audit/plc-clean-shots.mjs +161 -0
  371. package/scripts/_audit/plc-fc10-probe.mjs +30 -0
  372. package/scripts/_audit/probe-binding.mjs +114 -103
  373. package/scripts/_audit/review-fix-verify.mjs +158 -0
  374. package/scripts/_audit/seed-demo.mjs +165 -0
  375. package/scripts/_audit/town-focus-shot.mjs +129 -0
  376. package/scripts/_audit/town-reposition.mjs +85 -0
  377. package/scripts/_audit/ts-resolve-hook.mjs +57 -22
  378. package/scripts/_audit/verify-cleanup.mjs +67 -0
  379. package/scripts/_audit/verify-release-pack.mjs +82 -0
  380. package/scripts/_audit/watchdog-recovery-test.mjs +127 -0
  381. package/scripts/_dbg-audit-all-pages.mjs +43 -43
  382. package/scripts/_dbg-configroot-audit.mjs +84 -84
  383. package/scripts/_dbg-daq-intervals-func.mjs +94 -94
  384. package/scripts/_dbg-daq-rowstyle-verify.mjs +112 -112
  385. package/scripts/_dbg-groups-ui-verify.mjs +122 -122
  386. package/scripts/_dbg-harness-e2e.mjs +92 -92
  387. package/scripts/_dbg-harness-ui-e2e.py +97 -97
  388. package/scripts/_dbg-hitl-timeout-e2e.mjs +93 -93
  389. package/scripts/_dbg-multiharness-live-e2e.mjs +254 -254
  390. package/scripts/_dbg-opslog-agent-e2e.mjs +194 -191
  391. package/scripts/_dbg-opt-team-e2e.mjs +133 -133
  392. package/scripts/_dbg-recipe-e2e.mjs +176 -176
  393. package/scripts/_dbg-recipe-stale-e2e.mjs +135 -135
  394. package/scripts/_dbg-render-perf.mjs +142 -142
  395. package/scripts/_dbg-render-regression.mjs +130 -130
  396. package/scripts/_dbg-town-smoke.mjs +54 -54
  397. package/scripts/aw-start-smoke.mjs +27 -8
  398. package/scripts/check-docs-sync.mjs +367 -0
  399. package/scripts/e2e-full-closedloop.mjs +36 -18
  400. package/scripts/production-closed-loop-e2e.mjs +300 -300
  401. package/scripts/test-cli-exit.mjs +129 -21
  402. package/scripts/test-daq-frame-race.mjs +144 -96
  403. package/scripts/test-events-index.mjs +176 -0
  404. package/scripts/test-lru.mjs +34 -11
  405. package/scripts/test-memory-month-query.mjs +11 -3
  406. package/scripts/test-plugin-hardening.mjs +7 -2
  407. package/scripts/test-plugin-lifecycle.mjs +173 -0
  408. package/scripts/test-rollback-index.mjs +76 -18
  409. package/scripts/test-sdk-surface.mjs +6 -3
  410. package/sdk/client.mjs +16 -7
  411. package/sdk/context.mjs +21 -9
  412. package/sdk/examples/line-sentinel/client.mjs +13 -6
  413. package/sdk/examples/line-sentinel/index.mjs +5 -2
  414. package/sdk/examples/ops-notifier/client.mjs +3 -1
  415. package/sdk/examples/sample-insight/client.mjs +4 -2
  416. package/sdk/index.d.mts +133 -16
  417. package/sdk/index.mjs +3 -2
  418. package/sdk/lifecycle.mjs +8 -3
  419. package/server/api/workshop/agent-tools/bindings/index.post.ts +22 -7
  420. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -0
  421. package/server/api/workshop/aml/datasets/[id].get.ts +31 -9
  422. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -0
  423. package/server/api/workshop/aml/entities/index.get.ts +13 -0
  424. package/server/api/workshop/aml/entities/prune.post.ts +28 -0
  425. package/server/api/workshop/aml/env/index.get.ts +13 -0
  426. package/server/api/workshop/aml/env/recheck.post.ts +14 -0
  427. package/server/api/workshop/aml/env/uv.post.ts +21 -0
  428. package/server/api/workshop/aml/env/venv.post.ts +24 -0
  429. package/server/api/workshop/aml/index.get.ts +14 -1
  430. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -0
  431. package/server/api/workshop/aml/models/[id].delete.ts +35 -0
  432. package/server/api/workshop/aml/models/[id].patch.ts +30 -0
  433. package/server/services/workshop/agents/agent-interface.ts +3 -0
  434. package/server/services/workshop/agents/base-agent.ts +9 -0
  435. package/server/services/workshop/agents/codex-agent.ts +743 -729
  436. package/server/services/workshop/agents/dsh-agent.ts +4 -7
  437. package/server/services/workshop/agents/opencode-agent.ts +5 -7
  438. package/server/services/workshop/aml/aml.repo.ts +18 -0
  439. package/server/services/workshop/aml/dataset-builder.ts +4 -0
  440. package/server/services/workshop/aml/entity.ts +365 -0
  441. package/server/services/workshop/aml/env-manager.ts +242 -0
  442. package/server/services/workshop/aml/job-orchestrator.ts +4 -15
  443. package/server/services/workshop/aml/model-registry.ts +6 -0
  444. package/server/services/workshop/aml/python-runtime.ts +396 -62
  445. package/server/services/workshop/aml/runtime.ts +95 -4
  446. package/server/services/workshop/daq/bus/mqtt.adapter.ts +3 -1
  447. package/server/services/workshop/daq/daq-controller.ts +95 -47
  448. package/server/services/workshop/daq/daq-node.repo.ts +0 -10
  449. package/server/services/workshop/daq/daq-runtime.ts +0 -5
  450. package/server/services/workshop/json-store.mjs +35 -2
  451. package/server/services/workshop/plugins/host.mjs +18 -12
  452. package/server/services/workshop/runtime/agent-runtime.ts +32 -3
  453. package/server/services/workshop/runtime/manager.ts +28 -1
  454. package/server/services/workshop/runtime/scheduler-loop.ts +10 -1
  455. package/server/services/workshop/settings.ts +2 -0
  456. package/shared/config/home.mjs +58 -0
  457. package/shared/config/schema.json +2 -1
  458. package/shared/lru.mjs +4 -1
  459. package/.output/public/_nuxt/-6OnbLFb.js +0 -1
  460. package/.output/public/_nuxt/-nb2uqVg.js +0 -1
  461. package/.output/public/_nuxt/4bHdIqEg.js +0 -18
  462. package/.output/public/_nuxt/6PZPfFcO.js +0 -17
  463. package/.output/public/_nuxt/BBBtwOpo.js +0 -9
  464. package/.output/public/_nuxt/BBwMH_hG.js +0 -7
  465. package/.output/public/_nuxt/BDUjyaF4.js +0 -42
  466. package/.output/public/_nuxt/BNXfwXpE.js +0 -1
  467. package/.output/public/_nuxt/BN_PdN3J.js +0 -24
  468. package/.output/public/_nuxt/BSSUlJnx2.js +0 -1
  469. package/.output/public/_nuxt/BWSE6hR6.js +0 -1
  470. package/.output/public/_nuxt/BZGNTgTQ2.js +0 -1
  471. package/.output/public/_nuxt/BZv4RFYN.js +0 -1
  472. package/.output/public/_nuxt/BcmbLh2z2.js +0 -1
  473. package/.output/public/_nuxt/BfGc7TJp.js +0 -1
  474. package/.output/public/_nuxt/BgTB6h_q.js +0 -2
  475. package/.output/public/_nuxt/BkLJA9J5.js +0 -1
  476. package/.output/public/_nuxt/Bp5luxkg2.js +0 -1
  477. package/.output/public/_nuxt/BuCHayqN.js +0 -1
  478. package/.output/public/_nuxt/BuvcLKh1.js +0 -19
  479. package/.output/public/_nuxt/C3tCneTM.js +0 -1
  480. package/.output/public/_nuxt/C77oC8yC2.js +0 -7
  481. package/.output/public/_nuxt/C9f8QMp12.js +0 -1
  482. package/.output/public/_nuxt/CKfhtOt7.js +0 -13
  483. package/.output/public/_nuxt/CQvmN-Mi.js +0 -1
  484. package/.output/public/_nuxt/CUDrOuW7.js +0 -1
  485. package/.output/public/_nuxt/CZcC-gpk.js +0 -1
  486. package/.output/public/_nuxt/CbzsPO5H.js +0 -1
  487. package/.output/public/_nuxt/CdSOrh2c.js +0 -1
  488. package/.output/public/_nuxt/Cgx818r-.js +0 -1
  489. package/.output/public/_nuxt/Cjm7VogC.js +0 -1
  490. package/.output/public/_nuxt/Cm5mDxzH.js +0 -1
  491. package/.output/public/_nuxt/CmHzfVc5.js +0 -3
  492. package/.output/public/_nuxt/Cn3J3NXR.js +0 -23
  493. package/.output/public/_nuxt/Cno6kYiO2.js +0 -1
  494. package/.output/public/_nuxt/Cp6z0RN7.js +0 -1
  495. package/.output/public/_nuxt/CwqIxJGj.js +0 -2
  496. package/.output/public/_nuxt/D-Ca4BGY.js +0 -70
  497. package/.output/public/_nuxt/D0fhp-Ga.js +0 -75
  498. package/.output/public/_nuxt/D1z7i2UP.js +0 -31
  499. package/.output/public/_nuxt/DIaTPH1M.js +0 -1
  500. package/.output/public/_nuxt/DTYBfjRY.js +0 -1
  501. package/.output/public/_nuxt/DXRZPxGs.js +0 -1
  502. package/.output/public/_nuxt/DZzGarBE2.js +0 -13
  503. package/.output/public/_nuxt/DaMCzQhv.js +0 -1
  504. package/.output/public/_nuxt/DoLasgPj2.js +0 -1
  505. package/.output/public/_nuxt/DpojD719.js +0 -1
  506. package/.output/public/_nuxt/DsVcWfyR.js +0 -1
  507. package/.output/public/_nuxt/DtBu71ev.js +0 -32
  508. package/.output/public/_nuxt/Dy-mxvXY2.js +0 -1
  509. package/.output/public/_nuxt/DzuC31-i.js +0 -2
  510. package/.output/public/_nuxt/FQri3dV3.js +0 -1
  511. package/.output/public/_nuxt/ORt9oDIy2.js +0 -1
  512. package/.output/public/_nuxt/TownView.CtskuMXS.css +0 -1
  513. package/.output/public/_nuxt/VLI2Zy4t.js +0 -5
  514. package/.output/public/_nuxt/_id_.MbzdFygI.css +0 -1
  515. package/.output/public/_nuxt/_id_.hRYo-EAB.css +0 -1
  516. package/.output/public/_nuxt/_wsId_.gXMEOYgX.css +0 -1
  517. package/.output/public/_nuxt/aml.WU_bh87J.css +0 -1
  518. package/.output/public/_nuxt/arUY5dyq2.js +0 -4
  519. package/.output/public/_nuxt/builds/meta/291ef3e6-fa6a-4dee-8f46-05da1aeab815.json +0 -1
  520. package/.output/public/_nuxt/daq.Bb6l44-O.css +0 -1
  521. package/.output/public/_nuxt/dcw.rXH2fc2Z.css +0 -1
  522. package/.output/public/_nuxt/default.jNT73_hq.css +0 -1
  523. package/.output/public/_nuxt/ekuGmQ7R.js +0 -1
  524. package/.output/public/_nuxt/entry.jFrFAWuA.css +0 -1
  525. package/.output/public/_nuxt/logs.DMOM-iHe.css +0 -1
  526. package/.output/public/_nuxt/niDwBOZW.js +0 -3
  527. package/.output/public/_nuxt/pMoIO6rr.js +0 -14
  528. package/.output/public/_nuxt/pages.Cc8GX9T1.css +0 -1
  529. package/.output/public/_nuxt/plugins.wIPyfPn-.css +0 -1
  530. package/.output/public/_nuxt/rqZ-1SoP.js +0 -2
  531. package/.output/public/_nuxt/settings.BCm4NZIc.css +0 -1
  532. package/.output/public/_nuxt/town.C_DsNW0J.css +0 -1
  533. package/.output/public/_nuxt/users.DuAt_Zwf.css +0 -1
  534. package/.output/public/_nuxt/vJ4FPb-_.js +0 -1
  535. package/.output/public/_nuxt/workshop.BJg84pOK.css +0 -1
  536. package/.output/server/chunks/build/aml-uBNIppIf.mjs +0 -508
  537. package/.output/server/chunks/build/aml-uBNIppIf.mjs.map +0 -1
  538. package/.output/server/chunks/build/daq-BvihjQyW.mjs.map +0 -1
  539. package/.output/server/chunks/build/pages-C-6BRtv8.mjs.map +0 -1
  540. package/scripts/_audit/.tmp/audit-data/dcws.json +0 -28
  541. package/scripts/_audit/.tmp/dcw-writes.json +0 -15650
  542. package/scripts/_audit/.tmp/dcws.json +0 -9033
  543. package/scripts/_audit/.tmp/pollution-backup/dcw-rollback.polluted.json +0 -470006
  544. package/scripts/_audit/.tmp/pollution-backup/dcws.polluted.json +0 -9085
  545. package/scripts/_audit/.tmp/probe-cwd.txt +0 -1
  546. package/scripts/_audit/awhome/commands/README.md +0 -3
  547. package/scripts/_audit/awhome/commands/hello.mjs +0 -12
  548. package/scripts/_audit/diag-cwd.ts +0 -20
  549. package/scripts/_audit/diag-cwd2.ts +0 -19
  550. package/scripts/_audit/hello.mjs +0 -12
  551. package/scripts/_audit/ndjson-partial-line-repro.mjs +0 -77
  552. package/scripts/_audit/opencode-await-ternary-repro.mjs +0 -20
  553. package/scripts/_audit/part-frag.txt +0 -84
  554. package/scripts/_audit/part-head.txt +0 -45
  555. package/scripts/_audit/probe-child.mjs +0 -17
  556. package/scripts/_audit/probe-envelope.mjs +0 -49
  557. package/scripts/_audit/probe-packlist.mjs +0 -67
  558. package/scripts/_audit/probe-routes.mjs +0 -47
  559. package/scripts/_audit/probe-routes2.mjs +0 -38
  560. package/scripts/_audit/probe.ts +0 -9
  561. package/scripts/_audit/probe2.ts +0 -6
  562. package/scripts/_audit/probe3.ts +0 -3
  563. package/scripts/_audit/probe4.ts +0 -3
  564. package/scripts/_audit/proj/.AgentWorkShop/commands/echoargs.mjs +0 -13
  565. package/scripts/_audit/proj/config.yml +0 -1
  566. package/scripts/_audit/run.mjs +0 -30
  567. package/scripts/_audit/tsconfig.probe.json +0 -24
  568. package/scripts/_audit/typecheck-out.txt +0 -466
  569. package/scripts/_daq-realtime-probe.mjs +0 -68
  570. package/scripts/_daq-warn-probe.mjs +0 -50
  571. package/scripts/_dbg-acc-1-setup.mjs +0 -57
  572. package/scripts/_dbg-acc-2-diag.mjs +0 -14
  573. package/scripts/_dbg-acc-2-intervals.mjs +0 -81
  574. package/scripts/_dbg-acc-3-daq.mjs +0 -48
  575. package/scripts/_dbg-acc-4-team.mjs +0 -92
  576. package/scripts/_dbg-acc-5-visual.mjs +0 -63
  577. package/scripts/_dbg-acc-5b-ws-town.mjs +0 -18
  578. package/scripts/_dbg-acc-5c-town.mjs +0 -12
  579. package/scripts/_dbg-acc-6-i18n.mjs +0 -19
  580. package/scripts/_dbg-agent-tools-audit.mjs +0 -154
  581. package/scripts/_dbg-agent-workflow-audit.mjs +0 -177
  582. package/scripts/_dbg-agents-dropdown-shot.py +0 -33
  583. package/scripts/_dbg-anim-verify.mjs +0 -81
  584. package/scripts/_dbg-app-shot.mjs +0 -48
  585. package/scripts/_dbg-autoframe.mjs +0 -103
  586. package/scripts/_dbg-availability-probe.ts +0 -11
  587. package/scripts/_dbg-beacon-final.mjs +0 -181
  588. package/scripts/_dbg-bind-bidi-e2e.mjs +0 -239
  589. package/scripts/_dbg-callout-near.mjs +0 -108
  590. package/scripts/_dbg-catalog-smoke.ts +0 -20
  591. package/scripts/_dbg-cf-line-shot.mjs +0 -18
  592. package/scripts/_dbg-chan-focus.mjs +0 -49
  593. package/scripts/_dbg-channel-plugin-ui.mjs +0 -94
  594. package/scripts/_dbg-cleanup.mjs +0 -31
  595. package/scripts/_dbg-closedloop-ui-shot.mjs +0 -61
  596. package/scripts/_dbg-codex-handshake.ts +0 -30
  597. package/scripts/_dbg-codex-probe.mjs +0 -58
  598. package/scripts/_dbg-codex-sandbox.ts +0 -58
  599. package/scripts/_dbg-codex-turn.ts +0 -65
  600. package/scripts/_dbg-collab-scenario-e2e.mjs +0 -185
  601. package/scripts/_dbg-config-smoke.ts +0 -28
  602. package/scripts/_dbg-console-audit.mjs +0 -61
  603. package/scripts/_dbg-console-probe.mjs +0 -23
  604. package/scripts/_dbg-context-inject-audit.mjs +0 -231
  605. package/scripts/_dbg-cpu-profile.mjs +0 -53
  606. package/scripts/_dbg-crash-recovery.mjs +0 -143
  607. package/scripts/_dbg-crop-shot.mjs +0 -16
  608. package/scripts/_dbg-cross-channel-e2e.mjs +0 -157
  609. package/scripts/_dbg-cross-team-visibility-e2e.mjs +0 -129
  610. package/scripts/_dbg-crush-probe.sh +0 -21
  611. package/scripts/_dbg-crush-spawn-probe.ts +0 -22
  612. package/scripts/_dbg-daq-acc-probe.mjs +0 -24
  613. package/scripts/_dbg-daq-attrib.mjs +0 -34
  614. package/scripts/_dbg-daq-bind-audit.mjs +0 -119
  615. package/scripts/_dbg-daq-cadence.mjs +0 -104
  616. package/scripts/_dbg-daq-debug.mjs +0 -22
  617. package/scripts/_dbg-daq-diag.mjs +0 -33
  618. package/scripts/_dbg-daq-e2e.mjs +0 -171
  619. package/scripts/_dbg-daq-film.mjs +0 -136
  620. package/scripts/_dbg-daq-filter-e2e.mjs +0 -109
  621. package/scripts/_dbg-daq-filter-e2e2.mjs +0 -62
  622. package/scripts/_dbg-daq-final-regression.mjs +0 -78
  623. package/scripts/_dbg-daq-frame-alarm.mjs +0 -49
  624. package/scripts/_dbg-daq-frame-ui.mjs +0 -62
  625. package/scripts/_dbg-daq-frame-ws.mjs +0 -72
  626. package/scripts/_dbg-daq-full-check.mjs +0 -179
  627. package/scripts/_dbg-daq-line-note-verify.mjs +0 -61
  628. package/scripts/_dbg-daq-linebanner-audit.mjs +0 -107
  629. package/scripts/_dbg-daq-pages-shot.mjs +0 -37
  630. package/scripts/_dbg-daq-perf.mjs +0 -61
  631. package/scripts/_dbg-daq-probe.mjs +0 -27
  632. package/scripts/_dbg-daq-recipe-e2e.mjs +0 -30
  633. package/scripts/_dbg-daq-redesign-shot.mjs +0 -88
  634. package/scripts/_dbg-daq-rows-probe.mjs +0 -26
  635. package/scripts/_dbg-daq-rowstate-e2e.mjs +0 -152
  636. package/scripts/_dbg-daq-rowstate-shot.mjs +0 -45
  637. package/scripts/_dbg-daq-rowstate-shot2.mjs +0 -38
  638. package/scripts/_dbg-daq-tpl.mjs +0 -144
  639. package/scripts/_dbg-dash-console-check.mjs +0 -49
  640. package/scripts/_dbg-dash-deep-probe.mjs +0 -61
  641. package/scripts/_dbg-dash-hitpoint.mjs +0 -44
  642. package/scripts/_dbg-dash-live-shot.mjs +0 -36
  643. package/scripts/_dbg-dash-shot.mjs +0 -21
  644. package/scripts/_dbg-dashboard-shot.mjs +0 -35
  645. package/scripts/_dbg-dcw-audit.mjs +0 -126
  646. package/scripts/_dbg-dcw-card-e2e.mjs +0 -108
  647. package/scripts/_dbg-dcw-channel-ui.mjs +0 -144
  648. package/scripts/_dbg-dcw-examples.mjs +0 -81
  649. package/scripts/_dbg-dcw-light-shot.mjs +0 -19
  650. package/scripts/_dbg-dcw-line-audit.mjs +0 -107
  651. package/scripts/_dbg-dcw-pause-tpl-audit.mjs +0 -161
  652. package/scripts/_dbg-dcw-pause-ui.mjs +0 -175
  653. package/scripts/_dbg-dcw-read-toolface.ts +0 -13
  654. package/scripts/_dbg-dcw-read-ui.mjs +0 -74
  655. package/scripts/_dbg-dcw-scene.mjs +0 -72
  656. package/scripts/_dbg-dcw-shot2.mjs +0 -14
  657. package/scripts/_dbg-dcw-twin-e2e.mjs +0 -192
  658. package/scripts/_dbg-diag-mock-loop.mjs +0 -89
  659. package/scripts/_dbg-diag-watch.mjs +0 -95
  660. package/scripts/_dbg-docs-site-shot.mjs +0 -32
  661. package/scripts/_dbg-dsh-probe.mjs +0 -31
  662. package/scripts/_dbg-dt-interact.mjs +0 -193
  663. package/scripts/_dbg-error-probe.mjs +0 -54
  664. package/scripts/_dbg-filter-light-verify.mjs +0 -54
  665. package/scripts/_dbg-final-acceptance-2.mjs +0 -72
  666. package/scripts/_dbg-final-acceptance.mjs +0 -192
  667. package/scripts/_dbg-final-agent-e2e.mjs +0 -151
  668. package/scripts/_dbg-final-features.mjs +0 -155
  669. package/scripts/_dbg-final-fixups.mjs +0 -62
  670. package/scripts/_dbg-final-full-e2e.mjs +0 -218
  671. package/scripts/_dbg-final-line-e2e.mjs +0 -173
  672. package/scripts/_dbg-final-shots.mjs +0 -32
  673. package/scripts/_dbg-final-t6-hitl.mjs +0 -38
  674. package/scripts/_dbg-final-visual.mjs +0 -29
  675. package/scripts/_dbg-fix-unused-imports.py +0 -41
  676. package/scripts/_dbg-focus-range.mjs +0 -115
  677. package/scripts/_dbg-fresh-scene-e2e.mjs +0 -125
  678. package/scripts/_dbg-fullchain-e2e.mjs +0 -178
  679. package/scripts/_dbg-gate-debug.mjs +0 -37
  680. package/scripts/_dbg-gif-encode.mjs +0 -111
  681. package/scripts/_dbg-gizmo.mjs +0 -95
  682. package/scripts/_dbg-glass-probe.mjs +0 -57
  683. package/scripts/_dbg-glass-shot.mjs +0 -50
  684. package/scripts/_dbg-glass-sweep.mjs +0 -25
  685. package/scripts/_dbg-glb-probe.mjs +0 -43
  686. package/scripts/_dbg-goose-probe.mjs +0 -33
  687. package/scripts/_dbg-goose-probe.sh +0 -10
  688. package/scripts/_dbg-hardening-probe.mjs +0 -90
  689. package/scripts/_dbg-harness-ui-dbg.py +0 -49
  690. package/scripts/_dbg-harness-ui-shot.py +0 -109
  691. package/scripts/_dbg-hero-btn-probe.mjs +0 -21
  692. package/scripts/_dbg-hidden-check.mjs +0 -21
  693. package/scripts/_dbg-hmi-audit.mjs +0 -164
  694. package/scripts/_dbg-home-repro.mjs +0 -24
  695. package/scripts/_dbg-home-stack.mjs +0 -13
  696. package/scripts/_dbg-host.mjs +0 -16
  697. package/scripts/_dbg-huashu-survey.mjs +0 -31
  698. package/scripts/_dbg-huashu-survey2.mjs +0 -35
  699. package/scripts/_dbg-huashu-verify.mjs +0 -25
  700. package/scripts/_dbg-huashu-verify2.mjs +0 -26
  701. package/scripts/_dbg-hydration-detail.mjs +0 -18
  702. package/scripts/_dbg-i18n-debug.mjs +0 -27
  703. package/scripts/_dbg-i18n-debug2.mjs +0 -26
  704. package/scripts/_dbg-i18n-final.mjs +0 -42
  705. package/scripts/_dbg-i18n-scan.mjs +0 -38
  706. package/scripts/_dbg-infra-lifecycle.mjs +0 -44
  707. package/scripts/_dbg-interval-config.mjs +0 -156
  708. package/scripts/_dbg-interval-scenario.mjs +0 -126
  709. package/scripts/_dbg-kicker-check.mjs +0 -11
  710. package/scripts/_dbg-line-aura-shots.mjs +0 -54
  711. package/scripts/_dbg-line-control-e2e.mjs +0 -120
  712. package/scripts/_dbg-line-gate-audit.mjs +0 -108
  713. package/scripts/_dbg-line-live-e2e.mjs +0 -144
  714. package/scripts/_dbg-line-repo-test.ts +0 -10
  715. package/scripts/_dbg-line-scenario-e2e.mjs +0 -256
  716. package/scripts/_dbg-line-spawn.ts +0 -31
  717. package/scripts/_dbg-live-engine-probe.mjs +0 -80
  718. package/scripts/_dbg-login-debug.py +0 -23
  719. package/scripts/_dbg-login-e2e.mjs +0 -26
  720. package/scripts/_dbg-logs-ui-e2e.py +0 -126
  721. package/scripts/_dbg-mcp-bridge-probe.mjs +0 -147
  722. package/scripts/_dbg-modbus-latency.mjs +0 -22
  723. package/scripts/_dbg-mqtt-chain-e2e.mjs +0 -90
  724. package/scripts/_dbg-mqtt-publisher.mjs +0 -17
  725. package/scripts/_dbg-nav-rpg.mjs +0 -84
  726. package/scripts/_dbg-nav-shot.mjs +0 -28
  727. package/scripts/_dbg-nav.mjs +0 -27
  728. package/scripts/_dbg-oneshot-impl-probe.ts +0 -67
  729. package/scripts/_dbg-opencode-sse.mjs +0 -101
  730. package/scripts/_dbg-opencode-start.ts +0 -57
  731. package/scripts/_dbg-opslog-e2e.mjs +0 -121
  732. package/scripts/_dbg-opslog-shots.mjs +0 -62
  733. package/scripts/_dbg-optimization-e2e.mjs +0 -94
  734. package/scripts/_dbg-orbit.mjs +0 -58
  735. package/scripts/_dbg-overview-probe.sh +0 -31
  736. package/scripts/_dbg-panesplitter-fix-check.mjs +0 -62
  737. package/scripts/_dbg-perms-visual.mjs +0 -36
  738. package/scripts/_dbg-pg-tcp-probe.cjs +0 -27
  739. package/scripts/_dbg-phase-e3-monitor.mjs +0 -25
  740. package/scripts/_dbg-pi-spawn-probe.ts +0 -33
  741. package/scripts/_dbg-plc-agent-loop.ts +0 -102
  742. package/scripts/_dbg-plc-e2e.mjs +0 -171
  743. package/scripts/_dbg-plugin-agent-read.ts +0 -56
  744. package/scripts/_dbg-plugin-config-ui.mjs +0 -111
  745. package/scripts/_dbg-plugin-matrix.mjs +0 -212
  746. package/scripts/_dbg-plugin-panels-ui.mjs +0 -54
  747. package/scripts/_dbg-plugin-sink-rest.mjs +0 -70
  748. package/scripts/_dbg-plugin-sink-ui.mjs +0 -81
  749. package/scripts/_dbg-plugin-tools-inject.ts +0 -80
  750. package/scripts/_dbg-plugin-ui-wizard.mjs +0 -125
  751. package/scripts/_dbg-plugin-verify-e2e.mjs +0 -123
  752. package/scripts/_dbg-plugins-e2e.mjs +0 -101
  753. package/scripts/_dbg-pop-clamp-verify.mjs +0 -77
  754. package/scripts/_dbg-preset-e2e.mjs +0 -116
  755. package/scripts/_dbg-preview-console.mjs +0 -28
  756. package/scripts/_dbg-preview-minrepro.mjs +0 -156
  757. package/scripts/_dbg-preview-pixels.mjs +0 -93
  758. package/scripts/_dbg-prompts-hotreload-test.ts +0 -76
  759. package/scripts/_dbg-prompts-resolve-test.ts +0 -39
  760. package/scripts/_dbg-quality-pages-e2e.mjs +0 -84
  761. package/scripts/_dbg-query-cancel.ts +0 -12
  762. package/scripts/_dbg-qwen-acp-probe.mjs +0 -30
  763. package/scripts/_dbg-qwen-capture.mjs +0 -21
  764. package/scripts/_dbg-rail-tree-e2e.mjs +0 -183
  765. package/scripts/_dbg-real-driver-e2e.mjs +0 -55
  766. package/scripts/_dbg-redesign-shots.mjs +0 -34
  767. package/scripts/_dbg-registry-smoke.ts +0 -14
  768. package/scripts/_dbg-release-smoke.mjs +0 -104
  769. package/scripts/_dbg-repo-setup-verify.mjs +0 -31
  770. package/scripts/_dbg-resolve-probe.ts +0 -6
  771. package/scripts/_dbg-restart-persist.mjs +0 -41
  772. package/scripts/_dbg-retention-test.ts +0 -25
  773. package/scripts/_dbg-rollback-mgr-audit.mjs +0 -169
  774. package/scripts/_dbg-rpg.mjs +0 -71
  775. package/scripts/_dbg-sc001-dispatch.mjs +0 -63
  776. package/scripts/_dbg-scenario-final-shot.mjs +0 -24
  777. package/scripts/_dbg-scenario-phase-e2.mjs +0 -75
  778. package/scripts/_dbg-scenario-phase-e3.mjs +0 -96
  779. package/scripts/_dbg-scenario-phase1.mjs +0 -90
  780. package/scripts/_dbg-scenario-phase2.mjs +0 -105
  781. package/scripts/_dbg-scenario-phase3-monitor.mjs +0 -48
  782. package/scripts/_dbg-scenario-phase3.mjs +0 -111
  783. package/scripts/_dbg-scene-polish-shot.mjs +0 -118
  784. package/scripts/_dbg-selring-probe.mjs +0 -47
  785. package/scripts/_dbg-settings-draft-probe.mjs +0 -39
  786. package/scripts/_dbg-settings-probe.mjs +0 -33
  787. package/scripts/_dbg-setup-e2e.mjs +0 -88
  788. package/scripts/_dbg-sideinfo.mjs +0 -101
  789. package/scripts/_dbg-sim-keeper.mjs +0 -100
  790. package/scripts/_dbg-splitter.mjs +0 -88
  791. package/scripts/_dbg-swatch-check.mjs +0 -10
  792. package/scripts/_dbg-task-cancel-probe.mjs +0 -66
  793. package/scripts/_dbg-team-drill.mjs +0 -173
  794. package/scripts/_dbg-town-alarm-e2e.mjs +0 -40
  795. package/scripts/_dbg-town-beauty-shots.mjs +0 -54
  796. package/scripts/_dbg-town-daq-shot.mjs +0 -26
  797. package/scripts/_dbg-town-full-e2e.mjs +0 -104
  798. package/scripts/_dbg-town-gate.mjs +0 -44
  799. package/scripts/_dbg-town-ins-probe.mjs +0 -37
  800. package/scripts/_dbg-town-perf.mjs +0 -50
  801. package/scripts/_dbg-town-polish-shots.mjs +0 -82
  802. package/scripts/_dbg-town-realtime.mjs +0 -42
  803. package/scripts/_dbg-town-shot.py +0 -25
  804. package/scripts/_dbg-town-shot3.mjs +0 -17
  805. package/scripts/_dbg-town-truth.mjs +0 -37
  806. package/scripts/_dbg-town-truth2.mjs +0 -27
  807. package/scripts/_dbg-transform-audit.mjs +0 -98
  808. package/scripts/_dbg-trend-expand-test.mjs +0 -38
  809. package/scripts/_dbg-twindaq-focus.mjs +0 -81
  810. package/scripts/_dbg-ui-polish-shot.mjs +0 -43
  811. package/scripts/_dbg-ui-polish-verify1.mjs +0 -92
  812. package/scripts/_dbg-ui-polish-verify2.mjs +0 -50
  813. package/scripts/_dbg-ui-polish-verify3.mjs +0 -51
  814. package/scripts/_dbg-ui-polish-verify4.mjs +0 -50
  815. package/scripts/_dbg-ui-shot.mjs +0 -26
  816. package/scripts/_dbg-ui-shots.mjs +0 -28
  817. package/scripts/_dbg-ui-survey.py +0 -52
  818. package/scripts/_dbg-unify-shot.mjs +0 -43
  819. package/scripts/_dbg-uplink-probe.mjs +0 -36
  820. package/scripts/_dbg-wizard-preview-shot.mjs +0 -58
  821. package/scripts/_dbg-wizard-ui-e2e.mjs +0 -93
  822. package/scripts/_dbg-ws-probe.mjs +0 -86
  823. package/scripts/_dbg-ws-shot2.mjs +0 -23
  824. package/scripts/_dbg-wsdot-sanity.mjs +0 -25
  825. package/scripts/_dev-stack.mjs +0 -46
  826. package/scripts/_http-driver-probe.mjs +0 -30
  827. package/scripts/_mqtt-driver-probe.mjs +0 -30
  828. package/scripts/_newdriver-rest-probe.mjs +0 -100
  829. package/scripts/_node-state-probe.mjs +0 -5
  830. package/scripts/_opcua-driver-probe.mjs +0 -31
  831. package/scripts/_rtu-debug.mjs +0 -41
  832. package/scripts/_rtu-direct.mjs +0 -6
  833. package/scripts/_rtu-driver-probe.mjs +0 -53
  834. package/scripts/_spike-pitui.mjs +0 -116
  835. package/scripts/_tmp-args-probe.mjs +0 -20
  836. package/scripts/_tmp-cyc-entry.mjs +0 -8
  837. package/scripts/_tmp-cyc-main.mjs +0 -5
  838. package/scripts/_tmp-cyc-mod.mjs +0 -2
  839. package/scripts/_tmp-cycle-a.mjs +0 -6
  840. package/scripts/_tmp-cycle-b.mjs +0 -2
  841. package/scripts/_tmp-cycle-probe.mjs +0 -4
  842. package/scripts/_tmp-entry-variant.mjs +0 -2
  843. package/scripts/_tmp-help-probe.mjs +0 -19
  844. package/scripts/_tmp-help-probe2.mjs +0 -2
  845. package/scripts/_tmp-trace-preload.mjs +0 -1
  846. package/scripts/_wizard-shots.mjs +0 -90
  847. package/scripts/acceptance-suite.py +0 -207
  848. package/scripts/aml-agent-bridge.ts +0 -230
  849. package/scripts/aml-industrial-loop.ts +0 -232
  850. package/scripts/build-film-devices.mjs +0 -227
  851. package/scripts/collab-live-test.py +0 -177
  852. package/scripts/debug-mcp-http.ts +0 -64
  853. package/scripts/demo-lead-worker.ts +0 -256
  854. package/scripts/demo-modes.ts +0 -415
  855. package/scripts/demo-omp-channel.ts +0 -135
  856. package/scripts/design-preflight.mjs +0 -223
  857. package/scripts/design-verify-templates.mjs +0 -110
  858. package/scripts/design-verify.mjs +0 -170
  859. package/scripts/dev-window.cmd +0 -6
  860. package/scripts/device-line-restore.mjs +0 -34
  861. package/scripts/diag-lead-status.ts +0 -101
  862. package/scripts/e2e-a2a-steer-live.mjs +0 -193
  863. package/scripts/e2e-dual-drive-comm.ts +0 -259
  864. package/scripts/e2e-full-scenario.ts +0 -321
  865. package/scripts/e2e-harness-consistency.ts +0 -204
  866. package/scripts/e2e-harness-provider-task.mjs +0 -126
  867. package/scripts/e2e-line-live.mjs +0 -144
  868. package/scripts/e2e-memory-persistence.ts +0 -320
  869. package/scripts/e2e-omp-modes.ts +0 -274
  870. package/scripts/e2e-omp-realtime.ts +0 -258
  871. package/scripts/e2e-plc-scenario.mjs +0 -292
  872. package/scripts/e2e-real-scenario.mjs +0 -466
  873. package/scripts/e2e-tab-close.mjs +0 -136
  874. package/scripts/e2e-token-ui.mjs +0 -149
  875. package/scripts/final-soup-run.py +0 -192
  876. package/scripts/final-soup-watch.py +0 -83
  877. package/scripts/i18n-codemod.mjs +0 -173
  878. package/scripts/i18n-fix-en.py +0 -28
  879. package/scripts/i18n-fix-en2.py +0 -31
  880. package/scripts/i18n-merge.mjs +0 -191
  881. package/scripts/migrate-local-time.mjs +0 -123
  882. package/scripts/omp-real-test.py +0 -328
  883. package/scripts/team-plugins-api-smoke.mjs +0 -149
  884. package/scripts/test-a2a-relay.mjs +0 -222
  885. package/scripts/test-aml-integration.ts +0 -159
  886. package/scripts/test-aml-job.ts +0 -174
  887. package/scripts/test-aml-unit.ts +0 -184
  888. package/scripts/test-api-client.ts +0 -108
  889. package/scripts/test-api-suite.mjs +0 -271
  890. package/scripts/test-block-consumption.mjs +0 -194
  891. package/scripts/test-cmd-render.mjs +0 -218
  892. package/scripts/test-collab-omp.mjs +0 -192
  893. package/scripts/test-config-precedence.ts +0 -124
  894. package/scripts/test-context-governor.ts +0 -176
  895. package/scripts/test-daq-frames.ts +0 -180
  896. package/scripts/test-daq-minio.ts +0 -77
  897. package/scripts/test-dedup-logic.ts +0 -132
  898. package/scripts/test-e2e-collaboration.ts +0 -262
  899. package/scripts/test-e2e-monitor.ts +0 -192
  900. package/scripts/test-event-history.ts +0 -112
  901. package/scripts/test-exec-modes.ts +0 -316
  902. package/scripts/test-fifo-realtime.mjs +0 -193
  903. package/scripts/test-final-e2e.mjs +0 -290
  904. package/scripts/test-goal-summary.ts +0 -202
  905. package/scripts/test-harness-liveness.ts +0 -109
  906. package/scripts/test-harness-terminal.ts +0 -164
  907. package/scripts/test-header-trail.mjs +0 -95
  908. package/scripts/test-hitl.ts +0 -360
  909. package/scripts/test-koda-restyle.mjs +0 -105
  910. package/scripts/test-lane-raw.ts +0 -67
  911. package/scripts/test-lanes-history-render.mjs +0 -138
  912. package/scripts/test-loop-omp.mjs +0 -154
  913. package/scripts/test-mdlite.ts +0 -53
  914. package/scripts/test-memory-brief-chronicle.ts +0 -180
  915. package/scripts/test-memory-rrf-mmr.ts +0 -114
  916. package/scripts/test-mock-collab.mjs +0 -226
  917. package/scripts/test-modern-render.mjs +0 -174
  918. package/scripts/test-omp-terminal.mjs +0 -187
  919. package/scripts/test-plugin-ext.ts +0 -173
  920. package/scripts/test-prompts-loader.ts +0 -56
  921. package/scripts/test-real-scenario.mjs +0 -290
  922. package/scripts/test-stream-render.ts +0 -37
  923. package/scripts/test-task-drawer.mjs +0 -204
  924. package/scripts/test-task-invariants.mjs +0 -169
  925. package/scripts/test-town-3d.mjs +0 -121
  926. package/scripts/test-town-layout.mjs +0 -200
  927. package/scripts/test-town-page.mjs +0 -136
  928. package/scripts/test-town-scene-math.ts +0 -169
  929. package/scripts/test-town-twin.mjs +0 -121
  930. package/scripts/test-town-upload.mjs +0 -89
  931. package/scripts/test-town-user-flow.mjs +0 -619
  932. package/scripts/test-town-world.mjs +0 -76
  933. package/scripts/test-town-wuwa.mjs +0 -198
  934. package/scripts/test-user-isolation.mjs +0 -193
  935. package/scripts/test-workshop-entries.ts +0 -370
  936. package/scripts/test-workspace-api.ts +0 -329
  937. package/scripts/test-ws-aep.mjs +0 -187
  938. package/scripts/test-ws-protocol.ts +0 -134
  939. package/scripts/town-demo-seed.mjs +0 -75
  940. package/scripts/town-scene-clear.mjs +0 -56
  941. package/scripts/verify-exec-modes-report.ts +0 -248
  942. package/scripts/verify-lead-mail.ts +0 -188
  943. package/scripts/verify-page-smoke.mjs +0 -87
  944. package/scripts/ws-test.mjs +0 -176
  945. package/scripts/ws-test.py +0 -4
package/docs/sdk.md CHANGED
@@ -1,62 +1,116 @@
1
1
  # AgentWorkShop SDK 开发与使用指南
2
2
 
3
- > SDK 是 AgentWorkShop 的**编程客户端与扩展基座**:外部项目经它消费平台 REST 服务;
4
- > 插件经它获得宿主注入的运行时上下文(钩子 / 配置 / 存储 / 定时器 / 平台 API / 事件流)。
5
- > 零第三方运行时依赖,Node ≥ 23.4 与现代浏览器双端可用。
3
+ > SDK 是 AgentWorkShop 的**编程客户端与扩展基座**:外部项目经它消费平台 REST 服务;
4
+ > 插件经它获得宿主注入的运行时上下文(钩子 / 配置 / 存储 / 定时器 / 平台 API / 事件流)。
5
+ > 零第三方运行时依赖,Node ≥ 23.4 与现代浏览器双端可用。
6
6
 
7
- **版本**:与主包同步(`SDK_VERSION = 0.3.0`)· **协议**:ESM only
8
- **类型**:`agentworkshop/sdk` 自带 `index.d.mts`,TS 项目零配置获得完整提示。
7
+ **SDK 版本常量**:服务端 `SDK_VERSION = '0.3.0'`,浏览器端 `CLIENT_SDK_VERSION = '0.3.0'`。
8
+ 这两个常量是 **SDK 自身接口的版本号**,与 npm 包版本(`package.json` 的 `version`,当前 0.7.37)
9
+ **各自独立演进** —— 常数不同步是预期行为,不要拿 `SDK_VERSION` 去推断包版本,反之亦然。
10
+ **模块形态**:ESM only(只有 `import` / `export`,没有 CJS 入口)。
11
+ **类型**:`sdk/index.d.mts`、`sdk/client.d.mts` 随包发布,TS 项目零配置获得提示(覆盖范围见 §7)。
9
12
 
10
13
  ---
11
14
 
12
15
  ## 1. 获取 SDK
13
16
 
14
- ### 1.1 全局安装形态(含 CLI 与平台本体)
17
+ ### 1.1 全局安装形态(含 CLI 与平台本体)
15
18
 
16
19
  ```bash
17
20
  npm install -g agentworkshop
18
21
  ```
19
22
 
20
- SDK 位于全局包内:`$(npm prefix -g)/node_modules/agentworkshop/sdk/`。
21
- 插件**无需也不应该**直接 import 它(见 §2 的宿主注入模型),它主要服务两类人:
23
+ SDK 位于全局包内:`$(npm prefix -g)/node_modules/agentworkshop/sdk/`。
24
+ 插件**无需也不应该**直接 import 它(见 §2 的宿主注入模型),它主要服务两类人:
22
25
 
23
- - **外部项目集成**:把 AgentWorkShop 的产线/数采/写控/孪生能力嵌进你自己的 node 服务;
24
- - **插件开发**(TS):仅导入类型获得完整 IntelliSense,运行时由宿主注入。
26
+ - **外部项目集成**:把 AgentWorkShop 的产线 / 数采 / 写控 / 孪生能力嵌进你自己的 node 服务;
27
+ - **插件开发**(TS):仅导入类型获得完整 IntelliSense,运行时由宿主注入。
25
28
 
26
- ### 1.2 项目依赖形态(推荐集成方)
29
+ ### 1.2 项目依赖形态(推荐集成方)
27
30
 
28
31
  ```bash
29
- npm install agentworkshop # 作为依赖(含完整 SDK 与类型)
32
+ npm install agentworkshop # 作为依赖(含完整 SDK 与类型)
30
33
  ```
31
34
 
32
35
  ### 1.3 导入路径
33
36
 
34
- | 导入 | 内容 |
35
- |---|---|
36
- | `agentworkshop/sdk` | 全部门面(客户端 + 服务端 + 平台 REST 客户端 + 类型) |
37
- | `agentworkshop/sdk/client` | 仅浏览器端(`createClientContext`) |
37
+ `package.json` 的 `exports` 只开放四个入口:
38
+
39
+ | 导入 | 解析到 | 内容 |
40
+ |---|---|---|
41
+ | `agentworkshop` | `sdk/index.mjs` | 与 `agentworkshop/sdk` **完全同一个门面**(根导入此前未见于文档,可以照用) |
42
+ | `agentworkshop/sdk` | `sdk/index.mjs` | 全部门面(服务端 + 浏览器端 + 平台 REST 客户端 + 类型) |
43
+ | `agentworkshop/sdk/client` | `sdk/client.mjs` | 仅浏览器端(`createClientContext`) |
44
+ | `agentworkshop/package.json` | `package.json` | 包元数据 |
45
+
46
+ **深路径不可导入**:`agentworkshop/sdk/api.mjs`、`agentworkshop/sdk/hooks.mjs`
47
+ 这类路径没有出现在 `exports` 里,Node 会抛 `ERR_PACKAGE_PATH_NOT_EXPORTED`。
48
+ 需要哪个符号,就从上面三个入口取。
38
49
 
39
50
  ```js
40
51
  import { createPlatformClient, definePlugin, HookBus } from 'agentworkshop/sdk'
52
+ import { createClientContext } from 'agentworkshop/sdk/client' // 仅浏览器端
41
53
  ```
42
54
 
55
+ ### 1.4 命名导出清单
56
+
57
+ | 入口 | 命名导出 |
58
+ |---|---|
59
+ | `agentworkshop/sdk`(等价于 `agentworkshop`) | `SDK_VERSION`、`definePlugin`、`createPluginContext`、`createRouteTable`、`validatePluginModule`、`validatePluginSettings`、`validatePluginGroups`、`resolvePluginGroupId`、`pluginKvExists`、`isPathInside`、`HookBus`、`createPlatformClient`、`CLIENT_SDK_VERSION`、`createClientContext`、`LIFECYCLE_EVENTS`、`CLIENT_EVENTS` |
60
+ | `agentworkshop/sdk/client` | `CLIENT_SDK_VERSION`、`createClientContext` |
61
+
62
+ ### 1.5 其余命名导出速查
63
+
64
+ 插件作者平时用的是宿主注入的 `ctx`(§4);下面这些符号服务于宿主装配、脚手架与校验工具。
65
+
66
+ | 符号 | 签名 | 用途 |
67
+ |---|---|---|
68
+ | `createPluginContext(opts)` | `opts` 为宿主装配对象 | 由宿主调用生成 `ctx`;插件作者不需要自己调 |
69
+ | `createRouteTable()` | → `{ register, resolve, byPlugin, unregisterPlugin, size }` | 宿主路由表:精确匹配,挂 `/api/plugins/<name><path>` |
70
+ | `definePlugin(def)` | `def` → `def` | 纯类型糖兼形态校验;不合法直接抛错。宿主同样接受裸对象导出 |
71
+ | `validatePluginModule(mod, source)` | → `{ ok, def?, error? }` | 装载前的入口形态检查(`name` 必填、`setup` 必须是函数、`client` 必须是字符串、`settings` 必须是数组) |
72
+ | `validatePluginSettings(pluginName, defs)` | → `{ descriptors, errors }` | 校验并规范化设置声明;规则见 §4.9 |
73
+ | `validatePluginGroups(pluginName, defs)` | → `{ groups, errors }` | 校验并规范化配置分组声明 |
74
+ | `resolvePluginGroupId(pluginName, declaredId)` | → `string` | 把声明的分组名收敛进 `plugin-<name>[-<suffix>]` 命名空间 |
75
+ | `pluginKvExists(dataDir, name)` | → `boolean` | 探测 `<dataDir>/plugins/<name>/kv.json` 是否存在 |
76
+ | `isPathInside(dir, p)` | → `boolean` | 路径包含判定(用 `relative()`,不会被 `…/foo-evil` 这类兄弟同前缀目录骗过) |
77
+ | `HookBus` | `class` | 钩子总线实现;宿主持有一个共享实例,插件侧拿到的是作用域门面(§4.1) |
78
+ | `LIFECYCLE_EVENTS` | 冻结数组(11 项) | 服务端事件权威清单(§5) |
79
+ | `CLIENT_EVENTS` | 冻结数组(5 项) | 浏览器端事件权威清单(§5) |
80
+
43
81
  ---
44
82
 
45
- ## 2. 核心模型:两种身份,一个 SDK
83
+ ## 2. 核心模型:两种身份,一个 SDK
46
84
 
47
85
  | 身份 | 形态 | SDK 的角色 |
48
86
  |---|---|---|
49
87
  | **外部集成者** | 普通依赖 | 直接调用 `createPlatformClient()` 消费平台 REST 面 |
50
- | **插件作者** | 导出 `{ name, setup(ctx) }` | `ctx` 即宿主注入的 SDK 上下文——**零导入依赖**,SDK 运行时由宿主提供 |
88
+ | **插件作者** | 导出 `{ name, setup(ctx) }` | `ctx` 即宿主注入的 SDK 上下文 —— **零导入依赖**,SDK 运行时由宿主提供 |
51
89
 
52
- > 为什么插件不直接 import SDK?全局安装的插件目录(`~/.AgentWorkShop/plugins/`)
53
- > 不在 node_modules 解析链上,宿主注入是唯一零坑形态(VSCode `activate(context)` 同范式)。
90
+ > 为什么插件不直接 import SDK?全局安装的插件目录(`~/.AgentWorkShop/plugins/`)
91
+ > 不在 node_modules 解析链上,宿主注入是唯一零坑形态(VSCode `activate(context)` 同范式)。
92
+
93
+ 插件入口就是一个普通 ESM 模块:
94
+
95
+ ```js
96
+ export default {
97
+ name: 'my-plugin',
98
+ version: '1.0.0',
99
+ description: '示例插件',
100
+ auth: 'none', // 插件路由的声明式鉴权,见 §4.4
101
+ client: './client.mjs', // 浏览器端入口(可省略),见 §6
102
+ async setup(ctx) {
103
+ ctx.logger.info('已装载,目录:', ctx.dir)
104
+ },
105
+ }
106
+ ```
54
107
 
55
108
  ---
56
109
 
57
110
  ## 3. 平台 REST 客户端 `createPlatformClient`
58
111
 
59
- SDK 作为"项目服务客户端"的门面。自动携带鉴权、自动解包平台统一信封 `{ code, message, data } → data`、非 2xx 抛错(含 `err.status` 与 `err.body`)。
112
+ SDK 作为「项目服务客户端」的门面:自动携带 Bearer token、自动解包平台统一信封
113
+ `{ code, message, data } → data`、按下面的规则抛错。
60
114
 
61
115
  ### 3.1 创建
62
116
 
@@ -64,40 +118,145 @@ SDK 作为"项目服务客户端"的门面。自动携带鉴权、自动解包
64
118
  import { createPlatformClient } from 'agentworkshop/sdk'
65
119
 
66
120
  const api = createPlatformClient({
67
- baseUrl: 'http://127.0.0.1:3001', // 缺省 ''(同源相对路径);集成方填平台地址
68
- token: '<bearer-token>', // 可选;后续可 api.setToken() 更换
69
- timeoutMs: 10_000, // 可选;单请求超时
70
- logger, // 可选;请求失败时告警
121
+ baseUrl: 'http://127.0.0.1:3001', // 缺省 ''(同源相对路径);集成方填平台地址
122
+ token: '<bearer-token>', // 可选;后续可 api.setToken() 更换
123
+ timeoutMs: 10_000, // 可选;单请求超时(AbortSignal),默认 10 000
124
+ logger, // 可选;请求失败时告警
71
125
  })
72
126
  ```
73
127
 
74
- ### 3.2 通用调用(任意平台路径)
128
+ - `baseUrl` 缺省为 `''`,即同源相对路径;它**也可以是一个函数**,每次请求时惰性求值
129
+ (宿主的监听端口要到服务真正 listen 之后才确定,所以宿主传的是 `() => origin`)。
130
+ - 结尾的 `/` 会被自动去掉,`'http://host:3001/'` 与 `'http://host:3001'` 等价。
131
+
132
+ ### 3.2 信封与错误语义(三条路径,别记混)
133
+
134
+ | 情形 | 行为 |
135
+ |---|---|
136
+ | HTTP 非 2xx | 抛 `Error`,错误对象上**只有 `err.status` 与 `err.body`**;这条路径**不设 `err.code`** |
137
+ | HTTP 200 但信封 `code !== 0` | 抛 `Error`,错误对象上 `err.status`、`err.code`、`err.body` **三者都有** |
138
+ | 成功 | 返回解包后的 `data`;响应体不含 `code`/`data` 信封时**原样返回**(例如 `GET /api/workshop/plugins`、`GET /api/plugins/manifest`) |
139
+
140
+ ```js
141
+ try {
142
+ await api.daqNodes.get('no-such-node')
143
+ }
144
+ catch (err) {
145
+ err.status // 404
146
+ err.body // { code: 'NOT_FOUND', message: '…', data: null }
147
+ err.code // undefined —— 非 2xx 路径不设 code
148
+ }
149
+ ```
150
+
151
+ > 平台侧 `defineApiHandler` 会把业务错误设成对应的非 2xx 状态码,所以日常遇到的几乎都是第一条路径。
152
+ > 第二条路径是 SDK 的防御性检查(`sdk/api.mjs` 在解包前先看 `code`),主要防的是
153
+ > 「不走统一包装器、却在 200 下返回错误信封」的端点 —— 没有这道检查,插件会把错误信封
154
+ > 解包成 `null` 当成功用。
155
+
156
+ ### 3.3 通用调用(任意平台路径)
75
157
 
76
158
  | 方法 | 签名 | 说明 |
77
159
  |---|---|---|
78
- | `api.call(method, path, body?)` | 底层 | 返回解包后的 `data` |
160
+ | `api.call(method, path, body?, opt?)` | 底层 | `opt` 可带 `{ timeoutMs, headers }`;返回解包后的 `data` |
79
161
  | `api.get(path, query?)` | query 对象自动序列化 | `api.get('/api/workshop/dcw', { page: 1 })` |
80
162
  | `api.post(path, body?)` | JSON 序列化 | |
81
163
  | `api.patch(path, body?)` | | |
82
164
  | `api.delete(path)` | | |
83
- | `api.setToken(token)` | 链式 | 登录后 `api.setToken(res.token)` |
165
+ | `api.setToken(token)` | 链式,返回 `api` 自身 | 登录后 `api.setToken(res.token)`;传 `null` 清除 |
166
+ | `api.ping()` | `GET /api/plugins/manifest` | 存活探测(免鉴权) |
167
+
168
+ `toQuery` 会**丢弃 `undefined`、`null` 与空串**的字段,所以 `api.get('/x', { lineId: undefined })`
169
+ 不会产生 `?lineId=undefined`。
170
+
171
+ ### 3.4 资源面与真实基路径
172
+
173
+ 每个资源由内部的 `resource(root)` 生成,因此**都带齐五项**:
174
+ `list(query?)`、`get(id)`、`create(body)`、`update(id, patch)`、`remove(id)`。
175
+ 「方法存在」不等于「服务端路由存在」,真实可用性见 §3.5。
176
+
177
+ | 命名空间 | 基路径 | 额外方法 |
178
+ |---|---|---|
179
+ | `api.users` | `/api/users` | `login(email, password)` → `{ user, token }`;`me()` |
180
+ | `api.lines` | `/api/workshop/dcw/lines` | `start(id, recipeId = '')`;`stop(id)` |
181
+ | `api.products` | `/api/workshop/dcw/products` | — |
182
+ | `api.recipes` | `/api/workshop/dcw/recipes` | — |
183
+ | `api.dcwNodes` | `/api/workshop/dcw` | — |
184
+ | `api.daqNodes` | `/api/workshop/daq` | `alarms()` → `GET /api/workshop/daq/alarms` |
185
+ | `api.templates` | — | `daq()` / `dcw()`:读两条列表响应里的 `.templates` |
186
+ | `api.twins` | `/api/workshop/device-twins` | — |
187
+ | `api.teams` | `/api/workshop/teams` | — |
188
+ | `api.agents` | `/api/workshop/agents` | — |
189
+ | `api.channels` | `/api/workshop/channels` | — |
190
+ | `api.permissions` | — | `overview()` → `GET /api/workshop/permissions`;`set({ userId, grants })` → `PUT /api/workshop/permissions`(admin) |
191
+ | `api.plugins` | — | `manifest()` |
192
+
193
+ `api.permissions.set` 的载荷形状:
194
+
195
+ ```json
196
+ { "userId": "<用户 id>", "grants": [{ "lineId": "<产线 id>", "mode": "readonly" }] }
197
+ ```
198
+
199
+ `mode` 取 `'readonly'` / `'operate'` / `null`(传 `null` 表示撤销该项授权)。
200
+
201
+ ### 3.5 路由实际支持情况
202
+
203
+ `resource(root)` 一律生成五项,但服务端只有部分路由文件存在。**下表是逐个路由文件核对的结果**:
204
+ 「否」表示该调用打到不存在的路径,实际会 404。
205
+
206
+ | 命名空间 | `list` | `get(id)` | `create` | `update(id)` | `remove(id)` | 备注 |
207
+ |---|---|---|---|---|---|---|
208
+ | `users` | 是 | 是 | 是 | **否** | 是 | 服务端只有 `PUT /api/users/:id`,而 `update()` 发的是 `PATCH`;需要更新用户请直接 `api.call('PUT', '/api/users/' + id, patch)`。`list`/`get`/`create` 均需 admin |
209
+ | `lines` | 是 | 否 | 是 | 是 | 是 | 另有 `start` / `stop`。`create` 需要 `admin` 或 `editor` 角色 |
210
+ | `products` | **否** | 否 | 是 | 是 | 是 | 没有 `GET /api/workshop/dcw/products`;产品列表从 `GET /api/workshop/dcw` 的 `.products` 读(见 §3.6) |
211
+ | `recipes` | 是 | 否 | 是 | 是 | 是 | `list()` 返回 `{ recipes, runs }`;`recipes.get(id)` 无对应路由 |
212
+ | `dcwNodes` | 是 | 否 | 是 | 是 | 是 | 无 `[id].get.ts`;节点列表从 `GET /api/workshop/dcw` 的 `.nodes` 读 |
213
+ | `daqNodes` | 是 | 否 | 是 | 是 | 是 | 无 `[id].get.ts`;`alarms()` 可用 |
214
+ | `twins` | 是 | 否 | 是 | 是 | 是 | 无 `[id].get.ts` |
215
+ | `teams` | 是 | 是 | 是 | 是 | 是 | 完整 CRUD |
216
+ | `agents` | 是 | 是 | 是 | 是 | 是 | 完整 CRUD |
217
+ | `channels` | 是 | 是 | 是 | 是 | 是 | 完整 CRUD |
218
+ | `permissions` | 仅 `overview()` | — | — | — | — | 无 `resource()` 五项;只有 `overview()` 与 `set()` |
219
+ | `plugins` | 仅 `manifest()` | — | — | — | — | 免鉴权 |
220
+
221
+ 鉴权与超时:
222
+
223
+ - `api.lines.list()`、`api.daqNodes.list()`、`api.dcwNodes.list()` 等业务读接口都走平台鉴权,
224
+ 需要用户 token(`api.setToken(...)` 或浏览器里的 cookie);
225
+ - `api.plugins.manifest()` 与 `api.ping()` 免鉴权,是唯一的两个「不开 token 就能调」的接口。
226
+
227
+ ### 3.6 响应形状速查
84
228
 
85
- ### 3.3 资源面(开箱即用)
229
+ **列表不一定返回数组** —— 这是最容易踩的坑,下面每一条都对着服务端 handler 核过。
86
230
 
87
- | 资源 | 方法 |
231
+ | 调用 | 真实响应 |
88
232
  |---|---|
89
- | `api.users` | `login(email, password)` · `me()` · `list/get/create/update/remove` |
90
- | `api.lines` | CRUD + **`start(id, recipeId?)`** · `stop(id)` |
91
- | `api.products / api.recipes` | CRUD |
92
- | `api.dcwNodes` | 写控制节点 CRUD |
93
- | `api.daqNodes` | 数采节点 CRUD + `alarms()` |
94
- | `api.templates` | `daq()` / `dcw()` 信号模板注册表 |
95
- | `api.twins` | 数字孪生设备 CRUD |
96
- | `api.teams / api.agents / api.channels` | Agent 编组面 |
97
- | `api.plugins.manifest()` | 已装载插件清单(免鉴权) |
98
- | `api.ping()` | 存活探测(免鉴权) |
99
-
100
- ### 3.4 示例:外部项目集成产线
233
+ | `api.lines.list()` | `{ lines, states }`(**不是数组**) |
234
+ | `api.daqNodes.list()` | `{ controller, nodes, meta, driverAvailable, infra, templates }` |
235
+ | `api.dcwNodes.list()` | 多键对象(`controller` / `nodes` / `templates` / `recipes` / `runs` / `history` / `products` / `lines` …),**不是节点数组** |
236
+ | `api.recipes.list()` | `{ recipes, runs }` |
237
+ | `api.twins.list()` | `{ twins }` |
238
+ | `api.daqNodes.alarms()` | `{ alarms }` |
239
+ | `api.permissions.overview()` | `{ lines, users }` |
240
+ | `api.templates.daq()` / `api.templates.dcw()` | 数组(`.templates ?? []`) |
241
+ | `api.teams.list()` / `api.agents.list()` / `api.channels.list()` | 数组 |
242
+ | `api.users.list()` | `{ items, total, page, pageSize }` |
243
+ | `api.plugins.manifest()` | `{ plugins }`(无信封,原样返回) |
244
+ | `api.lines.create(body)` | `{ line }` |
245
+ | `api.recipes.create(body)` | `{ recipe }` |
246
+ | `api.products.create(body)` | `{ product }` |
247
+ | `api.dcwNodes.create(body)` / `api.daqNodes.create(body)` | `{ node }` |
248
+ | `api.twins.create(body)` | `{ twin }` |
249
+ | `api.lines.start(id, recipeId)` | `{ run, line }` |
250
+ | `api.users.login(email, password)` | `{ user, token }` |
251
+
252
+ 关于 `api.daqNodes.list({ lineId })`:`{ lineId }` 这个查询参数**服务端 handler 并不读取**,
253
+ 产线过滤是按调用者权限在服务端做的(普通用户只看到被授权产线的节点)。
254
+ 不要把它当成可用的客户端过滤器。
255
+
256
+ 关于 `api.lines.start(id, recipeId)`:`recipeId` 缺省是空串,但服务端**要求一个真实存在的配方**
257
+ (空串或未知 id 会得到 404 `Recipe 不存在`)。产线有配方时,`recipeId` 事实上是必填参数。
258
+
259
+ ### 3.7 完整示例:外部项目集成
101
260
 
102
261
  ```js
103
262
  import { createPlatformClient } from 'agentworkshop/sdk'
@@ -107,139 +266,544 @@ const api = createPlatformClient({ baseUrl: 'http://plant.local:3001' })
107
266
  const { token } = await api.users.login('you@example.com', 'secret')
108
267
  api.setToken(token)
109
268
 
110
- await api.lines.create({ name: '一号产线' })
111
- const line = (await api.lines.list())[0]
269
+ // 1) 产线列表:{ lines, states } —— 不是数组
270
+ const { lines, states } = await api.lines.list()
271
+ console.log(`产线 ${lines.length} 条`)
272
+ for (const l of lines) {
273
+ console.log(` ${l.name} → ${states.find(s => s.lineId === l.id)?.state ?? '未知'}`)
274
+ }
275
+
276
+ // 2) 数采面:{ controller, nodes, meta, driverAvailable, infra, templates }
277
+ const { nodes } = await api.daqNodes.list()
278
+ console.log(`数采节点 ${nodes.length} 个,离线 ${nodes.filter(n => n.state === 'offline').length} 个`)
279
+
280
+ // 3) 写控面:节点列表同样是对象,产品从 dcwNodes.list() 的 .products 读
281
+ const dcw = await api.dcwNodes.list()
282
+ console.log(`写控节点 ${dcw.nodes.length} 个,产品 ${dcw.products.length} 个`)
283
+
284
+ // 4) 配方面:{ recipes, runs }
285
+ const { recipes } = await api.recipes.list()
286
+
287
+ // 5) 开跑:recipeId 必须是本产线的真实配方(传空串会被服务端拒绝)
288
+ const line = lines[0]
289
+ const recipe = recipes.find(r => r.lineId === line?.id)
290
+ if (line && recipe) {
291
+ await api.lines.start(line.id, recipe.id)
292
+ await api.lines.stop(line.id)
293
+ }
112
294
 
113
- await api.lines.start(line.id) // 开跑
114
- const nodes = await api.daqNodes.list({ lineId: line.id })
115
- console.log(`产线 ${line.name} 在线节点 ${nodes.filter(n => n.state !== 'offline').length}`)
295
+ // 6) 产线授权(admin):overview() 全量,set() 批量写
296
+ const { users } = await api.permissions.overview()
297
+ const target = users[0]
298
+ if (target && line) {
299
+ await api.permissions.set({ userId: target.id, grants: [{ lineId: line.id, mode: 'readonly' }] })
300
+ }
116
301
  ```
117
302
 
118
303
  ---
119
304
 
120
- ## 4. 插件上下文 `ctx`(完整成员)
305
+ ## 4. 插件上下文 `ctx`(完整成员)
121
306
 
122
- `setup(ctx)` 收到的 `ctx` 是宿主装配的 SDK 运行时。**全部成员一览**:
307
+ `setup(ctx)` 收到的 `ctx` 是宿主装配的 SDK 运行时。**下表是完整成员面**;
308
+ 最后三行(`ctx.daq` / `ctx.omp` / `ctx.services`)由插件宿主在 `setup` 之前直接挂载,不在 `sdk/context.mjs` 里。
123
309
 
124
310
  | 分组 | 成员 | 类型 | 说明 |
125
311
  |---|---|---|---|
126
- | 身份 | `ctx.name` | `string` | 插件名(= 目录名/声明名) |
127
- | | `ctx.scope` | `'project' \| 'user'` | 装载作用域 |
312
+ | 身份 | `ctx.name` | `string` | 插件名(= 目录名 / 声明名) |
313
+ | | `ctx.scope` | `'builtin' \| 'project' \| 'user'` | 装载作用域;同名时优先级 builtin > project > user |
128
314
  | | `ctx.dir` | `string` | 插件目录绝对路径 |
129
- | | `ctx.sdkVersion` | `string` | 宿主 SDK 版本 |
130
- | 钩子 | `ctx.hooks` | `HookBus` | 全局钩子总线(§5) |
131
- | 日志 | `ctx.logger` | `{ debug, info, warn, error }` | 自动前缀 `[插件名]` |
132
- | 配置 | `ctx.config.get(key)` | 任意 | 有效配置项(四层合并后) |
133
- | | `ctx.config.all()` | `Record<string, any>` | 全部有效配置快照 |
134
- | | `ctx.config.onChange(fn)` | 退订函数 | 订阅 `config:changed` |
135
- | 存储 | `ctx.kv.get(key)` / `set(key, v)` / `all()` / `bump(key, by?)` | | 插件私有 KV(内存态 + 200ms 防抖落盘,防竞态) |
136
- | 定时 | `ctx.timer.setInterval(fn, ms)` / `setTimeout(fn, ms)` | id | **服务关闭自动回收**,无需手动 clear |
137
- | 清理 | `ctx.onDispose(fn)` / `ctx.subscriptions.add(d)` | | 登记 `server:close` 时执行的清理 |
138
- | 路由 | `ctx.route(method, path, handler)` | boolean | 注册插件 API → `/api/plugins/<name><path>` |
139
- | 平台 | `ctx.api` | `PlatformClient` | 自环 REST 客户端(origin 由宿主权威解析) |
140
- | 网络 | `ctx.http.get(url)` / `post(url, body)` | `Response` | 通用请求(**仅 http/https**,8s 默认超时) |
141
- | 事件 | `ctx.events.on(type, fn)` / `off` | 退订函数 | scene 实时事件订阅(§5 `event:*` 糖衣) |
142
- | 路径 | `ctx.paths` | `{ home, configRoot, dataDir }` | 配置根信息(home 模式 = `~/.AgentWorkShop`) |
143
- | 数据 | `ctx.dataDir` | `string` | 插件私有数据目录(`data/plugins/<name>`) |
144
-
145
- ### 4.1 `ctx.hooks` — 钩子总线
315
+ | | `ctx.sdkVersion` | `string` | SDK 接口版本(= `SDK_VERSION`) |
316
+ | 钩子 | `ctx.hooks` | `{ on, once, off, emit }` | 本插件作用域的钩子门面(§4.1);**不是 `HookBus` 实例,没有 `.size`** |
317
+ | 日志 | `ctx.logger` | `{ debug, info, warn, error }` | 输出前缀 `[aw-plugins] [<插件名>]` |
318
+ | 配置 | `ctx.config.get(key)` | 任意 | 有效配置项(四层合并后的值) |
319
+ | | `ctx.config.all()` | `Record<string, any>` | 全部有效配置的浅拷贝快照 |
320
+ | | `ctx.config.onChange(fn)` | 退订函数 | 订阅 `config:changed`(§4.5) |
321
+ | | `ctx.config.defineGroup(def)` | 分组对象 \| `null` | 声明本插件专属配置分组(§4.9) |
322
+ | | `ctx.config.defineField(decl)` | 描述符 \| `null` | 声明配置字段(key 自动编址 `plugins.<name>.<key>`) |
323
+ | | `ctx.config.removeGroup(id)` | `boolean` | 摘除分组声明 |
324
+ | | `ctx.config.removeField(key)` | `boolean` | 摘除字段声明 |
325
+ | | `ctx.config.groups()` / `fields()` | 数组 | 本插件当前已注册的分组 / 字段(只读快照) |
326
+ | 路径 | `ctx.paths` | `{ home, configRoot, dataDir }` | 配置根信息(home 模式 = `~/.AgentWorkShop`) |
327
+ | | `ctx.dataDir` | `string` | 本插件私有数据目录 = `<paths.dataDir>/plugins/<name>` |
328
+ | 存储 | `ctx.kv` | `{ get, set, all, bump }` | 插件私有 KV(§4.2);**没有 `reset()`** |
329
+ | 定时 | `ctx.timer.setInterval(fn, ms)` / `setTimeout(fn, ms)` | 定时器 id | 自动 `unref` + 关闭/热重载自动回收(§4.3) |
330
+ | 清理 | `ctx.onDispose(fn)` | 传入的 `fn` | 登记清理回调(§4.3) |
331
+ | | `ctx.subscriptions.add(d)` | 传入的 `d` | 登记 `{ dispose() }` 对象或函数;与 `onDispose` 同一回收队列 |
332
+ | 路由 | `ctx.route(method, path, handler)` | `boolean` | 挂到 `/api/plugins/<name><path>`;鉴权由插件 `auth` 字段声明(§4.4) |
333
+ | 平台 | `ctx.api` | `PlatformClient` | 自环 REST 客户端(**默认无 token**;§4.6) |
334
+ | 网络 | `ctx.http.get(url, opts)` / `post(url, body, opts)` | `Promise<Response>` | 出站请求,守卫只限协议,默认 8s 超时(§4.6) |
335
+ | 事件 | `ctx.events.on(type, fn)` / `off(type, fn)` | 退订函数 | scene 实时事件订阅,自动补 `event:` 前缀(§4.6) |
336
+ | 产线权限(宿主注入) | `ctx.permissions` | 见 §4.7 | 用户 × 产线三态授权的查询与管理 |
337
+ | 数采扩展(宿主注入) | `ctx.daq` | 见 §4.8 | 驱动 / 处理器 / 模板注册 + 帧订阅 + 时序查询 |
338
+ | Agent 工具(宿主注入) | `ctx.omp.registerTool(tool)` | 见 §4.8 | 运行时热注入自定义 host 工具 |
339
+ | 运行时服务(宿主注入) | `ctx.services` | 见 §4.8 | 惰性服务取数 + 跨插件供服务 |
340
+
341
+ `ctx` 上**没有** `ctx.routes`、`ctx.dcw`、`ctx.scene`、`ctx.version`:
342
+ 路由注册只有单数的 `ctx.route()`;写控流量靠 `dcw:write` 钩子观察;scene 事件走 `ctx.events`。
343
+
344
+ ### 4.1 `ctx.hooks` — 钩子门面
345
+
346
+ 宿主持有一个名为 `aw-plugins` 的共享 `HookBus`,插件拿到的是**只含 `on` / `once` / `off` / `emit`
347
+ 的作用域门面**:经它注册的监听器会被登记,插件热重载时自动解绑(这是唯一一条永远有效的清理路径)。
348
+ 门面没有 `count` / `size` / `listeners` 等诊断属性。
146
349
 
147
350
  ```js
148
- const off = ctx.hooks.on('daq:sample', (sample) => {
351
+ function onSample(sample) {
149
352
  ctx.kv.bump('samples')
150
- })
151
- ctx.hooks.once('server:close', () => { /* 收尾 */ })
152
- ctx.hooks.off('daq:sample', handler) // 手动解绑
153
- await ctx.hooks.emit('my-plugin:custom', { hello: 1 }) // 插件间通信(其他插件可监听)
353
+ }
354
+
355
+ const off = ctx.hooks.on('daq:sample', onSample) // 返回解绑函数
356
+ ctx.hooks.once('server:close', () => { /* 收尾,只触发一次 */ })
357
+ ctx.hooks.off('daq:sample', onSample) // 手动解绑:要传原 handler
358
+ off() // 或者直接调用 on() 返回的解绑函数
359
+
360
+ await ctx.hooks.emit('my-plugin:custom', { hello: 1 }) // 插件间通信:其他插件可监听
361
+ ctx.hooks.on('*', ({ type, payload }) => { /* 收全部事件 */ })
154
362
  ```
155
363
 
156
- - **异步串行**:同 type 监听器按注册序 `await`,返回值链式传递(waterfall)。
157
- - **错误隔离**:单监听器抛错只计数告警,不影响兄弟监听器与主服务。
158
- - **熔断**:同一监听器连续失败 ≥ 8 次自动摘除(防病态插件刷屏)。
159
- - **`'*'` 通配**:`ctx.hooks.on('*', ({ type, payload }) => …)` 收全部事件。
364
+ 语义(与 `sdk/hooks.mjs` 一致):
365
+
366
+ - **异步串行**:同 type 的监听器按注册序 `await`,一个未返回不会开始下一个;
367
+ - **错误隔离**:单个监听器抛错只计数并告警,不影响兄弟监听器与主服务;
368
+ - **熔断**:同一监听器**连续**失败 8 次自动摘除;**任意一次成功即把计数清零**,偶发失败不会累积驱逐;
369
+ - **通配**:服务端通配只有裸 `'*'` 一种写法,回调收到 `{ type, payload }`,且在具名监听器之后执行;
370
+ - **返回值为 fan-out 语义,不是 waterfall**:每个监听器都收到**同一个未改动的 payload**;
371
+ `emit()` 只返回「最后一个非 `undefined` 的返回值」,值不会在监听器之间链式传递;
372
+ - **v1 是观察语义**:没有 veto / 拦截 / 改写能力。
373
+
374
+ > `ctx.hooks.on('event:*')` 永远不会触发。`event:*` 是清单里给 scene 事件用的订阅条目名,
375
+ > 真正的通配是裸 `'*'`;scene 事件的订阅糖衣是 `ctx.events.on('<type>', fn)`(§4.6)。
160
376
 
161
377
  ### 4.2 `ctx.kv` — 插件私有持久化
162
378
 
163
- - 存储位置:`<配置根>/data/plugins/<name>/kv.json`(200ms 防抖原子写盘)。
164
- - **内存态为准**:高频钩子(`daq:sample`)与低频钩子(`line:stop`)并发调用无读改写竞态。
165
- - 典型用途:计数器、告警状态、阈值配置、心跳时间戳。
379
+ ```js
380
+ ctx.kv.set('threshold', 100)
381
+ ctx.kv.bump('samples') // 原子自增,默认 +1;bump(key, by) 可指定步长
382
+ ctx.kv.bump('samples', 5)
383
+ ctx.kv.get('threshold') // 100
384
+ ctx.kv.all() // { samples: 19453, threshold: 100, ... }
385
+ ```
386
+
387
+ - **只有这四个方法**:`get` / `set` / `all` / `bump`。**没有 `reset()`、没有 `delete()`、没有 `keys()`**;
388
+ 要清空请显式 `set` 或换成新键。
389
+ - 落盘位置:`<ctx.dataDir>/kv.json`,即 `<paths.dataDir>/plugins/<name>/kv.json`。
390
+ - **内存态为准 + 200ms 防抖原子写**(临时文件 + `rename`),因此高频钩子(`daq:sample`)
391
+ 与低频钩子(`line:stop`)并发调用不会有读改写竞态。
392
+ - 关闭 / 热重载时会**取消挂起的防抖并同步落盘**,退出前最后 200ms 内的 `set` 不会丢。
393
+ - 典型用途:计数器、告警状态、阈值配置、心跳时间戳。
166
394
 
167
- ### 4.3 `ctx.timer` / `ctx.onDispose` — 生命周期安全的后台工作
395
+ ### 4.3 `ctx.timer` / `ctx.onDispose` / `ctx.subscriptions`
168
396
 
169
397
  ```js
170
- ctx.timer.setInterval(() => ctx.kv.set('heartbeat', Date.now()), 5000) // 关闭自动回收
171
- ctx.onDispose(() => ctx.logger.info('插件清理完成')) // 显式清理登记
398
+ ctx.timer.setInterval(() => ctx.kv.set('heartbeat', Date.now()), 5000)
399
+ ctx.timer.setTimeout(() => ctx.logger.info('一次性任务'), 1000)
400
+
401
+ ctx.onDispose(() => ctx.logger.info('插件清理完成'))
402
+
403
+ // subscriptions.add 接受 { dispose() } 对象或函数;与 onDispose 共用同一回收队列
404
+ const controller = new AbortController()
405
+ ctx.subscriptions.add({ dispose() { controller.abort() } })
172
406
  ```
173
407
 
174
- 服务关闭序列:**先逐插件执行 onDispose 队列(逐个 try/catch)→ 再广播 `server:close`**。
408
+ - `ctx.timer.setInterval/setTimeout` 生成的定时器会自动 `unref`(不会拖住进程退出),
409
+ 并自动登记到回收队列,**不需要手动 clear**。
410
+ - `ctx.onDispose(fn)` 与 `ctx.subscriptions.add(d)`(`d` 可以是 `{ dispose() }` 或函数)
411
+ 与定时器共用**同一个宿主回收队列**。
412
+ - 该队列在**服务关闭**与**插件热重载**两种时机都会执行 —— 这是这一版 SDK 修复后给出的保证
413
+ (`createPluginContext` 此前漏接宿主的 `onDispose` 注入口,导致定时器泄漏与最后一次 kv 写入丢失)。
414
+
415
+ 服务关闭序列:
416
+
417
+ ```text
418
+ 服务关闭(nitro close)
419
+ └─ 逐插件执行 dispose 队列(逐个 try/catch):定时器 clear、kv 同步落盘、订阅解绑…
420
+ └─ 广播 server:close { at }
421
+ ```
175
422
 
176
- ### 4.4 `ctx.route` — 插件 API(增强后端)
423
+ ### 4.4 `ctx.route` — 插件 API
177
424
 
178
425
  ```js
179
- ctx.route('GET', '/stats', () => ctx.kv.all())
180
- ctx.route('POST', '/reset', (event) => {
181
- const body = event.awBody // 宿主已预读 JSON body
182
- ctx.kv.reset()
183
- return { ok: true } // 返回值由 nitro 序列化为 JSON
426
+ export default {
427
+ name: 'my-plugin',
428
+ auth: 'user', // 声明式鉴权:'none'(默认) | 'user' | 'admin' | 'agent-or-user'
429
+ async setup(ctx) {
430
+ // 返回 boolean:true = 注册成功,false = handler 不是函数
431
+ const ok = ctx.route('GET', '/stats', () => ctx.kv.all())
432
+ if (!ok) ctx.logger.warn('路由注册失败')
433
+
434
+ ctx.route('POST', '/threshold', (event) => {
435
+ const body = event.awBody // 宿主已预读的 JSON body(可能是 undefined)
436
+ const threshold = Number(body?.threshold)
437
+ if (!Number.isFinite(threshold)) return { ok: false, error: 'threshold must be a number' }
438
+ ctx.kv.set('threshold', threshold)
439
+ return { ok: true, threshold } // 返回值由 nitro 序列化为 JSON
440
+ })
441
+ },
442
+ }
443
+ ```
444
+
445
+ → 挂载在 `GET /api/plugins/<插件名>/stats`、`POST /api/plugins/<插件名>/threshold`。
446
+
447
+ - **返回值是 `boolean`**:`handler` 不是函数时返回 `false`。
448
+ - **路径**以 `/` 开头(缺失会被自动补上),base 固定是 `/api/plugins/<插件名>`。
449
+ - **鉴权是声明式的,不要自己写**:在插件定义上给 `auth: 'none' | 'user' | 'admin' | 'agent-or-user'`,
450
+ 平台 catch-all(`server/api/plugins/[name]/[...path].ts`)会在进入你的 handler **之前**统一校验,
451
+ 失败返回 401。
452
+ - **handler 拿不到用户对象**:`resolveUser(event)` 不在 `ctx` 上,也无法从插件模块 import。
453
+ 需要用户身份时请用 `auth` 门 + `ctx.api.setToken(...)` 走平台接口。
454
+ - **JSON body 已预读**,挂在 `event.awBody` 上(不是 h3 的 `readBody`)。
455
+ - handler 抛错会被隔离:平台记录带插件名的日志,并返回 500 信封
456
+ (`插件路由处理失败(<插件名>): <原始消息>`),不会裸传堆栈。
457
+
458
+ ### 4.5 `ctx.config` — 配置读取与变更
459
+
460
+ ```js
461
+ ctx.config.get('plugins.my-plugin.threshold') // 有效值(四层合并后)
462
+ ctx.config.all() // 全部有效配置(浅拷贝)
463
+
464
+ const off = ctx.config.onChange((payload) => { // payload: config:changed 载荷,见 §5
465
+ ctx.logger.info('配置已变更:', payload?.changed)
184
466
  })
185
467
  ```
186
468
 
187
- → `GET /api/plugins/<name>/stats`。v1 鉴权由插件自理(handler 内可用 `resolveUser(event)` 复用业务鉴权)。
469
+ `config:changed` 由平台设置服务的变更事件桥接到插件总线,`ctx.config.onChange(fn)`
470
+ 本质是 `ctx.hooks.on('config:changed', fn)`,因此热重载时同样会自动解绑。
188
471
 
189
- ### 4.5 `ctx.api` vs `ctx.http` vs `ctx.events` — 怎么选
472
+ ### 4.6 `ctx.api` / `ctx.http` / `ctx.events` — 怎么选
190
473
 
191
474
  | 需求 | 用 | 原因 |
192
475
  |---|---|---|
193
- | 读/写**平台业务数据**(产线、节点、孪生…) | `ctx.api` | 鉴权/信封/资源语义开箱即用 |
194
- | 调**外部系统**(MES、webhook、邮件网关) | `ctx.http` | 通用请求 + 协议守卫 |
195
- | 对**实时流**做反应(采样、告警、启停) | `ctx.events` / `ctx.hooks.on` | 进程内直连,零 HTTP 开销 |
476
+ | 读 / 写**平台业务数据**(产线、节点、孪生…) | `ctx.api` | 鉴权 / 信封 / 资源语义开箱即用 |
477
+ | 调**外部系统**(MES、webhook、邮件网关) | `ctx.http` | 通用请求 + 协议守卫 |
478
+ | 对**实时流**做反应(采样、告警、启停) | `ctx.events` / `ctx.hooks.on` | 进程内直连,零 HTTP 开销 |
196
479
 
197
- > 鉴权说明:`ctx.api` 自环调用遵循平台 REST 鉴权策略——免鉴权端点(manifest/ping)
198
- > 开箱即用;鉴权端点需 `ctx.api.setToken(token)`(登录后调用的 token)。
199
- > 服务端插件若仅需进程内数据,优先用 `ctx.events` 与 `ctx.hooks`(零鉴权、零开销)。
480
+ ```js
481
+ // ctx.api:自环 PlatformClient。baseUrl 由宿主惰性解析,默认不带 token。
482
+ const { token } = await ctx.api.users.login('user@example.com', 'secret')
483
+ ctx.api.setToken(token) // 之后的自环调用带上该 token
484
+ const { lines } = await ctx.api.lines.list()
485
+
486
+ // ctx.http:出站请求,只做协议守卫(仅 http/https),默认 8s 超时
487
+ const res = await ctx.http.get('https://mes.example.com/health', { timeoutMs: 3000 })
488
+ const payload = await ctx.http.post('https://mes.example.com/events', { lineId: 'L1' })
489
+
490
+ // ctx.events:scene 事件,type 传场景事件名本身,自动补 `event:` 前缀
491
+ ctx.events.on('daq.reading', r => ctx.logger.info('采样', r.nodeId))
492
+ ctx.events.on('permissions.changed', ({ userId }) => ctx.logger.info('授权变更', userId))
493
+ ctx.events.on('device.created', d => ctx.logger.info('新设备', d.id))
494
+ const off = ctx.events.on('daq.alarm', a => ctx.logger.warn('告警', a.id))
495
+ off()
496
+ ```
497
+
498
+ - `ctx.api` **默认无 token**:免鉴权端点(`plugins.manifest` / `ping`)可直接用;
499
+ 其余端点要先登录再 `setToken`。若只需要进程内数据,优先用 `ctx.events` 与 `ctx.hooks`(零鉴权、零开销)。
500
+ - `ctx.http` 的守卫**只检查协议**,不限制主机名 —— 目标地址由插件自己负责。
501
+ - `ctx.events.on(type, fn)` / `off(type, fn)` 内部装的是 `event:<type>`;
502
+ 要收全部 scene 事件请用 `ctx.hooks.on('*', ({ type, payload }) => …)`。
503
+
504
+ ### 4.7 `ctx.permissions` — 用户 × 产线授权
505
+
506
+ | 方法 | 返回 | 说明 |
507
+ |---|---|---|
508
+ | `lineMode(user, lineId)` | `'none' \| 'readonly' \| 'operate'` | `user` 是 `{ id, role }`;admin/editor 恒为 `operate` |
509
+ | `visibleLineIds(user)` | `Set<string> \| null` | `null` 表示不限(admin/editor) |
510
+ | `listGrants(userId)` | `Array<{ lineId, mode, grantedBy, grantedAt }>` | 读取某用户的全部授权 |
511
+ | `setGrants(userId, grants, grantedBy?)` | 写入后的授权数组 | `grants` 形如 `[{ lineId, mode }]`,`mode` 取 `'readonly'` / `'operate'` / `null` |
512
+
513
+ ```js
514
+ const userId = ctx.kv.get('watchUserId') // 插件侧的 userId 来自事件载荷或自身配置
515
+ if (userId) {
516
+ const mode = ctx.permissions.lineMode({ id: userId, role: 'user' }, 'line-1')
517
+ const visible = ctx.permissions.visibleLineIds({ id: userId, role: 'user' })
518
+ const grants = ctx.permissions.listGrants(userId)
519
+ ctx.logger.info(`mode=${mode} visible=${visible ? visible.size : 'all'} grants=${grants.length}`)
520
+ }
521
+
522
+ // 变更通知是 scene 事件 permissions.changed,经 ctx.events 补前缀后订阅
523
+ ctx.events.on('permissions.changed', ({ userId }) => ctx.logger.info('授权变更:', userId))
524
+ ```
525
+
526
+ ### 4.8 宿主注入的扩展面 `ctx.daq` / `ctx.omp` / `ctx.services`
527
+
528
+ **`ctx.daq`** —— 多形态数采扩展(v0.6 帧管线):
529
+
530
+ | 方法 | 说明 |
531
+ |---|---|
532
+ | `registerDriver({ kind, available, sample, test })` | 注册自定义驱动 |
533
+ | `registerProcessor(kind, name, fn)` | 注册下沉处理器(采样后、入库前) |
534
+ | `registerTemplate(def)` | 注册数采节点模板(`key` / `signalKind` / `vector` / `sink` / `metrics`) |
535
+ | `onFrame(fn)` | 帧订阅糖衣(= `ctx.hooks.on('daq:frame', fn)`) |
536
+ | `onSample(fn)` | 采样订阅糖衣(= `ctx.hooks.on('daq:sample', fn)`) |
537
+ | `query({ nodeIds?, lineId?, from?, to?, bucketMs? })` | 免鉴权时序查询(直通 `queryTagged`) |
538
+ | `nodes()` | 数采节点元数据快照(含产线归属) |
539
+
540
+ ```js
541
+ ctx.daq.registerProcessor('vector', 'my-derive', (frame) => {
542
+ // frame = { kind: 'vector'|'image', points? | blob?(仅图像生产侧), metrics }
543
+ return { ...frame, metrics: { ...frame.metrics, myMetric: 1 } }
544
+ })
545
+ ctx.daq.onFrame(f => ctx.logger.debug('帧', f.nodeId, f.kind))
546
+ const rows = await ctx.daq.query({ nodeIds: ['n1'], from: Date.now() - 3600_000, to: Date.now(), bucketMs: 60_000 })
547
+ const all = await ctx.daq.nodes()
548
+ ```
549
+
550
+ 模板的 `sink.processors` 声明下沉管线;`metrics` 声明派生指标阈值,越限走平台既有告警链路。
551
+ 向量 / 帧元数据入 Timescale `daq_frames`,图像像素入对象存储(`daq:frame` 载荷**不含像素 blob**)。
552
+
553
+ **`ctx.omp.registerTool({ name, label?, description, parameters, roles?, handler })`** ——
554
+ 注册自定义 host 工具,运行时热注入全部在跑的 agent 会话:
555
+
556
+ ```js
557
+ ctx.omp.registerTool({
558
+ name: 'sensor_log',
559
+ label: '传感器标定',
560
+ description: '查询或登记传感器标定结论',
561
+ parameters: { type: 'object', properties: { sensor: { type: 'string' } }, required: ['sensor'] },
562
+ roles: ['lead', 'worker'], // 合法字面量只有 'lead' 与 'worker';缺省双角色
563
+ handler: async (args, agent) => ({ text: `已登记 ${args.sensor}` }), // agent = { agentId, channelId, role, name }
564
+ })
565
+ ```
566
+
567
+ 注册表变更即时热注入在跑会话(重发 `set_host_tools`,不重 spawn);与内置 host tool 同名会被忽略。
568
+
569
+ **`ctx.services`** —— 后端运行时对象面(惰性 getter,取到后缓存):
570
+
571
+ | 调用 | 解析为 |
572
+ |---|---|
573
+ | `ctx.services.names()` | 全部服务名(含插件提供的 `<plugin>.<name>`) |
574
+ | `await ctx.services.get('daq')` | `{ query(q), nodes() }` |
575
+ | `await ctx.services.get('lines')` | `{ list(), byId(id) }` |
576
+ | `await ctx.services.get('channels')` | `{ list(), agents(channelId) }` |
577
+ | `await ctx.services.get('plugins')` | 插件清单**数组**(注意不是对象,也没有 `pluginManifest()`) |
578
+ | `ctx.services.provide(name, getter)` | 供服务,自动加 `<插件名>.` 前缀 |
579
+
580
+ ```js
581
+ const daq = await ctx.services.get('daq')
582
+ const lines = await ctx.services.get('lines')
583
+ const channels = await ctx.services.get('channels')
584
+ const plugins = await ctx.services.get('plugins') // 数组
585
+ ctx.services.provide('my-data', async () => ({ ready: true })) // → 'my-plugin.my-data'
586
+ ctx.logger.info(ctx.services.names().join(', '))
587
+ ```
588
+
589
+ 未知名会抛错(错误由调用方兜底)。`provide` 强制 `<插件名>.` 前缀,避免跨插件命名冲突。
590
+
591
+ ### 4.9 插件设置声明(`settings` / `configGroups`)
592
+
593
+ 两条路径等价:入口顶层的 `settings` 数组(声明式),或 `setup` 里的 `ctx.config.defineField`(条件式)。
594
+
595
+ ```js
596
+ export default {
597
+ name: 'my-plugin',
598
+ configGroups: [{ id: 'conn', label: '连接', collapsed: true }],
599
+ settings: [
600
+ { key: 'base_url', type: 'string', default: 'https://example.com', group: 'conn',
601
+ labelKey: 'plugin.my-plugin.base_url', label: '服务地址' },
602
+ ],
603
+ async setup(ctx) {
604
+ // 等价写法:按条件在运行时补声明
605
+ ctx.config.defineGroup({ id: 'sync', label: '同步' })
606
+ ctx.config.defineField({ key: 'interval', type: 'number', default: 30, min: 1, max: 3600, group: 'sync' })
607
+ },
608
+ }
609
+ ```
610
+
611
+ 校验规则(不满足的条目**会被跳过并告警**,不阻断插件装载):
612
+
613
+ | 规则 | 细节 |
614
+ |---|---|
615
+ | `key` | 必须是 `[A-Za-z0-9_-]+`;最终编址为 `plugins.<插件名>.<key>` |
616
+ | `type` | 只能是 `'string'` / `'number'` / `'boolean'` / `'select'` |
617
+ | `default` | **必填** —— 缺 `default` 的声明直接跳过 |
618
+ | `select` | 必须给 `options` 数组,且 `default` 必须在其字符串化结果里 |
619
+ | `min` / `max` | **只对 `number` 生效** |
620
+ | 分组 | 显式 `group` 会收敛进 `plugin-<name>[-<suffix>]` 命名空间;不给 `group` 的字段落入 `plugin-<name>` 分组,标签即插件名 |
621
+
622
+ 声明成功后并入平台设置服务:设置页「插件」分区自动渲染、PATCH 校验同源、保存即热生效。
623
+ 读值时用完整键:`ctx.config.get('plugins.my-plugin.base_url')`。
200
624
 
201
625
  ---
202
626
 
203
- ## 5. 生命周期事件(服务端,全部钩子)
627
+ ## 5. 生命周期事件
628
+
629
+ 权威清单是 SDK 导出的 `LIFECYCLE_EVENTS`(11 项)与 `CLIENT_EVENTS`(5 项),
630
+ 与宿主实际发射面逐一核对过。**全部事件也是配置根事件流的一部分**。
204
631
 
205
- | 事件 | 触发时机 | payload | 典型用途 |
632
+ ### 5.1 服务端事件(`LIFECYCLE_EVENTS`,11 项)
633
+
634
+ | 事件名(总线 type) | 触发时机 | payload | 典型用途 |
206
635
  |---|---|---|---|
207
- | `plugin:host:init` | 宿主装载完所有插件后 | `{ plugins: string[], failures: number }` | 就绪自证、延迟初始化 |
208
- | `config:changed` | `runtime-settings.json` 变化(`aw config set` / 设置页写入) | `{ at }` | 热更新阈值、刷新缓存的配置 |
209
- | `daq:sample` | 数采**下发级**采样(与 WS `daq.reading` 同点、按节点 publishIntervalMs 节拍) | `{ nodeId, templateRef, value, state, at }` | 越限告警、统计、联动 |
210
- | `dcw:write` | 写控 ACK 后观察(与运维入册同点、10s 去重) | `{ nodeId, name, eng, prevValue, ok, source, lineId, at }` | 写审计、趋势记录 |
211
- | `line:start` | 产线开跑 | `{ lineId, runId, recipeId, productName? }` | 批次开始联动 |
212
- | `line:stop` | 产线停止 | `{ lineId, runId }` | 批次收尾、报告生成 |
213
- | `event:<scene-type>` / `event:*` | scene 全部实时事件(`device.created` · `daq.node.changed` · `ops.log` …与 WS 同源) | 事件 payload | 任意平台事件的观察与增强 |
214
- | `server:close` | 服务关闭(disposables 回收之后) | `{ at }` | 最终落盘、对外通知 |
636
+ | `plugin:host:init` | 宿主装载完所有插件(含停用)之后,一次性 | `{ plugins: string[], failures: number }` | 就绪自证、延迟初始化 |
637
+ | `plugins:reloaded` | 热重载收尾(启停插件、`plugins-state.json` 变化触发) | `{ plugins: <清单条目数组> }` | 重建缓存、重新注册外部资源 |
638
+ | `config:changed` | `runtime-settings.json` 变化(`aw config set` / 设置页写入,经 SystemConfigService 桥接) | `{ type: 'config:changed', changed: string[], effective: object, sources: object }` | 热更新阈值、刷新缓存 |
639
+ | `event:permissions:changed` | 产线授权写入成功后 | `{ userId }` | 刷新缓存的授权视图 |
640
+ | `event:*` | **订阅条目,不是被发射的事件** | — | 用裸 `'*'` 收全部事件(§4.1) |
641
+ | `daq:sample` | 数采**下发级**采样(与 WS `daq.reading` 同点、按节点 `publishIntervalMs` 节拍) | `{ nodeId, templateRef, value, state, at, lineId }` | 越限告警、统计、联动 |
642
+ | `daq:frame` | 多形态帧(向量 / 图像)下发级,与 `daq:sample` 同一条帧入账路径 | `{ nodeId, templateRef, kind, at, lineId, preview?, metrics, thumbUrl?, state }` | 自定义下沉、派生指标 |
643
+ | `dcw:write` | 写控 ACK 之后观察(不影响写控决策) | `{ nodeId, name, eng, prevValue, ok, source, lineId, at }` | 写审计、趋势记录 |
644
+ | `line:start` | 产线开跑(批次窗口开启) | `{ lineId, runId, recipeId, productName? }` | 批次开始联动 |
645
+ | `line:stop` | 产线停止(批次窗口关闭) | `{ lineId, runId }` | 批次收尾、报告生成 |
646
+ | `server:close` | 服务关闭,逐插件 dispose 队列跑完之后 | `{ at }` | 最终落盘、对外通知 |
647
+
648
+ `dcw:write` 的 `source` 取 `'manual'` / `'recipe'` / `'agent'` / `'rollback'`;
649
+ 载荷里**没有 `message` 字段**(失败原因要看平台日志或入册记录)。
650
+
651
+ `config:changed` 的载荷里**没有 `at` 字段** —— 时间语义请自己取值时的 `Date.now()`,
652
+ 新值从 `ctx.config.get/all()` 读。
653
+
654
+ ### 5.2 浏览器端事件(`CLIENT_EVENTS`,5 项)
655
+
656
+ | 事件 | 触发时机 | payload |
657
+ |---|---|---|
658
+ | `client:init` | 客户端脚本 `setup(ctx)` 执行完成之后 | `{ name }` |
659
+ | `event:*` | scene 实时事件(与浏览器 WS 同源,经事件桥) | 事件自身 payload |
660
+ | `page:change` | 路由切换完成(`page:finish`) | `{ path }` |
661
+ | `i18n:changed` | 界面语言切换 | `{ locale }` |
662
+ | `client:destroy` | `ctx.dispose()` 回收前 | `{ name }` |
663
+
664
+ ### 5.3 订阅写法对照
665
+
666
+ | 想收什么 | 服务端插件 | 浏览器端插件 |
667
+ |---|---|---|
668
+ | 具名生命周期钩子(`daq:sample` / `dcw:write` / `line:start` …) | `ctx.hooks.on('daq:sample', fn)` | 收不到(服务端钩子从不下发) |
669
+ | scene 事件(如 `daq.reading`、`device.created`) | `ctx.events.on('daq.reading', fn)` | `ctx.on('daq.reading', fn)` |
670
+ | 全部 scene 事件 | `ctx.hooks.on('*', ({ type, payload }) => …)` | `ctx.on('event:*', fn)` |
671
+ | 客户端本地钩子(`client:init` / `page:change` / `i18n:changed` / `client:destroy`) | 不适用 | `ctx.hooks.on('page:change', fn)` |
215
672
 
216
- > v1 钩子为**观察语义**——不改变联锁/写控决策;veto(拦截/改写)钩子在路线图。
673
+ 两个最容易写错的地方:
674
+
675
+ - 服务端通配只有裸 `'*'`:`ctx.hooks.on('event:*', fn)` **永不触发**;
676
+ - 客户端通配只有字面量 `'event:*'`:`ctx.on('*', fn)` **永不触发**,
677
+ 而 `ctx.on('event:line.start', fn)` 会被二次加前缀成 `event:event:line.start`,同样永不触发。
678
+
679
+ scene 事件以 `event:<type>` 进入总线,`ctx.events.on('<type>', fn)` 是补前缀的糖衣;
680
+ 因此场景事件 `permissions.changed` 的正确订阅是 `ctx.events.on('permissions.changed', fn)`,
681
+ 而 `ctx.hooks.on('permissions:changed', fn)` 永远不会触发。
682
+
683
+ ### 5.4 关闭与热重载序列
684
+
685
+ ```text
686
+ 服务关闭(nitro close → shutdownPluginHost)
687
+ └─ 逐插件执行 ctx.onDispose 队列(逐个 try/catch)
688
+ └─ 广播 server:close { at }
689
+
690
+ 插件热重载(plugins-state.json 变化 / 启停插件 / 10s 轮询兜底)
691
+ └─ 逐插件执行 ctx.onDispose 队列
692
+ └─ 解绑经 ctx.hooks 注册的全部监听器
693
+ └─ 重新装载 → 广播 plugins:reloaded
694
+ └─ 广播 scene 事件 plugins.reloaded(浏览器端 loader 据此热注入 / 卸载客户端插件)
695
+ ```
696
+
697
+ > v1 钩子为**观察语义** —— 不改变联锁 / 写控决策;veto(拦截 / 改写)钩子在路线图。
217
698
 
218
699
  ---
219
700
 
220
- ## 6. 浏览器端 SDK(`agentworkshop/sdk/client`)
701
+ ## 6. 浏览器端 SDK(`agentworkshop/sdk/client`)
702
+
703
+ 插件 `client.mjs` 是**自包含 ESM**(无裸导入,浏览器原生解析),导出 `setup(ctx)`。
704
+ 入口必须在插件定义里用 `client: './client.mjs'` 声明,loader 经
705
+ `GET /api/plugins/client/<插件名>` 取回脚本后动态 import。
221
706
 
222
- 插件 `client.mjs`(自包含 ESM,**无裸导入**)导出 `setup(ctx)`,由宿主 loader 动态装载:
707
+ ### 6.1 创建(宿主调用;插件只写 `setup`)
223
708
 
224
709
  ```js
225
- export function setup(ctx) {
226
- const badge = ctx.el('div', { style: 'color:#35e0a0' }, ['⌁ 0'])
227
- ctx.root().append(badge) // 私有挂载点(右下角)
228
- let n = 0
229
- ctx.on('daq:sample', () => { badge.textContent = `⌁ ${++n}` })
230
- ctx.on('page:change', ({ path }) => ctx.log.info('page →', path))
710
+ import { createClientContext } from 'agentworkshop/sdk/client'
711
+
712
+ // 宿主侧装配(示意);插件作者只需要写 client.mjs 的 setup(ctx)
713
+ const listeners = new Set()
714
+ const townBus = {
715
+ subscribe(fn) { listeners.add(fn); return () => listeners.delete(fn) },
231
716
  }
717
+
718
+ const ctx = createClientContext({
719
+ name: 'my-plugin',
720
+ // 事件桥:宿主把 WS 总线的每条消息交给 dispatch
721
+ eventBridge: dispatch => townBus.subscribe(e => dispatch(e.type, e.payload)),
722
+ baseUrl: '', // 同源;跨域集成时可填平台地址
723
+ ui: { slots: ['plugins.page'], registerPanel: () => () => {} },
724
+ t: key => `plugin.my-plugin.${key}`, // 宿主传入真正的翻译助手
725
+ getLocale: () => 'zh-CN',
726
+ })
232
727
  ```
233
728
 
729
+ ### 6.2 `ctx` 成员
730
+
234
731
  | 成员 | 说明 |
235
732
  |---|---|
236
- | `ctx.on(type, fn)` | 实时事件订阅(`daq:sample` / `event:<type>` / `event:*` / `page:change`),**pagehide 自动回收** |
237
- | `ctx.fetch(path, opt?)` | 同源平台 API 助手(自动 JSON + 信封解包;非 2xx 抛错) |
238
- | `ctx.el(tag, attrs, children)` | DOM 构建(style/class/事件 attrs 特判) |
239
- | `ctx.root()` | 插件私有挂载点 `#aw-plugin-<name>`(懒创建) |
240
- | `ctx.mount(target, node)` | 挂载到任意选择器/元素 |
241
- | `ctx.hooks` | 本地 HookBus(`client:init` / `page:change` / `client:destroy`) |
242
- | `ctx.dispose()` | 卸载:回收订阅 + 清空挂载点 + 广播 `client:destroy`(pagehide 自动触发,幂等) |
733
+ | `ctx.name` | 插件名 |
734
+ | `ctx.sdkVersion` | `CLIENT_SDK_VERSION` |
735
+ | `ctx.hooks` | 客户端本地 `HookBus`;本地钩子与 scene 事件都在这条总线上 |
736
+ | `ctx.on(type, fn)` | 订阅 **scene 实时事件**,`type` 传**场景事件名本身**(如 `'daq.reading'` / `'daq.alarm'` / `'daq.alarm.changed'` / `'dcw.written'` / `'daq.node.changed'` / `'device.updated'`),内部装到 `event:<type>`;返回退订函数,**pagehide 时自动回收**。唯一的通配写法是字面量 **`'event:*'`** |
737
+ | `ctx.fetch(path, opt?)` | 同源平台 API:自动 JSON、自动解信封 `{data}`、非 2xx 抛错、**自动携带 cookie 里的平台 token** |
738
+ | `ctx.el(tag, attrs, children)` | DOM 构建:`style` / `class` / `on*` 事件属性特判 |
739
+ | `ctx.mount(target, node)` | 挂到任意选择器 / 元素;目标缺失时落到 `ctx.root()` |
740
+ | `ctx.root()` | 插件私有挂载点 `#aw-plugin-<name>`(右下角,懒创建) |
741
+ | `ctx.ui` | UI 注入面:`slots` 与 `registerPanel(entry)`(§6.4) |
742
+ | `ctx.t(key, params?)` | 插件命名空间翻译:`ctx.t('panel.title')` → `plugin.<name>.panel.title`(消息来自插件根目录 `i18n.json`;未命中回落原键)。**`params` 目前被忽略,不做插值** |
743
+ | `ctx.locale` | 当前界面语言(只读 getter) |
744
+ | `ctx.log` | 前缀 console:`info` / `warn` / `error`(**没有 `debug`**) |
745
+ | `ctx.dispose()` | 卸载:广播 `client:destroy` → 跑本地 disposables → 移除 `root()`。**幂等**;不负责注销面板(那由 loader 在停用 / 热重载时做) |
746
+
747
+ `ctx.on` 的两种错误写法:`ctx.on('*')` 与 `ctx.on('event:line.start')` 都**永不触发** ——
748
+ 前者没装到裸 `'*'`,后者被二次加前缀成 `event:event:line.start`。
749
+
750
+ **服务端钩子不会到达浏览器**:`daq:sample`、`dcw:write`、`line:start` / `line:stop`
751
+ 这类带冒号的服务端钩子在客户端收不到。它们的浏览器侧对应物是 scene 事件
752
+ (`daq.reading` / `daq.frame` / `dcw.written` 等),请通过 `ctx.on('<scene-type>')` 订阅。
753
+
754
+ **客户端生命周期钩子也不能走 `ctx.on`**:`client:init` / `page:change` / `i18n:changed` /
755
+ `client:destroy` 要用 `ctx.hooks.on(...)` 直订(它们没有 `event:` 前缀)。
756
+
757
+ ### 6.3 完整示例
758
+
759
+ ```js
760
+ export function setup(ctx) {
761
+ const badge = ctx.el('div', {
762
+ style: 'padding:8px 12px;border:1px solid #35e0a0;border-radius:10px;color:#35e0a0',
763
+ }, ['samples: 0'])
764
+ ctx.root().append(badge)
765
+
766
+ let n = 0
767
+ ctx.on('daq.reading', () => { badge.textContent = `samples: ${++n}` }) // scene 事件
768
+ ctx.on('event:*', (payload) => ctx.log.info('scene 事件', payload)) // 唯一通配写法
769
+
770
+ ctx.hooks.on('page:change', ({ path }) => ctx.log.info('page →', path)) // 本地钩子:直订
771
+
772
+ // 消费平台 API(同源;cookie 鉴权):产线列表是 { lines, states },不是数组
773
+ ctx.fetch('/api/workshop/dcw/lines').then(({ lines }) => ctx.log.info('产线数', lines.length))
774
+ }
775
+ ```
776
+
777
+ ### 6.4 UI 注入 `ctx.ui.registerPanel`
778
+
779
+ ```js
780
+ let samples = 0
781
+ ctx.on('daq.reading', () => { samples += 1 })
782
+
783
+ const off = ctx.ui.registerPanel({
784
+ slot: 'dashboard.widgets', // 'plugins.page' | 'settings.plugins' | 'dashboard.widgets'
785
+ name: 'my-widget',
786
+ title: '采样统计',
787
+ titleKey: 'plugin.my-plugin.widget.title', // 有 titleKey 时优先
788
+ order: 100, // 越小越靠前,缺省 100
789
+ mount(el) {
790
+ el.textContent = `samples: ${samples}`
791
+ const tick = setInterval(() => { el.textContent = `samples: ${samples}` }, 1000)
792
+ return () => clearInterval(tick) // 面板卸载时调用
793
+ },
794
+ })
795
+ off() // 返回的注销函数;ctx.dispose() 不自动调它,loader 停用插件时统一回收
796
+ ```
797
+
798
+ - `ctx.ui.slots` 就是 `['plugins.page', 'settings.plugins', 'dashboard.widgets']`。
799
+ - `registerPanel` 返回注销函数;`mount(el)` 的返回值若为函数,会在该面板卸载时被调用。
800
+
801
+ ### 6.5 约束与信任
802
+
803
+ - **自包含**:不能裸导入 `vue` 等第三方包(浏览器原生 import 解析不到);
804
+ 需要 UI 组件就用原生 DOM(`ctx.el`)。
805
+ - **信任模型**:客户端脚本由平台服务端点提供,与 aw commands 同级信任 —— 只装可信插件。
806
+ - **隔离**:单插件装载失败仅 console 告警,不影响应用与其他插件。
243
807
 
244
808
  ---
245
809
 
@@ -250,16 +814,48 @@ import type { PluginDef, PluginContext, PlatformClient } from 'agentworkshop/sdk
250
814
 
251
815
  export default {
252
816
  name: 'typed-plugin',
817
+ auth: 'user',
253
818
  async setup(ctx: PluginContext) {
254
- const threshold: number = ctx.config.get('api.timeout')
819
+ const timeout: number = ctx.config.get('plugins.typed-plugin.timeout')
820
+ const client: PlatformClient = ctx.api
821
+ ctx.logger.info('api 可用:', typeof client.get === 'function', 'timeout:', timeout)
255
822
  },
256
823
  } satisfies PluginDef
257
824
  ```
258
825
 
259
- 运行时**不引入** SDK(保持零依赖形态);类型在构建期擦除。
826
+ 运行时**不引入** SDK(保持零依赖形态);类型在构建期擦除。
827
+
828
+ 类型声明的当前覆盖范围(请以 `sdk/index.d.mts` / `sdk/client.d.mts` 为准):
829
+
830
+ - 已声明:`PluginDef`、`PluginContext`、`PluginHostExtensions`、`PluginSettingDecl`、
831
+ `PluginGroupDecl`、`PluginLogger`、`PluginKv`、`PluginHttp`、`CrudResource`、
832
+ `PlatformClient`、`ConfigChangedPayload`、`HookBus`、`ClientContext`、`ClientUi`、
833
+ `ClientPanelEntry`、`LIFECYCLE_EVENTS`、`CLIENT_EVENTS` 与各工厂函数。
834
+ - **尚未声明**:`isPathInside`、`validatePluginSettings`、`validatePluginGroups`、
835
+ `resolvePluginGroupId` 目前只有运行时导出,`.d.mts` 里没有对应声明 ——
836
+ TS 项目直接 import 它们会报 TS2614,需要本地补一份声明或改用 `await import()`。
837
+ - 另外 `sdk/client.d.mts` 里声明了一个运行时不存在的 `el` 命名导出(运行时只有
838
+ `CLIENT_SDK_VERSION` 与 `createClientContext`),导入它会编译通过但运行期拿到 `undefined`。
839
+
840
+ ---
260
841
 
261
842
  ## 8. 版本与兼容性策略
262
843
 
263
- - SDK 遵循 semver:patch = 修复;minor = 新增钩子/ctx 成员(向后兼容);major = 破坏性契约变更。
264
- - `aw start` 启动时对配置根做校验与就地迁移——升级不丢数据。
265
- - 宿主在 ctx 中暴露 `ctx.sdkVersion`,插件可按版本特性降级。
844
+ - SDK 接口遵循 semver:patch = 修复;minor = 新增钩子 / `ctx` 成员(向后兼容);
845
+ major = 破坏性契约变更。`SDK_VERSION` / `CLIENT_SDK_VERSION` 是这条线的版本号,
846
+ **与 npm 包版本独立**,不要互相推断。
847
+ - 宿主在 `ctx` 中暴露 `ctx.sdkVersion`,插件可按版本特性降级。
848
+ - 配置根的健壮化不在 `aw start` 一条命令里,而在 **CLI 上下文构建器**中 ——
849
+ 每个 `aw` 指令在解析运行根时都会调用它(幂等),因此任意命令都不会因为配置根缺目录而失败。
850
+ - 这里**没有基于版本的目录布局迁移**:唯一的迁移是把旧位置的数据文件搬进配置根,
851
+ 即 `cwd/data`(以及历史遗留的 `cwd/server/data`)→ `<configRoot>/data`,
852
+ 只搬 `.sqlite` / `.sqlite-wal` / `.sqlite-shm` / `.json`,同名文件按
853
+ `mtimeMs` **最新者胜**;当配置根回退到 `~/.AgentWorkShop` 时不做该迁移(避免跨项目污染)。
854
+
855
+ ---
856
+
857
+ ## 附:本页覆盖范围
858
+
859
+ 本页是 SDK 的单一事实源指南,以 `sdk/*.mjs`、`sdk/*.d.mts`、`server/services/workshop/plugins/host.mjs`、
860
+ `server/api/**` 的实际实现为准。CI 会把本文件复制到站点 `docs/site/sdk/guide.md`,
861
+ 英文版 `docs/sdk.en.md` 复制到 `docs/site/en/sdk/guide.md`。