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/plugins.md CHANGED
@@ -1,179 +1,531 @@
1
- # AgentWorkShop 插件开发指南(完整版)
2
-
3
- > 插件 = 配置根 `plugins/<name>/` 下的一个自包含目录。一个目录同时增强**服务端**
4
- > (工具/API/数据/事件)与**浏览器**(面板组件/多语言/设置 UI),放入即装载,
5
- > 启停即热重载。本文是唯一权威参考;`docs/site/plugins/` 的分页文档与本文同源。
6
- >
7
- > 适用版本:v0.7.29+(插件系统 v2:前端组件注入 / 插件设置 / 插件 i18n / 运行时服务面)
8
-
9
- ## 一、目录结构与快速开始
10
-
11
- ```bash
12
- aw plugin create my-plugin # 脚手架到 ~/.AgentWorkShop/plugins/(用户级)
13
- aw plugin create my-plugin --project # 或项目级 <repo>/.AgentWorkShop/plugins/
14
- aw plugin list # 查看已装插件
15
- ```
16
-
17
- ```
18
- plugins/my-plugin/
19
- ├── index.mjs # 服务端入口(必需): export default { name, setup(ctx), … }
20
- ├── client.mjs # 浏览器增强(可选): export function setup(ctx)
21
- ├── i18n.json # 多语言消息包(可选): { "zh-CN": {...}, "en": {...} }
22
- └── kv.json # 运行态存储(自动生成,勿手改)
23
- ```
24
-
25
- 三作用域发现:builtin(`<包根>/server/plugins-builtin`)→ project(`<repo>/.AgentWorkShop/plugins`)→ user(`~/.AgentWorkShop/plugins`),同名先到先得(builtin 优先)。启停状态在 `<配置根>/plugins-state.json`,Web 设置页 / `aw plugin enable|disable` 写入后服务自感知热重载。
26
-
27
- ## 二、插件契约(index.mjs)
28
-
29
- ```js
30
- export default {
31
- name: 'my-plugin', // 必填,全局唯一
32
- version: '1.1.0',
33
- description: '…',
34
- auth: 'user', // 插件 API 转发层鉴权:none(默认)|user|admin|agent-or-user
35
- client: './client.mjs', // 可选:浏览器入口(loader 动态 import)
36
- settings: [ /* 可选:插件设置声明(见 §4) */ ],
37
- routes: [ // 可选:声明式路由,挂 /api/plugins/<name>/**
38
- { method: 'GET', path: '/health', handler: () => ({ ok: true }) },
39
- ],
40
- async setup(ctx) { /* 服务端生命周期(见 §3) */ },
41
- }
42
- ```
43
-
44
- 装载期宿主做形态校验(`validatePluginModule` + `validatePluginSettings`);设置声明校验失败的条目跳过并告警,不阻断装载。装载失败进 `failures`(GET /api/workshop/plugins 可见),错误隔离绝不拖垮主服务。
45
-
46
- ## 三、生命周期(全周期注入矩阵)
47
-
48
- | 阶段 | 服务端 | 浏览器 |
49
- |---|---|---|
50
- | 装载 | 动态 import(`?t=` 防缓存)→ 校验 → `setup(ctx)` | loader(`app/plugins/aw-plugins.client.ts`)拉 manifest → 拉 i18n 包 → 动态 import client → `setup(ctx)` |
51
- | 注入 | 路由/工具/驱动/模板/处理器即时生效;设置描述符并入 SystemConfigService | `client:init` 钩子;面板经 `ctx.ui.registerPanel` 注入页面插槽 |
52
- | 运行 | `event:*` / `daq:sample` / `daq:frame` / `dcw:write` / `line:start|stop` / `plugins:reloaded` | `event:*`(与 WS 同源) / `page:change`(路由切换) / `i18n:changed`(语言切换) |
53
- | 卸载 | 状态文件变化 → 全量 dispose(`ctx.onDispose`)→ 解绑 hooks → 注销工具 → 重装载 | `plugins.reloaded` WS + 15s 轮询 diff → `ctx.dispose()`(订阅回收 + 面板注销 + `client:destroy`) |
54
- | 关机 | `server:close` 钩子 + 逐插件 dispose | 页面 `pagehide` 自动 dispose |
55
-
56
- 热重载语义:修改插件目录文件后,触碰 `plugins-state.json`(或 Web 启停开关)即触发全量重装载;重装载期间的状态再变化(如 disable→enable 连击)由禁用集快照比对自动补跑,事件不丢失。核心代码(server/ shared/)改动需重启。浏览器侧新启用插件 ≤15s(或 WS 即时)注入。
57
-
58
- ## 四、插件设置(前端设置页自动渲染)
59
-
60
- 在 `index.mjs` 导出 `settings` 声明数组,宿主装载后并入 `SystemConfigService`:
61
-
62
- ```js
63
- settings: [
64
- { key: 'base_url', type: 'string', default: 'http://127.0.0.1:8770',
65
- labelKey: 'plugin.my-plugin.settings.base_url', // i18n 键(见 §5)
66
- label: '服务地址(回退文案)', description: '保存即热生效' },
67
- { key: 'max_turns', type: 'number', default: 0, min: 0, max: 2000, label: '最大轮数' },
68
- { key: 'auto_enabled', type: 'boolean', default: false, label: '自动模式' },
69
- { key: 'mode', type: 'select', default: 'a', options: ['a', 'b'], label: '模式' },
70
- ],
71
- ```
72
-
73
- - **键编址**:强制 `plugins.<插件名>.<key>`,与全局 schema 键同一编址空间;插件停用即从设置页消失。
74
- - **渲染**:系统设置 → 运行配置 →「插件」分组自动出现(admin/editor 可见),来源标签(config.yml/runtime)与重置按钮与其他设置一致。
75
- - **读取**:`ctx.config.get('plugins.my-plugin.base_url')`(保存即热生效;可再落 kv 兜底)。运行时覆盖持久化在 `<配置根>/runtime-settings.json`,PATCH `/api/system/settings` 按同一份描述符校验。
76
- - **迁移**:0.7.28 前写死在 `shared/config/schema.json` 的 `plugins.kb.*`/`plugins.diag.*` 已由插件声明取代;服务启动时一次性搬移旧覆盖到新键(新键未注册时保留旧键等下一次 pass,绝不丢数据)。
77
-
78
- ## 五、插件 i18n(根目录 i18n.json)
79
-
80
- ```json
81
- {
82
- "zh-CN": { "settings": { "base_url": "服务地址" }, "panel": { "title": "我的面板" } },
83
- "en": { "settings": { "base_url": "Service URL" }, "panel": { "title": "My panel" } }
84
- }
85
- ```
86
-
87
- - 装载期宿主解析 `i18n.json`(坏文件忽略不阻断),`GET /api/plugins/i18n` 汇编全部启用插件的消息包(免鉴权;**只放 UI 文案,严禁放敏感信息**)。
88
- - 浏览器 loader 拉取后:① 合并进 vue-i18n 命名空间 `plugin.<插件名>` —— 宿主组件(设置页标签 labelKey、面板标题 titleKey)直接解析;② `ctx.t(key)` 提供自解析翻译(`ctx.t('panel.title')` → `plugin.my-plugin.panel.title`,未命中回落声明键)。
89
- - 语言切换广播 `i18n:changed` 钩子,面板监听它重渲染(宿主渲染的标题自动跟随)。
90
- - manifest 暴露 `hasI18n`/`settingsCount`/`hasClient` 供前端展示。
91
-
92
- ## 六、服务端 ctx 全参考
93
-
94
- | 面 | 签名 | 说明 |
95
- |---|---|---|
96
- | 身份 | `ctx.name/scope/dir/sdkVersion` | 插件身份 |
97
- | 钩子 | `ctx.hooks.on/once/off/emit` | 宿主生命周期 + 平台事件;热重载自动解绑 |
98
- | 日志 | `ctx.logger.debug/info/warn/error` | 插件名前缀 |
99
- | 配置 | `ctx.config.get(key)/all()/onChange(fn)` | 系统配置(含本插件 settings)热生效读取 |
100
- | 存储 | `ctx.kv.get/set/all/bump` | 运行态,防抖落盘 `data/plugins/<name>/kv.json` |
101
- | 定时 | `ctx.timer.setInterval/setTimeout` | 关机自动回收 |
102
- | 清理 | `ctx.onDispose(fn)` / `ctx.subscriptions.add` | 卸载回收 |
103
- | 路由 | `ctx.route(method, path, handler)` | 挂 `/api/plugins/<name>/**`,鉴权按 `auth` 声明 |
104
- | 平台 | `ctx.api` | 平台 REST 客户端(自环 origin;自动解信封) |
105
- | 网络 | `ctx.http.get/post(url, {timeoutMs, headers})` | 出站守卫(仅 http/https);headers 透传可带鉴权 |
106
- | 事件 | `ctx.events.on/off(type, fn)` | scene 实时事件糖(=hooks `event:<type>`) |
107
- | 工具 | `ctx.omp.registerTool({name,label,description,parameters,roles,handler})` | Agent 工具注入(全 harness 共享;受团队/Channel 插件开关过滤) |
108
- | 数采 | `ctx.daq.registerDriver/registerProcessor/registerTemplate/onFrame/onSample/query/nodes` | 驱动/处理器/模板注册 + 时序查询 + 节点元数据 |
109
- | 权限 | `ctx.permissions.lineMode/visibleLineIds/listGrants/setGrants` | 产线授权查询与管理 |
110
- | **服务** | `ctx.services.get('daq'\|'lines'\|'channels'\|'plugins')` / `.provide(name, getter)` / `.names()` | **后端运行时对象面**:惰性取数(daq 查询/产线/频道与成员/插件清单);`provide` 以 `<插件名>.<name>` 前缀跨插件供服务 |
111
-
112
- ## 七、浏览器 client.mjs(ctx 面参考)
113
-
114
- ```js
115
- export function setup(ctx) {
116
- ctx.ui.registerPanel({
117
- slot: 'plugins.page', // 插槽名(见下)
118
- name: 'my-panel', // 同插件内唯一
119
- titleKey: 'panel.title', // 解析 plugin.my-plugin.panel.title(或静态 title)
120
- order: 10,
121
- mount(el) { // el = 面板容器(标题由插槽渲染)
122
- el.append(ctx.el('p', {}, [ctx.t('panel.hello')]))
123
- const timer = setInterval(refresh, 30_000)
124
- return () => clearInterval(timer) // 清理函数(卸载时调用)
125
- },
126
- })
127
- }
128
- ```
129
-
130
- | 面 | 说明 |
131
- |---|---|
132
- | `ctx.ui.registerPanel(entry)` | 向命名插槽注册面板;返回注销函数;`ctx.dispose` 自动回收 |
133
- | `ctx.t(key, params?)` | 插件命名空间翻译(i18n.json 消息树) |
134
- | `ctx.locale` / `i18n:changed` | 当前语言 / 语言切换广播 |
135
- | `ctx.fetch(path, opt)` | 平台 API 助手(自动带 cookie token、解信封) |
136
- | `ctx.on(type, fn)` | scene 事件订阅(`*` 通配;pagehide 自动回收) |
137
- | `ctx.el / ctx.mount / ctx.root / ctx.log` | DOM 助手 / 挂载 / 兜底根节点 / 日志 |
138
- | `ctx.dispose()` | 卸载:订阅回收 + 面板注销 + `client:destroy` |
139
-
140
- **内置插槽**:页面在任意位置放 `<PluginSlot slot-name="…" />` 即接收注入;当前宿主已接入:
141
- - `plugins.page` —— 插件管理页卡片上方(默认落点)
142
- - `settings.plugins` —— 系统设置 → 插件管理区下方
143
- - `dashboard.widgets` —— 仪表盘页尾
144
-
145
- 新增插槽只需在页面放 `<workshop-plugin-slot slot-name="my.slot" />`(注册表 `usePluginPanels()` 全局单例,无需改动)。
146
-
147
- ## 八、工具与团队开关
148
-
149
- `ctx.omp.registerTool` 注册的工具出现在全部 harness 的工具面(omp RPC 下发 / 其余引擎经 MCP 桥 tools/list / pi 工具文件 / mock 经 REST invoke 直调)。Channel/AgentTeam 级插件开关(`GET|PUT /api/workshop/channels/:id/plugins`、`/api/workshop/teams/:id/plugins`)关闭的插件:工具不注入该团队、dispatch 同源拒绝;建队 `POST /teams` 可带 `plugins` 勾选,部署时传导到 Channel。
150
-
151
- ## 九、完整示例(rag-bridge 摘录)
152
-
153
- ```js
154
- // index.mjs(服务端)
155
- export default {
156
- name: 'rag-bridge', version: '1.1.0', auth: 'user',
157
- client: './client.mjs',
158
- settings: [
159
- { key: 'base_url', type: 'string', default: 'http://127.0.0.1:8770',
160
- labelKey: 'plugin.rag-bridge.settings.base_url', label: 'rag-knowledge 后端地址' },
161
- { key: 'token', type: 'string', default: '',
162
- labelKey: 'plugin.rag-bridge.settings.token', label: 'API Token' },
163
- ],
164
- async setup(ctx) {
165
- const base = () => ctx.config.get('plugins.rag-bridge.base_url')
166
- ctx.omp.registerTool({ name: 'kb_search', /* … */ handler: async () => ({ text: '…' }) })
167
- ctx.route('GET', '/health', async () => ({ ok: true }))
168
- },
169
- }
170
-
171
- // client.mjs(浏览器)—— 见 §7;i18n.json —— 见 §5
172
- ```
173
-
174
- ## 十、验证清单(发布前)
175
-
176
- 1. `aw plugin list` 可见、无 failures;启停开关往返后路由/工具/面板同步生灭(连击不丢事件)。
177
- 2. 设置页出现本插件设置,改值后 `ctx.config.get` 立即读到新值。
178
- 3. 语言切换:面板标题/文案跟随;`i18n:changed` 清理函数无泄漏。
179
- 4. 工具经 agent-tools/list 可见、参数无 url/host 注入口;团队开关关闭后工具消失且 dispatch 拒绝。
1
+ # AgentWorkShop 插件开发指南(完整版)
2
+
3
+ > 插件 = 一个自包含目录:入口 `index.mjs`(必需),可选 `client.mjs`(浏览器增强)与
4
+ > `i18n.json`(多语言消息包)。一个目录同时增强**服务端**(路由/工具/数采/事件)与
5
+ > **浏览器**(面板组件/多语言/设置 UI),放入即装载,启停即热重载。
6
+ > 本文是唯一权威参考;`docs/site/plugins/` 的分页文档与本文同源。
7
+ >
8
+ > 适用版本:插件系统 v2 自 **v0.7.29** 起可用(前端组件注入 / 插件设置 / 插件 i18n /
9
+ > 运行时服务面);本文档对应当前版本 **v0.7.37**。`ctx.sdkVersion` 当前为 `0.3.0`。
10
+
11
+ ## 一、目录结构与快速开始
12
+
13
+ ```bash
14
+ aw plugin create my-plugin # 脚手架到 <repo>/.AgentWorkShop/plugins/my-plugin(项目级,默认)
15
+ aw plugin create my-plugin --global # 或用户级 ~/.AgentWorkShop/plugins/my-plugin(-g 同义)
16
+ aw plugin list # 三作用域清单(含启停态)
17
+ aw plugin disable my-plugin # 停用(写状态文件,服务自感知热重载)
18
+ aw plugin enable my-plugin # 重新启用
19
+ ```
20
+
21
+ `aw plugin create` 默认落 **project** 级;`--global` / `-g` 落 **user** 级;`--project` 是显式写法(与默认等价,保留以符合直觉);`--force` / `-f` 覆盖已存在目录。插件名校验 `^[a-z][a-z0-9-]{1,31}$`(小写字母开头,2~32 位)。命令生成三个文件:
22
+
23
+ ```
24
+ <repo>/.AgentWorkShop/plugins/my-plugin/
25
+ ├── index.mjs # 服务端入口(必需):export default { name, setup(ctx), … }
26
+ ├── client.mjs # 浏览器增强(可选,且必须在 manifest 里声明 client:'./client.mjs')
27
+ └── README.md
28
+ ```
29
+
30
+ 插件根目录还可以放 `i18n.json`(多语言消息包,见 §5)。**插件 KV 不在这里** —— 它落在 `<配置根>/data/plugins/<插件名>/kv.json`(见 §6)。
31
+
32
+ ### 三作用域与优先级
33
+
34
+ 宿主按 `builtin` → `project` → `user` 顺序扫描,**同名先到先得**:
35
+
36
+ | 作用域 | 入口路径 | 说明 |
37
+ |---|---|---|
38
+ | `builtin` | `<包根>/server/plugins-builtin/<name>/index.mjs` | 随包发布,永远存在;当前发行内置 `diag-bridge`、`rag-bridge` |
39
+ | `project` | `<repo>/.AgentWorkShop/plugins/<name>/index.mjs` | 随检出分发,可 git 版本化 |
40
+ | `user` | `$AW_HOME/plugins/<name>/index.mjs`(默认 `~/.AgentWorkShop/plugins`) | 用户级,跨项目生效 |
41
+
42
+ 同名优先级 **builtin > project > user**(宿主先扫先占,`seen` 集合去重)。注意方向:CLI 指令注册表(`cli/core/registry.mjs`)是**后扫覆盖**,即 project > user > builtin —— 两者相反,不可互相类推。`aw plugin list` / `aw plugin enable|disable` 用的也是这同一顺序,所以启停一定打到你看到的那个插件上。
43
+
44
+ ### 启停状态文件
45
+
46
+ 启停状态在 **`<home>/plugins-state.json`**,其中 `home = $AW_HOME || ~/.AgentWorkShop`。源码检出下它与**配置根不是同一个目录**:
47
+
48
+ - `configRoot = <repo>/.AgentWorkShop` —— 数据与插件 KV 在这里;
49
+ - `home = ~/.AgentWorkShop` —— 启停状态在这里。
50
+
51
+ 全局安装(home 模式)时两者重合,旧描述写成"配置根"时看不出差别,但源码检出下会指向错误路径。文件格式:
52
+
53
+ ```json
54
+ { "version": 1, "updatedAt": "2026-09-03T00:00:00.000Z", "disabled": ["my-plugin"] }
55
+ ```
56
+
57
+ `aw plugin enable|disable`、Web 插件管理页与宿主三方读写同一份文件。
58
+
59
+ ## 二、插件契约(index.mjs)
60
+
61
+ `index.mjs` 导出**普通对象**(零导入依赖 —— `ctx` 由宿主注入):
62
+
63
+ ```js
64
+ export default {
65
+ name: 'my-plugin', // 必填,全局唯一(缺失/非字符串立即装载失败)
66
+ version: '1.1.0', // 可选,manifest 展示用
67
+ description: '…', // 可选
68
+ auth: 'user', // 可选:none(默认)| user | admin | agent-or-user
69
+ client: './client.mjs', // 可选:浏览器入口(必须是相对路径字符串)
70
+ settings: [ /* 可选:插件设置声明,见 §4 */ ],
71
+ configGroups: [ /* 可选:插件配置分组声明,见 §4 */ ],
72
+ routes: [ // 可选:声明式路由(setup 返回后才注册)
73
+ { method: 'GET', path: '/health', handler: () => ({ ok: true }) },
74
+ ],
75
+ async setup(ctx) { /* 服务端生命周期,见 §3 */ },
76
+ }
77
+ ```
78
+
79
+ 装载期宿主做形态校验(`validatePluginModule`):`name` 必须是非空字符串;`setup` 若存在必须是函数;`client` 若存在必须是字符串;`settings` 若存在必须是数组。任一不满足即装载失败,记入 `failures` 并告警,**错误隔离绝不拖垮主服务**。
80
+
81
+ 路由注册顺序很重要:**先 `await setup(ctx)`,再注册 `routes[]`**。这样 `setup` 抛错时不会留下"路由活着、宿主无记录"的幽灵路由。
82
+
83
+ ## 三、启用、停用与热重载
84
+
85
+ | 阶段 | 服务端 | 浏览器 |
86
+ |---|---|---|
87
+ | 装载 | nitro 插件 `server/plugins/aw-plugins.ts` → 三作用域扫描 → 动态 import(`?t=` 破缓存)→ 形态校验 → `setup(ctx)` → 注册 `routes[]` | loader(`app/plugins/aw-plugins.client.ts`)拉 `GET /api/plugins/manifest` → 拉 `GET /api/plugins/i18n` → 动态 import `/api/plugins/client/<name>` → `setup(ctx)` |
88
+ | 注入 | 路由/工具/驱动/模板/处理器即时生效;设置描述符并入 `SystemConfigService` | 面板经 `ctx.ui.registerPanel` 注入页面插槽;`client:init` 钩子广播 |
89
+ | 运行 | `daq:sample` / `daq:frame` / `dcw:write` / `line:start\|stop` / `config:changed` / `event:<type>` / `*` | `event:<type>`(与 WS 同源)/ `page:change` / `i18n:changed` |
90
+ | 重载 | 状态文件变化 → 全量 dispose(逐个 `await`)→ 解绑 hooks → 清路由 → 重新装载 → 广播 `plugins:reloaded` | WS `plugins.reloaded` 即时同步,另有 15s 轮询兜底 → 停用插件 `ctx.dispose()` |
91
+ | 关机 | 逐插件执行 dispose 队列(含 KV 同步落盘)→ 广播 `server:close` | 页面 `pagehide` 自动 `ctx.dispose()` |
92
+
93
+ 热重载的几个事实:
94
+
95
+ - **触发源是状态文件**:宿主 `fs.watch` 监听 `plugins-state.json` 所在目录,另有 **10s mtime 轮询**兜底(Windows 上 `rename` 原子写可能丢事件)。`aw plugin enable|disable`、Web 开关、或直接触碰该文件都会触发,**约 1s 内**完成全量重装载。
96
+ - **改代码不需要重启进程**:重装载用 `import(entry + '?t=' + Date.now())` 打破 ESM 模块缓存,所以插件代码改动会在下一次重装载时生效。宿主没有独立的插件目录 watcher —— 改完代码后触碰 `plugins-state.json`(或 enable/disable 往返一次)就能让它立刻生效。
97
+ - **核心代码仍需重启**:`server/` 与 `shared/` 的改动不在插件热重载范围内。
98
+ - **竞态防护**:重装载进行期间状态文件再次变化(如 disable→enable 连击)时,去抖回调会撞上 in-flight 守卫;装载结束后宿主比对禁用集快照,有差异自动补跑一次,启停事件不丢失。
99
+ - **浏览器侧**:新启用的插件最迟 15s 注入(WS 可用时即时);停用插件立即卸载并回收其全部面板。
100
+
101
+ ## 四、插件设置与配置分组
102
+
103
+ ### 声明式字段(manifest `settings[]`)
104
+
105
+ ```js
106
+ settings: [
107
+ { key: 'base_url', type: 'string', default: 'http://127.0.0.1:8770',
108
+ labelKey: 'plugin.my-plugin.settings.base_url', // i18n 键(见 §5)
109
+ label: '服务地址(回退文案)', description: '保存即热生效' },
110
+ { key: 'max_turns', type: 'number', default: 0, min: 0, max: 2000, label: '最大轮数' },
111
+ { key: 'auto_enabled', type: 'boolean', default: false, label: '自动模式' },
112
+ { key: 'mode', type: 'select', default: 'a', options: ['a', 'b'], label: '模式' },
113
+ ],
114
+ ```
115
+
116
+ 校验器(`validatePluginSettings`)的硬约束 —— 任一条不满足,该条目被**跳过并告警**,其余条目照常装载:
117
+
118
+ | 约束 | 规则 |
119
+ |---|---|
120
+ | `key` | 必填,且匹配 `/^[A-Za-z0-9_-]+$/`(仅字母数字与 `-` `_`) |
121
+ | `type` | 必须是 `'string' \| 'number' \| 'boolean' \| 'select'` 之一 |
122
+ | `default` | **必填** —— 不给默认值的条目直接跳过 |
123
+ | `select` | 必须给 `options` 数组,且 `default` 必须在其中(比较按字符串) |
124
+ | `min` / `max` | 仅 `number` 生效(仍会被写进描述符,但对其他类型无意义) |
125
+ | `label` | 缺省回落 `key`;`labelKey` 存在时优先解析 i18n |
126
+ | `description` | 缺省为空串 |
127
+
128
+ 规范化后的描述符 `applies` 恒为 `'live'`(保存即热生效),键被强制编址为 **`plugins.<插件名>.<key>`** —— 与全局 schema 键同一编址空间。
129
+
130
+ ### 配置分组(manifest `configGroups[]` + `settings[].group`)
131
+
132
+ ```js
133
+ configGroups: [
134
+ { id: 'default', label: '连接', description: '后端地址与鉴权', order: 400 },
135
+ { id: 'advanced', label: '高级', collapsed: true },
136
+ ],
137
+ settings: [
138
+ { key: 'base_url', type: 'string', default: 'http://127.0.0.1:8770', group: 'default', label: '服务地址' },
139
+ { key: 'timeout_ms', type: 'number', default: 8000, group: 'advanced', label: '超时(ms)' },
140
+ ],
141
+ ```
142
+
143
+ - 分组 id 会被收敛进本插件命名空间:`default`(或写成插件名)映射为 `plugin-<插件名>`,其余声明 id `x` 映射为 `plugin-<插件名>-x`。两个插件用同一个 `network` 也不会互相覆盖。
144
+ - `settings[].group` 引用的是**声明时的原始 id**(`default` / `advanced`),不是已经加过前缀的 id。
145
+ - **未声明 `group` 的字段**落入本插件默认分区,id 为 `plugin-<插件名>`;若插件没有为这个默认 id 声明过标题,设置页显示的标题就是这个 id 本身(即 `plugin-<插件名>`)。想显示可读标题,就像上面那样声明一个 `{ id: 'default', label: '…' }` —— 两个内置插件都这么做。
146
+ - 分组会在插件卸载/停用时自动摘除,不残留空分区。
147
+ - 设置页里**没有**一个字面叫「插件」的配置分组:那是系统设置 → 运行配置里的插件管理清单(启停开关 + 健康检测),与插件自己的配置分区是两块 UI。
148
+
149
+ > 字段 `configGroups` 是宿主实际读取的名字(`host.mjs` 读 `def.configGroups`)。类型声明文件 `sdk/index.d.mts` 里写的是 `groups?`,与运行时不一致,以本文与代码为准。
150
+
151
+ ### 运行时注册(在 `setup` 里按条件扩展)
152
+
153
+ ```js
154
+ async setup(ctx) {
155
+ // 追加一个分组,并拿到收敛后的真实 id
156
+ const group = ctx.config.defineGroup({ id: 'rules', label: '自动规则', collapsed: true })
157
+ // 追加字段(等价于 manifest 的 settings[],但可以按条件注册)
158
+ ctx.config.defineField({
159
+ key: 'auto_rules', type: 'string', default: '', group: 'rules', label: 'JSON 规则',
160
+ })
161
+ ctx.logger.info(ctx.config.groups().map(g => g.id).join(','))
162
+ ctx.logger.info(ctx.config.fields().map(f => f.key).join(','))
163
+ // 摘除(removeGroup 收的是 defineGroup 返回的已命名空间化 id;removeField 收短 key)
164
+ if (group) ctx.config.removeGroup(group.id)
165
+ ctx.config.removeField('auto_rules')
166
+ }
167
+ ```
168
+
169
+ `defineGroup` / `defineField` 的校验规则与声明式完全一致(不合法返回 `null` 并告警);`removeGroup` / `removeField` 返回布尔值表示是否真的移除了。这些分组与字段随插件卸载自动摘除,已保存的值不会因为重注册而丢失。
170
+
171
+ ### 读取与持久化
172
+
173
+ - 读取:`ctx.config.get('plugins.my-plugin.base_url')`(每次调用都读合并后的有效值,保存即热生效);`ctx.config.all()` 拿全量快照。
174
+ - 订阅:`ctx.config.onChange(fn)` 等价于 `ctx.hooks.on('config:changed', fn)`。
175
+ - 运行时覆盖持久化在 `<配置根>/runtime-settings.json`;`PATCH /api/system/settings` 按同一份描述符校验,前端设置页按描述符渲染。
176
+ - 迁移:0.7.28 前写死在 `shared/config/schema.json` 的 `plugins.kb.*` / `plugins.diag.*` 已由插件声明取代;服务启动时一次性搬移旧覆盖到新键(新键未注册时保留旧键等下一次 pass,绝不丢数据)。
177
+
178
+ ## 五、插件 i18n(i18n.json)
179
+
180
+ ```json
181
+ {
182
+ "zh-CN": { "settings": { "base_url": "服务地址" }, "panel": { "title": "我的面板" } },
183
+ "en": { "settings": { "base_url": "Service URL" }, "panel": { "title": "My panel" } }
184
+ }
185
+ ```
186
+
187
+ - 装载期宿主解析插件根目录的 `i18n.json`(坏文件忽略,不阻断装载)。
188
+ - `GET /api/plugins/i18n` 汇编全部**已启用**插件的消息包(免鉴权;只放 UI 文案,**严禁放敏感信息**),返回 `{ i18n: { "<插件名>": { "<locale>": { … } } }, locales: ["zh-CN", "en"] }`。
189
+ - 浏览器 loader 拉取后:合并进 vue-i18n 命名空间 `plugin.<插件名>` —— 宿主组件(设置页 `labelKey`、面板 `titleKey`)直接解析;同时 `ctx.t(key)` 在插件自有的消息树上自解析(`ctx.t('panel.title')` 解析到 `plugin.my-plugin.panel.title`,未命中回落原键)。
190
+ - 语言切换时 loader 广播 `i18n:changed` 钩子;插件用 `ctx.hooks.on('i18n:changed', fn)` 接收(注意:它**不在** `ctx.on` 的投递面上)。
191
+ - manifest 暴露 `hasI18n` / `settingsCount` / `hasClient` 供前端展示。
192
+
193
+ ## 六、服务端 ctx 全参考
194
+
195
+ | 面 | 成员 | 说明 |
196
+ |---|---|---|
197
+ | 身份 | `ctx.name` / `ctx.scope` / `ctx.dir` / `ctx.sdkVersion` | `scope ∈ 'builtin' \| 'project' \| 'user'`;`dir` 为插件目录绝对路径 |
198
+ | 钩子 | `ctx.hooks.on / once / off / emit` | 每插件门面;热重载自动解绑,无需手动 `off` |
199
+ | 日志 | `ctx.logger.debug / info / warn / error` | 自动前缀 `[aw-plugins] [<插件名>]` |
200
+ | 配置 | `ctx.config.get / all / onChange / defineGroup / defineField / removeGroup / removeField / groups / fields` | 有效配置只读 + 变更订阅 + 运行时分区分字段注册(见 §4) |
201
+ | 存储 | `ctx.kv.get / set / all / bump` | 插件私有 KV;**没有 `reset()`**;内存态为准 + 200ms 防抖原子落盘 |
202
+ | 定时 | `ctx.timer.setInterval / setTimeout` | 自动进回收队列,关机与热重载都会清理 |
203
+ | 清理 | `ctx.onDispose(fn)` / `ctx.subscriptions.add(d)` | 与 `ctx.timer` 共用同一个宿主回收队列 |
204
+ | 路由 | `ctx.route(method, path, handler)` | 挂 `/api/plugins/<插件名><path>`(exact-match);**返回 boolean** |
205
+ | 平台 | `ctx.api` | 平台 REST 客户端(自环 origin;自动解信封;鉴权端点需 `ctx.api.setToken(token)`) |
206
+ | 网络 | `ctx.http.get(url, opt)` / `ctx.http.post(url, body, opt)` | 出站 fetch;守卫**只校验协议**(仅 http/https),不限制 host;默认超时 8s;`headers` 透传 |
207
+ | 事件 | `ctx.events.on(type, fn)` / `ctx.events.off(type, fn)` | scene 实时事件糖:内部订阅 `event:<type>`(见 §7) |
208
+ | 路径 | `ctx.paths.home / configRoot / dataDir`;`ctx.dataDir` | `ctx.dataDir` 即本插件 KV 目录 `<配置根>/data/plugins/<插件名>` |
209
+ | 数采 | `ctx.daq.registerDriver / registerProcessor / registerTemplate / onFrame / onSample / query / nodes` | 驱动、下沉处理器、节点模板注册 + 时序查询 + 节点元数据快照 |
210
+ | 工具 | `ctx.omp.registerTool({ name, label?, description, parameters, roles?, handler })` | Agent 工具注入;`roles` 仅 `'lead'` 与 `'worker'`(见 §10) |
211
+ | 服务 | `ctx.services.names()` / `.get(name)` / `.provide(name, getter)` | 运行时对象面:`get('daq' \| 'lines' \| 'channels' \| 'plugins')`;`provide` 自动加 `<插件名>.` 前缀 |
212
+ | 权限 | `ctx.permissions.lineMode / visibleLineIds / listGrants / setGrants` | 产线授权查询与管理 |
213
+
214
+ ### KV 落在哪里
215
+
216
+ `<configRoot>/data/plugins/<插件名>/kv.json` —— **不在插件目录里**。写入以内存为准,200ms 防抖后 `tmp + rename` 原子落盘;关机与热重载时取消挂起的防抖并同步落盘。`ctx.kv` 只有 `get / set / all / bump` 四个方法。
217
+
218
+ ```js
219
+ ctx.kv.set('threshold', 180) // 写(200ms 后落盘)
220
+ ctx.kv.get('threshold') // 读(未写过为 undefined)
221
+ ctx.kv.bump('alarms') // +1,返回新值;bump('alarms', -1) 递减
222
+ ctx.kv.all() // 全量浅拷贝快照
223
+ ```
224
+
225
+ ## 七、事件参考(服务端)
226
+
227
+ 事件经 HookBus 分发,**监听器按注册序串行 await**,同一个监听器收到的 payload 始终是**同一个未被改写的对象** —— 不是 waterfall(只有最后一个非 `undefined` 的返回值被保留,宿主不使用它),v1 也没有 veto / 拦截能力。单个监听器抛错被隔离并计数:成功清零,**连续失败 8 次自动摘除**(熔断)。
228
+
229
+ ### 生命周期与平台事件
230
+
231
+ | 事件 | 时机 | payload |
232
+ |---|---|---|
233
+ | `plugin:host:init` | 全部插件 setup 完成后(一次性) | `{ plugins: string[], failures: number }` |
234
+ | `plugins:reloaded` | 热重载收尾 | `{ plugins: <manifest> }` |
235
+ | `config:changed` | `runtime-settings.json` / 设置页变化 | `{ type, changed: string[], effective, sources }` —— **没有 `at` 字段** |
236
+ | `server:close` | nitro close,逐插件 dispose 之后 | `{ at }` |
237
+
238
+ ### 业务事件
239
+
240
+ | 事件 | 时机 | payload |
241
+ |---|---|---|
242
+ | `daq:sample` | 节点采样经管线汇聚后的**下发级**出口(与 WS `daq.reading` 同点同节拍,按 `publishIntervalMs` 门控) | `{ nodeId, templateRef, value, state, at, lineId }` |
243
+ | `daq:frame` | 多形态帧(向量/图像)入账后(只含元数据/指标/预览,不含 blob) | `{ nodeId, templateRef, kind, at, lineId, preview?, metrics, thumbUrl?, state }` |
244
+ | `dcw:write` | 写控 ACK 落账后(含 10s 同值去重) | `{ nodeId, name, eng, prevValue, ok, source, lineId, at }`;`source ∈ manual \| recipe \| agent \| rollback` |
245
+ | `line:start` | 批次窗口开启 | `{ lineId, runId, recipeId, productName }` |
246
+ | `line:stop` | 批次窗口关闭 | `{ lineId, runId }` |
247
+ | `event:<scene-type>` | 任一 `broadcastSceneEvent(type, payload)`,与浏览器 WS 完全同源 | 事件自身 payload |
248
+
249
+ ### 通配符与 scene 事件
250
+
251
+ 服务端通配写法是**裸星号 `'*'`**,回调收到的是 `{ type, payload }` 包装:
252
+
253
+ ```js
254
+ ctx.hooks.on('*', ({ type, payload }) => {
255
+ ctx.logger.debug('全事件审计', type)
256
+ void payload
257
+ })
258
+ ```
259
+
260
+ `ctx.hooks.on('event:*', fn)` 是**错的** —— 永远不会触发。要按类型订阅 scene 事件,用 `ctx.events`,它会替你补 `event:` 前缀:
261
+
262
+ ```js
263
+ ctx.events.on('daq.node.changed', (p) => ctx.logger.debug('节点变更', p?.op))
264
+ ctx.events.on('daq.alarm.changed', (p) => ctx.logger.info('告警状态', p?.nodeId, p?.recovered))
265
+ ```
266
+
267
+ 常见 scene 事件:`daq.reading`、`daq.frame`、`daq.alarm`、`daq.alarm.changed`、`daq.node.changed`、`daq.controller`、`daq.template.changed`、`dcw.node.changed`、`device.created|updated|deleted`、`ops.log`、`permissions.changed`、`plugins.reloaded`、`aml.job|dataset|model`。
268
+
269
+ ### 权限变更
270
+
271
+ 权限变更到达插件总线时是 scene 事件 `permissions.changed`(原始总线上的名字是 `event:permissions.changed`)。`ctx.hooks.on('permissions:changed', …)` **永远不触发**,正确写法:
272
+
273
+ ```js
274
+ ctx.events.on('permissions.changed', (p) => ctx.logger.info('授权变更', p?.userId))
275
+ ```
276
+
277
+ ### 配置变更
278
+
279
+ ```js
280
+ ctx.hooks.on('config:changed', (p) => {
281
+ ctx.logger.info('配置已变更', p.changed)
282
+ ctx.logger.info('当前主题色', ctx.config.get('theme.primaryColor'))
283
+ })
284
+ // 等价糖:ctx.config.onChange(fn)
285
+ ```
286
+
287
+ ## 八、浏览器 client.mjs(ctx 面参考)
288
+
289
+ 客户端入口必须**在 manifest 里声明** `client: './client.mjs'` —— 仅存在文件是不够的。loader 从 `/api/plugins/client/<插件名>` 取脚本后动态 import 并调用 `setup(ctx)`。
290
+
291
+ ```js
292
+ export function setup(ctx) {
293
+ let samples = 0
294
+ const counter = ctx.el('strong', {}, ['0'])
295
+
296
+ // scene 事件:type 传事件名本身;收全部 scene 事件用字面量 'event:*'
297
+ ctx.on('daq.reading', () => { samples += 1; counter.textContent = String(samples) })
298
+
299
+ // 生命周期钩子只能走 ctx.hooks.on(不在 ctx.on 的投递面上)
300
+ ctx.hooks.on('i18n:changed', ({ locale }) => ctx.log.info('语言切换:', locale))
301
+
302
+ ctx.ui.registerPanel({
303
+ slot: 'plugins.page', // 插槽名(见下)
304
+ name: 'my-panel', // 同插件内唯一
305
+ titleKey: 'panel.title', // 解析 plugin.my-plugin.panel.title(或用静态 title)
306
+ order: 10,
307
+ mount(el) { // el = 面板容器(标题由插槽渲染)
308
+ const box = ctx.el('div', {}, ['样本数:', counter])
309
+ el.append(box)
310
+ const timer = setInterval(() => { counter.textContent = String(samples) }, 5000)
311
+ return () => { clearInterval(timer); box.remove() } // 清理函数:面板卸载时调用
312
+ },
313
+ })
314
+
315
+ ctx.log.info('客户端已注入')
316
+ }
317
+ ```
318
+
319
+ | 成员 | 说明 |
320
+ |---|---|
321
+ | `ctx.name` / `ctx.sdkVersion` | 插件名 / 客户端 SDK 版本 |
322
+ | `ctx.hooks` | 真实 HookBus:`client:init` / `page:change` / `i18n:changed` / `client:destroy` |
323
+ | `ctx.on(type, fn)` | scene 事件订阅(type 传事件名本身,内部装到 `event:<type>`);只有字面量 `'event:*'` 是通配;返回解绑函数 |
324
+ | `ctx.fetch(path, opt)` | 同源平台 API 助手(自动带 cookie token、解 `{code,data}` 信封、非 2xx 抛错) |
325
+ | `ctx.el(tag, attrs, children)` | DOM 助手;`style` 走 `cssText`,`class` 走 `className`,`onXxx` 自动 `addEventListener` |
326
+ | `ctx.mount(target, node)` / `ctx.root()` | 挂到选择器/元素(缺失时挂 `ctx.root()`)/ 插件私有挂载点 `#aw-plugin-<name>` |
327
+ | `ctx.ui.registerPanel(entry)` / `ctx.ui.slots` | 向命名插槽注册面板,返回注销函数;`slots` 为已知插槽名 |
328
+ | `ctx.t(key, params?)` | 插件命名空间翻译(`plugin.<name>.<key>`) |
329
+ | `ctx.locale` | 当前界面语言 |
330
+ | `ctx.log.info / warn / error` | 带 `[aw-plugin:<name>]` 前缀的 console |
331
+ | `ctx.dispose()` | 卸载:广播 `client:destroy` → 回收订阅 → 移除 `root()`(幂等) |
332
+
333
+ ### 通配与不可达的订阅(高频坑)
334
+
335
+ | 写法 | 结果 |
336
+ |---|---|
337
+ | `ctx.on('daq.reading', fn)` | 正确:订阅 scene 事件 `daq.reading` |
338
+ | `ctx.on('event:*', fn)` | 正确:唯一通配写法,收全部 scene 事件 |
339
+ | `ctx.on('*', fn)` | **死订阅**:不会触发 |
340
+ | `ctx.on('event:line.start', fn)` | **死订阅**:只订阅同名 scene 事件 `event:line.start`,而它不存在 |
341
+ | `ctx.on('daq:sample', fn)` | **死订阅**:服务端钩子不过桥到浏览器 |
342
+ | `ctx.hooks.on('page:change', fn)` | 正确:生命周期钩子走 `ctx.hooks` |
343
+ | `ctx.on('client:init', fn)` | **死订阅**:生命周期钩子不在 `ctx.on` 面上 |
344
+
345
+ 服务端钩子(`daq:sample`、`daq:frame`、`dcw:write`、`line:start\\|stop`)**永远不会到达浏览器**;浏览器能收到的只有 scene 事件(经 TownBus/WS 桥)。反过来,`page:change` / `i18n:changed` 也只存在于浏览器侧。
346
+
347
+ ### 面板与页面插槽
348
+
349
+ 宿主页面在任意位置放 `<workshop-plugin-slot slot-name="…" />` 即接收注入;`ctx.ui.slots` 当前为:
350
+
351
+ | 插槽 | 落点 |
352
+ |---|---|
353
+ | `plugins.page` | 插件管理页(默认落点) |
354
+ | `settings.plugins` | 系统设置 → 运行配置 → 插件管理区下方 |
355
+ | `dashboard.widgets` | 仪表盘页尾 |
356
+
357
+ `registerPanel` 返回 `unregisterPanel` 注销函数;面板的 `mount(el)` 可以返回清理函数(面板卸载时调用),也可以抛错 —— 单面板异常由插槽隔离,不影响其他面板与页面。
358
+
359
+ ### 卸载语义
360
+
361
+ - `ctx.dispose()` 由 **`pagehide`** 触发(导航离开 / 进入 bfcache;切标签页**不**触发)。它会广播 `client:destroy`、回收插件自己的订阅、移除 `root()`。
362
+ - `ctx.dispose()` 本身**不注销面板** —— 面板回收由 loader 在停用/热重载时调用 `unregisterPlugin(name)` 完成。
363
+ - 热通道双保险:WS `plugins.reloaded` 事件(即时)+ 15s 轮询 diff。
364
+
365
+ ## 九、路由与鉴权
366
+
367
+ `ctx.route(method, path, handler)` 立即注册并返回 **boolean**;manifest 里的 `routes[]` 在 `setup` 返回之后才注册。两者最终都挂在同一个路由表上:
368
+
369
+ ```
370
+ GET /api/plugins/<插件名>/health ← ctx.route('GET', '/health', handler)
371
+ ← routes: [{ method: 'GET', path: '/health', handler }]
372
+ ```
373
+
374
+ - 匹配是 **exact-match**,路径统一以 `/` 开头;没有通配段、没有子路由匹配。
375
+ - handler 收到 h3 的 `event`;JSON body 已由平台转发层预读并挂在 **`event.awBody`** 上(插件无需导入 h3)。
376
+ - handler 的返回值由 nitro 序列化为 JSON;抛错会变成 500 信封(带插件归属的日志),不裸传堆栈。
377
+ - **鉴权由声明式 `auth` 字段统一执行**,在进入 handler **之前**校验,对 `routes[]` 与 `ctx.route()` 一视同仁:
378
+
379
+ | `auth` | 行为 |
380
+ |---|---|
381
+ | `'none'`(默认) | 不校验,直接进入 handler |
382
+ | `'user'` | 需要有效用户 token,否则 401 |
383
+ | `'admin'` | 需要管理员,否则 401 |
384
+ | `'agent-or-user'` | 接受 Agent 身份或用户 token |
385
+
386
+ **不要把鉴权写进 handler**:`resolveUser(event)` 不可从插件导入,`ctx` 上也没有它。要鉴权就声明 `auth`。
387
+
388
+ ```js
389
+ ctx.route('GET', '/report', () => ({ plugin: ctx.name, at: new Date().toISOString() }))
390
+
391
+ ctx.route('POST', '/threshold', (event) => {
392
+ const v = Number(event.awBody?.threshold) // 宿主已预读 JSON body
393
+ if (!Number.isFinite(v)) return { ok: false, error: 'threshold 必须是数字' }
394
+ ctx.kv.set('threshold', v)
395
+ return { ok: true, threshold: v }
396
+ })
397
+ ```
398
+
399
+ ## 十、工具与团队开关
400
+
401
+ `ctx.omp.registerTool(def)` 注册的工具出现在全部 harness 的工具面上(omp 经 RPC `set_host_tools` 下发 / 其余引擎经 MCP 桥 `tools/list` / pi 经工具文件 / mock 经 REST invoke 直调),注册表变化会**热重发**给在跑的会话,无需重启或重 spawn 子进程。
402
+
403
+ ```js
404
+ ctx.omp.registerTool({
405
+ name: 'sensor_log',
406
+ label: '传感器标定',
407
+ description: '查询/登记传感器标定结论',
408
+ parameters: { type: 'object', properties: { sensor: { type: 'string' } }, required: ['sensor'] },
409
+ roles: ['lead', 'worker'], // 仅这两个字面量;缺省=两者都可用
410
+ handler: async (args, agent) => ({ text: `${agent.role}@${agent.channelId}: ${args.sensor}` }),
411
+ })
412
+ ```
413
+
414
+ 参数 schema 里**不要开 `url` / `host` 这类注入口** —— 插件工具的参数直接来自模型,任何"让模型指定目标地址"的字段都会变成 SSRF 面。
415
+
416
+ ### 团队 / Channel 级开关
417
+
418
+ 全局启停之外,每个团队(Channel)还有独立的插件开关组(由 `channel_plugins` 表承载):
419
+
420
+ - **建队时勾选**:`POST /api/workshop/teams` 接受 `plugins: [{ name, enabled }]`,以 team id 为键落库,部署时传导到 Channel;
421
+ - **随时切换**:`GET|PUT /api/workshop/channels/:id/plugins`、`GET|PUT /api/workshop/teams/:id/plugins`(body 为 `{ plugins: [{ name, enabled }] }`,全量替换语义,未知/停用插件名忽略);
422
+ - **语义**:无显式行 = 未配置 → 全部启用插件对该团队可见(向后兼容);写入显式行后按行过滤 —— **被关闭插件的工具不注入该团队的 Agent,dispatch 同源拒绝**;
423
+ - **前端**:workshop teams 页(创建勾选 + 团队弹层)。
424
+
425
+ ## 十一、完整示例
426
+
427
+ ```js
428
+ // index.mjs —— 服务端入口(零导入依赖;ctx 由宿主注入)
429
+ export default {
430
+ name: 'my-plugin',
431
+ version: '1.0.0',
432
+ description: '示例:越限计数 + 自有 API + 设置分区 + Agent 工具',
433
+ auth: 'user',
434
+ client: './client.mjs',
435
+ configGroups: [
436
+ { id: 'default', label: '我的插件', description: '基础配置', order: 500 },
437
+ { id: 'advanced', label: '高级', collapsed: true },
438
+ ],
439
+ settings: [
440
+ { key: 'threshold', type: 'number', default: 180, min: 0, max: 5000, group: 'default',
441
+ label: '告警阈值', description: '保存即热生效' },
442
+ { key: 'endpoint', type: 'string', default: 'http://127.0.0.1:8080', group: 'advanced',
443
+ label: '外部服务地址' },
444
+ ],
445
+ routes: [
446
+ { method: 'GET', path: '/health', handler: () => ({ ok: true }) },
447
+ ],
448
+
449
+ async setup(ctx) {
450
+ ctx.logger.info(`装载完成(scope=${ctx.scope}, sdk=${ctx.sdkVersion})`)
451
+
452
+ const threshold = () => Number(ctx.config.get('plugins.my-plugin.threshold')) || 180
453
+
454
+ // 1) 数采下发级样本:越限计数落插件私有 KV
455
+ ctx.hooks.on('daq:sample', (s) => {
456
+ if (typeof s?.value === 'number' && s.value > threshold())
457
+ ctx.kv.bump(`alarm:${s.nodeId}`)
458
+ })
459
+
460
+ // 2) scene 事件订阅(ctx.events 自动补 event: 前缀)
461
+ ctx.events.on('daq.alarm', (a) => ctx.logger.warn('告警', a?.nodeId))
462
+ ctx.events.on('permissions.changed', (p) => ctx.logger.info('授权变更', p?.userId))
463
+
464
+ // 3) 全事件审计:服务端通配是裸 '*',回调收 { type, payload }
465
+ ctx.hooks.on('*', ({ type }) => ctx.logger.debug('event', type))
466
+
467
+ // 4) setup 之后才会注册 routes[];这里用 ctx.route 立即注册(返回 boolean)
468
+ ctx.route('POST', '/threshold', (event) => {
469
+ const v = Number(event.awBody?.threshold)
470
+ if (!Number.isFinite(v)) return { ok: false, error: 'threshold 必须是数字' }
471
+ ctx.kv.set('threshold', v)
472
+ return { ok: true, threshold: v }
473
+ })
474
+
475
+ // 5) 定时器 + 清理:同一个宿主回收队列,关机与热重载都会执行
476
+ ctx.timer.setInterval(() => ctx.kv.set('heartbeat', new Date().toISOString()), 5000)
477
+ ctx.onDispose(() => ctx.logger.info('插件已清理'))
478
+
479
+ // 6) Agent 工具(roles 仅 'lead' | 'worker')
480
+ ctx.omp.registerTool({
481
+ name: 'my_alarm_report',
482
+ description: '读取本插件记录的越限告警计数',
483
+ parameters: { type: 'object', properties: { nodeId: { type: 'string' } }, required: ['nodeId'] },
484
+ roles: ['lead', 'worker'],
485
+ handler: async (args, agent) => ({
486
+ text: `${args.nodeId} 告警 ${ctx.kv.get(`alarm:${args.nodeId}`) ?? 0} 次(by ${agent.role})`,
487
+ }),
488
+ })
489
+ },
490
+ }
491
+ ```
492
+
493
+ `client.mjs` 见 §8;`i18n.json` 见 §5。装到哪个作用域、怎么启停见 §1。
494
+
495
+ ## 十二、故障排查
496
+
497
+ | 现象 | 原因 / 处理 |
498
+ |---|---|
499
+ | 改了插件代码没生效 | 宿主没有插件目录 watcher:触碰 `<home>/plugins-state.json` 或 `aw plugin enable/disable` 往返一次触发重载(重载会带 `?t=` 破缓存);核心 `server/`、`shared/` 改动仍需重启进程 |
500
+ | 装载失败看不到 | `aw plugin list` **不显示**装载失败。用 `GET /api/workshop/plugins`(返回 `{ plugins, failures, initedAt }`,**没有 `{code,data}` 信封**),或看启动日志里的 `[aw-plugins] 装载失败 …` |
501
+ | 插件路由 404 | exact-match;检查 method 与 path 前导 `/`,以及插件是否处于启用态(停用插件的路由已从路由表移除) |
502
+ | 插件路由 401 | 入口声明了 `auth: 'user' \| 'admin' \| 'agent-or-user'`,请求未带有效凭据;开放接口才用 `auth: 'none'` |
503
+ | 客户端面板没出现 | 浏览器 console 看 `[aw-plugins]` 告警;确认 manifest `hasClient: true`(即 manifest 里声明了 `client:'./client.mjs'`)且插件 `enabled !== false` |
504
+ | 客户端订阅不触发 | 检查是不是踩了 §8 的坑(`ctx.on('*')`、`ctx.on('event:line.start')`、`ctx.on('daq:sample')`,或把生命周期钩子交给 `ctx.on`) |
505
+ | 设置项没渲染 | 声明里缺 `default` 会被跳过并告警;`select` 的 `default` 必须在 `options` 里;`key` 只允许字母数字与 `-` `_` |
506
+ | 设置值改了没生效 | 确认读的是 `ctx.config.get('plugins.<插件名>.<key>')`(短 key 读不到) |
507
+ | `permissions:changed` 钩子不触发 | 该名字不存在;用 `ctx.events.on('permissions.changed', fn)` |
508
+ | KV 数据"丢了" | KV 在 `<配置根>/data/plugins/<插件名>/kv.json`,不在插件目录;写入 200ms 防抖落盘,强杀进程会有极小丢失窗口 |
509
+ | `ctx.api` 401 | 鉴权端点需 `ctx.api.setToken(token)`;免鉴权端点(manifest / ping)无需 |
510
+
511
+ **信任模型**:插件是任意 node 代码,与 aw commands 同级 —— 只安装/启用你信任的插件。
512
+
513
+ ### 已知边界(有意为之,不是缺陷)
514
+
515
+ - **钩子是观察语义**:v1 没有 veto / 拦截 / 改写能力,写控联锁完整性优先。
516
+ - **`ctx.http` 守卫只校验协议**(仅 http/https),**不限制 host**;需要白名单请在插件内自行校验(内置 `diag-bridge` / `rag-bridge` 就是这么做的)。
517
+ - **`ctx.t(key, params)` 的 `params` 当前被忽略**(不做插值);需要拼字符串请在插件里自己做。
518
+ - **`ctx.kv` 没有 `reset()`**,只有 `get / set / all / bump`。
519
+ - **服务端与浏览器的订阅面不互通**:服务端钩子不过桥,浏览器事件也不上服务端。
520
+ - **浏览器新启用插件注入延迟 ≤15s**(WS 可用时即时)。
521
+ - **`server:close` / `onDispose` 依赖优雅关闭信号**,Windows 强杀进程不触发。
522
+ - **`aw plugin list` 只做目录扫描**,不反映装载失败与运行态健康。
523
+
524
+ ## 十三、发布前验证清单
525
+
526
+ 1. `aw plugin list` 三个作用域都能看到;C 端插件显示 `+client`;启停开关往返后路由/工具/面板同步生灭(连击不丢事件)。
527
+ 2. `GET /api/workshop/plugins` 的 `failures` 为空;`GET /api/plugins/manifest` 的 `settingsCount` / `hasClient` / `hasI18n` 与声明一致。
528
+ 3. 设置页出现本插件的配置分区(未声明分组的字段落在 `plugin-<插件名>` 分区),改值后 `ctx.config.get('plugins.<插件名>.<key>')` 立即读到新值。
529
+ 4. 语言切换:面板标题/文案跟随;`i18n:changed` 清理函数无泄漏。
530
+ 5. 工具经 `GET /api/workshop/agent-tools/list` 可见;参数里没有 `url` / `host` 注入口;团队开关关闭后工具消失且 dispatch 拒绝。
531
+ 6. 触发一次热重载(enable/disable 往返),确认 `plugins:reloaded` 到达插件、KV 与定时器无泄漏。