agentworkshop 0.8.5 → 0.8.7

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 (1999) hide show
  1. package/.AgentWorkShop/prompts/host-tools.en.json +196 -68
  2. package/.AgentWorkShop/prompts/host-tools.json +16 -6
  3. package/.output/.AgentWorkShop/aml-python/train-example.py +92 -92
  4. package/.output/.AgentWorkShop/prompts/host-tools.en.json +196 -68
  5. package/.output/.AgentWorkShop/prompts/host-tools.json +16 -6
  6. package/.output/nitro.json +1 -1
  7. package/.output/public/_nuxt/9Kt-rxrm.js +1 -0
  8. package/.output/public/_nuxt/ATAvN55g.js +1 -0
  9. package/.output/public/_nuxt/B3GEA4IW.js +1 -0
  10. package/.output/public/_nuxt/B9qIhT7k2.js +1 -0
  11. package/.output/public/_nuxt/BBTI9r9T2.js +1 -0
  12. package/.output/public/_nuxt/BE9oKpOt.js +1 -0
  13. package/.output/public/_nuxt/BHOjkDAJ.js +21 -0
  14. package/.output/public/_nuxt/BTaGYNZF2.js +1 -0
  15. package/.output/public/_nuxt/BXUDD9fv.js +1 -0
  16. package/.output/public/_nuxt/BXbZ_hei.js +1 -0
  17. package/.output/public/_nuxt/BaGy_jAI2.js +1 -0
  18. package/.output/public/_nuxt/BdfAuX81.js +1 -0
  19. package/.output/public/_nuxt/BoXKUOiN2.js +1 -0
  20. package/.output/public/_nuxt/Buj_DMJ-.js +1 -0
  21. package/.output/public/_nuxt/Bv7dyPx4.js +1 -0
  22. package/.output/public/_nuxt/BvjY-Xks.js +1 -0
  23. package/.output/public/_nuxt/BxC9PAu-2.js +1 -0
  24. package/.output/public/_nuxt/Bzfzp9-f.js +1 -0
  25. package/.output/public/_nuxt/CT4bi_Y4.js +1 -0
  26. package/.output/public/_nuxt/CTGJHZ8X2.js +1 -0
  27. package/.output/public/_nuxt/CWcaJnFp.js +1 -0
  28. package/.output/public/_nuxt/CYLe9LKr.js +1 -0
  29. package/.output/public/_nuxt/CeCSjB9O2.js +1 -0
  30. package/.output/public/_nuxt/CnoJJb7B.js +1 -0
  31. package/.output/public/_nuxt/Crf8_Ad02.js +1 -0
  32. package/.output/public/_nuxt/CtMTOx_-2.js +1 -0
  33. package/.output/public/_nuxt/Cv9OcYm3.js +1 -0
  34. package/.output/public/_nuxt/CxIF09Zj2.js +1 -0
  35. package/.output/public/_nuxt/CxR0TyUA.js +1 -0
  36. package/.output/public/_nuxt/D9tNM-1a.js +9 -0
  37. package/.output/public/_nuxt/DL8QM0x5.js +1 -0
  38. package/.output/public/_nuxt/DO9Y3eoU.js +20 -0
  39. package/.output/public/_nuxt/DQLBGo6O.js +1 -0
  40. package/.output/public/_nuxt/DSqQKrMK2.js +1 -0
  41. package/.output/public/_nuxt/DXc4yISs.js +47 -0
  42. package/.output/public/_nuxt/DXmEuVFQ2.js +1 -0
  43. package/.output/public/_nuxt/DeXAMdSa2.js +1 -0
  44. package/.output/public/_nuxt/DjjOAXrj2.js +1 -0
  45. package/.output/public/_nuxt/DkRozlDP2.js +1 -0
  46. package/.output/public/_nuxt/DoprKJ5a2.js +1 -0
  47. package/.output/public/_nuxt/DvI5fMX12.js +1 -0
  48. package/.output/public/_nuxt/DzWyfYJ12.js +2 -0
  49. package/.output/public/_nuxt/EXs4hr_w2.js +2 -0
  50. package/.output/public/_nuxt/K5Xen0wZ2.js +1 -0
  51. package/.output/public/_nuxt/LS9Wa05P.js +1 -0
  52. package/.output/public/_nuxt/MmlCf-EZ.js +1 -0
  53. package/.output/public/_nuxt/OmpTerminalPanel.DMWgGwDs.css +1 -0
  54. package/.output/public/_nuxt/PluginSlot.BqBzLD4T.css +1 -0
  55. package/.output/public/_nuxt/TownView.DQaU1HuK.css +1 -0
  56. package/.output/public/_nuxt/TugRY_4O.js +1 -0
  57. package/.output/public/_nuxt/UgCvr7b2.js +1 -0
  58. package/.output/public/_nuxt/WCG1-KXf2.js +16 -0
  59. package/.output/public/_nuxt/WybiLTow2.js +8 -0
  60. package/.output/public/_nuxt/YWsTLN5m.js +1 -0
  61. package/.output/public/_nuxt/Zn0BZpf0.js +3 -0
  62. package/.output/public/_nuxt/ZzOyoXex2.js +1 -0
  63. package/.output/public/_nuxt/_id_.Be5JaH-P.css +1 -0
  64. package/.output/public/_nuxt/_wsId_.DSOfdfx2.css +1 -0
  65. package/.output/public/_nuxt/agents.CRomddYR.css +1 -0
  66. package/.output/public/_nuxt/aml.DgOMpDpv.css +1 -0
  67. package/.output/public/_nuxt/builds/latest.json +1 -1
  68. package/.output/public/_nuxt/builds/meta/02ba4bc7-f353-4183-a619-716921b5f0dc.json +1 -0
  69. package/.output/public/_nuxt/default.CpAx70gC.css +1 -0
  70. package/.output/public/_nuxt/eNEgl-ZF.js +1 -0
  71. package/.output/public/_nuxt/entry.Buc3k7Ha.css +1 -0
  72. package/.output/public/_nuxt/fJv3DH8b.js +1 -0
  73. package/.output/public/_nuxt/hyLdZsOd2.js +1 -0
  74. package/.output/public/_nuxt/logs.6VGjPS34.css +1 -0
  75. package/.output/public/_nuxt/monitor.OoNTwfMJ.css +1 -0
  76. package/.output/public/_nuxt/o8sYG6xx2.js +1 -0
  77. package/.output/public/_nuxt/ontology.D4P756Tc.css +1 -0
  78. package/.output/public/_nuxt/operations.C48ggFa5.css +1 -0
  79. package/.output/public/_nuxt/pages.Dpa28tJW.css +1 -0
  80. package/.output/public/_nuxt/permissions.CrV-4t-6.css +1 -0
  81. package/.output/public/_nuxt/px0VQ09m.js +2 -0
  82. package/.output/public/_nuxt/schedules.DYWOjGHm.css +1 -0
  83. package/.output/public/_nuxt/teams.DEJoJ4QV.css +1 -0
  84. package/.output/public/_nuxt/tokens.DKZWCP5v.css +1 -0
  85. package/.output/public/_nuxt/tools.DP-nsTli.css +1 -0
  86. package/.output/public/_nuxt/workshop.PT1xhP8C.css +1 -0
  87. package/.output/public/favicon.svg +14 -14
  88. package/.output/public/robots.txt +3 -3
  89. package/.output/server/chunks/_/AuthGate-G74Wr5IV.mjs +716 -0
  90. package/.output/server/chunks/_/AuthGate-G74Wr5IV.mjs.map +1 -0
  91. package/.output/server/chunks/_/FormItemContext-DmuQqaeJ.mjs +72 -0
  92. package/.output/server/chunks/_/FormItemContext-DmuQqaeJ.mjs.map +1 -0
  93. package/.output/server/chunks/_/LeftOutlined.mjs.map +1 -1
  94. package/.output/server/chunks/_/OmpTerminalPanel-CVn7GF98.mjs +942 -0
  95. package/.output/server/chunks/_/OmpTerminalPanel-CVn7GF98.mjs.map +1 -0
  96. package/.output/server/chunks/_/PluginSlot-CZlGlRoR.mjs +141 -0
  97. package/.output/server/chunks/_/PluginSlot-CZlGlRoR.mjs.map +1 -0
  98. package/.output/server/chunks/_/RightOutlined.mjs.map +1 -1
  99. package/.output/server/chunks/_/SearchOutlined.mjs +13 -13
  100. package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
  101. package/.output/server/chunks/_/TownView-CaxNtCrZ.mjs +6496 -0
  102. package/.output/server/chunks/_/TownView-CaxNtCrZ.mjs.map +1 -0
  103. package/.output/server/chunks/_/_id_-CvCH8aqA.mjs +2045 -0
  104. package/.output/server/chunks/_/_id_-CvCH8aqA.mjs.map +1 -0
  105. package/.output/server/chunks/_/_id_-X_k47fyM.mjs +392 -0
  106. package/.output/server/chunks/_/_id_-X_k47fyM.mjs.map +1 -0
  107. package/.output/server/chunks/_/_wsId_-CIXvt220.mjs +14589 -0
  108. package/.output/server/chunks/_/_wsId_-CIXvt220.mjs.map +1 -0
  109. package/.output/server/chunks/_/access.mjs +1 -1
  110. package/.output/server/chunks/_/agent-dto.mjs +26 -0
  111. package/.output/server/chunks/_/agent-dto.mjs.map +1 -0
  112. package/.output/server/chunks/_/agents-Bipi0xxl.mjs +1078 -0
  113. package/.output/server/chunks/_/agents-Bipi0xxl.mjs.map +1 -0
  114. package/.output/server/chunks/_/alert-CNGhs--Y.mjs +263 -0
  115. package/.output/server/chunks/_/alert-CNGhs--Y.mjs.map +1 -0
  116. package/.output/server/chunks/_/aml-gCTIxLoE.mjs +814 -0
  117. package/.output/server/chunks/_/aml-gCTIxLoE.mjs.map +1 -0
  118. package/.output/server/chunks/_/analysis-BrSFajFi.mjs +533 -0
  119. package/.output/server/chunks/_/analysis-BrSFajFi.mjs.map +1 -0
  120. package/.output/server/chunks/_/api--f4L9O86.mjs +64 -0
  121. package/.output/server/chunks/_/api--f4L9O86.mjs.map +1 -0
  122. package/.output/server/chunks/_/api-CRGCw6io.mjs +53 -0
  123. package/.output/server/chunks/_/api-CRGCw6io.mjs.map +1 -0
  124. package/.output/server/chunks/_/api-DKutH26K.mjs +72 -0
  125. package/.output/server/chunks/_/api-DKutH26K.mjs.map +1 -0
  126. package/.output/server/chunks/_/api-error-BrL8jXVC.mjs +47 -0
  127. package/.output/server/chunks/_/api-error-BrL8jXVC.mjs.map +1 -0
  128. package/.output/server/chunks/_/apiClient-DrCvj3Zb.mjs +81 -0
  129. package/.output/server/chunks/_/apiClient-DrCvj3Zb.mjs.map +1 -0
  130. package/.output/server/chunks/_/binding-authz.mjs +4 -1
  131. package/.output/server/chunks/_/binding-authz.mjs.map +1 -1
  132. package/.output/server/chunks/_/board-DB55AvRS.mjs +189 -0
  133. package/.output/server/chunks/_/board-DB55AvRS.mjs.map +1 -0
  134. package/.output/server/chunks/_/builtin-catalog-edpDcgfL.mjs.map +1 -0
  135. package/.output/server/chunks/_/card-BECE6y_G.mjs +953 -0
  136. package/.output/server/chunks/_/card-BECE6y_G.mjs.map +1 -0
  137. package/.output/server/chunks/_/channel-templates-C0Njk-Ir.mjs +942 -0
  138. package/.output/server/chunks/_/channel-templates-C0Njk-Ir.mjs.map +1 -0
  139. package/.output/server/chunks/_/chart-pipeline-BpoWYMK_.mjs.map +1 -0
  140. package/.output/server/chunks/_/chart-trend-BWeZh5Lv.mjs.map +1 -0
  141. package/.output/server/chunks/_/checkbox-C6xY5uc6.mjs +439 -0
  142. package/.output/server/chunks/_/checkbox-C6xY5uc6.mjs.map +1 -0
  143. package/.output/server/chunks/_/client-only-DQ6Q0w4J.mjs +43 -0
  144. package/.output/server/chunks/_/client-only-DQ6Q0w4J.mjs.map +1 -0
  145. package/.output/server/chunks/_/constants-HPHJvjne.mjs +142 -0
  146. package/.output/server/chunks/_/constants-HPHJvjne.mjs.map +1 -0
  147. package/.output/server/chunks/_/core-CRlsQhzd.mjs +294 -0
  148. package/.output/server/chunks/_/core-CRlsQhzd.mjs.map +1 -0
  149. package/.output/server/chunks/_/daq-VLM0Ud2Y.mjs +1266 -0
  150. package/.output/server/chunks/_/daq-VLM0Ud2Y.mjs.map +1 -0
  151. package/.output/server/chunks/_/data-Bgx_w04W.mjs +481 -0
  152. package/.output/server/chunks/_/data-Bgx_w04W.mjs.map +1 -0
  153. package/.output/server/chunks/_/data-export.mjs +6 -6
  154. package/.output/server/chunks/_/data-query.mjs +3 -3
  155. package/.output/server/chunks/_/dcw-BstEJzQ4.mjs +505 -0
  156. package/.output/server/chunks/_/dcw-BstEJzQ4.mjs.map +1 -0
  157. package/.output/server/chunks/_/dcw-driver-badge-Df5wL_ZA.mjs.map +1 -0
  158. package/.output/server/chunks/_/default-Dmo-rt5V.mjs +2353 -0
  159. package/.output/server/chunks/_/default-Dmo-rt5V.mjs.map +1 -0
  160. package/.output/server/chunks/_/descriptions-B3uhDesi.mjs +406 -0
  161. package/.output/server/chunks/_/descriptions-B3uhDesi.mjs.map +1 -0
  162. package/.output/server/chunks/_/drawer-DwXxapMg.mjs +834 -0
  163. package/.output/server/chunks/_/drawer-DwXxapMg.mjs.map +1 -0
  164. package/.output/server/chunks/_/dropdown-DLrGy-Fs.mjs +14 -0
  165. package/.output/server/chunks/_/dropdown-DLrGy-Fs.mjs.map +1 -0
  166. package/.output/server/chunks/_/dropdown-nsGv8Gqx.mjs +540 -0
  167. package/.output/server/chunks/_/dropdown-nsGv8Gqx.mjs.map +1 -0
  168. package/.output/server/chunks/_/eda-run.repo.mjs +2 -2
  169. package/.output/server/chunks/_/entity.mjs +1 -1
  170. package/.output/server/chunks/_/error-500.mjs.map +1 -1
  171. package/.output/server/chunks/_/es-DXSEkmAm.mjs +43 -0
  172. package/.output/server/chunks/_/es-DXSEkmAm.mjs.map +1 -0
  173. package/.output/server/chunks/_/features.mjs +5 -5
  174. package/.output/server/chunks/_/firstNotUndefined-laiThpLD.mjs +2448 -0
  175. package/.output/server/chunks/_/firstNotUndefined-laiThpLD.mjs.map +1 -0
  176. package/.output/server/chunks/_/form-Cw2Ex9w5.mjs +4712 -0
  177. package/.output/server/chunks/_/form-Cw2Ex9w5.mjs.map +1 -0
  178. package/.output/server/chunks/_/golden.mjs +3 -3
  179. package/.output/server/chunks/_/harness-spawn-policy.mjs +77 -0
  180. package/.output/server/chunks/_/harness-spawn-policy.mjs.map +1 -0
  181. package/.output/server/chunks/_/hasIn-RYRGomyg.mjs +553 -0
  182. package/.output/server/chunks/_/hasIn-RYRGomyg.mjs.map +1 -0
  183. package/.output/server/chunks/_/hitl-CQowkJ6s.mjs +132 -0
  184. package/.output/server/chunks/_/hitl-CQowkJ6s.mjs.map +1 -0
  185. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  186. package/.output/server/chunks/_/index.mjs +1 -1
  187. package/.output/server/chunks/_/input-CJgB-RL6.mjs +2181 -0
  188. package/.output/server/chunks/_/input-CJgB-RL6.mjs.map +1 -0
  189. package/.output/server/chunks/_/input-number-CQKL42p_.mjs +1120 -0
  190. package/.output/server/chunks/_/input-number-CQKL42p_.mjs.map +1 -0
  191. package/.output/server/chunks/_/interval-CfceaI3F.mjs +9 -0
  192. package/.output/server/chunks/_/interval-CfceaI3F.mjs.map +1 -0
  193. package/.output/server/chunks/_/isNumeric-DQiJ-b15.mjs +7 -0
  194. package/.output/server/chunks/_/isNumeric-DQiJ-b15.mjs.map +1 -0
  195. package/.output/server/chunks/_/line-scope.mjs +32 -0
  196. package/.output/server/chunks/_/line-scope.mjs.map +1 -0
  197. package/.output/server/chunks/_/logs-Dt4ejjjU.mjs +492 -0
  198. package/.output/server/chunks/_/logs-Dt4ejjjU.mjs.map +1 -0
  199. package/.output/server/chunks/_/menu-xO8ocVtL.mjs +1952 -0
  200. package/.output/server/chunks/_/menu-xO8ocVtL.mjs.map +1 -0
  201. package/.output/server/chunks/_/mes-console.mjs +1 -1
  202. package/.output/server/chunks/_/monitor-vqmGVVN5.mjs +2253 -0
  203. package/.output/server/chunks/_/monitor-vqmGVVN5.mjs.map +1 -0
  204. package/.output/server/chunks/_/narrow-fetch-CcG-BPxc.mjs.map +1 -0
  205. package/.output/server/chunks/_/nitro.mjs +4416 -3477
  206. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  207. package/.output/server/chunks/_/ocap.mjs +1 -1
  208. package/.output/server/chunks/_/ontology-ih0HgPpL.mjs +1406 -0
  209. package/.output/server/chunks/_/ontology-ih0HgPpL.mjs.map +1 -0
  210. package/.output/server/chunks/_/operations-BHmdVOUk.mjs +311 -0
  211. package/.output/server/chunks/_/operations-BHmdVOUk.mjs.map +1 -0
  212. package/.output/server/chunks/_/optimizer-DyvIYE4A.mjs +202 -0
  213. package/.output/server/chunks/_/optimizer-DyvIYE4A.mjs.map +1 -0
  214. package/.output/server/chunks/_/pages-C2KTn0U1.mjs +542 -0
  215. package/.output/server/chunks/_/pages-C2KTn0U1.mjs.map +1 -0
  216. package/.output/server/chunks/_/pagination-BTzq7dD5.mjs +1346 -0
  217. package/.output/server/chunks/_/pagination-BTzq7dD5.mjs.map +1 -0
  218. package/.output/server/chunks/_/permissions-BbTI02WI.mjs +637 -0
  219. package/.output/server/chunks/_/permissions-BbTI02WI.mjs.map +1 -0
  220. package/.output/server/chunks/_/pipeline-BgNjQ4J3.mjs +212 -0
  221. package/.output/server/chunks/_/pipeline-BgNjQ4J3.mjs.map +1 -0
  222. package/.output/server/chunks/_/plugins-CplEv3mY.mjs +272 -0
  223. package/.output/server/chunks/_/plugins-CplEv3mY.mjs.map +1 -0
  224. package/.output/server/chunks/_/popconfirm-DuGF7ty-.mjs +340 -0
  225. package/.output/server/chunks/_/popconfirm-DuGF7ty-.mjs.map +1 -0
  226. package/.output/server/chunks/_/responsiveObserve-CzRpNXkr.mjs +78 -0
  227. package/.output/server/chunks/_/responsiveObserve-CzRpNXkr.mjs.map +1 -0
  228. package/.output/server/chunks/_/rest-auth.mjs +1 -1
  229. package/.output/server/chunks/_/schedules-BN4t_4PG.mjs +7172 -0
  230. package/.output/server/chunks/_/schedules-BN4t_4PG.mjs.map +1 -0
  231. package/.output/server/chunks/_/segmented-29uEKZ3D.mjs +341 -0
  232. package/.output/server/chunks/_/segmented-29uEKZ3D.mjs.map +1 -0
  233. package/.output/server/chunks/_/select-CJb2XrQf.mjs +3923 -0
  234. package/.output/server/chunks/_/select-CJb2XrQf.mjs.map +1 -0
  235. package/.output/server/chunks/_/settings-BQaAoT4q.mjs +1014 -0
  236. package/.output/server/chunks/_/settings-BQaAoT4q.mjs.map +1 -0
  237. package/.output/server/chunks/_/space-BByD-mFE.mjs +110 -0
  238. package/.output/server/chunks/_/space-BByD-mFE.mjs.map +1 -0
  239. package/.output/server/chunks/_/spc.mjs +1 -1
  240. package/.output/server/chunks/_/spin-XhbgGeLP.mjs +357 -0
  241. package/.output/server/chunks/_/spin-XhbgGeLP.mjs.map +1 -0
  242. package/.output/server/chunks/_/studio-D5r5Rzaq.mjs +336 -0
  243. package/.output/server/chunks/_/studio-D5r5Rzaq.mjs.map +1 -0
  244. package/.output/server/chunks/_/switch-DWcwVFxW.mjs +377 -0
  245. package/.output/server/chunks/_/switch-DWcwVFxW.mjs.map +1 -0
  246. package/.output/server/chunks/_/table-Zhuo7Fq-.mjs +7546 -0
  247. package/.output/server/chunks/_/table-Zhuo7Fq-.mjs.map +1 -0
  248. package/.output/server/chunks/_/tabs-BCwBXjNt.mjs +1924 -0
  249. package/.output/server/chunks/_/tabs-BCwBXjNt.mjs.map +1 -0
  250. package/.output/server/chunks/_/tag-CRW-anwy.mjs +1156 -0
  251. package/.output/server/chunks/_/tag-CRW-anwy.mjs.map +1 -0
  252. package/.output/server/chunks/_/teams-BUtsNTet.mjs +1203 -0
  253. package/.output/server/chunks/_/teams-BUtsNTet.mjs.map +1 -0
  254. package/.output/server/chunks/_/tokens-o8lT3x-p.mjs +1062 -0
  255. package/.output/server/chunks/_/tokens-o8lT3x-p.mjs.map +1 -0
  256. package/.output/server/chunks/_/tools-DRb5HTtU.mjs +487 -0
  257. package/.output/server/chunks/_/tools-DRb5HTtU.mjs.map +1 -0
  258. package/.output/server/chunks/_/tooltip-GlMrUZzx.mjs +920 -0
  259. package/.output/server/chunks/_/tooltip-GlMrUZzx.mjs.map +1 -0
  260. package/.output/server/chunks/_/town-BPA3G6yX.mjs +133 -0
  261. package/.output/server/chunks/_/town-BPA3G6yX.mjs.map +1 -0
  262. package/.output/server/chunks/_/town-BV-hbwb5.mjs +75 -0
  263. package/.output/server/chunks/_/town-BV-hbwb5.mjs.map +1 -0
  264. package/.output/server/chunks/_/types-D6J7slEa.mjs +5565 -0
  265. package/.output/server/chunks/_/types-D6J7slEa.mjs.map +1 -0
  266. package/.output/server/chunks/_/types-DWqIeMRP.mjs +76 -0
  267. package/.output/server/chunks/_/types-DWqIeMRP.mjs.map +1 -0
  268. package/.output/server/chunks/_/useAgentHarnessOptions-dDHiEoK2.mjs +124 -0
  269. package/.output/server/chunks/_/useAgentHarnessOptions-dDHiEoK2.mjs.map +1 -0
  270. package/.output/server/chunks/_/useAgentTemplateActions-S3dtH5UW.mjs +77 -0
  271. package/.output/server/chunks/_/useAgentTemplateActions-S3dtH5UW.mjs.map +1 -0
  272. package/.output/server/chunks/_/useAgentTemplateDialogState-CZzpu5og.mjs +67 -0
  273. package/.output/server/chunks/_/useAgentTemplateDialogState-CZzpu5og.mjs.map +1 -0
  274. package/.output/server/chunks/_/useAgentTemplateForm-D8gneIvd.mjs +117 -0
  275. package/.output/server/chunks/_/useAgentTemplateForm-D8gneIvd.mjs.map +1 -0
  276. package/.output/server/chunks/_/useAgentTemplatesCatalog-DHUpubKM.mjs +133 -0
  277. package/.output/server/chunks/_/useAgentTemplatesCatalog-DHUpubKM.mjs.map +1 -0
  278. package/.output/server/chunks/_/useAmlDatasets-CDg3Qbpv.mjs +92 -0
  279. package/.output/server/chunks/_/useAmlDatasets-CDg3Qbpv.mjs.map +1 -0
  280. package/.output/server/chunks/_/useAmlEntities-Bcaput4Y.mjs +86 -0
  281. package/.output/server/chunks/_/useAmlEntities-Bcaput4Y.mjs.map +1 -0
  282. package/.output/server/chunks/_/useAmlEnv-Dga_Nq6z.mjs +194 -0
  283. package/.output/server/chunks/_/useAmlEnv-Dga_Nq6z.mjs.map +1 -0
  284. package/.output/server/chunks/_/useAmlExperiments-CFngqLM3.mjs +89 -0
  285. package/.output/server/chunks/_/useAmlExperiments-CFngqLM3.mjs.map +1 -0
  286. package/.output/server/chunks/_/useAmlFormat-C2sl3MGB.mjs +82 -0
  287. package/.output/server/chunks/_/useAmlFormat-C2sl3MGB.mjs.map +1 -0
  288. package/.output/server/chunks/_/useAmlJobs-C7onZkcR.mjs +267 -0
  289. package/.output/server/chunks/_/useAmlJobs-C7onZkcR.mjs.map +1 -0
  290. package/.output/server/chunks/_/useAmlModels-B2b3mx4d.mjs +93 -0
  291. package/.output/server/chunks/_/useAmlModels-B2b3mx4d.mjs.map +1 -0
  292. package/.output/server/chunks/_/useAmlNotes-6gZX7tbx.mjs +86 -0
  293. package/.output/server/chunks/_/useAmlNotes-6gZX7tbx.mjs.map +1 -0
  294. package/.output/server/chunks/_/useAmlPredict-DwOmM2ke.mjs +130 -0
  295. package/.output/server/chunks/_/useAmlPredict-DwOmM2ke.mjs.map +1 -0
  296. package/.output/server/chunks/_/useAnalysisFeed-CpPsKh_I.mjs +129 -0
  297. package/.output/server/chunks/_/useAnalysisFeed-CpPsKh_I.mjs.map +1 -0
  298. package/.output/server/chunks/_/useDaqAddNode-QtJja03_.mjs +142 -0
  299. package/.output/server/chunks/_/useDaqAddNode-QtJja03_.mjs.map +1 -0
  300. package/.output/server/chunks/_/useDaqDetailBinding-Dd5c4bep.mjs +70 -0
  301. package/.output/server/chunks/_/useDaqDetailBinding-Dd5c4bep.mjs.map +1 -0
  302. package/.output/server/chunks/_/useDaqDetailFrames-C2gvrOr6.mjs +79 -0
  303. package/.output/server/chunks/_/useDaqDetailFrames-C2gvrOr6.mjs.map +1 -0
  304. package/.output/server/chunks/_/useDaqDetailHistory-Bhht_iFw.mjs +176 -0
  305. package/.output/server/chunks/_/useDaqDetailHistory-Bhht_iFw.mjs.map +1 -0
  306. package/.output/server/chunks/_/useDaqDetailNode-BayXtr5W.mjs +99 -0
  307. package/.output/server/chunks/_/useDaqDetailNode-BayXtr5W.mjs.map +1 -0
  308. package/.output/server/chunks/_/useDaqDetailParams-D8d1l3_R.mjs +159 -0
  309. package/.output/server/chunks/_/useDaqDetailParams-D8d1l3_R.mjs.map +1 -0
  310. package/.output/server/chunks/_/useDaqFilters-TYucwywj.mjs +222 -0
  311. package/.output/server/chunks/_/useDaqFilters-TYucwywj.mjs.map +1 -0
  312. package/.output/server/chunks/_/useDaqNodeWindow-1DWj2H5G.mjs +90 -0
  313. package/.output/server/chunks/_/useDaqNodeWindow-1DWj2H5G.mjs.map +1 -0
  314. package/.output/server/chunks/_/useDaqOptimizations-o5hubsm8.mjs +136 -0
  315. package/.output/server/chunks/_/useDaqOptimizations-o5hubsm8.mjs.map +1 -0
  316. package/.output/server/chunks/_/useDaqStream-BCTOU87S.mjs +395 -0
  317. package/.output/server/chunks/_/useDaqStream-BCTOU87S.mjs.map +1 -0
  318. package/.output/server/chunks/_/useDaqTemplates-Fj64LHfn.mjs +187 -0
  319. package/.output/server/chunks/_/useDaqTemplates-Fj64LHfn.mjs.map +1 -0
  320. package/.output/server/chunks/_/useDashboardCharts-D45083s_.mjs +354 -0
  321. package/.output/server/chunks/_/useDashboardCharts-D45083s_.mjs.map +1 -0
  322. package/.output/server/chunks/_/useDashboardData-Cm_-daeI.mjs +153 -0
  323. package/.output/server/chunks/_/useDashboardData-Cm_-daeI.mjs.map +1 -0
  324. package/.output/server/chunks/_/useDcwAddNode-DaqIQSXN.mjs +219 -0
  325. package/.output/server/chunks/_/useDcwAddNode-DaqIQSXN.mjs.map +1 -0
  326. package/.output/server/chunks/_/useDcwCards-OhzgHbAI.mjs +67 -0
  327. package/.output/server/chunks/_/useDcwCards-OhzgHbAI.mjs.map +1 -0
  328. package/.output/server/chunks/_/useDcwDetailScope-CaWcaiBg.mjs +184 -0
  329. package/.output/server/chunks/_/useDcwDetailScope-CaWcaiBg.mjs.map +1 -0
  330. package/.output/server/chunks/_/useDcwDetailTemplates-CrOgqQMX.mjs +148 -0
  331. package/.output/server/chunks/_/useDcwDetailTemplates-CrOgqQMX.mjs.map +1 -0
  332. package/.output/server/chunks/_/useDcwFilter-RH511Ra2.mjs +71 -0
  333. package/.output/server/chunks/_/useDcwFilter-RH511Ra2.mjs.map +1 -0
  334. package/.output/server/chunks/_/useDcwLedger-Dg61GD1J.mjs +79 -0
  335. package/.output/server/chunks/_/useDcwLedger-Dg61GD1J.mjs.map +1 -0
  336. package/.output/server/chunks/_/useDcwLineMutations-CiurWUFF.mjs +137 -0
  337. package/.output/server/chunks/_/useDcwLineMutations-CiurWUFF.mjs.map +1 -0
  338. package/.output/server/chunks/_/useDcwLineRun-DTSemEZb.mjs +104 -0
  339. package/.output/server/chunks/_/useDcwLineRun-DTSemEZb.mjs.map +1 -0
  340. package/.output/server/chunks/_/useDcwParamApprovals-DpnD-yw0.mjs +121 -0
  341. package/.output/server/chunks/_/useDcwParamApprovals-DpnD-yw0.mjs.map +1 -0
  342. package/.output/server/chunks/_/useDcwProducts-CRAl59cn.mjs +93 -0
  343. package/.output/server/chunks/_/useDcwProducts-CRAl59cn.mjs.map +1 -0
  344. package/.output/server/chunks/_/useDcwQuery-Cyh_iGa9.mjs +98 -0
  345. package/.output/server/chunks/_/useDcwQuery-Cyh_iGa9.mjs.map +1 -0
  346. package/.output/server/chunks/_/useDcwQuickActions-BW5-5HFn.mjs +88 -0
  347. package/.output/server/chunks/_/useDcwQuickActions-BW5-5HFn.mjs.map +1 -0
  348. package/.output/server/chunks/_/useDcwRecipes-Ct9bWJwP.mjs +258 -0
  349. package/.output/server/chunks/_/useDcwRecipes-Ct9bWJwP.mjs.map +1 -0
  350. package/.output/server/chunks/_/useDcwStream-BerzMqxo.mjs +455 -0
  351. package/.output/server/chunks/_/useDcwStream-BerzMqxo.mjs.map +1 -0
  352. package/.output/server/chunks/_/useDcwTemplates-PMVeSLNP.mjs +91 -0
  353. package/.output/server/chunks/_/useDcwTemplates-PMVeSLNP.mjs.map +1 -0
  354. package/.output/server/chunks/_/useDcwWrites-CND_sZdb.mjs +140 -0
  355. package/.output/server/chunks/_/useDcwWrites-CND_sZdb.mjs.map +1 -0
  356. package/.output/server/chunks/_/useDeviceTwins-FB6rTm-6.mjs +128 -0
  357. package/.output/server/chunks/_/useDeviceTwins-FB6rTm-6.mjs.map +1 -0
  358. package/.output/server/chunks/_/useExpConfirmations-b0bE75Yq.mjs +107 -0
  359. package/.output/server/chunks/_/useExpConfirmations-b0bE75Yq.mjs.map +1 -0
  360. package/.output/server/chunks/_/useLocalTime-BJ_4vg1E.mjs +55 -0
  361. package/.output/server/chunks/_/useLocalTime-BJ_4vg1E.mjs.map +1 -0
  362. package/.output/server/chunks/_/useLogsFormat-B-o4MHy7.mjs +77 -0
  363. package/.output/server/chunks/_/useLogsFormat-B-o4MHy7.mjs.map +1 -0
  364. package/.output/server/chunks/_/useLogsManual-Cxka55hz.mjs +89 -0
  365. package/.output/server/chunks/_/useLogsManual-Cxka55hz.mjs.map +1 -0
  366. package/.output/server/chunks/_/useLogsQuery-DxMHc7M4.mjs +150 -0
  367. package/.output/server/chunks/_/useLogsQuery-DxMHc7M4.mjs.map +1 -0
  368. package/.output/server/chunks/_/useLogsScope-HuOiW-OR.mjs +83 -0
  369. package/.output/server/chunks/_/useLogsScope-HuOiW-OR.mjs.map +1 -0
  370. package/.output/server/chunks/_/useMonitorColumns-vVnt3r5Q.mjs +217 -0
  371. package/.output/server/chunks/_/useMonitorColumns-vVnt3r5Q.mjs.map +1 -0
  372. package/.output/server/chunks/_/useMonitorData-Bf3w2khj.mjs +135 -0
  373. package/.output/server/chunks/_/useMonitorData-Bf3w2khj.mjs.map +1 -0
  374. package/.output/server/chunks/_/useMonitorFormat-DsiVqWoa.mjs +91 -0
  375. package/.output/server/chunks/_/useMonitorFormat-DsiVqWoa.mjs.map +1 -0
  376. package/.output/server/chunks/_/useMonitorTerminal-Dj4QwRNW.mjs +71 -0
  377. package/.output/server/chunks/_/useMonitorTerminal-Dj4QwRNW.mjs.map +1 -0
  378. package/.output/server/chunks/_/useOperationsFeed-Bg35fcgt.mjs +195 -0
  379. package/.output/server/chunks/_/useOperationsFeed-Bg35fcgt.mjs.map +1 -0
  380. package/.output/server/chunks/_/useOpsLog-BEzBrMf4.mjs +149 -0
  381. package/.output/server/chunks/_/useOpsLog-BEzBrMf4.mjs.map +1 -0
  382. package/.output/server/chunks/_/useRecipeDispatchApprovals-CZfcMRYk.mjs +156 -0
  383. package/.output/server/chunks/_/useRecipeDispatchApprovals-CZfcMRYk.mjs.map +1 -0
  384. package/.output/server/chunks/_/useResponsive-BKDMGTHs.mjs.map +1 -0
  385. package/.output/server/chunks/_/useTeamActions-CmiuiQiG.mjs +79 -0
  386. package/.output/server/chunks/_/useTeamActions-CmiuiQiG.mjs.map +1 -0
  387. package/.output/server/chunks/_/useTeamAddMemberDialog-CMpzf0jO.mjs +84 -0
  388. package/.output/server/chunks/_/useTeamAddMemberDialog-CMpzf0jO.mjs.map +1 -0
  389. package/.output/server/chunks/_/useTeamCreateDialog-BnvjXWso.mjs +97 -0
  390. package/.output/server/chunks/_/useTeamCreateDialog-BnvjXWso.mjs.map +1 -0
  391. package/.output/server/chunks/_/useTeamDeployDialog-C0FOUYep.mjs +80 -0
  392. package/.output/server/chunks/_/useTeamDeployDialog-C0FOUYep.mjs.map +1 -0
  393. package/.output/server/chunks/_/useTeamDialogState-CFRUQxAf.mjs +82 -0
  394. package/.output/server/chunks/_/useTeamDialogState-CFRUQxAf.mjs.map +1 -0
  395. package/.output/server/chunks/_/useTeamPluginDialog-Do-07a47.mjs +103 -0
  396. package/.output/server/chunks/_/useTeamPluginDialog-Do-07a47.mjs.map +1 -0
  397. package/.output/server/chunks/_/useTeamsCatalog-ClG_gBI8.mjs +123 -0
  398. package/.output/server/chunks/_/useTeamsCatalog-ClG_gBI8.mjs.map +1 -0
  399. package/.output/server/chunks/_/useTokenClipboard-CwQpoFeP.mjs +72 -0
  400. package/.output/server/chunks/_/useTokenClipboard-CwQpoFeP.mjs.map +1 -0
  401. package/.output/server/chunks/_/useTokenCreate-C4g5eKd3.mjs +115 -0
  402. package/.output/server/chunks/_/useTokenCreate-C4g5eKd3.mjs.map +1 -0
  403. package/.output/server/chunks/_/useTokenRename-ClWrxpNk.mjs +87 -0
  404. package/.output/server/chunks/_/useTokenRename-ClWrxpNk.mjs.map +1 -0
  405. package/.output/server/chunks/_/useTokenReveal-C8n1Vt9t.mjs +118 -0
  406. package/.output/server/chunks/_/useTokenReveal-C8n1Vt9t.mjs.map +1 -0
  407. package/.output/server/chunks/_/useTokensList-CgiH2W1C.mjs +92 -0
  408. package/.output/server/chunks/_/useTokensList-CgiH2W1C.mjs.map +1 -0
  409. package/.output/server/chunks/_/useTownBus-D9SoIsAN.mjs.map +1 -0
  410. package/.output/server/chunks/_/useWorkbenchAuth-DSstfK5Z.mjs +141 -0
  411. package/.output/server/chunks/_/useWorkbenchAuth-DSstfK5Z.mjs.map +1 -0
  412. package/.output/server/chunks/_/useWorkbenchWorkspaces-l_0SUOzn.mjs +138 -0
  413. package/.output/server/chunks/_/useWorkbenchWorkspaces-l_0SUOzn.mjs.map +1 -0
  414. package/.output/server/chunks/_/useWorkshopApi-Bqe2FlsB.mjs +127 -0
  415. package/.output/server/chunks/_/useWorkshopApi-Bqe2FlsB.mjs.map +1 -0
  416. package/.output/server/chunks/_/useWorkshopWs-DP4MbZsb.mjs +1659 -0
  417. package/.output/server/chunks/_/useWorkshopWs-DP4MbZsb.mjs.map +1 -0
  418. package/.output/server/chunks/_/useWorkspaceAuth-CzDigJGl.mjs +60 -0
  419. package/.output/server/chunks/_/useWorkspaceAuth-CzDigJGl.mjs.map +1 -0
  420. package/.output/server/chunks/_/useWorkspaceChannels-BLtsS6-m.mjs +92 -0
  421. package/.output/server/chunks/_/useWorkspaceChannels-BLtsS6-m.mjs.map +1 -0
  422. package/.output/server/chunks/_/useWorkspacePanels-CTwREmq0.mjs +78 -0
  423. package/.output/server/chunks/_/useWorkspacePanels-CTwREmq0.mjs.map +1 -0
  424. package/.output/server/chunks/_/useWorkspaceShell-rQHWNNWJ.mjs +168 -0
  425. package/.output/server/chunks/_/useWorkspaceShell-rQHWNNWJ.mjs.map +1 -0
  426. package/.output/server/chunks/_/users-BM1ZzxPp.mjs +569 -0
  427. package/.output/server/chunks/_/users-BM1ZzxPp.mjs.map +1 -0
  428. package/.output/server/chunks/_/workshop-CUXCV3RH.mjs +546 -0
  429. package/.output/server/chunks/_/workshop-CUXCV3RH.mjs.map +1 -0
  430. package/.output/server/chunks/_/workspaces-CmW0cpOt.mjs.map +1 -0
  431. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  432. package/.output/server/chunks/routes/api/system/backup/run.post.mjs +2 -2
  433. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  434. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +1 -1
  435. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +1 -1
  436. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  437. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  438. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +36 -9
  439. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  440. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  441. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
  442. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
  443. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +3 -0
  444. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs.map +1 -1
  445. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  446. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
  447. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
  448. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
  449. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
  450. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
  451. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
  452. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  453. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  454. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  455. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
  456. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
  457. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
  458. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
  459. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
  460. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
  461. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  462. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  463. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  464. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
  465. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
  466. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  467. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  468. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
  469. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +1 -1
  470. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
  471. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
  472. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
  473. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
  474. package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +1 -1
  475. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +1 -1
  476. package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs +1 -1
  477. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
  478. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +6 -0
  479. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs.map +1 -1
  480. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +5 -0
  481. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs.map +1 -1
  482. package/.output/server/chunks/routes/api/workshop/channels/_id/execution-mode.patch.mjs +1 -1
  483. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +5 -2
  484. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs.map +1 -1
  485. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +7 -1
  486. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs.map +1 -1
  487. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
  488. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs +1 -1
  489. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
  490. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +3 -1
  491. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs.map +1 -1
  492. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +8 -6
  493. package/.output/server/chunks/routes/api/workshop/channels.post.mjs.map +1 -1
  494. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  495. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  496. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
  497. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
  498. package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs +29 -49
  499. package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs.map +1 -1
  500. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  501. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  502. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  503. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +6 -1
  504. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs.map +1 -1
  505. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
  506. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +4 -2
  507. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs.map +1 -1
  508. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  509. package/.output/server/chunks/routes/api/workshop/daq/index2.post.mjs +1 -1
  510. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +14 -5
  511. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs.map +1 -1
  512. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  513. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  514. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  515. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +7 -4
  516. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs.map +1 -1
  517. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  518. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  519. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +6 -2
  520. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs.map +1 -1
  521. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +6 -2
  522. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs.map +1 -1
  523. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  524. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  525. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  526. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +6 -1
  527. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs.map +1 -1
  528. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  529. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +7 -4
  530. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs.map +1 -1
  531. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  532. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  533. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  534. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +6 -2
  535. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs.map +1 -1
  536. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  537. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +7 -4
  538. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
  539. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  540. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  541. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
  542. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +7 -3
  543. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs.map +1 -1
  544. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
  545. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  546. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  547. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  548. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  549. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  550. package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs +6 -2
  551. package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs.map +1 -1
  552. package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs +1 -1
  553. package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.mjs +1 -1
  554. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  555. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  556. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +6 -2
  557. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs.map +1 -1
  558. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +4 -2
  559. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs.map +1 -1
  560. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +5 -2
  561. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs.map +1 -1
  562. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
  563. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
  564. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
  565. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  566. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  567. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  568. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  569. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +1 -1
  570. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  571. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +7 -3
  572. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs.map +1 -1
  573. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +8 -1
  574. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs.map +1 -1
  575. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +1 -1
  576. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +6 -2
  577. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs.map +1 -1
  578. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  579. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  580. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  581. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  582. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +7 -4
  583. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs.map +1 -1
  584. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  585. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  586. package/.output/server/chunks/routes/api/workshop/eda/commonality.get.mjs +1 -1
  587. package/.output/server/chunks/routes/api/workshop/eda/index6.get.mjs +1 -1
  588. package/.output/server/chunks/routes/api/workshop/eda/index6.post.mjs +1 -1
  589. package/.output/server/chunks/routes/api/workshop/eda/vm/predict.post.mjs +1 -1
  590. package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +1 -1
  591. package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +1 -1
  592. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
  593. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  594. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  595. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  596. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  597. package/.output/server/chunks/routes/api/workshop/index.mjs +1 -1
  598. package/.output/server/chunks/routes/api/workshop/index.post.mjs +2 -0
  599. package/.output/server/chunks/routes/api/workshop/index.post.mjs.map +1 -1
  600. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  601. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  602. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  603. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  604. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +8 -3
  605. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  606. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  607. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  608. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  609. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  610. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  611. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +18 -6
  612. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  613. package/.output/server/chunks/routes/api/workshop/mes/datasets.get.mjs +1 -1
  614. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/autofix.mjs +1 -1
  615. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs +1 -1
  616. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs +1 -1
  617. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs +1 -1
  618. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs +1 -1
  619. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs +1 -1
  620. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs +1 -1
  621. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/subgraph.mjs +1 -1
  622. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs +1 -1
  623. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs +1 -1
  624. package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs +1 -1
  625. package/.output/server/chunks/routes/api/workshop/ontology/index.mjs +1 -1
  626. package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs +1 -1
  627. package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs +1 -1
  628. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs +1 -1
  629. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs +1 -1
  630. package/.output/server/chunks/routes/api/workshop/optimization/capabilities.get.mjs +1 -1
  631. package/.output/server/chunks/routes/api/workshop/optimization/index.get.mjs +1 -1
  632. package/.output/server/chunks/routes/api/workshop/optimization/index.mjs +1 -1
  633. package/.output/server/chunks/routes/api/workshop/optimization/index2.mjs +1 -1
  634. package/.output/server/chunks/routes/api/workshop/optimization/profiles/_id/publish.post.mjs +1 -1
  635. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/crosscheck.post.mjs +1 -1
  636. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/dispatch.post.mjs +1 -1
  637. package/.output/server/chunks/routes/api/workshop/optimization/solve.post.mjs +1 -1
  638. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  639. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  640. package/.output/server/chunks/routes/api/workshop/process-model/datasets.post.mjs +1 -1
  641. package/.output/server/chunks/routes/api/workshop/process-model/eligibility.mjs +1 -1
  642. package/.output/server/chunks/routes/api/workshop/process-model/experiments.mjs +1 -1
  643. package/.output/server/chunks/routes/api/workshop/process-model/index.mjs +1 -1
  644. package/.output/server/chunks/routes/api/workshop/process-model/specs/_id/publish.post.mjs +1 -1
  645. package/.output/server/chunks/routes/api/workshop/process-model/train.post.mjs +1 -1
  646. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  647. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  648. package/.output/server/chunks/routes/api/workshop/tools/sync.post.mjs +1 -1
  649. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
  650. package/.output/server/chunks/routes/renderer.mjs +2 -2
  651. package/.output/server/chunks/routes/renderer.mjs.map +1 -1
  652. package/.output/server/chunks/virtual/entry.mjs +395 -377
  653. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  654. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  655. package/.output/server/chunks/virtual/precomputed.mjs.map +1 -1
  656. package/.output/server/index.mjs +1 -1
  657. package/.output/server/package.json +1 -1
  658. package/README-zh.md +5 -2
  659. package/README.md +14 -2
  660. package/app/components/AwLogo.vue +75 -75
  661. package/app/components/aml/AmlDatasetFormModal.vue +279 -279
  662. package/app/components/aml/AmlDatasetTable.vue +319 -319
  663. package/app/components/aml/AmlExperimentsTable.vue +142 -142
  664. package/app/components/aml/AmlInfraBanner.vue +23 -23
  665. package/app/components/aml/AmlJobsTable.vue +248 -248
  666. package/app/components/aml/AmlOverviewBar.vue +62 -62
  667. package/app/components/aml/AmlPageHeader.vue +47 -47
  668. package/app/components/aml/AmlPredictConsole.vue +201 -201
  669. package/app/components/app-header/HitlBell.vue +423 -423
  670. package/app/components/daq/DaqAddNodeModal.vue +209 -209
  671. package/app/components/daq/DaqAlarmBar.vue +46 -46
  672. package/app/components/daq/DaqControlCard.vue +159 -159
  673. package/app/components/daq/DaqInfraBanner.vue +31 -31
  674. package/app/components/daq/DaqLineBanner.vue +47 -47
  675. package/app/components/daq/DaqNodePanel.vue +396 -396
  676. package/app/components/daq/DaqOptPanel.vue +197 -197
  677. package/app/components/daq/DaqTemplateModal.vue +246 -246
  678. package/app/components/dashboard/DashboardGaugeBand.vue +78 -78
  679. package/app/components/dashboard/DashboardHero.vue +209 -209
  680. package/app/components/dashboard/DashboardLineStatePanel.vue +78 -78
  681. package/app/components/dashboard/DashboardNodeStatePanel.vue +46 -46
  682. package/app/components/dashboard/DashboardPipelinePanel.vue +46 -46
  683. package/app/components/dashboard/DashboardTrendPanel.vue +83 -83
  684. package/app/components/dashboard/DashboardWritePanel.vue +52 -52
  685. package/app/components/dcw/DcwCreateLineModal.vue +105 -105
  686. package/app/components/dcw/DcwDeleteLineModal.vue +73 -73
  687. package/app/components/dcw/DcwDetailTemplateModal.vue +238 -238
  688. package/app/components/dcw/DcwLedgerCard.vue +160 -160
  689. package/app/components/dcw/DcwMesArtifacts.vue +140 -140
  690. package/app/components/dcw/DcwProductCreateModal.vue +113 -113
  691. package/app/components/dcw/DcwRecipeDispatchHistoryModal.vue +244 -244
  692. package/app/components/dcw/DcwRecipeEditModal.vue +399 -399
  693. package/app/components/dcw/DcwRecipeHistoryModal.vue +165 -165
  694. package/app/components/dcw/DcwRunDataModal.vue +191 -191
  695. package/app/components/dcw/DcwTemplateModal.vue +227 -227
  696. package/app/components/dcw/DcwWriteHistoryCard.vue +96 -96
  697. package/app/components/dcw/ExpConfirmCard.vue +103 -103
  698. package/app/components/dcw/RecipeDispatchApprovalCard.vue +330 -330
  699. package/app/components/logs/LogsEventTable.vue +36 -3
  700. package/app/components/logs/LogsManualModal.vue +23 -1
  701. package/app/components/logs/LogsPageHead.vue +122 -71
  702. package/app/components/monitor/MonitorAgentTable.vue +143 -143
  703. package/app/components/monitor/MonitorChannelTable.vue +80 -80
  704. package/app/components/monitor/MonitorLoginGate.vue +24 -24
  705. package/app/components/monitor/MonitorPageHead.vue +92 -92
  706. package/app/components/monitor/MonitorProcessTable.vue +159 -159
  707. package/app/components/ontology/OntologyGraph.vue +356 -356
  708. package/app/components/operations/OperationsFilterCard.vue +164 -164
  709. package/app/components/operations/OperationsPageHead.vue +47 -47
  710. package/app/components/tokens/TokenCreateModal.vue +42 -42
  711. package/app/components/tokens/TokenOnceModal.vue +164 -164
  712. package/app/components/tokens/TokenRenameModal.vue +40 -40
  713. package/app/components/tokens/TokensPageHead.vue +76 -76
  714. package/app/components/workshop/A2aRpcDebugger.vue +237 -237
  715. package/app/components/workshop/AgentInspectorDrawer.vue +424 -424
  716. package/app/components/workshop/AgentLanesView.vue +278 -278
  717. package/app/components/workshop/ArtifactCard.vue +120 -120
  718. package/app/components/workshop/AssetLibrary.vue +452 -452
  719. package/app/components/workshop/ChatMemberPanel.vue +556 -556
  720. package/app/components/workshop/CommandPalette.vue +270 -270
  721. package/app/components/workshop/Composer.vue +540 -540
  722. package/app/components/workshop/DaqTemplateIcon.vue +33 -33
  723. package/app/components/workshop/DeviceTwinPanel.vue +167 -167
  724. package/app/components/workshop/FileSelectorModal.vue +188 -188
  725. package/app/components/workshop/InspectorPanel.vue +301 -301
  726. package/app/components/workshop/PluginSlot.vue +120 -120
  727. package/app/components/workshop/TranscriptTimeline.vue +223 -223
  728. package/app/components/workshop/agents/AgentTemplateEditModal.vue +139 -139
  729. package/app/components/workshop/blocks/ClusterArtifact.vue +61 -61
  730. package/app/components/workshop/blocks/ClusterError.vue +85 -85
  731. package/app/components/workshop/blocks/ClusterLife.vue +87 -87
  732. package/app/components/workshop/blocks/ClusterMember.vue +95 -95
  733. package/app/components/workshop/blocks/ClusterMemory.vue +84 -84
  734. package/app/components/workshop/blocks/ClusterOther.vue +67 -67
  735. package/app/components/workshop/blocks/ClusterStatus.vue +149 -149
  736. package/app/components/workshop/blocks/ClusterTool.vue +176 -176
  737. package/app/components/workshop/blocks/EventBlockAvatar.vue +114 -114
  738. package/app/components/workshop/blocks/EventBlockHead.vue +232 -232
  739. package/app/components/workshop/composer/ComposerToolbar.vue +278 -278
  740. package/app/components/workshop/composer/MentionMenu.vue +135 -135
  741. package/app/components/workshop/composer/ReplyChip.vue +65 -65
  742. package/app/components/workshop/composer/StatusChip.vue +171 -171
  743. package/app/components/workshop/console/Dock.vue +71 -71
  744. package/app/components/workshop/console/LeftPane.vue +84 -84
  745. package/app/components/workshop/device-twin/DeviceTwinCard.vue +265 -265
  746. package/app/components/workshop/device-twin/DeviceTwinDcwSection.vue +203 -203
  747. package/app/components/workshop/lanes/AddMemberModal.vue +270 -270
  748. package/app/components/workshop/lanes/EditMemberModal.vue +106 -106
  749. package/app/components/workshop/lanes/LanesToolbar.vue +97 -97
  750. package/app/components/workshop/session-list/MountChannelModal.vue +124 -124
  751. package/app/components/workshop/session-list/SaveTemplateModal.vue +93 -93
  752. package/app/components/workshop/task-board/Card.vue +172 -172
  753. package/app/components/workshop/task-board/Column.vue +151 -151
  754. package/app/components/workshop/task-board/List.vue +157 -157
  755. package/app/components/workshop/task-board/StatusMenu.vue +88 -88
  756. package/app/components/workshop/teams/TeamAddMemberModal.vue +53 -53
  757. package/app/components/workshop/teams/TeamCreateModal.vue +94 -94
  758. package/app/components/workshop/teams/TeamDeployModal.vue +40 -40
  759. package/app/components/workshop/teams/TeamPluginModal.vue +119 -119
  760. package/app/components/workshop/terminal/OmpTerminalPanel.vue +270 -270
  761. package/app/components/workshop/terminal/TerminalHitlCard.vue +170 -170
  762. package/app/components/workshop/town/TownScene.ts +466 -466
  763. package/app/components/workshop/town/TownView.vue +561 -561
  764. package/app/components/workshop/town/components/AutoModeConfirmModal.vue +94 -94
  765. package/app/components/workshop/town/components/TownAgentBindings.vue +417 -405
  766. package/app/components/workshop/town/components/TownAgentInspector.vue +554 -554
  767. package/app/components/workshop/town/components/TownAlarmList.vue +147 -147
  768. package/app/components/workshop/town/components/TownBoundaryPanel.vue +350 -350
  769. package/app/components/workshop/town/components/TownCalloutLayer.vue +147 -147
  770. package/app/components/workshop/town/components/TownChannelDock.vue +116 -116
  771. package/app/components/workshop/town/components/TownControlDock.vue +405 -405
  772. package/app/components/workshop/town/components/TownDaqNodeInspector.vue +345 -345
  773. package/app/components/workshop/town/components/TownDaqTree.vue +366 -366
  774. package/app/components/workshop/town/components/TownDcwBindSection.vue +473 -473
  775. package/app/components/workshop/town/components/TownDcwNodeInspector.vue +185 -185
  776. package/app/components/workshop/town/components/TownDcwTree.vue +280 -280
  777. package/app/components/workshop/town/components/TownDeviceBindings.vue +394 -394
  778. package/app/components/workshop/town/components/TownDeviceTransform.vue +248 -248
  779. package/app/components/workshop/town/components/TownEventList.vue +120 -120
  780. package/app/components/workshop/town/components/TownHealthBody.vue +100 -100
  781. package/app/components/workshop/town/components/TownKpiStrip.vue +207 -207
  782. package/app/components/workshop/town/components/TownLeftRail.vue +308 -308
  783. package/app/components/workshop/town/components/TownLoadingMask.vue +61 -61
  784. package/app/components/workshop/town/components/TownNavMap.vue +154 -154
  785. package/app/components/workshop/town/components/TownRightRail.vue +543 -543
  786. package/app/components/workshop/town/components/TownStage.vue +281 -281
  787. package/app/components/workshop/town/components/TownStageTop.vue +238 -238
  788. package/app/components/workshop/town/components/TownStatusBar.vue +108 -108
  789. package/app/components/workshop/town/components/TownTopNav.vue +367 -367
  790. package/app/components/workshop/town/components/TownTrendDock.vue +178 -178
  791. package/app/components/workshop/town/scene/town-scene-agents.ts +254 -254
  792. package/app/components/workshop/town/scene/town-scene-behavior.ts +194 -194
  793. package/app/components/workshop/town/scene/town-scene-bubbles.ts +96 -96
  794. package/app/components/workshop/town/scene/town-scene-core.ts +158 -158
  795. package/app/components/workshop/town/scene/town-scene-models.ts +109 -109
  796. package/app/components/workshop/town/scene/town-scene-visuals.ts +279 -279
  797. package/app/components/workshop/town/scene/town-scene3d-agents.ts +308 -308
  798. package/app/components/workshop/town/scene/town-scene3d-blocks.ts +297 -297
  799. package/app/components/workshop/town/scene/town-scene3d-bubbles.ts +281 -281
  800. package/app/components/workshop/town/scene/town-scene3d-camera.ts +282 -282
  801. package/app/components/workshop/town/scene/town-scene3d-devices.ts +433 -433
  802. package/app/components/workshop/town/scene/town-scene3d-editing.ts +490 -490
  803. package/app/components/workshop/town/scene/town-scene3d-events.ts +173 -173
  804. package/app/components/workshop/town/scene/town-scene3d-factory.ts +412 -412
  805. package/app/components/workshop/town/scene/town-scene3d-hud.ts +110 -110
  806. package/app/components/workshop/town/scene/town-scene3d-lifecycle.ts +144 -144
  807. package/app/components/workshop/town/scene/town-scene3d-links.ts +141 -141
  808. package/app/components/workshop/town/scene/town-scene3d-loop.ts +286 -286
  809. package/app/components/workshop/town/scene/town-scene3d-models.ts +154 -154
  810. package/app/components/workshop/town/scene/town-scene3d-nodes.ts +562 -562
  811. package/app/components/workshop/town/scene/town-scene3d-ranges.ts +273 -273
  812. package/app/components/workshop/town/scene/town-scene3d-renderer.ts +320 -320
  813. package/app/components/workshop/town/scene/town-scene3d-selection.ts +257 -257
  814. package/app/components/workshop/town/scene/town-scene3d-types.ts +264 -264
  815. package/app/components/workshop/transcript/TranscriptBlockList.vue +68 -68
  816. package/app/components/workshop/transcript/TranscriptEarlierPager.vue +81 -81
  817. package/app/components/workshop/transcript/TranscriptFilterBar.vue +126 -126
  818. package/app/components/workshop/workbench/CreateWorkspaceModal.vue +36 -36
  819. package/app/components/workshop/workbench/WorkspaceEmpty.vue +56 -56
  820. package/app/composables/useResponsive.ts +88 -88
  821. package/app/composables/workshop/device-twin-types.ts +29 -29
  822. package/app/composables/workshop/event-blocks/attention.ts +58 -58
  823. package/app/composables/workshop/event-blocks/classify.ts +44 -44
  824. package/app/composables/workshop/event-blocks/clusterer.ts +231 -231
  825. package/app/composables/workshop/event-blocks/fold-stream.ts +45 -45
  826. package/app/composables/workshop/event-blocks/markdown.ts +81 -81
  827. package/app/composables/workshop/event-blocks/mentions.ts +49 -49
  828. package/app/composables/workshop/event-blocks/text-utils.ts +100 -100
  829. package/app/composables/workshop/event-blocks/types.ts +40 -40
  830. package/app/composables/workshop/town/town-relay-props.ts +231 -231
  831. package/app/composables/workshop/town/town-view-types.ts +145 -145
  832. package/app/composables/workshop/town/useTownAgentBindings.ts +183 -182
  833. package/app/composables/workshop/town/useTownAgentChat.ts +203 -203
  834. package/app/composables/workshop/town/useTownAlarms.ts +36 -36
  835. package/app/composables/workshop/town/useTownCallouts.ts +174 -174
  836. package/app/composables/workshop/town/useTownChannels.ts +220 -220
  837. package/app/composables/workshop/town/useTownHealth.ts +66 -66
  838. package/app/composables/workshop/town/useTownHudTickers.ts +77 -77
  839. package/app/composables/workshop/town/useTownLayout.ts +277 -277
  840. package/app/composables/workshop/town/useTownNavMap.ts +301 -301
  841. package/app/composables/workshop/town/useTownNodeBindings.ts +345 -345
  842. package/app/composables/workshop/town/useTownPanelDrag.ts +91 -91
  843. package/app/composables/workshop/town/useTownRailData.ts +421 -421
  844. package/app/composables/workshop/town/useTownSceneControl.ts +92 -92
  845. package/app/composables/workshop/town/useTownSceneInput.ts +275 -275
  846. package/app/composables/workshop/town/useTownSceneRuntime.ts +390 -390
  847. package/app/composables/workshop/town/useTownSheets.ts +41 -41
  848. package/app/composables/workshop/town/useTownTrends.ts +93 -93
  849. package/app/composables/workshop/useChannelList.ts +88 -88
  850. package/app/composables/workshop/useChannelTerminals.ts +65 -65
  851. package/app/composables/workshop/useComposerMentions.ts +130 -130
  852. package/app/composables/workshop/useDcwStream.ts +377 -374
  853. package/app/composables/workshop/useDeviceTwinDcwWrite.ts +77 -77
  854. package/app/composables/workshop/useDeviceTwinPanel.ts +56 -56
  855. package/app/composables/workshop/useEscClose.ts +44 -44
  856. package/app/composables/workshop/useEventBlockView.ts +159 -159
  857. package/app/composables/workshop/useEventBlocks.ts +33 -33
  858. package/app/composables/workshop/useHitlAnswer.ts +184 -184
  859. package/app/composables/workshop/useLaneWidths.ts +27 -27
  860. package/app/composables/workshop/useOmpTerminalSession.ts +424 -424
  861. package/app/composables/workshop/useOpsLog.ts +1 -1
  862. package/app/composables/workshop/usePluginAdmin.ts +152 -152
  863. package/app/composables/workshop/usePluginPanels.ts +72 -72
  864. package/app/composables/workshop/useRuntimeConfigDraft.ts +118 -118
  865. package/app/composables/workshop/useSettingsGroups.ts +243 -243
  866. package/app/composables/workshop/useTaskBoardColumns.ts +47 -47
  867. package/app/composables/workshop/useTerminalRenderer.ts +308 -308
  868. package/app/composables/workshop/useTranscriptEnterStage.ts +48 -48
  869. package/app/composables/workshop/useTranscriptHistory.ts +52 -52
  870. package/app/composables/workshop/useTranscriptScroll.ts +113 -113
  871. package/app/composables/workshop/useVisibleInterval.ts +42 -42
  872. package/app/composables/workshop/useWorkshopWs.ts +265 -265
  873. package/app/config/index.ts +1 -1
  874. package/app/middleware/locale-cookie.global.ts +22 -22
  875. package/app/pages/aml/api.ts +6 -6
  876. package/app/pages/aml/composables/useAmlDatasets.ts +38 -38
  877. package/app/pages/aml/composables/useAmlEntities.ts +57 -57
  878. package/app/pages/aml/composables/useAmlEnv.ts +191 -191
  879. package/app/pages/aml/composables/useAmlExperiments.ts +45 -45
  880. package/app/pages/aml/composables/useAmlFormat.ts +44 -44
  881. package/app/pages/aml/composables/useAmlJobs.ts +131 -131
  882. package/app/pages/aml/composables/useAmlModels.ts +56 -56
  883. package/app/pages/aml/composables/useAmlNotes.ts +47 -47
  884. package/app/pages/aml/composables/useAmlPredict.ts +93 -93
  885. package/app/pages/aml/constants.ts +63 -63
  886. package/app/pages/aml/index.vue +236 -236
  887. package/app/pages/composables/useDashboardCharts.ts +192 -192
  888. package/app/pages/composables/useDashboardData.ts +144 -144
  889. package/app/pages/daq/composables/useDaqAddNode.ts +126 -126
  890. package/app/pages/daq/composables/useDaqDetailBinding.ts +29 -29
  891. package/app/pages/daq/composables/useDaqDetailFrames.ts +42 -42
  892. package/app/pages/daq/composables/useDaqDetailNode.ts +53 -53
  893. package/app/pages/daq/composables/useDaqDetailParams.ts +138 -138
  894. package/app/pages/daq/composables/useDaqFilters.ts +187 -187
  895. package/app/pages/daq/composables/useDaqNodeWindow.ts +86 -86
  896. package/app/pages/daq/composables/useDaqOptimizations.ts +99 -99
  897. package/app/pages/daq/composables/useDaqTemplates.ts +152 -152
  898. package/app/pages/daq/index.vue +260 -260
  899. package/app/pages/dcw/composables/useDcwCards.ts +27 -27
  900. package/app/pages/dcw/composables/useDcwDetailScope.ts +145 -145
  901. package/app/pages/dcw/composables/useDcwDetailTemplates.ts +94 -94
  902. package/app/pages/dcw/composables/useDcwFilter.ts +29 -29
  903. package/app/pages/dcw/composables/useDcwLedger.ts +34 -34
  904. package/app/pages/dcw/composables/useDcwLineMutations.ts +115 -115
  905. package/app/pages/dcw/composables/useDcwLineRun.ts +60 -60
  906. package/app/pages/dcw/composables/useDcwProducts.ts +54 -54
  907. package/app/pages/dcw/composables/useDcwQuery.ts +68 -68
  908. package/app/pages/dcw/composables/useDcwQuickActions.ts +47 -47
  909. package/app/pages/dcw/composables/useDcwRecipes.ts +256 -256
  910. package/app/pages/dcw/composables/useDcwTemplates.ts +50 -50
  911. package/app/pages/dcw/index.vue +195 -195
  912. package/app/pages/dcw/types.ts +9 -9
  913. package/app/pages/index.vue +126 -126
  914. package/app/pages/logs/composables/useLogsFormat.ts +43 -43
  915. package/app/pages/logs/composables/useLogsManual.ts +3 -0
  916. package/app/pages/logs/composables/useLogsScope.ts +39 -39
  917. package/app/pages/logs/index.vue +34 -1
  918. package/app/pages/monitor/types.ts +61 -61
  919. package/app/pages/operations.vue +61 -61
  920. package/app/pages/permissions/index.vue +369 -369
  921. package/app/pages/tokens/composables/useTokenClipboard.ts +33 -33
  922. package/app/pages/tokens/composables/useTokenCreate.ts +93 -93
  923. package/app/pages/tokens/composables/useTokenRename.ts +54 -54
  924. package/app/pages/tokens/composables/useTokenReveal.ts +84 -84
  925. package/app/pages/tokens/composables/useTokensList.ts +60 -60
  926. package/app/pages/tokens.vue +111 -111
  927. package/app/pages/tools/index.vue +98 -98
  928. package/app/pages/workshop/agents.vue +130 -130
  929. package/app/pages/workshop/composables/useAgentHarnessOptions.ts +59 -59
  930. package/app/pages/workshop/composables/useAgentTemplateActions.ts +42 -42
  931. package/app/pages/workshop/composables/useAgentTemplateDialogState.ts +24 -24
  932. package/app/pages/workshop/composables/useAgentTemplateForm.ts +88 -88
  933. package/app/pages/workshop/composables/useAgentTemplatesCatalog.ts +92 -92
  934. package/app/pages/workshop/composables/useTeamActions.ts +44 -44
  935. package/app/pages/workshop/composables/useTeamAddMemberDialog.ts +49 -49
  936. package/app/pages/workshop/composables/useTeamCreateDialog.ts +67 -67
  937. package/app/pages/workshop/composables/useTeamDeployDialog.ts +49 -49
  938. package/app/pages/workshop/composables/useTeamDialogState.ts +46 -46
  939. package/app/pages/workshop/composables/useTeamPluginDialog.ts +72 -72
  940. package/app/pages/workshop/composables/useTeamsCatalog.ts +100 -100
  941. package/app/pages/workshop/composables/useWorkbenchWorkspaces.ts +123 -123
  942. package/app/pages/workshop/composables/useWorkspaceAuth.ts +31 -31
  943. package/app/pages/workshop/composables/useWorkspaceChannels.ts +62 -62
  944. package/app/pages/workshop/composables/useWorkspaceShell.ts +136 -136
  945. package/app/pages/workshop/schedules.vue +553 -553
  946. package/app/pages/workshop/w/[wsId].vue +221 -221
  947. package/app/plugins/aw-plugins.client.ts +213 -213
  948. package/app/plugins/esc-close.client.ts +31 -31
  949. package/app/stores/workshop/hitl.ts +183 -183
  950. package/app/stores/workshop/narrow-fetch.ts +23 -23
  951. package/app/utils/api-error.ts +75 -75
  952. package/app/utils/builtin-catalog.ts +104 -104
  953. package/app/utils/chart-trend.ts +97 -97
  954. package/app/utils/dcw-driver-badge.ts +16 -16
  955. package/app/utils/dcw-recipe-form.ts +26 -26
  956. package/cli/commands/tui.mjs +28 -28
  957. package/cli/commands/update.mjs +124 -124
  958. package/cli/core/child-lifecycle.mjs +136 -136
  959. package/cli/core/meta.mjs +38 -38
  960. package/cli/core/post-build.mjs +96 -96
  961. package/config.yml +1 -1
  962. package/docker-compose.yml +4 -2
  963. package/docs/cli.en.md +2 -2
  964. package/docs/cli.md +2 -2
  965. package/docs/mcp.en.md +27 -27
  966. package/docs/multi-harness-architecture.md +248 -248
  967. package/docs/plugins.en.md +1 -1
  968. package/docs/plugins.md +1 -1
  969. package/docs/sdk.en.md +1 -1
  970. package/docs/sdk.md +1 -1
  971. package/docs/tui.md +43 -43
  972. package/i18n/dicts/_en.json +1551 -1551
  973. package/i18n/dicts/_en2.json +300 -300
  974. package/i18n/dicts/_en4.json +114 -114
  975. package/i18n/dicts/agentLanesView.json +61 -61
  976. package/i18n/dicts/appHeader.json +17 -17
  977. package/i18n/dicts/channelSessionList.json +51 -51
  978. package/i18n/dicts/chat.json +79 -79
  979. package/i18n/dicts/clusterTool.json +4 -4
  980. package/i18n/dicts/composer.json +38 -38
  981. package/i18n/dicts/ctpl.json +37 -37
  982. package/i18n/dicts/dcwDetail.json +219 -219
  983. package/i18n/dicts/lineOps.json +14 -14
  984. package/i18n/dicts/multiChannelView.json +13 -13
  985. package/i18n/dicts/notifications.json +13 -13
  986. package/i18n/dicts/taskInspectorDrawer.json +25 -25
  987. package/i18n/dicts/teamPlugins.json +10 -10
  988. package/i18n/dicts/townView.json +211 -209
  989. package/i18n/locales/en.ts +9 -0
  990. package/i18n/locales/zh-CN.ts +9 -0
  991. package/mcp/discovery.mjs +227 -227
  992. package/package.json +3 -1
  993. package/public/favicon.svg +14 -14
  994. package/public/robots.txt +3 -3
  995. package/scripts/_audit/_live-mqtt-e2e-20261028.mjs +219 -0
  996. package/scripts/_audit/audit-harness-adapters.md +664 -664
  997. package/scripts/_audit/aw-mcp-live-e2e.mjs +293 -293
  998. package/scripts/_audit/bump-version.mjs +51 -51
  999. package/scripts/_audit/detached-instance.mjs +112 -112
  1000. package/scripts/_audit/detached-start.mjs +103 -103
  1001. package/scripts/_audit/eda-ui-fix-acceptance.mjs +212 -212
  1002. package/scripts/_audit/guard-upstream-liveness.mjs +104 -104
  1003. package/scripts/_audit/http-api-authz-audit.md +657 -657
  1004. package/scripts/_audit/kb-team-mock-e2e.mjs +146 -146
  1005. package/scripts/_audit/kb-team-omp-e2e.mjs +229 -229
  1006. package/scripts/_audit/prompt-injection-probe.mts +76 -0
  1007. package/scripts/_audit/run.mjs +21 -21
  1008. package/scripts/_audit/runtime-audit.md +716 -716
  1009. package/scripts/_audit/skills-guided-e2e.mjs +316 -316
  1010. package/scripts/_audit/stability-soak.mjs +252 -252
  1011. package/scripts/_audit/stubs/nuxt-imports.mjs +67 -67
  1012. package/scripts/_audit/ts-register-hook.mjs +12 -12
  1013. package/scripts/_audit/ts-resolve-hook.mjs +96 -96
  1014. package/scripts/_aw0746-stage12.mjs +94 -94
  1015. package/scripts/_aw0746-stage34.mjs +136 -136
  1016. package/scripts/_aw0746-stage6b-train-sweep.mjs +145 -145
  1017. package/scripts/_aw0746-stage6c-jobsmoke.mjs +69 -69
  1018. package/scripts/_dbg-configroot-audit.mjs +86 -86
  1019. package/scripts/_dbg-daq-intervals-func.mjs +115 -115
  1020. package/scripts/_dbg-perms-e2e.mjs +142 -142
  1021. package/scripts/_dbg-protocol-matrix.mjs +462 -462
  1022. package/scripts/_dbg-render-regression.mjs +193 -193
  1023. package/scripts/_dbg-schedule-e2e.mjs +262 -262
  1024. package/scripts/_e2e-ui-functional.mjs +371 -371
  1025. package/scripts/_lib-aml-python-run.mjs +17 -17
  1026. package/scripts/_plc-sim-detached.cjs +22 -22
  1027. package/scripts/_provision-injection-line.mjs +39 -39
  1028. package/scripts/_run-matrix.ps1 +53 -53
  1029. package/scripts/_sweep-button-contrast.mjs +87 -87
  1030. package/scripts/acceptance-aml-hybrid-e2e.ts +396 -396
  1031. package/scripts/acceptance-aml-hybrid-live.mjs +93 -93
  1032. package/scripts/acceptance-aml-model-identity.ts +137 -137
  1033. package/scripts/agent-daq-isolation-e2e.mjs +91 -91
  1034. package/scripts/api-contract-smoke.mjs +126 -126
  1035. package/scripts/api-live-e2e.mjs +9 -3
  1036. package/scripts/ask-hitl-e2e.mjs +96 -96
  1037. package/scripts/aw-expose.mjs +159 -159
  1038. package/scripts/channel-interaction-smoke.mjs +80 -80
  1039. package/scripts/data-studio-ui-e2e.mjs +163 -163
  1040. package/scripts/demo-group-chat-all-real.ts +279 -279
  1041. package/scripts/dev-modbus-simulator.mjs +55 -55
  1042. package/scripts/docs-shots.mjs +36 -36
  1043. package/scripts/e2e-agentteam-chat.mjs +473 -473
  1044. package/scripts/e2e-agentteam-real-triage.mjs +421 -421
  1045. package/scripts/e2e-aml-decoupled.mjs +162 -162
  1046. package/scripts/e2e-analysis-ledger.mjs +202 -0
  1047. package/scripts/e2e-aw-tui-global.mjs +277 -277
  1048. package/scripts/e2e-binding-modes-real.mjs +442 -0
  1049. package/scripts/e2e-business-loop-real.mjs +391 -0
  1050. package/scripts/e2e-closedloop/cleanup.mjs +27 -27
  1051. package/scripts/e2e-closedloop/lib.mjs +109 -109
  1052. package/scripts/e2e-closedloop/main.mjs +59 -59
  1053. package/scripts/e2e-closedloop/scenarios-accounts.mjs +210 -210
  1054. package/scripts/e2e-closedloop/scenarios-authz.mjs +196 -196
  1055. package/scripts/e2e-closedloop/scenarios-daq-dcw.mjs +222 -222
  1056. package/scripts/e2e-closedloop/scenarios-plugins.mjs +169 -169
  1057. package/scripts/e2e-closedloop/state.mjs +10 -10
  1058. package/scripts/e2e-config-groups.mjs +238 -238
  1059. package/scripts/e2e-core-bridges-matrix.mjs +303 -0
  1060. package/scripts/e2e-crash-cycle.mjs +108 -108
  1061. package/scripts/e2e-error-handling.mjs +190 -0
  1062. package/scripts/e2e-full-closedloop.mjs +16 -16
  1063. package/scripts/e2e-golive-matrix.mjs +515 -0
  1064. package/scripts/e2e-hil-multi-user.mjs +307 -307
  1065. package/scripts/e2e-hil-restart.mjs +339 -339
  1066. package/scripts/e2e-line-governance.mjs +352 -352
  1067. package/scripts/e2e-mes-mirror-real.mjs +418 -0
  1068. package/scripts/e2e-multiexpert-remediation-real.mjs +453 -0
  1069. package/scripts/e2e-node-binding-3mode-real.mjs +792 -0
  1070. package/scripts/e2e-node-binding-authz.mjs +372 -0
  1071. package/scripts/e2e-ontology.mjs +393 -393
  1072. package/scripts/e2e-optimizer-live.mjs +4 -0
  1073. package/scripts/e2e-physical-effect-real.mjs +570 -0
  1074. package/scripts/e2e-plc-plugin-closedloop.mjs +549 -549
  1075. package/scripts/full-stack-shots.mjs +145 -145
  1076. package/scripts/full-tool-injection-harness-e2e.mjs +214 -214
  1077. package/scripts/hitl-reject-e2e.mjs +131 -131
  1078. package/scripts/line-log-smoke.mjs +260 -260
  1079. package/scripts/live-aml-mockomp.mjs +304 -304
  1080. package/scripts/live-aml-optloop-resume.mjs +322 -322
  1081. package/scripts/live-aml-optloop.mjs +588 -588
  1082. package/scripts/live-aml-stage9.mjs +169 -169
  1083. package/scripts/live-aml-two-goals.mjs +315 -315
  1084. package/scripts/live-demo-seed.mjs +157 -0
  1085. package/scripts/live-optloop-two-modes.mjs +857 -857
  1086. package/scripts/mes-agent-integration-e2e.mjs +361 -361
  1087. package/scripts/ops-plugins-e2e.mjs +85 -85
  1088. package/scripts/scenario-suite-setup.mjs +337 -337
  1089. package/scripts/scenario-suite-stability.mjs +144 -144
  1090. package/scripts/security-acceptance.mjs +218 -0
  1091. package/scripts/team-coordination-e2e.mjs +96 -96
  1092. package/scripts/test-agentteam-workflow.ts +472 -472
  1093. package/scripts/test-aw-skills.mjs +102 -102
  1094. package/scripts/test-daq-frame-race.mjs +358 -358
  1095. package/scripts/test-data-root.mjs +208 -208
  1096. package/scripts/test-events-index.mjs +176 -176
  1097. package/scripts/test-group-chat-unit/lib.ts +186 -186
  1098. package/scripts/test-group-chat-unit/main.ts +45 -45
  1099. package/scripts/test-group-chat-unit.ts +35 -35
  1100. package/scripts/test-hitl-decision.ts +526 -526
  1101. package/scripts/test-hitl-registry.ts +112 -112
  1102. package/scripts/test-log-flooding.mjs +160 -160
  1103. package/scripts/test-lru.mjs +101 -101
  1104. package/scripts/test-plugin-hardening.mjs +90 -90
  1105. package/scripts/test-plugin-lifecycle.mjs +173 -173
  1106. package/scripts/test-rollback-index.mjs +137 -137
  1107. package/scripts/test-schedule-runtime.ts +309 -309
  1108. package/scripts/test-sdk-surface.mjs +158 -158
  1109. package/scripts/test-serial-bridge.mjs +418 -418
  1110. package/scripts/test-tui-commands.mjs +148 -148
  1111. package/scripts/test-tui-reducers.mjs +72 -72
  1112. package/scripts/three-system-e2e/lib.mjs +79 -79
  1113. package/scripts/three-system-e2e/main.mjs +40 -40
  1114. package/scripts/three-system-e2e/phases/phase-0-user-token.mjs +42 -42
  1115. package/scripts/three-system-e2e/phases/phase-0a2-line-autoselect.mjs +35 -35
  1116. package/scripts/three-system-e2e/phases/phase-0b-fixture-grants.mjs +39 -39
  1117. package/scripts/three-system-e2e/phases/phase-0c-plugin-outbound-auth.mjs +95 -95
  1118. package/scripts/three-system-e2e/phases/stage-1-health.mjs +47 -47
  1119. package/scripts/three-system-e2e/phases/stage-2-5-team-plugins.mjs +84 -84
  1120. package/scripts/three-system-e2e/phases/stage-2-teams-tools-hitl.mjs +184 -184
  1121. package/scripts/three-system-e2e/phases/stage-3-diag.mjs +73 -73
  1122. package/scripts/three-system-e2e/phases/stage-4-plugin-toggle.mjs +53 -53
  1123. package/scripts/three-system-e2e/state.mjs +87 -87
  1124. package/scripts/three-system-e2e.mjs +40 -40
  1125. package/scripts/tool-face-batch-identity-e2e.mjs +222 -222
  1126. package/scripts/tsconfig.json +14 -14
  1127. package/scripts/tui-smoke.mjs +100 -100
  1128. package/scripts/typecheck.mjs +75 -75
  1129. package/scripts/ui/md-lint.mjs +80 -80
  1130. package/scripts/ui/readme-assets.mjs +30 -30
  1131. package/scripts/ui/readme-shots.mjs +42 -42
  1132. package/scripts/ui/record-demo.mjs +557 -557
  1133. package/scripts/ui/record.mjs +225 -225
  1134. package/scripts/ui/seed-admin.mjs +68 -68
  1135. package/scripts/ui/seed-demo.mjs +83 -83
  1136. package/scripts/ui/seed-industrial-demo.mjs +171 -171
  1137. package/scripts/ui/shot-hero.mjs +25 -25
  1138. package/scripts/ui/shots.mjs +75 -75
  1139. package/scripts/ui/verify-nav.mjs +51 -51
  1140. package/scripts/ui/verify-responsive.mjs +285 -285
  1141. package/sdk/client.d.mts +110 -110
  1142. package/sdk/examples/line-sentinel/index.mjs +105 -105
  1143. package/sdk/examples/ops-notifier/index.mjs +34 -34
  1144. package/sdk/examples/sample-insight/index.mjs +39 -39
  1145. package/server/api/plugins/client/[name].get.ts +18 -18
  1146. package/server/api/plugins/i18n.get.ts +12 -12
  1147. package/server/api/plugins/manifest.get.ts +10 -10
  1148. package/server/api/system/backup/list.get.ts +32 -32
  1149. package/server/api/system/backup/run.post.ts +21 -21
  1150. package/server/api/system/config-groups/[id].delete.ts +21 -21
  1151. package/server/api/system/config-groups/[id].patch.ts +26 -26
  1152. package/server/api/system/config-groups/index.get.ts +21 -21
  1153. package/server/api/system/config-groups/index.post.ts +33 -33
  1154. package/server/api/system/timezone.get.ts +20 -20
  1155. package/server/api/users/tokens/[id]/token.get.ts +11 -11
  1156. package/server/api/workshop/[...path].ts +13 -13
  1157. package/server/api/workshop/agent-tools/approvals/index.get.ts +45 -43
  1158. package/server/api/workshop/agent-tools/bindings/[id].delete.ts +26 -26
  1159. package/server/api/workshop/agent-tools/bindings/grant.post.ts +45 -45
  1160. package/server/api/workshop/agent-tools/bindings/index.get.ts +41 -41
  1161. package/server/api/workshop/agent-tools/bindings/index.post.ts +58 -20
  1162. package/server/api/workshop/agent-tools/bindings/revoke.post.ts +42 -42
  1163. package/server/api/workshop/agents/[id].patch.ts +3 -0
  1164. package/server/api/workshop/agents/index.post.ts +3 -0
  1165. package/server/api/workshop/aml/datasets/[id]/preview.get.ts +68 -68
  1166. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -39
  1167. package/server/api/workshop/aml/datasets/[id].get.ts +53 -53
  1168. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -30
  1169. package/server/api/workshop/aml/datasets/index.get.ts +20 -20
  1170. package/server/api/workshop/aml/datasets/index.post.ts +27 -27
  1171. package/server/api/workshop/aml/entities/index.get.ts +13 -13
  1172. package/server/api/workshop/aml/entities/prune.post.ts +28 -28
  1173. package/server/api/workshop/aml/env/index.get.ts +13 -13
  1174. package/server/api/workshop/aml/env/recheck.post.ts +14 -14
  1175. package/server/api/workshop/aml/env/uv.post.ts +21 -21
  1176. package/server/api/workshop/aml/env/venv.post.ts +24 -24
  1177. package/server/api/workshop/aml/experiments/index.get.ts +35 -35
  1178. package/server/api/workshop/aml/index.get.ts +37 -37
  1179. package/server/api/workshop/aml/jobs/[id]/cancel.post.ts +21 -21
  1180. package/server/api/workshop/aml/jobs/[id]/logs.get.ts +23 -23
  1181. package/server/api/workshop/aml/jobs/[id]/retry.post.ts +20 -20
  1182. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -44
  1183. package/server/api/workshop/aml/jobs/[id].get.ts +23 -23
  1184. package/server/api/workshop/aml/jobs/index.get.ts +26 -26
  1185. package/server/api/workshop/aml/models/[id]/predict.post.ts +24 -24
  1186. package/server/api/workshop/aml/models/[id]/promote.post.ts +30 -30
  1187. package/server/api/workshop/aml/models/index.get.ts +48 -48
  1188. package/server/api/workshop/aml/training-plans/[id]/train.post.ts +18 -18
  1189. package/server/api/workshop/aml/training-plans/[id].delete.ts +18 -18
  1190. package/server/api/workshop/aml/training-plans/[id].patch.ts +30 -30
  1191. package/server/api/workshop/aml/training-plans/index.get.ts +9 -9
  1192. package/server/api/workshop/aml/training-plans/index.post.ts +43 -43
  1193. package/server/api/workshop/analysis/index.post.ts +54 -54
  1194. package/server/api/workshop/approvals/[id]/decide.post.ts +30 -30
  1195. package/server/api/workshop/approvals/index.get.ts +22 -22
  1196. package/server/api/workshop/audit.get.ts +43 -43
  1197. package/server/api/workshop/channel-templates/[id].patch.ts +5 -0
  1198. package/server/api/workshop/channel-templates/index.post.ts +6 -0
  1199. package/server/api/workshop/channels/[id]/agents/[agentId].patch.ts +5 -0
  1200. package/server/api/workshop/channels/[id]/agents/index.get.ts +8 -2
  1201. package/server/api/workshop/channels/[id]/agents/index.post.ts +7 -0
  1202. package/server/api/workshop/channels/[id]/chat/messages/[messageId]/read.post.ts +22 -22
  1203. package/server/api/workshop/channels/[id]/chat/messages/index.get.ts +29 -29
  1204. package/server/api/workshop/channels/[id]/chat/messages/index.post.ts +51 -51
  1205. package/server/api/workshop/channels/[id]/chat/permissions.get.ts +35 -35
  1206. package/server/api/workshop/channels/[id]/index.get.ts +10 -4
  1207. package/server/api/workshop/channels/[id]/index.patch.ts +64 -64
  1208. package/server/api/workshop/channels/[id]/members/[userId]/approve.post.ts +20 -20
  1209. package/server/api/workshop/channels/[id]/members/[userId].delete.ts +21 -21
  1210. package/server/api/workshop/channels/[id]/members/index.get.ts +23 -23
  1211. package/server/api/workshop/channels/[id]/members/leave.post.ts +20 -20
  1212. package/server/api/workshop/channels/[id]/twin-profile.get.ts +45 -45
  1213. package/server/api/workshop/channels/[id]/twin-profile.patch.ts +72 -72
  1214. package/server/api/workshop/channels.post.ts +3 -0
  1215. package/server/api/workshop/daq/[id]/ingest.post.ts +26 -22
  1216. package/server/api/workshop/daq/[id]/test.post.ts +1 -1
  1217. package/server/api/workshop/daq/[id].patch.ts +8 -0
  1218. package/server/api/workshop/daq/alarms.get.ts +18 -16
  1219. package/server/api/workshop/daq/infra/reconnect.post.ts +21 -5
  1220. package/server/api/workshop/daq/test-driver.post.ts +10 -3
  1221. package/server/api/workshop/dcw/[id]/param-ledger.get.ts +7 -1
  1222. package/server/api/workshop/dcw/[id]/read.post.ts +6 -1
  1223. package/server/api/workshop/dcw/[id]/write.post.ts +4 -4
  1224. package/server/api/workshop/dcw/[id].delete.ts +41 -41
  1225. package/server/api/workshop/dcw/[id].patch.ts +49 -40
  1226. package/server/api/workshop/dcw/journal/index.get.ts +7 -3
  1227. package/server/api/workshop/dcw/mes-artifacts/file.get.ts +7 -1
  1228. package/server/api/workshop/dcw/mes-artifacts/index.get.ts +7 -1
  1229. package/server/api/workshop/dcw/mes-test-read.post.ts +24 -24
  1230. package/server/api/workshop/dcw/optimizations/[id]/series.get.ts +6 -1
  1231. package/server/api/workshop/dcw/optimizations/[id].get.ts +3 -1
  1232. package/server/api/workshop/dcw/optimizations/index.get.ts +6 -3
  1233. package/server/api/workshop/dcw/params/[id]/read.post.ts +22 -17
  1234. package/server/api/workshop/dcw/params/[id]/write.post.ts +21 -21
  1235. package/server/api/workshop/dcw/params/[id].delete.ts +19 -19
  1236. package/server/api/workshop/dcw/params/[id].patch.ts +23 -23
  1237. package/server/api/workshop/dcw/params/index.get.ts +27 -27
  1238. package/server/api/workshop/dcw/params/index.post.ts +25 -25
  1239. package/server/api/workshop/dcw/recipes/[id]/versions.get.ts +20 -14
  1240. package/server/api/workshop/dcw/recipes/[id].delete.ts +33 -25
  1241. package/server/api/workshop/dcw/recipes/index.get.ts +17 -12
  1242. package/server/api/workshop/dcw/runs/[id]/close.post.ts +21 -15
  1243. package/server/api/workshop/dcw/templates/[key].delete.ts +14 -14
  1244. package/server/api/workshop/dcw/templates/[key].patch.ts +16 -16
  1245. package/server/api/workshop/dcw/templates/index.post.ts +15 -15
  1246. package/server/api/workshop/dcw/test-driver.post.ts +21 -16
  1247. package/server/api/workshop/device-twins/[id].delete.ts +25 -25
  1248. package/server/api/workshop/eda/runs/[id]/labels.patch.ts +25 -25
  1249. package/server/api/workshop/eda/templates/[id].delete.ts +14 -14
  1250. package/server/api/workshop/eda/templates/[id].get.ts +15 -15
  1251. package/server/api/workshop/eda/templates/[id].patch.ts +20 -20
  1252. package/server/api/workshop/eda/templates/index.get.ts +11 -11
  1253. package/server/api/workshop/eda/templates/index.post.ts +20 -20
  1254. package/server/api/workshop/exp/confirmations/[id]/decide.post.ts +41 -41
  1255. package/server/api/workshop/exp/confirmations/index.get.ts +25 -25
  1256. package/server/api/workshop/harnesses/[id]/providers.get.ts +16 -16
  1257. package/server/api/workshop/hitl/respond.post.ts +94 -94
  1258. package/server/api/workshop/notifications/index.get.ts +60 -60
  1259. package/server/api/workshop/notifications/read.post.ts +31 -31
  1260. package/server/api/workshop/ontology/drafts/[draftId]/subgraph.ts +24 -24
  1261. package/server/api/workshop/ops-logs/index.post.ts +20 -2
  1262. package/server/api/workshop/plugins/[name]/disable.post.ts +21 -21
  1263. package/server/api/workshop/plugins/[name]/enable.post.ts +21 -21
  1264. package/server/api/workshop/plugins/[name]/index.get.ts +14 -14
  1265. package/server/api/workshop/schedules/[id]/run.post.ts +15 -15
  1266. package/server/api/workshop/schedules/[id]/runs.get.ts +15 -15
  1267. package/server/api/workshop/schedules/[id].delete.ts +14 -14
  1268. package/server/api/workshop/schedules/[id].get.ts +13 -13
  1269. package/server/api/workshop/schedules/[id].patch.ts +29 -29
  1270. package/server/api/workshop/schedules/index.get.ts +12 -12
  1271. package/server/api/workshop/schedules/index.post.ts +32 -32
  1272. package/server/api/workshop/tasks/[id]/reassign.post.ts +32 -32
  1273. package/server/api/workshop/tasks/[id]/update.post.ts +35 -35
  1274. package/server/api/workshop/teams/[id]/plugins/index.get.ts +36 -36
  1275. package/server/api/workshop/teams/[id]/plugins/index.put.ts +42 -42
  1276. package/server/api/workshop/ws/audience.ts +56 -56
  1277. package/server/api/workshop/ws/db-buffer.ts +68 -68
  1278. package/server/api/workshop/ws/event-mapping.ts +47 -47
  1279. package/server/api/workshop/ws/handlers.ts +132 -132
  1280. package/server/api/workshop/ws/hub.ts +134 -133
  1281. package/server/api/workshop/ws/index.ts +23 -23
  1282. package/server/api/workshop/ws/notification-uplink.ts +77 -77
  1283. package/server/api/workshop/ws/shared.ts +94 -94
  1284. package/server/api/workshop/ws/streams.ts +146 -146
  1285. package/server/middleware/00-security-headers.ts +38 -38
  1286. package/server/middleware/01-rate-guard.ts +101 -101
  1287. package/server/plugins/01-instance-guard.ts +82 -0
  1288. package/server/plugins/aml-twin-worker.ts +32 -32
  1289. package/server/plugins/aw-plugins.ts +4 -1
  1290. package/server/plugins/daq.ts +40 -8
  1291. package/server/plugins/dev-stability-guard.ts +46 -42
  1292. package/server/plugins/error-ledger.ts +21 -0
  1293. package/server/plugins/workshop.ts +12 -0
  1294. package/server/plugins-builtin/diag-bridge/host/constants.mjs +25 -25
  1295. package/server/plugins-builtin/diag-bridge/host/exports.mjs +104 -104
  1296. package/server/plugins-builtin/diag-bridge/host/index.mjs +15 -15
  1297. package/server/plugins-builtin/diag-bridge/host/intents.mjs +62 -62
  1298. package/server/plugins-builtin/diag-bridge/host/snapshot.mjs +93 -93
  1299. package/server/plugins-builtin/diag-bridge/index.mjs +9 -9
  1300. package/server/plugins-builtin/serial-bridge/client.mjs +211 -211
  1301. package/server/plugins-builtin/serial-bridge/drivers.mjs +409 -409
  1302. package/server/plugins-builtin/serial-bridge/i18n.json +62 -62
  1303. package/server/plugins-builtin/serial-bridge/index.mjs +247 -247
  1304. package/server/plugins-builtin/serial-bridge/lib.mjs +208 -208
  1305. package/server/plugins-builtin/serial-bridge/rtu.mjs +168 -168
  1306. package/server/services/system-config/contracts.ts +29 -29
  1307. package/server/services/system-config/dispose.ts +19 -19
  1308. package/server/services/system-config/facade.ts +26 -26
  1309. package/server/services/system-config/groups.ts +108 -108
  1310. package/server/services/system-config/index.ts +21 -21
  1311. package/server/services/system-config/init.ts +26 -26
  1312. package/server/services/system-config/mutate.ts +103 -103
  1313. package/server/services/system-config/plugins.ts +104 -104
  1314. package/server/services/system-config/snapshot.ts +59 -59
  1315. package/server/services/system-config/state.ts +79 -79
  1316. package/server/services/system-config/types.ts +58 -58
  1317. package/server/services/workshop/agents/adapters/line-spawn.ts +24 -1
  1318. package/server/services/workshop/agents/adapters/omp-rpc-client/api.ts +111 -111
  1319. package/server/services/workshop/agents/adapters/omp-rpc-client/contracts.ts +22 -22
  1320. package/server/services/workshop/agents/adapters/omp-rpc-client/facade.ts +7 -7
  1321. package/server/services/workshop/agents/adapters/omp-rpc-client/helpers.ts +38 -38
  1322. package/server/services/workshop/agents/adapters/omp-rpc-client/index.ts +25 -25
  1323. package/server/services/workshop/agents/adapters/omp-rpc-client/start.ts +70 -70
  1324. package/server/services/workshop/agents/adapters/omp-rpc-client/state.ts +65 -65
  1325. package/server/services/workshop/agents/adapters/omp-rpc-client/stdout.ts +92 -92
  1326. package/server/services/workshop/agents/adapters/omp-rpc-client/usage.ts +47 -47
  1327. package/server/services/workshop/agents/agent-badge.ts +38 -38
  1328. package/server/services/workshop/agents/agent-dto.ts +54 -0
  1329. package/server/services/workshop/agents/binding-authz.ts +66 -60
  1330. package/server/services/workshop/agents/binding-mode.ts +51 -51
  1331. package/server/services/workshop/agents/codex-agent/client.ts +170 -170
  1332. package/server/services/workshop/agents/codex-agent/core.ts +119 -119
  1333. package/server/services/workshop/agents/codex-agent/facade.ts +8 -8
  1334. package/server/services/workshop/agents/codex-agent/helpers.ts +13 -13
  1335. package/server/services/workshop/agents/codex-agent/hitl.ts +138 -138
  1336. package/server/services/workshop/agents/codex-agent/index.ts +14 -14
  1337. package/server/services/workshop/agents/codex-agent/turn.ts +367 -367
  1338. package/server/services/workshop/agents/codex-agent/types.ts +42 -42
  1339. package/server/services/workshop/agents/harness-process.ts +3 -3
  1340. package/server/services/workshop/agents/harness-spawn-policy.ts +114 -0
  1341. package/server/services/workshop/agents/harness-terminal/api.ts +197 -197
  1342. package/server/services/workshop/agents/harness-terminal/index.ts +17 -17
  1343. package/server/services/workshop/agents/harness-terminal/io.ts +120 -120
  1344. package/server/services/workshop/agents/harness-terminal/park.ts +55 -55
  1345. package/server/services/workshop/agents/harness-terminal/sanitize.ts +98 -98
  1346. package/server/services/workshop/agents/harness-terminal/session.ts +124 -124
  1347. package/server/services/workshop/agents/harness-terminal/shared.ts +74 -74
  1348. package/server/services/workshop/agents/hitl-capabilities.ts +312 -312
  1349. package/server/services/workshop/agents/hitl-decision/answers.ts +32 -32
  1350. package/server/services/workshop/agents/hitl-decision/decide.ts +268 -268
  1351. package/server/services/workshop/agents/hitl-decision/payload.ts +45 -45
  1352. package/server/services/workshop/agents/hitl-decision/shared.ts +108 -108
  1353. package/server/services/workshop/agents/hitl-decision/visibility.ts +94 -94
  1354. package/server/services/workshop/agents/host-tool-bridge/dispatch.ts +22 -0
  1355. package/server/services/workshop/agents/host-tool-bridge/index.ts +1 -1
  1356. package/server/services/workshop/agents/host-tool-bridge/per-agent.ts +31 -3
  1357. package/server/services/workshop/agents/host-tool-bridge/tools/progress.ts +84 -84
  1358. package/server/services/workshop/agents/host-tool-bridge/tools/tasks.ts +1 -1
  1359. package/server/services/workshop/agents/host-tool-bridge/tools/team-delegation.ts +109 -104
  1360. package/server/services/workshop/agents/host-tool-bridge/tools/team.ts +70 -70
  1361. package/server/services/workshop/agents/industrial/aml-activity.ts +131 -131
  1362. package/server/services/workshop/agents/industrial/audit-query.ts +66 -66
  1363. package/server/services/workshop/agents/industrial/dcw-tools.ts +17 -3
  1364. package/server/services/workshop/agents/industrial/exp-tools.ts +104 -104
  1365. package/server/services/workshop/agents/industrial/ops-tools.ts +62 -14
  1366. package/server/services/workshop/agents/industrial/param-tools.ts +69 -69
  1367. package/server/services/workshop/agents/industrial/recipe-gate.ts +103 -22
  1368. package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +2 -1
  1369. package/server/services/workshop/agents/industrial/tool-verify-legacy-specs.ts +2 -2
  1370. package/server/services/workshop/agents/industrial/tool-verify.ts +51 -2
  1371. package/server/services/workshop/agents/node-bindings.repo.ts +210 -207
  1372. package/server/services/workshop/agents/node-delegation.ts +204 -159
  1373. package/server/services/workshop/agents/omp-agent/core.ts +146 -146
  1374. package/server/services/workshop/agents/omp-agent/facade.ts +8 -8
  1375. package/server/services/workshop/agents/omp-agent/helpers.ts +37 -37
  1376. package/server/services/workshop/agents/omp-agent/index.ts +16 -16
  1377. package/server/services/workshop/agents/omp-agent/types.ts +45 -45
  1378. package/server/services/workshop/agents/opencode-agent/core.ts +77 -77
  1379. package/server/services/workshop/agents/opencode-agent/facade.ts +8 -8
  1380. package/server/services/workshop/agents/opencode-agent/helpers.ts +29 -29
  1381. package/server/services/workshop/agents/opencode-agent/hitl.ts +113 -113
  1382. package/server/services/workshop/agents/opencode-agent/index.ts +16 -16
  1383. package/server/services/workshop/agents/opencode-agent/lifecycle.ts +44 -44
  1384. package/server/services/workshop/agents/opencode-agent/server.ts +244 -244
  1385. package/server/services/workshop/agents/opencode-agent/turn.ts +278 -278
  1386. package/server/services/workshop/agents/opencode-agent/types.ts +54 -54
  1387. package/server/services/workshop/agents/tool-approvals.ts +25 -0
  1388. package/server/services/workshop/agents/tool-classes.ts +44 -44
  1389. package/server/services/workshop/agents/tool-reference-spec.ts +3 -0
  1390. package/server/services/workshop/aml/clean.ts +120 -120
  1391. package/server/services/workshop/aml/entity.ts +367 -367
  1392. package/server/services/workshop/aml/job-orchestrator/broadcast.ts +37 -37
  1393. package/server/services/workshop/aml/job-orchestrator/control.ts +94 -94
  1394. package/server/services/workshop/aml/job-orchestrator/failure.ts +96 -96
  1395. package/server/services/workshop/aml/job-orchestrator/index.ts +22 -22
  1396. package/server/services/workshop/aml/job-orchestrator/process.ts +101 -101
  1397. package/server/services/workshop/aml/job-orchestrator/shared.ts +53 -53
  1398. package/server/services/workshop/aml/job-orchestrator/status.ts +20 -20
  1399. package/server/services/workshop/aml/job-orchestrator/tick.ts +37 -37
  1400. package/server/services/workshop/aml/python/train-example.py +92 -92
  1401. package/server/services/workshop/aml/runtime.ts +137 -137
  1402. package/server/services/workshop/aml/stats.ts +140 -140
  1403. package/server/services/workshop/aml/twin/calibration-worker.ts +150 -150
  1404. package/server/services/workshop/aml/twin/model-backed-provider.ts +332 -332
  1405. package/server/services/workshop/aml/twin/physics-spec-draft.ts +185 -185
  1406. package/server/services/workshop/aml/twin/prompt-composer.ts +143 -143
  1407. package/server/services/workshop/aml/twin/training-plans.ts +260 -260
  1408. package/server/services/workshop/aml/twin/write-guard.ts +19 -19
  1409. package/server/services/workshop/assets/character-asset.repo.ts +1 -1
  1410. package/server/services/workshop/assets/device-twin.repo.ts +1 -1
  1411. package/server/services/workshop/daq/bus/mqtt.adapter.ts +12 -0
  1412. package/server/services/workshop/daq/daq-controller/contracts.ts +39 -39
  1413. package/server/services/workshop/daq/daq-controller/crud.ts +5 -3
  1414. package/server/services/workshop/daq/daq-controller/facade.ts +28 -28
  1415. package/server/services/workshop/daq/daq-controller/frames.ts +137 -137
  1416. package/server/services/workshop/daq/daq-controller/helpers.ts +52 -52
  1417. package/server/services/workshop/daq/daq-controller/index.ts +22 -22
  1418. package/server/services/workshop/daq/daq-controller/ingest.ts +23 -0
  1419. package/server/services/workshop/daq/daq-controller/push.ts +24 -3
  1420. package/server/services/workshop/daq/daq-controller/runtime-control.ts +6 -0
  1421. package/server/services/workshop/daq/daq-controller/sweep-alarms.ts +3 -1
  1422. package/server/services/workshop/daq/daq-controller/tsdb-twin.ts +21 -1
  1423. package/server/services/workshop/daq/daq-node.repo.ts +10 -7
  1424. package/server/services/workshop/daq/daq-node.ts +2 -0
  1425. package/server/services/workshop/daq/daq-runtime.ts +10 -2
  1426. package/server/services/workshop/daq/drivers/mock.ts +130 -130
  1427. package/server/services/workshop/daq/drivers/modbus-rtu.ts +67 -67
  1428. package/server/services/workshop/daq/drivers/modbus-tcp.ts +310 -307
  1429. package/server/services/workshop/daq/drivers/opcua.ts +227 -227
  1430. package/server/services/workshop/daq/drivers/registry.ts +5 -4
  1431. package/server/services/workshop/daq/drivers/s7-stub.ts +29 -29
  1432. package/server/services/workshop/daq/host-bindings.ts +71 -71
  1433. package/server/services/workshop/daq/host-ports.ts +65 -65
  1434. package/server/services/workshop/daq/infra.ts +13 -0
  1435. package/server/services/workshop/daq/ingest-policy.ts +24 -1
  1436. package/server/services/workshop/daq/storage/timescale.adapter.ts +42 -3
  1437. package/server/services/workshop/db/aml-team-seeds.ts +118 -118
  1438. package/server/services/workshop/db/backup-registry.ts +33 -33
  1439. package/server/services/workshop/db/channel-member.repo.ts +122 -122
  1440. package/server/services/workshop/db/channel.repo.ts +203 -203
  1441. package/server/services/workshop/db/chat-message.repo.ts +233 -233
  1442. package/server/services/workshop/db/database/index.ts +18 -18
  1443. package/server/services/workshop/db/database/json.ts +14 -14
  1444. package/server/services/workshop/db/database/migrations.ts +83 -68
  1445. package/server/services/workshop/db/database/seed-data.ts +60 -60
  1446. package/server/services/workshop/db/hitl-request.repo.ts +221 -221
  1447. package/server/services/workshop/db/notification.repo.ts +199 -199
  1448. package/server/services/workshop/db/readonly.ts +30 -30
  1449. package/server/services/workshop/db/scheduled-task.repo.ts +235 -235
  1450. package/server/services/workshop/db/transaction.ts +72 -72
  1451. package/server/services/workshop/dcw/dcw-controller/contracts.ts +16 -16
  1452. package/server/services/workshop/dcw/dcw-controller/control.ts +78 -78
  1453. package/server/services/workshop/dcw/dcw-controller/crud.ts +27 -2
  1454. package/server/services/workshop/dcw/dcw-controller/facade.ts +19 -19
  1455. package/server/services/workshop/dcw/dcw-controller/index.ts +22 -22
  1456. package/server/services/workshop/dcw/dcw-controller/lines.ts +14 -3
  1457. package/server/services/workshop/dcw/dcw-controller/params.ts +97 -97
  1458. package/server/services/workshop/dcw/dcw-controller/products.ts +103 -103
  1459. package/server/services/workshop/dcw/dcw-controller/recipes.ts +63 -5
  1460. package/server/services/workshop/dcw/dcw-controller/write.ts +12 -0
  1461. package/server/services/workshop/dcw/dcw-node.ts +13 -1
  1462. package/server/services/workshop/dcw/dcw-recipe.repo.ts +10 -1
  1463. package/server/services/workshop/dcw/dcw-runtime.ts +39 -15
  1464. package/server/services/workshop/dcw/dcw-templates.ts +136 -136
  1465. package/server/services/workshop/dcw/drivers/shared.ts +62 -6
  1466. package/server/services/workshop/dcw/param-conversion.ts +78 -78
  1467. package/server/services/workshop/dcw/param-map.repo.ts +349 -349
  1468. package/server/services/workshop/dcw/plugin-bridge.ts +45 -45
  1469. package/server/services/workshop/dcw/recipe-op-anchor.ts +28 -0
  1470. package/server/services/workshop/dcw/recipe-rollback-manager/contracts.ts +26 -26
  1471. package/server/services/workshop/dcw/recipe-rollback-manager/facade.ts +13 -13
  1472. package/server/services/workshop/dcw/recipe-rollback-manager/helpers.ts +30 -30
  1473. package/server/services/workshop/dcw/recipe-rollback-manager/index.ts +17 -17
  1474. package/server/services/workshop/dcw/recipe-rollback-manager/internal.ts +33 -33
  1475. package/server/services/workshop/dcw/recipe-rollback-manager/judge.ts +52 -52
  1476. package/server/services/workshop/dcw/recipe-rollback-manager/lock.ts +137 -137
  1477. package/server/services/workshop/dcw/recipe-rollback-manager/rollback.ts +204 -190
  1478. package/server/services/workshop/dcw/recipe-rollback-manager/state.ts +21 -21
  1479. package/server/services/workshop/dcw/recipe-rollback-manager/sweep.ts +97 -77
  1480. package/server/services/workshop/dcw/recipe-rollback-manager/types.ts +3 -3
  1481. package/server/services/workshop/dcw/recipe-rollback-manager/views.ts +214 -214
  1482. package/server/services/workshop/eda/template-repo.ts +101 -101
  1483. package/server/services/workshop/exp/exp-collector.ts +275 -275
  1484. package/server/services/workshop/exp/exp-state.repo.ts +339 -339
  1485. package/server/services/workshop/line-scope.ts +80 -0
  1486. package/server/services/workshop/mes/mes-controller.ts +1164 -1155
  1487. package/server/services/workshop/mes/mes-hook.ts +567 -567
  1488. package/server/services/workshop/ontology/subgraph.core.ts +300 -300
  1489. package/server/services/workshop/ontology/subgraph.service.ts +113 -113
  1490. package/server/services/workshop/ops/error-ledger.ts +209 -0
  1491. package/server/services/workshop/optimization/dispatch.service.ts +18 -2
  1492. package/server/services/workshop/permissions.ts +2 -0
  1493. package/server/services/workshop/plugins/host/api.mjs +90 -90
  1494. package/server/services/workshop/plugins/host/config.mjs +135 -135
  1495. package/server/services/workshop/plugins/host/index.mjs +23 -23
  1496. package/server/services/workshop/plugins/host/init.mjs +109 -109
  1497. package/server/services/workshop/plugins/host/rollback.mjs +72 -72
  1498. package/server/services/workshop/plugins/host/state.mjs +54 -54
  1499. package/server/services/workshop/plugins/host/toggle.mjs +64 -64
  1500. package/server/services/workshop/plugins/host.mjs +9 -9
  1501. package/server/services/workshop/runtime/agent-runtime/facade.ts +7 -7
  1502. package/server/services/workshop/runtime/agent-runtime/helpers.ts +18 -18
  1503. package/server/services/workshop/runtime/agent-runtime/index.ts +19 -19
  1504. package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +137 -137
  1505. package/server/services/workshop/runtime/agent-runtime/message.ts +17 -0
  1506. package/server/services/workshop/runtime/agent-runtime/state.ts +9 -3
  1507. package/server/services/workshop/runtime/agent-runtime/types.ts +2 -1
  1508. package/server/services/workshop/runtime/channel-runtime.ts +3 -1
  1509. package/server/services/workshop/runtime/chat-mention.ts +164 -164
  1510. package/server/services/workshop/runtime/chat-projection.ts +246 -246
  1511. package/server/services/workshop/runtime/mailbox.ts +6 -3
  1512. package/server/services/workshop/runtime/manager/a2a.ts +4 -2
  1513. package/server/services/workshop/runtime/manager/admin-agents.ts +268 -268
  1514. package/server/services/workshop/runtime/manager/admin-channel.ts +1 -1
  1515. package/server/services/workshop/runtime/manager/bus.ts +182 -182
  1516. package/server/services/workshop/runtime/manager/channel-template-constants.ts +20 -20
  1517. package/server/services/workshop/runtime/manager/chat-reply.ts +181 -181
  1518. package/server/services/workshop/runtime/manager/chat.ts +386 -384
  1519. package/server/services/workshop/runtime/manager/facade.ts +24 -24
  1520. package/server/services/workshop/runtime/manager/helpers.ts +119 -119
  1521. package/server/services/workshop/runtime/manager/host-tools.ts +1 -1
  1522. package/server/services/workshop/runtime/manager/index.ts +42 -42
  1523. package/server/services/workshop/runtime/manager/internal.ts +73 -73
  1524. package/server/services/workshop/runtime/manager/notifications.ts +108 -108
  1525. package/server/services/workshop/runtime/manager/runtime-wiring.ts +31 -19
  1526. package/server/services/workshop/runtime/manager/state.ts +43 -1
  1527. package/server/services/workshop/runtime/manager/teams.ts +148 -148
  1528. package/server/services/workshop/runtime/memory/contracts.ts +18 -18
  1529. package/server/services/workshop/runtime/memory/facade.ts +10 -10
  1530. package/server/services/workshop/runtime/memory/helpers.ts +196 -196
  1531. package/server/services/workshop/runtime/memory/index.ts +27 -27
  1532. package/server/services/workshop/runtime/memory/score.ts +33 -33
  1533. package/server/services/workshop/runtime/memory/state.ts +40 -40
  1534. package/server/services/workshop/runtime/monitor.ts +3 -3
  1535. package/server/services/workshop/runtime/permission-scope.ts +21 -0
  1536. package/server/services/workshop/runtime/platform-notice.ts +113 -113
  1537. package/server/services/workshop/runtime/schedule-runtime.ts +347 -347
  1538. package/server/services/workshop/runtime/scheduler-loop/contracts.ts +29 -29
  1539. package/server/services/workshop/runtime/scheduler-loop/facade.ts +7 -7
  1540. package/server/services/workshop/runtime/scheduler-loop/helpers.ts +14 -14
  1541. package/server/services/workshop/runtime/scheduler-loop/index.ts +16 -16
  1542. package/server/services/workshop/runtime/scheduler-loop/tick.ts +16 -4
  1543. package/server/services/workshop/runtime/task-engine/facade.ts +7 -7
  1544. package/server/services/workshop/runtime/task-engine/index.ts +15 -15
  1545. package/server/services/workshop/runtime/task-engine/types.ts +3 -3
  1546. package/server/services/workshop/runtime/user-notification-hub.ts +192 -192
  1547. package/server/services/workshop/scene-events.ts +19 -0
  1548. package/server/types/pg.d.ts +49 -49
  1549. package/server/utils/approval-gate.ts +67 -67
  1550. package/server/utils/mojibake-guard.ts +29 -29
  1551. package/server/utils/stability-severity.ts +77 -77
  1552. package/shared/config/groups.mjs +241 -241
  1553. package/shared/daq-protocol.ts +24 -5
  1554. package/shared/dcw-protocol/catalog.ts +4 -4
  1555. package/shared/dcw-protocol/line.ts +4 -1
  1556. package/shared/lru.mjs +97 -97
  1557. package/tui/README.md +74 -74
  1558. package/tui/aw-tui.mjs +445 -445
  1559. package/tui/commands/index.mjs +287 -287
  1560. package/tui/components/chat-log.mjs +42 -42
  1561. package/tui/components/monitor-pane.mjs +39 -39
  1562. package/tui/components/root.mjs +53 -53
  1563. package/tui/components/status-bar.mjs +33 -33
  1564. package/tui/lib/api.mjs +82 -82
  1565. package/tui/lib/pickers.mjs +121 -121
  1566. package/tui/lib/reducers.mjs +218 -218
  1567. package/tui/lib/state.mjs +86 -86
  1568. package/tui/lib/virtual-terminal.mjs +48 -48
  1569. package/tui/lib/ws.mjs +125 -125
  1570. package/tui/theme.mjs +38 -38
  1571. package/.output/.AgentWorkShop/aml-python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  1572. package/.output/.AgentWorkShop/aml-python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1573. package/.output/.AgentWorkShop/aml-python/__pycache__/train-example.cpython-312.pyc +0 -0
  1574. package/.output/.AgentWorkShop/aml-python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  1575. package/.output/public/_nuxt/-gy9k_TE2.js +0 -1
  1576. package/.output/public/_nuxt/26OL4Ao82.js +0 -1
  1577. package/.output/public/_nuxt/7OZQiw002.js +0 -1
  1578. package/.output/public/_nuxt/8b9CKi6F.js +0 -1
  1579. package/.output/public/_nuxt/B0UUODeh.js +0 -1
  1580. package/.output/public/_nuxt/B4GOTVfN.js +0 -1
  1581. package/.output/public/_nuxt/BBhroEeN.js +0 -1
  1582. package/.output/public/_nuxt/BHxG41IQ2.js +0 -1
  1583. package/.output/public/_nuxt/BPUQZ9Lq2.js +0 -8
  1584. package/.output/public/_nuxt/BVg2R2VB2.js +0 -1
  1585. package/.output/public/_nuxt/BZg_MIK42.js +0 -1
  1586. package/.output/public/_nuxt/BaYDgyaR.js +0 -3
  1587. package/.output/public/_nuxt/BfvuWqSa.js +0 -1
  1588. package/.output/public/_nuxt/BkEokGX5.js +0 -1
  1589. package/.output/public/_nuxt/BkO5WdX5.js +0 -1
  1590. package/.output/public/_nuxt/BqBTlfiz.js +0 -1
  1591. package/.output/public/_nuxt/BtZKe9ZV2.js +0 -1
  1592. package/.output/public/_nuxt/BwOko01T.js +0 -47
  1593. package/.output/public/_nuxt/BzBBEE-o2.js +0 -1
  1594. package/.output/public/_nuxt/C3vxePED.js +0 -21
  1595. package/.output/public/_nuxt/C4tXwpSt.js +0 -1
  1596. package/.output/public/_nuxt/CBkXv24C2.js +0 -1
  1597. package/.output/public/_nuxt/CCI-fwcS2.js +0 -1
  1598. package/.output/public/_nuxt/CGf9neEK2.js +0 -1
  1599. package/.output/public/_nuxt/CGviZq4E.js +0 -1
  1600. package/.output/public/_nuxt/CNrRZmSx2.js +0 -1
  1601. package/.output/public/_nuxt/CQ31GiJU2.js +0 -1
  1602. package/.output/public/_nuxt/CY_7u1ST2.js +0 -2
  1603. package/.output/public/_nuxt/CZJ5cw6r2.js +0 -1
  1604. package/.output/public/_nuxt/ChF6qLpY2.js +0 -1
  1605. package/.output/public/_nuxt/CjdxNYpU2.js +0 -1
  1606. package/.output/public/_nuxt/CmuGMxDP.js +0 -1
  1607. package/.output/public/_nuxt/Cr2xJ_CY.js +0 -1
  1608. package/.output/public/_nuxt/Cy_HDgSl.js +0 -20
  1609. package/.output/public/_nuxt/D1thFC3z.js +0 -1
  1610. package/.output/public/_nuxt/D8AvmPUH.js +0 -1
  1611. package/.output/public/_nuxt/D9GoOkyP2.js +0 -1
  1612. package/.output/public/_nuxt/D9ppMCbw.js +0 -1
  1613. package/.output/public/_nuxt/DGmFHb7m.js +0 -1
  1614. package/.output/public/_nuxt/DJaGVY4v2.js +0 -1
  1615. package/.output/public/_nuxt/DOUuGOQR2.js +0 -2
  1616. package/.output/public/_nuxt/DZqVVvR0.js +0 -1
  1617. package/.output/public/_nuxt/DZzbCFY2.js +0 -1
  1618. package/.output/public/_nuxt/DnuJ66Jy.js +0 -1
  1619. package/.output/public/_nuxt/DuUc4bbY2.js +0 -1
  1620. package/.output/public/_nuxt/EJkmXP432.js +0 -1
  1621. package/.output/public/_nuxt/EMbqTHfT.js +0 -1
  1622. package/.output/public/_nuxt/OmpTerminalPanel.ComMDrA8.css +0 -1
  1623. package/.output/public/_nuxt/PbzVdCTA2.js +0 -1
  1624. package/.output/public/_nuxt/PluginSlot.CGH0vb95.css +0 -1
  1625. package/.output/public/_nuxt/SgsmmrsZ.js +0 -1
  1626. package/.output/public/_nuxt/TownView.CC3t-Dte.css +0 -1
  1627. package/.output/public/_nuxt/U_n8pryv2.js +0 -1
  1628. package/.output/public/_nuxt/W0sNnJQh.js +0 -1
  1629. package/.output/public/_nuxt/_id_.BQRWK7J2.css +0 -1
  1630. package/.output/public/_nuxt/_wsId_.CQMH8t8j.css +0 -1
  1631. package/.output/public/_nuxt/ae2-5ZPt.js +0 -1
  1632. package/.output/public/_nuxt/agents.D-JPovTZ.css +0 -1
  1633. package/.output/public/_nuxt/aml.PalMp-5n.css +0 -1
  1634. package/.output/public/_nuxt/builds/meta/5cd11284-05bf-4fcd-9a69-56a01c9f56dd.json +0 -1
  1635. package/.output/public/_nuxt/byZYInPk2.js +0 -1
  1636. package/.output/public/_nuxt/dHwWyr6b.js +0 -1
  1637. package/.output/public/_nuxt/default.BEXGWZFQ.css +0 -1
  1638. package/.output/public/_nuxt/entry.D6nBdXet.css +0 -1
  1639. package/.output/public/_nuxt/gUYi1hLJ2.js +0 -16
  1640. package/.output/public/_nuxt/iqxZGXsY.js +0 -1
  1641. package/.output/public/_nuxt/logs.BkJPbR_K.css +0 -1
  1642. package/.output/public/_nuxt/monitor.D3yEqqrv.css +0 -1
  1643. package/.output/public/_nuxt/ontology.CkuUThtY.css +0 -1
  1644. package/.output/public/_nuxt/operations.-l6u44Ar.css +0 -1
  1645. package/.output/public/_nuxt/pages.Cdpm_B-G.css +0 -1
  1646. package/.output/public/_nuxt/permissions.DxuOOIqQ.css +0 -1
  1647. package/.output/public/_nuxt/rDvMijKA.js +0 -9
  1648. package/.output/public/_nuxt/schedules.BXNJ9q_I.css +0 -1
  1649. package/.output/public/_nuxt/teams.CLQaXno5.css +0 -1
  1650. package/.output/public/_nuxt/tokens.BDSUWF-L.css +0 -1
  1651. package/.output/public/_nuxt/tools.BwXFAb-X.css +0 -1
  1652. package/.output/public/_nuxt/workshop.BBiFhXuM.css +0 -1
  1653. package/.output/public/_nuxt/zWZ26UWi.js +0 -1
  1654. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs +0 -716
  1655. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs.map +0 -1
  1656. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs +0 -72
  1657. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs.map +0 -1
  1658. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs +0 -942
  1659. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs.map +0 -1
  1660. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs +0 -141
  1661. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs.map +0 -1
  1662. package/.output/server/chunks/build/TownView-BWMDbosY.mjs +0 -6489
  1663. package/.output/server/chunks/build/TownView-BWMDbosY.mjs.map +0 -1
  1664. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs +0 -392
  1665. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs.map +0 -1
  1666. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs +0 -2045
  1667. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs.map +0 -1
  1668. package/.output/server/chunks/build/_wsId_-C871SDPN.mjs +0 -14589
  1669. package/.output/server/chunks/build/_wsId_-C871SDPN.mjs.map +0 -1
  1670. package/.output/server/chunks/build/agents-D7CdEUTv.mjs +0 -1078
  1671. package/.output/server/chunks/build/agents-D7CdEUTv.mjs.map +0 -1
  1672. package/.output/server/chunks/build/alert-D0ivtTGy.mjs +0 -263
  1673. package/.output/server/chunks/build/alert-D0ivtTGy.mjs.map +0 -1
  1674. package/.output/server/chunks/build/aml-DRAFRcGU.mjs +0 -814
  1675. package/.output/server/chunks/build/aml-DRAFRcGU.mjs.map +0 -1
  1676. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs +0 -533
  1677. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs.map +0 -1
  1678. package/.output/server/chunks/build/api-B4Om0mEc.mjs +0 -53
  1679. package/.output/server/chunks/build/api-B4Om0mEc.mjs.map +0 -1
  1680. package/.output/server/chunks/build/api-BEW_ebY_.mjs +0 -64
  1681. package/.output/server/chunks/build/api-BEW_ebY_.mjs.map +0 -1
  1682. package/.output/server/chunks/build/api-BsAgXWxi.mjs +0 -72
  1683. package/.output/server/chunks/build/api-BsAgXWxi.mjs.map +0 -1
  1684. package/.output/server/chunks/build/api-error-BwAQLw44.mjs +0 -47
  1685. package/.output/server/chunks/build/api-error-BwAQLw44.mjs.map +0 -1
  1686. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs +0 -81
  1687. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs.map +0 -1
  1688. package/.output/server/chunks/build/board-CJUc032b.mjs +0 -189
  1689. package/.output/server/chunks/build/board-CJUc032b.mjs.map +0 -1
  1690. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs.map +0 -1
  1691. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs +0 -953
  1692. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs.map +0 -1
  1693. package/.output/server/chunks/build/channel-templates-ggsBacZF.mjs +0 -942
  1694. package/.output/server/chunks/build/channel-templates-ggsBacZF.mjs.map +0 -1
  1695. package/.output/server/chunks/build/chart-pipeline-BpoWYMK_.mjs.map +0 -1
  1696. package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs.map +0 -1
  1697. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs +0 -439
  1698. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs.map +0 -1
  1699. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs +0 -43
  1700. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs.map +0 -1
  1701. package/.output/server/chunks/build/constants-HPHJvjne.mjs +0 -142
  1702. package/.output/server/chunks/build/constants-HPHJvjne.mjs.map +0 -1
  1703. package/.output/server/chunks/build/core-CgTOPS4t.mjs +0 -294
  1704. package/.output/server/chunks/build/core-CgTOPS4t.mjs.map +0 -1
  1705. package/.output/server/chunks/build/daq-CdxcfY_G.mjs +0 -1266
  1706. package/.output/server/chunks/build/daq-CdxcfY_G.mjs.map +0 -1
  1707. package/.output/server/chunks/build/data-D8uX1dnm.mjs +0 -481
  1708. package/.output/server/chunks/build/data-D8uX1dnm.mjs.map +0 -1
  1709. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +0 -505
  1710. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs.map +0 -1
  1711. package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs.map +0 -1
  1712. package/.output/server/chunks/build/default-CNWS6NUw.mjs +0 -2353
  1713. package/.output/server/chunks/build/default-CNWS6NUw.mjs.map +0 -1
  1714. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs +0 -406
  1715. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs.map +0 -1
  1716. package/.output/server/chunks/build/drawer-Caji0PLs.mjs +0 -834
  1717. package/.output/server/chunks/build/drawer-Caji0PLs.mjs.map +0 -1
  1718. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs +0 -14
  1719. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs.map +0 -1
  1720. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs +0 -540
  1721. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs.map +0 -1
  1722. package/.output/server/chunks/build/es-Bxu10NJ2.mjs +0 -43
  1723. package/.output/server/chunks/build/es-Bxu10NJ2.mjs.map +0 -1
  1724. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs +0 -2448
  1725. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs.map +0 -1
  1726. package/.output/server/chunks/build/form-D_UpWPN4.mjs +0 -4712
  1727. package/.output/server/chunks/build/form-D_UpWPN4.mjs.map +0 -1
  1728. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs +0 -553
  1729. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs.map +0 -1
  1730. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs +0 -132
  1731. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs.map +0 -1
  1732. package/.output/server/chunks/build/input-GtPuSEgt.mjs +0 -2181
  1733. package/.output/server/chunks/build/input-GtPuSEgt.mjs.map +0 -1
  1734. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs +0 -1120
  1735. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs.map +0 -1
  1736. package/.output/server/chunks/build/interval-DvHBIIZh.mjs +0 -9
  1737. package/.output/server/chunks/build/interval-DvHBIIZh.mjs.map +0 -1
  1738. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs +0 -7
  1739. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs.map +0 -1
  1740. package/.output/server/chunks/build/logs-pRb-TMWa.mjs +0 -427
  1741. package/.output/server/chunks/build/logs-pRb-TMWa.mjs.map +0 -1
  1742. package/.output/server/chunks/build/menu-BXt-X0dt.mjs +0 -1952
  1743. package/.output/server/chunks/build/menu-BXt-X0dt.mjs.map +0 -1
  1744. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs +0 -2253
  1745. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs.map +0 -1
  1746. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs.map +0 -1
  1747. package/.output/server/chunks/build/ontology-ohICfVVb.mjs +0 -1406
  1748. package/.output/server/chunks/build/ontology-ohICfVVb.mjs.map +0 -1
  1749. package/.output/server/chunks/build/operations-SMQrRAcr.mjs +0 -311
  1750. package/.output/server/chunks/build/operations-SMQrRAcr.mjs.map +0 -1
  1751. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +0 -202
  1752. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs.map +0 -1
  1753. package/.output/server/chunks/build/pages-DsMKUw7i.mjs +0 -542
  1754. package/.output/server/chunks/build/pages-DsMKUw7i.mjs.map +0 -1
  1755. package/.output/server/chunks/build/pagination-DTAconUo.mjs +0 -1346
  1756. package/.output/server/chunks/build/pagination-DTAconUo.mjs.map +0 -1
  1757. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs +0 -637
  1758. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs.map +0 -1
  1759. package/.output/server/chunks/build/pipeline-CkavMBhk.mjs +0 -212
  1760. package/.output/server/chunks/build/pipeline-CkavMBhk.mjs.map +0 -1
  1761. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs +0 -272
  1762. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs.map +0 -1
  1763. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs +0 -340
  1764. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs.map +0 -1
  1765. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs +0 -78
  1766. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs.map +0 -1
  1767. package/.output/server/chunks/build/schedules-Hz2DJUE2.mjs +0 -7172
  1768. package/.output/server/chunks/build/schedules-Hz2DJUE2.mjs.map +0 -1
  1769. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs +0 -341
  1770. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs.map +0 -1
  1771. package/.output/server/chunks/build/select-B3Dsb9yq.mjs +0 -3923
  1772. package/.output/server/chunks/build/select-B3Dsb9yq.mjs.map +0 -1
  1773. package/.output/server/chunks/build/settings-DXLJPq7d.mjs +0 -1014
  1774. package/.output/server/chunks/build/settings-DXLJPq7d.mjs.map +0 -1
  1775. package/.output/server/chunks/build/space-Dwu2Skt8.mjs +0 -110
  1776. package/.output/server/chunks/build/space-Dwu2Skt8.mjs.map +0 -1
  1777. package/.output/server/chunks/build/spin-C2cuvGth.mjs +0 -357
  1778. package/.output/server/chunks/build/spin-C2cuvGth.mjs.map +0 -1
  1779. package/.output/server/chunks/build/studio-hSqH9TYS.mjs +0 -336
  1780. package/.output/server/chunks/build/studio-hSqH9TYS.mjs.map +0 -1
  1781. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs +0 -377
  1782. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs.map +0 -1
  1783. package/.output/server/chunks/build/table-CmVD-cA9.mjs +0 -7546
  1784. package/.output/server/chunks/build/table-CmVD-cA9.mjs.map +0 -1
  1785. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs +0 -1924
  1786. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs.map +0 -1
  1787. package/.output/server/chunks/build/tag-y0sn-xv9.mjs +0 -1156
  1788. package/.output/server/chunks/build/tag-y0sn-xv9.mjs.map +0 -1
  1789. package/.output/server/chunks/build/teams-BbwYJyzv.mjs +0 -1203
  1790. package/.output/server/chunks/build/teams-BbwYJyzv.mjs.map +0 -1
  1791. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs +0 -1062
  1792. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs.map +0 -1
  1793. package/.output/server/chunks/build/tools-CnYi9cou.mjs +0 -487
  1794. package/.output/server/chunks/build/tools-CnYi9cou.mjs.map +0 -1
  1795. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs +0 -920
  1796. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs.map +0 -1
  1797. package/.output/server/chunks/build/town-B5aoiG98.mjs +0 -133
  1798. package/.output/server/chunks/build/town-B5aoiG98.mjs.map +0 -1
  1799. package/.output/server/chunks/build/town-BV-hbwb5.mjs +0 -75
  1800. package/.output/server/chunks/build/town-BV-hbwb5.mjs.map +0 -1
  1801. package/.output/server/chunks/build/types-D6J7slEa.mjs +0 -5565
  1802. package/.output/server/chunks/build/types-D6J7slEa.mjs.map +0 -1
  1803. package/.output/server/chunks/build/types-DWqIeMRP.mjs +0 -76
  1804. package/.output/server/chunks/build/types-DWqIeMRP.mjs.map +0 -1
  1805. package/.output/server/chunks/build/useAgentHarnessOptions-Dq0l0Z6d.mjs +0 -124
  1806. package/.output/server/chunks/build/useAgentHarnessOptions-Dq0l0Z6d.mjs.map +0 -1
  1807. package/.output/server/chunks/build/useAgentTemplateActions-BFOHb5-L.mjs +0 -77
  1808. package/.output/server/chunks/build/useAgentTemplateActions-BFOHb5-L.mjs.map +0 -1
  1809. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +0 -67
  1810. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs.map +0 -1
  1811. package/.output/server/chunks/build/useAgentTemplateForm-CuJPOPcK.mjs +0 -117
  1812. package/.output/server/chunks/build/useAgentTemplateForm-CuJPOPcK.mjs.map +0 -1
  1813. package/.output/server/chunks/build/useAgentTemplatesCatalog-B2bIhZLA.mjs +0 -133
  1814. package/.output/server/chunks/build/useAgentTemplatesCatalog-B2bIhZLA.mjs.map +0 -1
  1815. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs +0 -92
  1816. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs.map +0 -1
  1817. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs +0 -86
  1818. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs.map +0 -1
  1819. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs +0 -194
  1820. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs.map +0 -1
  1821. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs +0 -89
  1822. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs.map +0 -1
  1823. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs +0 -82
  1824. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs.map +0 -1
  1825. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs +0 -267
  1826. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs.map +0 -1
  1827. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs +0 -93
  1828. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs.map +0 -1
  1829. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs +0 -86
  1830. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs.map +0 -1
  1831. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs +0 -130
  1832. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs.map +0 -1
  1833. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs +0 -129
  1834. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs.map +0 -1
  1835. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +0 -142
  1836. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs.map +0 -1
  1837. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs +0 -70
  1838. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs.map +0 -1
  1839. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs +0 -79
  1840. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs.map +0 -1
  1841. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs +0 -176
  1842. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs.map +0 -1
  1843. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +0 -99
  1844. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs.map +0 -1
  1845. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +0 -159
  1846. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs.map +0 -1
  1847. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +0 -222
  1848. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs.map +0 -1
  1849. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +0 -90
  1850. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs.map +0 -1
  1851. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs +0 -136
  1852. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs.map +0 -1
  1853. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +0 -395
  1854. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs.map +0 -1
  1855. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +0 -187
  1856. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs.map +0 -1
  1857. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs +0 -354
  1858. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs.map +0 -1
  1859. package/.output/server/chunks/build/useDashboardData-NJ7rKxhx.mjs +0 -153
  1860. package/.output/server/chunks/build/useDashboardData-NJ7rKxhx.mjs.map +0 -1
  1861. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +0 -219
  1862. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs.map +0 -1
  1863. package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs +0 -67
  1864. package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs.map +0 -1
  1865. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs +0 -184
  1866. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs.map +0 -1
  1867. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs +0 -148
  1868. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs.map +0 -1
  1869. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs +0 -71
  1870. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs.map +0 -1
  1871. package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs +0 -79
  1872. package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs.map +0 -1
  1873. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs +0 -137
  1874. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs.map +0 -1
  1875. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs +0 -104
  1876. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs.map +0 -1
  1877. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs +0 -121
  1878. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs.map +0 -1
  1879. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs +0 -93
  1880. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs.map +0 -1
  1881. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs +0 -98
  1882. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs.map +0 -1
  1883. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs +0 -88
  1884. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs.map +0 -1
  1885. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs +0 -258
  1886. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs.map +0 -1
  1887. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +0 -452
  1888. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs.map +0 -1
  1889. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs +0 -91
  1890. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs.map +0 -1
  1891. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs +0 -140
  1892. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs.map +0 -1
  1893. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs +0 -128
  1894. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs.map +0 -1
  1895. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs +0 -107
  1896. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs.map +0 -1
  1897. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs +0 -55
  1898. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs.map +0 -1
  1899. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs +0 -77
  1900. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs.map +0 -1
  1901. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs +0 -88
  1902. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs.map +0 -1
  1903. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs +0 -150
  1904. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs.map +0 -1
  1905. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs +0 -83
  1906. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs.map +0 -1
  1907. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs +0 -217
  1908. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs.map +0 -1
  1909. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs +0 -135
  1910. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs.map +0 -1
  1911. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs +0 -91
  1912. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs.map +0 -1
  1913. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +0 -71
  1914. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs.map +0 -1
  1915. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs +0 -195
  1916. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs.map +0 -1
  1917. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs +0 -149
  1918. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs.map +0 -1
  1919. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs +0 -156
  1920. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs.map +0 -1
  1921. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +0 -1
  1922. package/.output/server/chunks/build/useTeamActions-BDjU06LP.mjs +0 -79
  1923. package/.output/server/chunks/build/useTeamActions-BDjU06LP.mjs.map +0 -1
  1924. package/.output/server/chunks/build/useTeamAddMemberDialog-J3oFn3FI.mjs +0 -84
  1925. package/.output/server/chunks/build/useTeamAddMemberDialog-J3oFn3FI.mjs.map +0 -1
  1926. package/.output/server/chunks/build/useTeamCreateDialog-fbn4ixYu.mjs +0 -97
  1927. package/.output/server/chunks/build/useTeamCreateDialog-fbn4ixYu.mjs.map +0 -1
  1928. package/.output/server/chunks/build/useTeamDeployDialog-BNezMD2k.mjs +0 -80
  1929. package/.output/server/chunks/build/useTeamDeployDialog-BNezMD2k.mjs.map +0 -1
  1930. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +0 -82
  1931. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs.map +0 -1
  1932. package/.output/server/chunks/build/useTeamPluginDialog-BZznrOVe.mjs +0 -103
  1933. package/.output/server/chunks/build/useTeamPluginDialog-BZznrOVe.mjs.map +0 -1
  1934. package/.output/server/chunks/build/useTeamsCatalog-DuZFP3oG.mjs +0 -123
  1935. package/.output/server/chunks/build/useTeamsCatalog-DuZFP3oG.mjs.map +0 -1
  1936. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +0 -72
  1937. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs.map +0 -1
  1938. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs +0 -115
  1939. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs.map +0 -1
  1940. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs +0 -87
  1941. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs.map +0 -1
  1942. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs +0 -118
  1943. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs.map +0 -1
  1944. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs +0 -92
  1945. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs.map +0 -1
  1946. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs.map +0 -1
  1947. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs +0 -141
  1948. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs.map +0 -1
  1949. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs +0 -138
  1950. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs.map +0 -1
  1951. package/.output/server/chunks/build/useWorkshopApi-BxHn-4iR.mjs +0 -127
  1952. package/.output/server/chunks/build/useWorkshopApi-BxHn-4iR.mjs.map +0 -1
  1953. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs +0 -1659
  1954. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs.map +0 -1
  1955. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs +0 -60
  1956. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs.map +0 -1
  1957. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs +0 -92
  1958. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs.map +0 -1
  1959. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs +0 -78
  1960. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs.map +0 -1
  1961. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs +0 -168
  1962. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs.map +0 -1
  1963. package/.output/server/chunks/build/users-DjiVC_tS.mjs +0 -569
  1964. package/.output/server/chunks/build/users-DjiVC_tS.mjs.map +0 -1
  1965. package/.output/server/chunks/build/workshop-1gKeDASV.mjs +0 -546
  1966. package/.output/server/chunks/build/workshop-1gKeDASV.mjs.map +0 -1
  1967. package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs.map +0 -1
  1968. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.json +0 -1
  1969. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/1459e6269990a5d229b9228c8b2f62ffaa7d350068380ae8b875fee0db45cca6.source +0 -180
  1970. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/c2991e909c70c5c12b90a407c7adcf63384c51668a2b334e6e047fa675c268fe.source +0 -305
  1971. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/e09129039d1e27e3fac24becc9bdafd2d1a7c8049bff24173df007be865f0165.source +0 -264
  1972. package/app/.mimosa/hook-status/sess_05189059-e42d-4188-8911-4f7baabe009b-28ef7c75ea.json +0 -14
  1973. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.json +0 -1
  1974. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/942d2679b87b96c612b4f2a425c3ccc5b6f3234f0cf589a8441602f866fbe277.source +0 -41
  1975. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/dd617a82339d2c61e49e28e416aabeb2fc100fb3cb1beca18d02dfb833214af6.source +0 -51
  1976. package/server/.mimosa/hook-status/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2-e67b6b91bf.json +0 -14
  1977. package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json +0 -1
  1978. package/server/services/workshop/.mimosa/hook-status/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f-e6b75bbfe6.json +0 -14
  1979. package/server/services/workshop/aml/python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  1980. package/server/services/workshop/aml/python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1981. package/server/services/workshop/aml/python/__pycache__/train-example.cpython-312.pyc +0 -0
  1982. package/server/services/workshop/aml/python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  1983. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.json +0 -1
  1984. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.mvjqkcs6-68688-fb7131a89c.baseline/190a6772a4e43801737b4ba6072eb9d53d3099b5d8a9e6f57bc5e8592a26a6c4.source +0 -274
  1985. package/server/services/workshop/optimization/python/.mimosa/hook-status/session_187ec97f45d4bd02369bbe94da527cf1-01ed7f04fa.json +0 -14
  1986. package/server/services/workshop/optimization/python/__pycache__/problems.cpython-312.pyc +0 -0
  1987. /package/.output/public/_nuxt/{6P4ZAzxa2.js → 6P4ZAzxa.js} +0 -0
  1988. /package/.output/public/_nuxt/{9j2J4k4w.js → 9j2J4k4w2.js} +0 -0
  1989. /package/.output/public/_nuxt/{DgrK8UCQ.js → BvRk9kiK2.js} +0 -0
  1990. /package/.output/public/_nuxt/{dVw8IHY62.js → dVw8IHY6.js} +0 -0
  1991. /package/.output/public/_nuxt/{k9b520K-.js → k9b520K-2.js} +0 -0
  1992. /package/.output/server/chunks/{build → _}/builtin-catalog-edpDcgfL.mjs +0 -0
  1993. /package/.output/server/chunks/{build → _}/chart-pipeline-BpoWYMK_.mjs +0 -0
  1994. /package/.output/server/chunks/{build → _}/chart-trend-BWeZh5Lv.mjs +0 -0
  1995. /package/.output/server/chunks/{build → _}/dcw-driver-badge-Df5wL_ZA.mjs +0 -0
  1996. /package/.output/server/chunks/{build → _}/narrow-fetch-CcG-BPxc.mjs +0 -0
  1997. /package/.output/server/chunks/{build → _}/useResponsive-BKDMGTHs.mjs +0 -0
  1998. /package/.output/server/chunks/{build → _}/useTownBus-D9SoIsAN.mjs +0 -0
  1999. /package/.output/server/chunks/{build → _}/workspaces-CmW0cpOt.mjs +0 -0
@@ -1,664 +1,664 @@
1
- # Harness-adapter audit — `server/services/workshop/agents/`
2
-
3
- Read-only audit. All 20 requested files read completely (plus `registry.ts`, `base-agent.ts`,
4
- `prompt-builder.ts`, `mock-agent.ts`, `harness-models.ts`, `harness-terminal.ts`, `plugin-tools.ts`,
5
- `factory.ts` and the call sites `runtime/agent-runtime.ts`, `runtime/scheduler-loop.ts`,
6
- `runtime/manager.ts`, `plugins/workshop.ts`, `plugins/dev-stability-guard.ts`).
7
- Scratch artifacts only: `scripts/_audit/ndjson-partial-line-repro.mjs`,
8
- `scripts/_audit/opencode-await-ternary-repro.mjs`.
9
-
10
- Compiler evidence: `npx tsc --noEmit --skipLibCheck --target esnext --module esnext
11
- --moduleResolution bundler <all adapters>` (alias-resolution errors filtered out; module-internal
12
- errors reproduced below are independent of path aliases).
13
-
14
- ---
15
-
16
- ## 1. Child-process lifecycle
17
-
18
- ### 1.1 Every spawn site (complete)
19
-
20
- | # | site | API |
21
- |---|---|---|
22
- | S1 | `adapters/line-spawn.ts:114` `return launchChildProcess(file, args, {` | `child_process.spawn`, `shell: false` |
23
- | S2 | `adapters/line-spawn.ts:105` `return launchChildProcess('cmd.exe', ['/d', '/s', '/c', ...line], {` | Windows `.cmd/.bat` shim |
24
- | S3 | `adapters/omp-rpc-client.ts:246` `this.child = spawn(command, args, {` | **bypasses line-spawn** |
25
- | S4 | `harness-process.ts:130` `const child = spawn('taskkill', ['/pid', String(pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' })` | tree-killer |
26
-
27
- `spawnLineProcess` callers: `adapters/stdio-jsonrpc.ts:86`, `adapters/one-shot-cli-agent.ts:366`,
28
- `opencode-agent.ts:734`, `harness-models.ts:53`.
29
-
30
- S3 is a real gap: it does **not** go through `assertPlainExecutable` / `resolveOnPath` / the `cmd.exe`
31
- shim, and it hard-codes `env: { ...process.env, ...this.options.env }` (omp-rpc-client.ts:249) so the
32
- `cleanEnv` whitelist semantics of `line-spawn.ts:88-90` are unavailable to omp.
33
-
34
- ### 1.2 The only tree-killer
35
-
36
- `harness-process.ts:125-157`:
37
-
38
- ```ts
39
- 125: export function killHarnessProcess(pid: number): boolean {
40
- ...
41
- 129: if (process.platform === 'win32') {
42
- 130: const child = spawn('taskkill', ['/pid', String(pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' })
43
- ...
44
- 139: process.kill(-pid, 'SIGKILL')
45
- ...
46
- 144: process.kill(pid, 'SIGKILL')
47
- ```
48
-
49
- Direct single-process kills that do **not** reap grandchildren:
50
- `adapters/stdio-jsonrpc.ts:192` `this.child?.kill('SIGKILL')`;
51
- `adapters/stdio-jsonrpc.ts:205` `this.child?.kill('SIGKILL')`;
52
- `adapters/omp-rpc-client.ts:237` `this.child?.kill('SIGKILL')`;
53
- `adapters/omp-rpc-client.ts:382` `this.child?.kill('SIGKILL')`;
54
- `adapters/one-shot-cli-agent.ts:263` `child.kill('SIGKILL')`;
55
- `harness-models.ts:61` `child.kill('SIGKILL')`.
56
-
57
- ### 1.3 (a) Session end / `dispose()`
58
-
59
- Only caller: `runtime/agent-runtime.ts:363-369`
60
-
61
- ```ts
62
- 363: // 清理 impl 持有的资源(omp 子进程等);容错:impl.dispose 可能不存在
63
- 364: try {
64
- 365: await this.impl.dispose?.()
65
- ```
66
-
67
- reached from `manager.shutdown()` (`runtime/manager.ts:992` `await Promise.all([...this.agentIndex.values()].map(a => a.stop()))`)
68
- and from the Nitro hook `plugins/workshop.ts:168-174` `nitroApp.hooks.hook('close', async () => { ... await manager.shutdown() ... })`.
69
-
70
- | adapter | dispose location | child killed? |
71
- |---|---|---|
72
- | omp | `omp-agent.ts:437-449` `await this.client.dispose()` | **single-process only** — `omp-rpc-client.ts:369-389` `this.child?.stdin?.end()` then `this.child?.kill('SIGKILL')` (382). omp's own grandchildren survive. |
73
- | codex | `codex-agent.ts:112-125` `await client.dispose().catch(() => {})` | same weak path via `stdio-jsonrpc.ts:195-218` |
74
- | dsh | `dsh-agent.ts:116-129` | same |
75
- | qwen | `qwen-agent.ts:140-153` | same |
76
- | hermes | `hermes-agent.ts:95-108` | same |
77
- | opencode | `opencode-agent.ts:181-195` `killHarnessProcess(pid)` (185) | **tree** ✓ (+ `this.sseAbort?.abort()` 182) |
78
- | one-shot (gemini/copilot/cursor/crush/goose/pi) | `one-shot-cli-agent.ts:148-151` → `killChild()` (253-265) → `killHarnessProcess(pid)` (259) | **tree** ✓ |
79
- | claude | `claude-agent.ts:113-128` `this.abortCtrl?.abort()` (120), `await this.session?.interrupt?.()` (122) | **no process kill at all**; `getProcessInfo(): null` (`claude-agent.ts:130-132` `return null // SDK 自管二进制生命周期,无宿主侧进程句柄`) |
80
- | mock | no `dispose` method (`mock-agent.ts:38` `export class MockAgentImpl implements AgentInterface {`) | n/a (in-process) |
81
-
82
- Asymmetry worth fixing: `killProcess()` uses the tree killer while `dispose()` on the same class does
83
- not — e.g. `codex-agent.ts:134-138`
84
-
85
- ```ts
86
- 134: killProcess(): void {
87
- 135: const pid = this.client?.pid
88
- 136: if (pid) killHarnessProcess(pid)
89
- 137: else this.client?.kill()
90
- ```
91
-
92
- vs `codex-agent.ts:118` `await client.dispose().catch(() => {})` → `stdio-jsonrpc.ts:205`.
93
-
94
- ### 1.4 (b) Error
95
-
96
- - `one-shot-cli-agent.ts:442-444` — `child.on('error', ...)` calls `finishTurn(...)` only and **does not
97
- clear `this.child`** (contrast the `exit` handler `one-shot-cli-agent.ts:445-447` `this.child = null`).
98
- A later `killChild()` (`one-shot-cli-agent.ts:253-265`) then targets a stale pid.
99
- - `harness-models.ts:59` `child.on('error', err => reject(err))` — the promise rejects but
100
- the timeout timer created at `harness-models.ts:60` is **never cleared** and `child.kill()` is never
101
- called on this path.
102
- - `stdio-jsonrpc.ts:106-109`, `omp-rpc-client.ts:280-283` — handled (reject / notifyError).
103
-
104
- ### 1.5 (c) Timeout
105
-
106
- | adapter | per-turn timeout | on timeout | child killed? | error to UI |
107
- |---|---|---|---|---|
108
- | omp | `omp-agent.ts:838` `const idleTimeoutMs = this.config.promptTimeoutMs ?? 600_000` | `omp-agent.ts:915-928` | **yes** — `client.send({ type: 'abort' })` + `this.killProcess()` + `this.client = null` | `TURN_STALLED` error event (921-927) |
109
- | one-shot | `one-shot-cli-agent.ts:206,238` `?? 600_000` | `one-shot-cli-agent.ts:495-502` | **yes** — `this.killChild()` (496) | `TURN_STALLED` (497-501) |
110
- | codex | `codex-agent.ts:238,278` `?? 600_000` | `codex-agent.ts:463-469` | **no** — only `turn/interrupt` (464) | `CODEX_TURN_STALLED` (466-467) |
111
- | claude | `claude-agent.ts:221,262` | `claude-agent.ts:391-397` | no — `this.session?.interrupt?.()` (392) | `CLAUDE_TURN_STALLED` (394) |
112
- | dsh | `dsh-agent.ts:237,277` | `dsh-agent.ts:417-423` | no — `session/cancel` notify (418) | `DSH_TURN_STALLED` (420) |
113
- | hermes | `hermes-agent.ts:209,249` | `hermes-agent.ts:379-385` | no | `HERMES_TURN_STALLED` (382) |
114
- | qwen | `qwen-agent.ts:259,299` | `qwen-agent.ts:407-413` | no | `QWEN_TURN_STALLED` (410) |
115
- | opencode | `opencode-agent.ts:349,391` | `opencode-agent.ts:505-516` | no — `POST /abort` (507) | `OPENCODE_TURN_STALLED` (510) |
116
- | mock | none | — | — | — |
117
-
118
- Non-killing timeout paths leave the pending promise resolved (they `enqueue`), so nothing hangs — but
119
- the child process keeps running and keeps its model turn burning tokens.
120
-
121
- Per-request (not per-turn) timeouts: `stdio-jsonrpc.ts:133-134`
122
- `reject(new Error(\`${this.options.name} 请求超时: ${method} (id=${id},${timeoutMs ?? this.options.requestTimeoutMs ?? 60_000}ms)\`))`
123
- (adapters pass `requestTimeoutMs: 60_000` — codex-agent.ts:613, dsh-agent.ts:500, qwen-agent.ts:486,
124
- hermes-agent.ts:457 — except `harness-models.ts:110` `requestTimeoutMs: 30_000`);
125
- `omp-rpc-client.ts:309-312` `reject(new Error(\`omp RPC 命令超时: ${command.type} (id=${id})\`))`, 60 s.
126
-
127
- ### 1.6 (d) Parent process exit — **not guaranteed**
128
-
129
- There is **no** `process.on('exit' | 'SIGINT' | 'SIGTERM' | 'beforeExit')` anywhere under `server/`
130
- (only `unhandledRejection`: `plugins/workshop.ts:88`, `plugins/dev-stability-guard.ts:56`;
131
- `uncaughtException`: `plugins/dev-stability-guard.ts:59`). Cleanup depends entirely on the Nitro
132
- `close` hook (`plugins/workshop.ts:168`). Two concrete consequence paths:
133
-
134
- 1. `plugins/dev-stability-guard.ts:53-54`
135
- ```ts
136
- 53: console.error(`[stability-guard] fatal ${kind}, exiting:\n${describe(reason)}`)
137
- 54: process.exit(1)
138
- ```
139
- `process.exit(1)` skips the `close` hook entirely → **every live harness child is orphaned**.
140
- The exemption regex only knows four engines — `plugins/dev-stability-guard.ts:16`
141
- `const ENGINE_BOUNDARY = /\b(opencode|omp|codex|dsh) API\b/i` — so failures from
142
- claude/gemini/copilot/cursor/crush/goose/qwen/pi/hermes are not exempted.
143
- 2. The pid registry is process-local: `harness-process.ts:36`
144
- `const registry = new Map<number, HarnessProcessEntry>()`. After a restart, orphaned children are
145
- unreachable — `listAliveHarnessProcessesByAgent` (`harness-process.ts:87-89`) can only see pids
146
- registered in the current process; there is no OS process-table scan.
147
-
148
- ### 1.7 Windows-specific handling
149
-
150
- - `windowsHide: true` — `line-spawn.ts:109`, `line-spawn.ts:118`, `omp-rpc-client.ts:250`,
151
- `harness-process.ts:130`.
152
- - `.cmd/.bat` shim: `line-spawn.ts:63-66` `if (lower.endsWith('.cmd') || lower.endsWith('.bat')) return { file, needsCmd: true }`
153
- → `line-spawn.ts:99-112` fixed `'cmd.exe'`, `/d /s /c`, per-arg `assertCmdSafeArg` (`line-spawn.ts:78-83`
154
- `/["\r\n\0]/.test(arg)`), `windowsVerbatimArguments: true` (111).
155
- - Tree kill is Windows-`taskkill`-only (`harness-process.ts:130`); `process.kill(-pid, 'SIGKILL')`
156
- (`harness-process.ts:139`) is guarded by `if (process.platform === 'win32')` at line 129, so on Windows
157
- the POSIX branch never runs.
158
- - `process.kill(pid, 0)` liveness probe: `harness-process.ts:107-116` (EPERM treated as alive, 114).
159
- - `resolveOnPath` PATHEXT resolution: `line-spawn.ts:29-55`, incl. `.cmd` last-resort bare name (51-53).
160
- - `one-shot-cli-agent.ts:104-106 sanitizePromptArg` exists specifically because `arg` delivery goes
161
- through the cmd wrapper on Windows.
162
-
163
- ### 1.8 stdio pipes drained?
164
-
165
- | consumer | stdout | stderr |
166
- |---|---|---|
167
- | `stdio-jsonrpc.ts:97-105` | drained | drained (8 KB tail) |
168
- | `omp-rpc-client.ts:253-279` | drained (8 MB line cap) | drained (1 MB cap, `STDERR_CAP` 130) |
169
- | `one-shot-cli-agent.ts:404-432` | drained | drained (8 KB tail) |
170
- | `opencode-agent.ts:745-748` | **NOT drained — no `child.stdout` reference in the file** | drained |
171
- | `harness-models.ts:55-58` | drained | **NOT drained — no `child.stderr` reference in the file** |
172
-
173
- `opencode serve` is long-lived (`opencode-agent.ts:734`), so an unread stdout that exceeds the OS pipe
174
- buffer will block the engine mid-turn. `harness-models.collect()` is bounded by its 45–60 s timeout
175
- (`harness-models.ts:79,144`), so it degrades to a timeout rather than a permanent hang, but returns a
176
- truncated catalog.
177
-
178
- ## 2. Unhandled promise rejection risk
179
-
180
- **Overall: floating promises are overwhelmingly `.catch()`-guarded — I found no unguarded floating
181
- promise that could reject.** The real rejection risk is *synchronous throws inside `async` methods*
182
- (§4.3/§4.4), which the call sites do catch.
183
-
184
- ### 2.1 Floating calls (all verified guarded)
185
-
186
- `void`-guarded: `omp-rpc-client.ts:466`; `omp-agent.ts:169,348,455,596,1065,1171,1172`;
187
- `claude-agent.ts:136,379,392,521`; `codex-agent.ts:430,464,528,556`; `dsh-agent.ts:389,573`;
188
- `qwen-agent.ts:387,535`; `hermes-agent.ts:352,523`; `opencode-agent.ts:475,507,705,892`.
189
-
190
- Floating but `.catch()`-ed (no `void`): `omp-agent.ts:873` `client.send({ type: 'abort' }).catch(() => {})`,
191
- `omp-agent.ts:916` same shape.
192
-
193
- ### 2.2 `async` setTimeout/setInterval callbacks without try/catch
194
-
195
- There is **no `setInterval`** in any of the audited files. Every timer body is synchronous; the two
196
- async timers-adjacent loops have internal try/catch:
197
- `opencode-agent.ts:855-891` (`const connect = async (): Promise<void> => { while (...) { try { ... } catch (err) {...} } }`)
198
- and `claude-agent.ts:521-533` `void (async () => { try { for await (const msg of session) ... } catch ... finally ... })()`.
199
-
200
- ### 2.3 `timer.unref()`
201
-
202
- Exactly three uses in the whole agents tree:
203
- `tool-approvals.ts:83` `timer.unref?.()`, `harness-terminal.ts:301` `session.parkTimer.unref?.()`,
204
- `opencode-agent.ts:92` `srv.unref()`.
205
- **No per-turn / stall / poll / abort-fallback timer is unref'd.** (`AbortSignal.timeout` at
206
- `opencode-agent.ts:766,912` is fine — verified at runtime that Node unrefs it: no `Timeout` appears in
207
- `process.getActiveResourcesInfo()` after `AbortSignal.timeout(60000)`.)
208
-
209
- ### 2.4 Leaked timers (never cleared, never unref'd)
210
-
211
- | file:line | timer | note |
212
- |---|---|---|
213
- | `omp-rpc-client.ts:294` | `setTimeout(() => { if (!this.ready) reject(new Error('omp RPC ready 超时(10s)')) }, 10_000)` | no handle stored → refs the loop 10 s after every successful `start()` |
214
- | `omp-agent.ts:620` | `const timer = setTimeout(abortTurn, timeoutMs)` | **not** cleared on the early-return path `omp-agent.ts:625-629` `if (opts.signal.aborted) { unsub(); resolve([]); return }` → later fires `omp-agent.ts:596` `void this.client?.send({ type: 'abort' }).catch(() => {})` against the shared omp subprocess, cancelling an unrelated live turn |
215
- | `one-shot-cli-agent.ts:506-509` | `setTimeout(() => { resolveWait = null; r() }, Math.min(remaining + 100, 5000))` | no variable |
216
- | `codex-agent.ts:473-476` | `setTimeout(() => { resolveWait = null; r() }, remaining + 100)` | no variable |
217
- | `claude-agent.ts:401-404` | same shape | no variable |
218
- | `dsh-agent.ts:427-430` | same shape | no variable |
219
- | `qwen-agent.ts:417-420` | same shape | no variable |
220
- | `hermes-agent.ts:389-392` | same shape | no variable |
221
- | `codex-agent.ts:431-433` | `setTimeout(() => { if (!isDone) enqueue({ kind: 'done', ... }) }, 5000)` | abort fallback |
222
- | `claude-agent.ts:380-382`, `dsh-agent.ts:381-383`, `qwen-agent.ts:380-382`, `hermes-agent.ts:345-347` | same 5 s abort fallback | |
223
- | `opencode-agent.ts:477` | `setTimeout(() => finishTurn(), 5000)` | abort fallback |
224
- | `harness-models.ts:60-63` | `const timer = setTimeout(...)` | cleared only on `exit` (65); the `error` path (59) leaks it |
225
- | `omp-agent.ts:533`, `harness-terminal.ts:545` | `setTimeout(resolve, 150)` per poll iteration | bounded by 20 s / 8 s deadlines |
226
-
227
- Correctly-cleared counterparts (for contrast): `opencode-agent.ts:520-528,536` and
228
- `omp-agent.ts:932-940,948`.
229
-
230
- ### 2.5 Leaked listeners
231
-
232
- 1. **`adapters/omp-rpc-client.ts:269`** `this.eventListeners.add(onReady as (event: AgentSessionEvent) => void)`
233
- — added inside `start()` on every (re)spawn, never removed; only `dispose()` clears
234
- (`omp-rpc-client.ts:397` `this.eventListeners.clear()`). `handleExit` does not. The `onReady`
235
- closure also captures the **previous** `resolve`/`reject` of an already-settled promise.
236
- 2. **`adapters/stdio-jsonrpc.ts:208`** `this.child.once('exit', () => { clearTimeout(timer); resolve() })`
237
- — on the 3 s timeout path (`stdio-jsonrpc.ts:204-207`) the promise resolves via the timer branch but
238
- this listener is left attached.
239
- 3. `adapters/stdio-jsonrpc.ts:102-105`, `:106-109`, `:110-117` — child listeners never removed
240
- (`removeListener`/`off(` never appears in the file); bounded by child lifetime.
241
- 4. `harness-terminal.ts:387-393 detachTerminalTap` — clears `unsubRaw` but not `session.batchTimer`,
242
- so the pending 50 ms flush (`harness-terminal.ts:175-181`) survives detach.
243
- 5. `adapters/one-shot-cli-agent.ts:406,430` and `opencode-agent.ts:746` — `data` listeners never
244
- removed; bounded per-turn (one-shot) / per-server (opencode).
245
- 6. No `request.destroy()`, no stream `destroy()`, and no `stdin.destroy()` anywhere; the only
246
- teardown is `stdin.end()` (`stdio-jsonrpc.ts:199`, `omp-rpc-client.ts:371`, `one-shot-cli-agent.ts:484,488`).
247
-
248
- ### 2.6 "Dangerous by construction" — `.then()` on an `AsyncGenerator`
249
-
250
- `opencode-agent.ts:396-402`
251
-
252
- ```ts
253
- 396: private runTurn(
254
- 397: prompt: string,
255
- 398: taskId: string | undefined,
256
- 399: opts: { timeoutMs: number, signal?: AbortSignal, beforeStart?: () => void, onDone?: () => void },
257
- 400: ): AsyncGenerator<AgentEvent, void, unknown> {
258
- 401: return this._runTurn(prompt, taskId, opts)
259
- 402: }
260
- ```
261
-
262
- used at `opencode-agent.ts:301-323` `return await this.runTurn(prompt, undefined, {...}).then((events) => {...})`.
263
- Compiler: `opencode-agent.ts(310,8): error TS2339: Property 'then' does not exist on type 'AsyncGenerator<AgentEvent, void, unknown>'`.
264
- At runtime this is `TypeError: ... .then is not a function` inside `async supervise`, contradicting the
265
- in-file intent at `opencode-agent.ts:281-282` ("绝不让引擎故障以 unhandledRejection 形态逃逸"). It is
266
- caught downstream by `runtime/scheduler-loop.ts:309-312`, so opencode's LLM lead-scheduling silently
267
- degrades to the rule engine on every tick.
268
-
269
- ## 3. NDJSON / JSON-RPC streaming correctness
270
-
271
- | site | cross-chunk buffer | `\r\n` | split JSON line | non-JSON banner |
272
- |---|---|---|---|---|
273
- | `adapters/stdio-jsonrpc.ts:234-252` | ✔ | ✔ via `line.trim()` (240) | ✔ | ✔ `catch { continue }` (246-248) |
274
- | `adapters/omp-rpc-client.ts:404-424` | ✔ | ✔ via `line.trim()` (414) | ✔ | ✔ (420-422) |
275
- | `opencode-agent.ts:866-883` (SSE) | ✔ | ✗ only `\n\n` (870) | ✔ (871) | ✔ (877-880) |
276
- | `adapters/one-shot-cli-agent.ts:406-428` | ✗ **BUG** | ✔ `/\r?\n/` (411) | ✗ **lost** | ✗ dropped (418) |
277
-
278
- Correct pattern (verbatim, `stdio-jsonrpc.ts:234-238`):
279
-
280
- ```ts
281
- 234: private onStdout(data: string): void {
282
- 235: this.stdoutBuf += data
283
- 236: if (this.stdoutBuf.length > 8 * 1024 * 1024) this.stdoutBuf = ''
284
- 237: const lines = this.stdoutBuf.split('\n')
285
- 238: this.stdoutBuf = lines.pop() ?? ''
286
- ```
287
-
288
- Caveat on 236: the cap check runs *before* the split, discarding the accumulated partial line — a
289
- single frame > 8 MB desynchronises the stream (the remainder is then parsed as a fresh line).
290
-
291
- ### 3.1 BUG — `one-shot-cli-agent.ts:406-428` parses each chunk with no line buffering
292
-
293
- ```ts
294
- 406: child.stdout?.on('data', (chunk: string) => {
295
- ...
296
- 411: for (const rawLine of chunk.split(/\r?\n/)) {
297
- 412: const line = rawLine.trim()
298
- 413: if (!line) continue
299
- 414: const json = tryParse(line)
300
- 415: if (json === null) {
301
- 416: // 无结构化输出面的引擎:stdout 纯文本行即回复增量;其余(横幅/告警)忽略
302
- 417: if (this.spec.plainTextStdout === true) sink.delta(line)
303
- 418: continue
304
- 419: }
305
- ```
306
-
307
- Concrete breaking input (executed — `scripts/_audit/ndjson-partial-line-repro.mjs`), one logical
308
- NDJSON stream delivered as two `data` events because the payload exceeds the pipe read size (64 KiB):
309
-
310
- ```
311
- chunk#1 {"type":"message","role":"assistant","content":"hello wor
312
- chunk#2 ld"}\n{"type":"result","usage":{"input_tokens":42}}\n
313
- ```
314
-
315
- Observed:
316
-
317
- ```
318
- A one-shot-cli-agent.ts loop : frames=1 ["result"] drops=2 ["{\"type\":\"message\",...,\"hello wor","ld\"}"] assistantText=""
319
- B stdio-jsonrpc.ts loop : frames=2 ["message","result"]
320
- ```
321
-
322
- The whole assistant message is silently lost (never becomes a `delta`), and one frame disappears.
323
- Affects every `OneShotCliAgentImpl` subclass without `plainTextStdout`: gemini, copilot, cursor,
324
- goose, pi. `crush` sets `plainTextStdout: true` (`crush-agent.ts:67`) so it survives but with each
325
- fragment `.trim()`-ed (411-412), altering leading/trailing whitespace of the answer.
326
-
327
- Additional unbounded buffer: `one-shot-cli-agent.ts:405-409`
328
-
329
- ```ts
330
- 405: let stdoutAll = ''
331
- 406: child.stdout?.on('data', (chunk: string) => {
332
- 407: if (this.spec.wholeJsonAtExit === true) {
333
- 408: stdoutAll += chunk
334
- ```
335
-
336
- `stdoutAll` has no cap. Latent only — no shipped spec sets `wholeJsonAtExit`
337
- (only `crush-agent.ts:67` sets `plainTextStdout`).
338
-
339
- ### 3.2 SSE caveat — `opencode-agent.ts:866-883`
340
-
341
- ```ts
342
- 869: buf += decoder.decode(value, { stream: true })
343
- 870: const chunks = buf.split('\n\n')
344
- 871: buf = chunks.pop() ?? ''
345
- ```
346
-
347
- Correct for `\n\n`-delimited SSE. Two gaps: (a) a CRLF-delimited stream (`\r\n\r\n`) never splits and
348
- `buf` grows without bound; (b) multi-line `data:` payloads are parsed line-by-line (873-879), so a
349
- payload split over two `data:` lines is rejected as non-JSON and dropped (880).
350
-
351
- ### 3.3 Non-stream splits (safe)
352
-
353
- `harness-models.ts:82` `for (const rawLine of out.split('\n'))`, `:146`, `:184` — `out` is the fully
354
- collected stdout string, not a chunk. No `readline` usage anywhere in the tree.
355
-
356
- ## 4. Timeout / retry / error propagation
357
-
358
- ### 4.1 Per-turn timeout (quoted) — see table in §1.5
359
-
360
- Every process-based adapter has one except `mock`. All default to `600_000` ms; supervise defaults to
361
- `150_000` (`base-agent.ts:170`, `omp-agent.ts:576`, `opencode-agent.ts:300`, `qwen-agent.ts:219`).
362
-
363
- ### 4.2 Correct propagation to `{ kind: 'error' }`
364
-
365
- Timeout → error event, verified for all nine: `omp-agent.ts:921-927`, `one-shot-cli-agent.ts:497-501`,
366
- `codex-agent.ts:465-468`, `claude-agent.ts:393-396`, `dsh-agent.ts:419-422`, `hermes-agent.ts:381-384`,
367
- `qwen-agent.ts:409-412`, `opencode-agent.ts:508-514`. Non-zero child exit → error event:
368
- `one-shot-cli-agent.ts:469-479`
369
-
370
- ```ts
371
- 469: if (code === 0) {
372
- 470: finishTurn({ kind: 'done' })
373
- 471: }
374
- 472: else {
375
- 473: const custom = this.spec.exitErrorMessage?.(code ?? -1, stderrTail)
376
- 474: finishTurn({
377
- 475: kind: 'error',
378
- 476: code: `${this.spec.harnessId.toUpperCase()}_EXIT_${code ?? -1}`,
379
- ```
380
-
381
- Spawn failure → error event: `one-shot-cli-agent.ts:368-377`, `omp-agent.ts:652-660`.
382
-
383
- ### 4.3 Swallowed errors (verbatim)
384
-
385
- - `base-agent.ts:160-162`
386
- ```ts
387
- 160: catch {
388
- 161: return []
389
- 162: }
390
- ```
391
- `supervise()` failure produces **no AgentEvent at all** — every adapter that relies on the base
392
- implementation (all except omp/opencode/qwen) loses the reason.
393
- - `qwen-agent.ts:229-231` — the same `catch { return [] }`, duplicated.
394
- - `opencode-agent.ts:320-323` `}).catch(() => { this.supervising = false; return [] })` and
395
- `opencode-agent.ts:286-289` `catch (err) { log.warn(...); return [] }`.
396
- - `codex-agent.ts:208-210` compact failure → `log.warn(... 放行)`; `opencode-agent.ts:270-272` same.
397
- - `codex-agent.ts:725-727` `catch (err) { log.warn(\`[CodexAgent:${this.selfAgentId}] CODEX_HOME config 写入失败(信任全局配置):\`, ...) }`
398
- — if the MCP section is not written, the agent runs **without tools** and the turn still reports `done`.
399
- - `opencode-agent.ts:794-796` `catch (err) { log.warn(\`[OpenCodeAgent:${this.selfAgentId}] MCP 桥注册失败(host tools 不可用):\`, ...) }` — same class of silent capability loss.
400
- - `claude-agent.ts:527-529` `catch (err) { log.warn(\`[ClaudeSdk:${this.selfAgentId}] 消息流异常: ...\`) }` — the SDK stream dies but `streamTurn` keeps waiting until the 600 s stall timer; the UI sees nothing until then.
401
- - `omp-rpc-client.ts:420-422` `// 非 JSON 行(理论上不应出现):忽略` and `:549-551` `// chunk 重组失败:忽略`.
402
- - `stdio-jsonrpc.ts:246-248` `catch { continue // 非 JSON 行(横幅/日志混流)忽略 }` — combined with a lost frame this is invisible.
403
- - `harness-models.ts:142` `catch { /* 无凭据则按未登录目录输出 */ }`, `:243` `catch { /* 无 settings.yaml/解析失败 → 仅内置目录 */ }`.
404
-
405
- ### 4.4 `async` methods that throw before doing any work
406
-
407
- | method | throw | compiler evidence |
408
- |---|---|---|
409
- | `QwenAgentImpl.supervise` | `qwen-agent.ts:209` `const prompt = supervisePrompt({` — **`supervisePrompt` is not imported** (`qwen-agent.ts:30` imports only `peerPrompt, systemManual, toolArgsPreview, workerPrompt`) → `ReferenceError`; next failure would be `qwen-agent.ts:219` `const events = await this.collectTurn(...)` (the method is `collectTurnEvents`, `qwen-agent.ts:435`) and `qwen-agent.ts:226` `extractJsonArray(text)` (also not imported) | `qwen-agent.ts(209,20): TS2304: Cannot find name 'supervisePrompt'`; `(219,33): TS2339: Property 'collectTurn' does not exist`; `(226,22): TS2304: Cannot find name 'extractJsonArray'`; `(208,14)/(217,10)/(233,12): TS2341: Property 'supervising' is private and only accessible within class 'BaseAgentImpl'` |
410
- | `OpenCodeAgentImpl.supervise` | `opencode-agent.ts:301` `.then(...)` on an AsyncGenerator | `opencode-agent.ts(310,8): TS2339` |
411
- | `OpenCodeAgentImpl.respondHitl` | `opencode-agent.ts:252` `if (pending.timer) clearTimeout(p.timer)` — `p` is undefined in this scope (the loop variable `p` lives at 652 and 191) → `ReferenceError` **after** the engine was already answered (241/246/249) but **before** `this.pendingHitl.delete(id)` (253) and `getHitlRegistry().resolve(...)` (254) → the local map entry and the global HITL item leak forever, and the REST caller gets a 500 (`server/api/workshop/hitl/respond.post.ts:80` `await manager.respondHarnessHitl(...)` → `runtime/manager.ts:2821` `const ok = await runtime.respondHitl(kind, id, outcome)`) | `opencode-agent.ts(252,37): TS2304: Cannot find name 'p'` |
412
- | `OpenCodeAgentImpl.startServer` | `opencode-agent.ts:805-808` — `await` binds tighter than `?:`, so `created` is a **Promise**, not the session object, and `String(created?.id ?? '')` is always `''`; entry into the 3× retry loop at 811-815 is therefore guaranteed (≥2.5 s `await sleep(2500)`) and the first, real, session is created and abandoned | `opencode-agent.ts(808,38): TS2339: Property 'id' does not exist on type 'Promise<Record<string, unknown>>'`; reproduced in `scripts/_audit/opencode-await-ternary-repro.mjs` (`created instanceof Promise = true`, `this.sessionId = ""`) |
413
-
414
- ```ts
415
- 805: const created = await (this.config.permission ?? DEFAULT_PERMISSION)
416
- 806: ? createWith({ permission: this.config.permission ?? DEFAULT_PERMISSION }).catch(() => createWith(undefined))
417
- 807: : createWith(undefined)
418
- 808: this.sessionId = String(created?.id ?? '')
419
- ```
420
-
421
- Also note the ternary condition `this.config.permission ?? DEFAULT_PERMISSION` can never be falsy
422
- (`DEFAULT_PERMISSION` is a 4-line array literal, `opencode-agent.ts:82-86`), so the `: createWith(undefined)`
423
- branch at 807 is dead code and `permission` is always sent on the first attempt.
424
-
425
- ## 5. DUPLICATION INVENTORY
426
-
427
- Line ranges are exact. "Copies" counts textual copies of the same block; near-copies with token
428
- renames are flagged.
429
-
430
- ### 5.1 MCP-bridge env setup (`AW_BASE_URL` / `AW_AGENT_ID` / `AW_AGENT_TOKEN`)
431
-
432
- | # | function / block | file:lines | copies |
433
- |---|---|---|---|
434
- | D1 | `generateMcpBridgeEnv({ agentId, token, baseUrl, bridgePath })` call site | `codex-agent.ts:606-612`, `codex-agent.ts:690`, `claude-agent.ts:452-457`, `dsh-agent.ts:477-484`, `qwen-agent.ts:461-466`, `hermes-agent.ts:438-443`, `adapters/one-shot-cli-agent.ts:296-301`, `gemini-agent.ts:119` | **8 sites / 7 files** |
435
- | D2 | Redundant repeat calls of the *same* expression inside one function | `dsh-agent.ts:485`, `dsh-agent.ts:486` (three identical `generateMcpBridgeEnv(...)` evaluations in one call) | 3 extra evaluations |
436
- | D3 | Hand-rolled `AW_*` literal object duplicating `harness-env.ts:41-53` | `opencode-agent.ts:786-790` vs `harness-env.ts:44-47` | **2 copies** |
437
- | D4 | `\` ${k} = "${v}"\`` TOML env expansion | `codex-agent.ts:691` | 1 (no dup) |
438
- | D5 | bridge launch pair `process.execPath` + bridge path | `codex-agent.ts:695-696`, `claude-agent.ts:506-508`, `qwen-agent.ts:75`, `gemini-agent.ts:49-51`, `copilot-agent.ts:61`, `cursor-agent.ts:46`, `opencode-agent.ts:784`, `crush-agent.ts:39-43`, `goose-agent.ts:40-41` | **9 copies** |
439
-
440
- Canonical source being duplicated: `harness-env.ts:43-48`
441
-
442
- ```ts
443
- 43: const bridgeEnv = {
444
- 44: AW_BASE_URL: resolvePlatformBaseUrl(input.baseUrl),
445
- 45: AW_AGENT_ID: input.agentId,
446
- 46: AW_AGENT_TOKEN: input.token ?? '',
447
- 47: AW_MCP_TOOL_TIMEOUT_MS: String(200_000),
448
- 48: }
449
- ```
450
-
451
- ### 5.2 `resolveCli` / binary path resolution
452
-
453
- | # | function | file:lines | copies |
454
- |---|---|---|---|
455
- | D6 | `resolveCommand` one-liner `config => (typeof config.command === 'string' && config.command.trim() !== '' ? config.command.trim() : harnessSettings().X_command)` | `gemini-agent.ts:60`, `copilot-agent.ts:85`, `cursor-agent.ts:54`, `crush-agent.ts:59`, `goose-agent.ts:33`, `pi-agent.ts:52` | **6 byte-identical copies** (only the settings key differs) |
456
- | D7 | same rule re-implemented for the registry probe | `registry.ts:106-107` `const cmdFrom = (config) => typeof config?.command === 'string' && config.command.trim() !== '' ? config.command.trim() : ''` | +1 |
457
- | D8 | `getProcessInfo` fallback command strings `'opencode serve' / 'dsh --profile acp' / 'qwen --experimental-acp' / 'hermes acp' / 'codex app-server'` re-stating the spawn argv | `opencode-agent.ts:166`, `dsh-agent.ts:135`, `qwen-agent.ts:158`, `hermes-agent.ts:113`, `codex-agent.ts:131` | 5 |
458
- | D9 | PATH probing: `probeExecutable` re-implements the explicit-path test and the POSIX PATH walk already in `resolveOnPath` | `harness-availability.ts:55-67` vs `adapters/line-spawn.ts:29-55` (explicit-path test `harness-availability.ts:58` ≈ `line-spawn.ts:39`) | 2 |
459
- | D10 | `safeId(agentId)` (identical 4-line body) | `copilot-agent.ts:28-31`, `goose-agent.ts:26-29`, `pi-agent.ts:27-30` | **3 identical copies** |
460
- | D11 | "absolute path, no `..`" override validation | `copilot-agent.ts:37-40`, `pi-agent.ts:36-39` | 2 |
461
-
462
- ### 5.3 `spawn` option assembly
463
-
464
- | # | block | file:lines | copies |
465
- |---|---|---|---|
466
- | D12 | `stdio: ['pipe', 'pipe', 'pipe']` literal | `adapters/line-spawn.ts:106`, `:115`, `adapters/omp-rpc-client.ts:247` | 3 (omp-rpc-client bypasses the shared helper) |
467
- | D13 | `{ cwd: this.config.cwd ?? process.cwd(), env, windowsHide: true }` + `new StdioJsonRpcClient({...})` | `codex-agent.ts:601-614`, `dsh-agent.ts:494-501`, `qwen-agent.ts:480-487`, `hermes-agent.ts:451-458`, `harness-models.ts:110` | **5 copies** |
468
- | D14 | `env = { ...bridge.bridgeEnv, ...(engine-specific keys) }` | `dsh-agent.ts:477-493`, `qwen-agent.ts:468-474`, `hermes-agent.ts:444-449`, `one-shot-cli-agent.ts:315-318`, `gemini-agent.ts:67-70`, `copilot-agent.ts:104-107`, `cursor-agent.ts:62-64`, `crush-agent.ts:68-73`, `goose-agent.ts:47-60`, `pi-agent.ts:66-71`, `claude-agent.ts:458-462`, `opencode-agent.ts:736-740` | **12 copies** |
469
-
470
- ### 5.4 prompt / context assembly
471
-
472
- | # | block | file:lines | copies |
473
- |---|---|---|---|
474
- | D15 | `const taskText = request.message.parts.map((p) => { if ('text' in p) ... }).join('\n')` — a re-implementation of `base-agent.ts:189-197 partsText()` | `codex-agent.ts:222-228`, `claude-agent.ts:205-211`, `dsh-agent.ts:221-227`, `qwen-agent.ts:243-249`, `hermes-agent.ts:193-199`, `opencode-agent.ts:332-338`, `omp-agent.ts:669-675` | **7 copies** |
475
- | D16 | same block for `msgText` in `peerTurn` | `codex-agent.ts:256-262`, `claude-agent.ts:240-246`, `dsh-agent.ts:255-261`, `qwen-agent.ts:277-283`, `hermes-agent.ts:227-233`, `opencode-agent.ts:369-375`, `omp-agent.ts:722-728` | **7 copies** |
476
- | D17 | `fromId` / `requireReply` / `crossChannel` / `toolState.replyContext` prelude | `codex-agent.ts:248-255`, `claude-agent.ts:232-239`, `dsh-agent.ts:247-254`, `qwen-agent.ts:269-276`, `hermes-agent.ts:219-226`, `opencode-agent.ts:361-368`, `one-shot-cli-agent.ts:215-222`, `omp-agent.ts:719-740` | **8 copies** |
477
- | D18 | `workerTurn` skeleton (taskId → `toolState.currentTaskId` → prompt → `yield* streamTurn`) incl. `finally { this.toolState.currentTaskId = null }` | `codex-agent.ts:216-243`, `claude-agent.ts:198-226`, `dsh-agent.ts:215-242`, `qwen-agent.ts:237-264`, `hermes-agent.ts:187-214`, `opencode-agent.ts:326-356`, `one-shot-cli-agent.ts:192-211`, `omp-agent.ts:642-688` | **8 copies** |
478
- | D19 | `peerTurn` skeleton | `codex-agent.ts:245-279`, `claude-agent.ts:228-263`, `dsh-agent.ts:244-278`, `qwen-agent.ts:266-300`, `hermes-agent.ts:216-250`, `opencode-agent.ts:358-392`, `one-shot-cli-agent.ts:213-239`, `omp-agent.ts:695-759` | **8 copies** |
479
- | D20 | constructor identity block `super({ agentId: typeof config.agentId === 'string' ? ... , role: config.role === 'lead' ? 'lead' : 'worker', ... })` | `codex-agent.ts:95-100`, `claude-agent.ts:96-101`, `dsh-agent.ts:99-104`, `qwen-agent.ts:123-128`, `hermes-agent.ts:76-81`, `opencode-agent.ts:144-149`, `one-shot-cli-agent.ts:130-135`, `omp-agent.ts:398-403` | **8 copies** |
480
- | D21 | `contextPrefix()` / `systemManual()` per-turn assembly paired with `workerPrompt`/`peerPrompt` | same 8 files, `workerTurn`/`peerTurn` bodies (see D18/D19) | 8 |
481
- | D22 | `partsText` twin in the base itself | `base-agent.ts:189-197` — canonical, already exists | (target, not duplicate) |
482
-
483
- ### 5.5 `parseXxxLine` / event-line mappers
484
-
485
- | # | function | file:lines | copies |
486
- |---|---|---|---|
487
- | D23 | ACP `pushUpdate(params)` notification mapper (`agent_message_chunk` / `tool_call` / `tool_call_update` / usage) | `dsh-agent.ts:327-371`, `hermes-agent.ts:293-336` | **2 near-identical copies (~95 %)**; only `DSH_ACP_METHODS` vs `HERMES_ACP_METHODS` and 2 comment lines differ |
488
- | D24 | inner `statusEvent(text)` helper | `dsh-agent.ts:335-344`, `hermes-agent.ts:301-310`, `claude-agent.ts:311-316`, `opencode-agent.ts:551-558`, `one-shot-cli-agent.ts:339-348` | **5 copies** |
489
- | D25 | `tryParse(line)` JSON guard | `one-shot-cli-agent.ts:108-115` (only one in adapters; `stdio-jsonrpc.ts:244`, `omp-rpc-client.ts:417` are inline `JSON.parse`) | 1 + 2 inline |
490
- | D26 | engine `mapLine` dispatch tables | `gemini-agent.ts:76-108`, `copilot-agent.ts:112-129`, `cursor-agent.ts:68-95`, `crush-agent.ts:78-100`, `goose-agent.ts:61-91`, `pi-agent.ts:82-101` | 6 (shape, not text) |
491
-
492
- ### 5.6 output accumulation loops
493
-
494
- | # | block | file:lines | copies |
495
- |---|---|---|---|
496
- | D27 | `enqueue` closure (artifact-before-done + `isDone` latch + `resolveWait?.()`) | `codex-agent.ts:301-322`, `dsh-agent.ts:304-324`, `hermes-agent.ts:271-291`, `qwen-agent.ts:321-340`, `claude-agent.ts:286-303`, `opencode-agent.ts:423-446`, `one-shot-cli-agent.ts:386-402`, `omp-agent.ts:826-832` | **8** (dsh/hermes/qwen are textually identical except qwen's missing `this.turnActive = false` at dsh:314/hermes:281 — behaviourally equivalent because qwen sets it in the following branch at 332-335) |
497
- | D28 | artifact literal `{ kind: 'artifact', artifact: { artifactId: randomUUID(), name: 'output', parts: [{ text }], lastChunk: true, totalChunks: 1 } }` | `codex-agent.ts:304-309`, `dsh-agent.ts:307-312`, `hermes-agent.ts:274-279`, `qwen-agent.ts:324-329`, `claude-agent.ts:288-293`, `one-shot-cli-agent.ts:390-395`, `opencode-agent.ts:428-433` + `:460-465`, `omp-agent.ts:1035-1044` | **9** |
498
- | D29 | drain loop `while (!isDone \|\| queue.length > 0)` + stall watchdog + `await new Promise((r) => { resolveWait = r; setTimeout(...) })` | `codex-agent.ts:460-478`, `claude-agent.ts:388-406`, `dsh-agent.ts:414-432`, `qwen-agent.ts:404-422`, `hermes-agent.ts:376-394`, `opencode-agent.ts:502-529`, `one-shot-cli-agent.ts:492-511`, `omp-agent.ts:912-941` | **8 copies** |
499
- | D30 | `flushDelta` / `pushDelta` 50 ms delta batching | `codex-agent.ts:324-340`, `omp-agent.ts:845-861` | 2 |
500
- | D31 | `const queue / let isDone / let resolveWait / let lastActivity / let agentText` state prelude | 8 files (same as D29) | 8 |
501
- | D32 | abort fallback `setTimeout(() => { if (!isDone) enqueue({ kind: 'done', ... }) }, 5000)` | `codex-agent.ts:431-433`, `claude-agent.ts:380-382`, `dsh-agent.ts:381-383`, `qwen-agent.ts:380-382`, `hermes-agent.ts:345-347`, `opencode-agent.ts:477` | **6 copies** |
502
- | D33 | `onAbort` handler (log + engine cancel + 5 s fallback) | `codex-agent.ts:428-434`, `claude-agent.ts:377-383`, `dsh-agent.ts:378-385`, `qwen-agent.ts:377-385`, `hermes-agent.ts:342-348`, `opencode-agent.ts:472-478`, `one-shot-cli-agent.ts:434-438`, `omp-agent.ts:871-883` | **8 copies** |
503
- | D34 | `collectTurnEvents` (byte-identical) | `codex-agent.ts:494-501`, `claude-agent.ts:419-426`, `dsh-agent.ts:446-453`, `qwen-agent.ts:435-442`, `hermes-agent.ts:407-414`, `one-shot-cli-agent.ts:242-249` | **6 identical copies** (omp-agent.ts:145-192 is a 7th, differently implemented) |
504
-
505
- ```ts
506
- 494: protected async collectTurnEvents(prompt: string, timeoutMs: number, signal?: AbortSignal): Promise<AgentEvent[]> {
507
- 495: const events: AgentEvent[] = []
508
- 496: for await (const e of this.streamTurn(prompt, undefined, timeoutMs, signal)) {
509
- 497: events.push(e)
510
- 498: if (e.kind === 'error') break
511
- 499: }
512
- 500: return events
513
- 501: }
514
- ```
515
-
516
- ### 5.7 `dispose` / `kill` / process-management bodies
517
-
518
- | # | function | file:lines | copies |
519
- |---|---|---|---|
520
- | D35 | `dispose()` (client teardown + `markHarnessProcessExit` + pending-map timer clear) | `codex-agent.ts:112-125`, `dsh-agent.ts:116-129`, `qwen-agent.ts:140-153`, `hermes-agent.ts:95-108` | **4 near-identical** (+ variants `claude-agent.ts:113-128`, `one-shot-cli-agent.ts:148-151`, `opencode-agent.ts:181-195`, `omp-agent.ts:437-449`) |
521
- | D36 | `getProcessInfo()` | `codex-agent.ts:127-132`, `dsh-agent.ts:131-136`, `qwen-agent.ts:155-159`, `hermes-agent.ts:110-114`, `opencode-agent.ts:163-167`, `omp-agent.ts:459-464`, `one-shot-cli-agent.ts:153-157` | **7** |
522
- | D37 | `killProcess()` | `codex-agent.ts:134-138`, `dsh-agent.ts:138-142`, `qwen-agent.ts:161-165`, `hermes-agent.ts:116-120` (byte-identical 5-liners) + `opencode-agent.ts:169-173`, `omp-agent.ts:467-476` | **6** |
523
- | D38 | `reconcileProcess()` | `codex-agent.ts:140-142`, `dsh-agent.ts:144-146`, `qwen-agent.ts:167-169`, `hermes-agent.ts:122-124` (identical) + `opencode-agent.ts:175-179`, `omp-agent.ts:483-485` | **6** |
524
- | D39 | `getContextStats()` shape `{ usedTokens, contextWindow, percent, compacting }` | `codex-agent.ts:144-153`, `dsh-agent.ts:148-157`, `hermes-agent.ts:126-135`, `qwen-agent.ts:171-173`, `claude-agent.ts:139-148`, `opencode-agent.ts:199-208`, `omp-agent.ts:241-252`, `one-shot-cli-agent.ts:170-179` | **8** |
525
- | D40 | `steer()` deferred stub | `dsh-agent.ts:160-162`, `qwen-agent.ts:175-177`, `hermes-agent.ts:137-139`, `one-shot-cli-agent.ts:181-183` | **4** |
526
- | D41 | `respondHitl()` default throw | `base-agent.ts:102-110`, `one-shot-cli-agent.ts:186-188` | 2 |
527
- | D42 | `ensureClient(ctx)` guard (`if (!this.workspace) ... ; if (!this.agentInfo) { ...refreshIdentity() } ; if (client?.alive && session) return ; clientStarting ??= startClient().finally(...)`) | `codex-agent.ts:581-597`, `dsh-agent.ts:457-473`, `qwen-agent.ts:446-457`, `hermes-agent.ts:418-434`, `opencode-agent.ts:714-726` (`ensureServer`), `omp-agent.ts:1092-1103` | **6** |
528
- | D43 | `startClient()` scaffolding (`const command = config.command ?? harnessSettings().X` + `new StdioJsonRpcClient` + pidRef + onExit + `registerHarnessProcess`/`bindHarnessProcess` + handshake + session create) | `codex-agent.ts:599-664`, `dsh-agent.ts:475-545`, `qwen-agent.ts:459-511`, `hermes-agent.ts:436-497` | **4** (~60 lines each) |
529
- | D44 | `const pidRef = { pid: undefined as number \| undefined }` + `client.onExit(...)` + `registerHarnessProcess` + `bindHarnessProcess` | `codex-agent.ts:615-626`, `dsh-agent.ts:502-513`, `qwen-agent.ts:488-499`, `hermes-agent.ts:459-470`, `one-shot-cli-agent.ts:380-384`, `opencode-agent.ts:749-753` | **6** |
530
- | D45 | ACP `initialize` + version-retry + `session/new` + sessionId guard | `dsh-agent.ts:525-542`, `hermes-agent.ts:480-494` | **2 near-identical** |
531
- | D46 | `registerXxxHitl` (registry.register + `harnessSettings().hitl_timeout_ms` + `setTimeout` fail-closed) | `codex-agent.ts:505-533` and `:535-560`, `dsh-agent.ts:547-577`, `hermes-agent.ts:499-527`, `qwen-agent.ts:513-539`, `opencode-agent.ts:686-710`, `claude-agent.ts:539-562` | **7** |
532
- | D47 | `clearPending(id, resolution)` | `dsh-agent.ts:206-211`, `hermes-agent.ts:178-183` (identical), `qwen-agent.ts:196-201`, `claude-agent.ts:187-194 denyPending` | 4 |
533
- | D48 | ACP allow/reject option picking | `dsh-agent.ts:182-201`, `hermes-agent.ts:154-173` | **2 identical** |
534
- | D49 | ensure engine MCP config (read JSON → merge `mcpServers.aw` → write JSON) | `gemini-agent.ts:34-56`, `copilot-agent.ts:47-64`, `cursor-agent.ts:34-50`, `qwen-agent.ts:50-86` | **4** (+ TOML variant `codex-agent.ts:671-728`, bash variant `crush-agent.ts:35-55`) |
535
-
536
- ### 5.8 Same-key config parsing (config interfaces)
537
-
538
- | # | duplicated shape | file:lines | copies |
539
- |---|---|---|---|
540
- | D50 | `command / args / cwd / model / promptTimeoutMs / superviseTimeoutMs / systemPromptPrefix / scenarioPrompt / agentId / name / role / channelId / token / baseUrl / mcpBridgePath` re-declared | `codex-agent.ts:35-66`, `dsh-agent.ts:44-77`, `claude-agent.ts:39-61`, `hermes-agent.ts:42-62`, `qwen-agent.ts:88-109`, `opencode-agent.ts:40-78` (no index signature) and `one-shot-cli-agent.ts:82-101` (has one) | **7 interfaces**, 15 shared keys each |
541
- | D51 | `private agentRole: 'lead' \| 'worker' = 'worker'` re-declared over `base-agent.ts:54 protected agentRole` | `codex-agent.ts:77`, `claude-agent.ts:78`, `dsh-agent.ts:88`, `qwen-agent.ts:114`, `hermes-agent.ts:67`, `opencode-agent.ts:119`, `omp-agent.ts:208` | **7 copies**; compiler: `TS2415 … Property 'agentRole' is private in type 'ClaudeSdkAgentImpl' but not in type 'BaseAgentImpl'` (and the same for Hermes/Omp/Qwen); at runtime the field initializer runs **after** `super()` and overwrites the value the base constructor set — masked only because `ensureClient` re-assigns it (`dsh-agent.ts:461`, `codex-agent.ts:585`, `opencode-agent.ts:718`, `hermes-agent.ts:422`, `omp-agent.ts:1099`) |
542
- | D52 | `private readonly bridgeCtx = { identity: {...}, state: this.toolState, getWorkspace: () => this.workspace }` re-declared over `base-agent.ts:49` | `codex-agent.ts:71-75`, `dsh-agent.ts:82-86`, `opencode-agent.ts:113-117` | **3 copies**; compiler: `TS2415 … Property 'bridgeCtx' is private in type 'CodexAgentImpl' but not in type 'BaseAgentImpl'` (same for Dsh/OpenCode) |
543
- | D53 | `private supervising = false` re-declared over `base-agent.ts:135` | `opencode-agent.ts:278`, `omp-agent.ts:554` | 2; compiler `TS2415` on `opencode-agent.ts(110,14)` |
544
- | D54 | `configRecord()` return `Record<string, unknown>` with a non-index-signature config type | `codex-agent.ts:108-110`, `dsh-agent.ts:112-114`, `opencode-agent.ts:157-159` | 3; compiler `TS2322: Type 'CodexAgentConfig' is not assignable to type 'Record<string, unknown>'. Index signature for type 'string' is missing` |
545
-
546
- ### 5.9 Duplicate object keys / dead code (verified literals)
547
-
548
- | # | file:line | code |
549
- |---|---|---|
550
- | D55 | `omp-agent.ts:1112-1113` | `args: [...(this.config.thinkingLevel ? ['--thinking', this.config.thinkingLevel] : [])],` / `args: this.config.args,` — last key wins, so **`--thinking` is never passed**; compiler `omp-agent.ts(1113,9): error TS1117: An object literal cannot have multiple properties with the same name.` The monitoring registration at `omp-agent.ts:1131` repeats the same (wrong) argv: `args: ['--mode', this.rpcMode, ...(this.config.args ?? [])]` |
551
- | D56 | `goose-agent.ts:44-45` | `promptDelivery: 'arg',` twice; compiler `goose-agent.ts(45,3): error TS1117` |
552
- | D57 | `goose-agent.ts:41` | `args.push('--with-extension', \`${nodePath} ${bridgePath}\`)` — two paths pre-joined into one argv element |
553
- | D58 | `one-shot-cli-agent.ts:117` | `export class OneShotCliAgentImpl extends BaseAgentImpl implements AgentInterface {` — `AgentInterface` is only `import type` at line 20-24, which does not list it; compiler `one-shot-cli-agent.ts(117,67): error TS2304: Cannot find name 'AgentInterface'` |
554
- | D59 | `qwen-agent.ts:205-235` | third copy of `supervise()` (base `base-agent.ts:137-166`, opencode `opencode-agent.ts:280-324`) — see §4.4 for why it never works |
555
-
556
- ### 5.10 Proposal — shared base class + util module
557
-
558
- **Move into `adapters/stdio-jsonrpc.ts` (or a new `adapters/stdio-rpc-agent.ts` subclass base):**
559
- everything shared by codex / dsh / qwen / hermes —
560
- `dispose` (`codex-agent.ts:112-125`, `dsh-agent.ts:116-129`, `qwen-agent.ts:140-153`, `hermes-agent.ts:95-108`),
561
- `getProcessInfo` (D36), `killProcess` (D37), `reconcileProcess` (D38), `getContextStats` (D39),
562
- `ensureClient` (D42), the `pidRef`/`onExit`/register/bind block (D44), `startClient` scaffolding (D43),
563
- `collectTurnEvents` (D34), the `enqueue` closure (D27) and the drain loop (D29).
564
- Net: ≈ **560 lines** of the 4 ACP/JSON-RPC adapters become one ≈ 180-line base.
565
-
566
- **Move into a new `agents/harness-turn.ts` util:** the event-queue turn machine
567
- (`enqueue`, `flushDelta`/`pushDelta` when applicable, stall watchdog, `onAbort`, 5 s abort fallback,
568
- `collectTurnEvents`) currently copied as D27/D29/D30/D32/D33/D34 — ≈ **340 lines across 8 files → ≈ 70**.
569
-
570
- **Move into `prompt-builder.ts`:** `taskText`/`msgText` (D15/D16) become `partsText()` (already at
571
- `base-agent.ts:189-197`); `fromId`/`requireReply`/`crossChannel`/`replyContext` (D17) becomes
572
- `peerContext(request)`; the `workerTurn`/`peerTurn` skeletons (D18/D19) collapse into two base
573
- template methods. ≈ **300 lines → ≈ 60**.
574
-
575
- **Move into `harness-env.ts`:** D1 all 8 call sites become `bridgeEnvFor(config, selfAgentId)`; add
576
- `registerBridgeProcess(client, meta)` covering D44/D5; delete the hand-rolled duplicate at
577
- `opencode-agent.ts:786-790`.
578
-
579
- **Move into `harness-process.ts`:** add `spawnKill(pid, child)` so `stdio-jsonrpc.ts:205` and
580
- `omp-rpc-client.ts:382` use the same tree-kill as `killProcess()`; add `registerAgentProcess(child,
581
- meta)` covering D44.
582
-
583
- **Move into `agents/harness-config.ts` (new):** the merge-only MCP config writers (D49) as
584
- `mergeMcpServer(file, { type?, command, args, trust? })` + `resolveHarnessHome(root, agentId)`
585
- (covering `safeId`, D10) + `assertSafeAbsolutePath` (D11).
586
-
587
- **Move into `registry.ts`:** `resolveCommand` (D6/D7) becomes `HarnessDef.resolveCommand(config)` so
588
- both the probe (`registry.ts:125,134,…`) and the adapter read the same function.
589
-
590
- **Delete outright:** all `private agentRole` / `private bridgeCtx` / `private supervising`
591
- re-declarations (D51-D53, 12 declarations), `qwen-agent.ts:205-235` (dead override, D59), the duplicate
592
- key at `omp-agent.ts:1113` (D55) and `goose-agent.ts:45` (D56), the two redundant
593
- `generateMcpBridgeEnv` evaluations at `dsh-agent.ts:485-486` (D2).
594
-
595
- Estimated net reduction: **≈ 1 500 lines** of the ~5 000 lines currently in the 13 adapters, with the
596
- divergences in D27/D29 and D51-D54 eliminated by construction.
597
-
598
- ## 6. Registry + base class
599
-
600
- ### 6.1 Registry enumeration — complete and correct
601
-
602
- `registry.ts:109-236` `export const HARNESS_REGISTRY: Record<string, HarnessDef> = {` contains
603
- **14 entries**: `mock` (110), `omp` (119), `opencode` (128), `codex` (137), `dsh` (146), `claude` (155),
604
- `gemini` (164), `copilot` (173), `cursor` (182), `crush` (191), `goose` (200), `qwen` (209), `pi` (218),
605
- `hermes` (227).
606
- That is **exactly one entry per adapter file** (13 harness adapters + `mock-agent.ts`) — no adapter is
607
- missing and none is registered twice. `factory.ts:10-12` delegates to
608
- `registry.ts:252-258 createAgentImplByHarness`.
609
-
610
- Every entry carries a `probe`; the two in-process engines declare
611
- `probe: { inprocess: true }` — `registry.ts:116` (mock) and `registry.ts:161` (claude) — matching
612
- `harness-availability.ts:90-92`. The 11 process engines' `probe.command` uses the same
613
- `cmdFrom(c) || harnessSettings().X_command` rule as the adapters, and
614
- `settings.ts:87-98` declares exactly those 11 keys (`opencode_command … hermes_command`, no
615
- `omp_command` because `registry.ts:125` hard-codes `'omp'`, matching `omp-agent.ts:1108`
616
- `const command = this.config.command ?? 'omp'`).
617
-
618
- Cross-file enumeration gaps found (outside the agents tree but same fact source):
619
- - `plugins/dev-stability-guard.ts:16` lists only 4 harnesses (`opencode|omp|codex|dsh`).
620
- - `scripts/e2e-multi-harness.ts:166` lists 12 (identical union minus `omp`) while
621
- `harness-models.ts:265-303` covers all 13 (`case 'omp' … case 'hermes'` + `default`).
622
-
623
- ### 6.2 Which adapters do NOT extend `BaseAgentImpl`
624
-
625
- Exactly one: **`mock-agent.ts:38`**
626
-
627
- ```ts
628
- 38: export class MockAgentImpl implements AgentInterface {
629
- ```
630
-
631
- It has no `dispose`, no `killProcess`/`getProcessInfo`, no `respondHitl` and no `onTurnSettled`
632
- — consistent with its in-process nature, but it also means it does not inherit the base
633
- `run()` dispatch (`base-agent.ts:114-125`); it re-implements it at `mock-agent.ts:68-81`.
634
-
635
- Declarations (verbatim):
636
-
637
- ```ts
638
- base-agent.ts:46 export abstract class BaseAgentImpl implements AgentInterface {
639
- adapters/one-shot-cli-agent.ts:117 export class OneShotCliAgentImpl extends BaseAgentImpl implements AgentInterface {
640
- codex-agent.ts:68 export class CodexAgentImpl extends BaseAgentImpl implements AgentInterface {
641
- claude-agent.ts:75 export class ClaudeSdkAgentImpl extends BaseAgentImpl implements AgentInterface {
642
- dsh-agent.ts:79 export class DshAgentImpl extends BaseAgentImpl implements AgentInterface {
643
- qwen-agent.ts:111 export class QwenAgentImpl extends BaseAgentImpl {
644
- hermes-agent.ts:64 export class HermesAgentImpl extends BaseAgentImpl implements AgentInterface {
645
- omp-agent.ts:129 export class OmpRpcAgentImpl extends BaseAgentImpl implements AgentInterface {
646
- opencode-agent.ts:110 export class OpenCodeAgentImpl extends BaseAgentImpl implements AgentInterface {
647
- gemini-agent.ts:112 export class GeminiAgentImpl extends OneShotCliAgentImpl {
648
- copilot-agent.ts:132 export class CopilotAgentImpl extends OneShotCliAgentImpl {
649
- cursor-agent.ts:98 export class CursorAgentImpl extends OneShotCliAgentImpl {
650
- crush-agent.ts:103 export class CrushAgentImpl extends OneShotCliAgentImpl {
651
- goose-agent.ts:94 export class GooseAgentImpl extends OneShotCliAgentImpl {
652
- pi-agent.ts:104 export class PiAgentImpl extends OneShotCliAgentImpl {
653
- mock-agent.ts:38 export class MockAgentImpl implements AgentInterface {
654
- ```
655
-
656
- So: 8 direct subclasses, 6 indirect (via `OneShotCliAgentImpl`), 1 (`mock`) outside the hierarchy.
657
- `QwenAgentImpl` is the only direct subclass that omits `implements AgentInterface` (it inherits the
658
- contract structurally).
659
-
660
- Two "extends BaseAgentImpl" declarations do not actually satisfy it:
661
- `opencode-agent.ts(110,14): error TS2515: Non-abstract class 'OpenCodeAgentImpl' does not implement
662
- inherited abstract member collectTurnEvents from class 'BaseAgentImpl'` — opencode never defines
663
- `collectTurnEvents` (it routes `supervise` through its own `runTurn` instead), so the base
664
- `supervise()` at `base-agent.ts:150` would call an undefined method if the override were removed.
1
+ # Harness-adapter audit — `server/services/workshop/agents/`
2
+
3
+ Read-only audit. All 20 requested files read completely (plus `registry.ts`, `base-agent.ts`,
4
+ `prompt-builder.ts`, `mock-agent.ts`, `harness-models.ts`, `harness-terminal.ts`, `plugin-tools.ts`,
5
+ `factory.ts` and the call sites `runtime/agent-runtime.ts`, `runtime/scheduler-loop.ts`,
6
+ `runtime/manager.ts`, `plugins/workshop.ts`, `plugins/dev-stability-guard.ts`).
7
+ Scratch artifacts only: `scripts/_audit/ndjson-partial-line-repro.mjs`,
8
+ `scripts/_audit/opencode-await-ternary-repro.mjs`.
9
+
10
+ Compiler evidence: `npx tsc --noEmit --skipLibCheck --target esnext --module esnext
11
+ --moduleResolution bundler <all adapters>` (alias-resolution errors filtered out; module-internal
12
+ errors reproduced below are independent of path aliases).
13
+
14
+ ---
15
+
16
+ ## 1. Child-process lifecycle
17
+
18
+ ### 1.1 Every spawn site (complete)
19
+
20
+ | # | site | API |
21
+ |---|---|---|
22
+ | S1 | `adapters/line-spawn.ts:114` `return launchChildProcess(file, args, {` | `child_process.spawn`, `shell: false` |
23
+ | S2 | `adapters/line-spawn.ts:105` `return launchChildProcess('cmd.exe', ['/d', '/s', '/c', ...line], {` | Windows `.cmd/.bat` shim |
24
+ | S3 | `adapters/omp-rpc-client.ts:246` `this.child = spawn(command, args, {` | **bypasses line-spawn** |
25
+ | S4 | `harness-process.ts:130` `const child = spawn('taskkill', ['/pid', String(pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' })` | tree-killer |
26
+
27
+ `spawnLineProcess` callers: `adapters/stdio-jsonrpc.ts:86`, `adapters/one-shot-cli-agent.ts:366`,
28
+ `opencode-agent.ts:734`, `harness-models.ts:53`.
29
+
30
+ S3 is a real gap: it does **not** go through `assertPlainExecutable` / `resolveOnPath` / the `cmd.exe`
31
+ shim, and it hard-codes `env: { ...process.env, ...this.options.env }` (omp-rpc-client.ts:249) so the
32
+ `cleanEnv` whitelist semantics of `line-spawn.ts:88-90` are unavailable to omp.
33
+
34
+ ### 1.2 The only tree-killer
35
+
36
+ `harness-process.ts:125-157`:
37
+
38
+ ```ts
39
+ 125: export function killHarnessProcess(pid: number): boolean {
40
+ ...
41
+ 129: if (process.platform === 'win32') {
42
+ 130: const child = spawn('taskkill', ['/pid', String(pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' })
43
+ ...
44
+ 139: process.kill(-pid, 'SIGKILL')
45
+ ...
46
+ 144: process.kill(pid, 'SIGKILL')
47
+ ```
48
+
49
+ Direct single-process kills that do **not** reap grandchildren:
50
+ `adapters/stdio-jsonrpc.ts:192` `this.child?.kill('SIGKILL')`;
51
+ `adapters/stdio-jsonrpc.ts:205` `this.child?.kill('SIGKILL')`;
52
+ `adapters/omp-rpc-client.ts:237` `this.child?.kill('SIGKILL')`;
53
+ `adapters/omp-rpc-client.ts:382` `this.child?.kill('SIGKILL')`;
54
+ `adapters/one-shot-cli-agent.ts:263` `child.kill('SIGKILL')`;
55
+ `harness-models.ts:61` `child.kill('SIGKILL')`.
56
+
57
+ ### 1.3 (a) Session end / `dispose()`
58
+
59
+ Only caller: `runtime/agent-runtime.ts:363-369`
60
+
61
+ ```ts
62
+ 363: // 清理 impl 持有的资源(omp 子进程等);容错:impl.dispose 可能不存在
63
+ 364: try {
64
+ 365: await this.impl.dispose?.()
65
+ ```
66
+
67
+ reached from `manager.shutdown()` (`runtime/manager.ts:992` `await Promise.all([...this.agentIndex.values()].map(a => a.stop()))`)
68
+ and from the Nitro hook `plugins/workshop.ts:168-174` `nitroApp.hooks.hook('close', async () => { ... await manager.shutdown() ... })`.
69
+
70
+ | adapter | dispose location | child killed? |
71
+ |---|---|---|
72
+ | omp | `omp-agent.ts:437-449` `await this.client.dispose()` | **single-process only** — `omp-rpc-client.ts:369-389` `this.child?.stdin?.end()` then `this.child?.kill('SIGKILL')` (382). omp's own grandchildren survive. |
73
+ | codex | `codex-agent.ts:112-125` `await client.dispose().catch(() => {})` | same weak path via `stdio-jsonrpc.ts:195-218` |
74
+ | dsh | `dsh-agent.ts:116-129` | same |
75
+ | qwen | `qwen-agent.ts:140-153` | same |
76
+ | hermes | `hermes-agent.ts:95-108` | same |
77
+ | opencode | `opencode-agent.ts:181-195` `killHarnessProcess(pid)` (185) | **tree** ✓ (+ `this.sseAbort?.abort()` 182) |
78
+ | one-shot (gemini/copilot/cursor/crush/goose/pi) | `one-shot-cli-agent.ts:148-151` → `killChild()` (253-265) → `killHarnessProcess(pid)` (259) | **tree** ✓ |
79
+ | claude | `claude-agent.ts:113-128` `this.abortCtrl?.abort()` (120), `await this.session?.interrupt?.()` (122) | **no process kill at all**; `getProcessInfo(): null` (`claude-agent.ts:130-132` `return null // SDK 自管二进制生命周期,无宿主侧进程句柄`) |
80
+ | mock | no `dispose` method (`mock-agent.ts:38` `export class MockAgentImpl implements AgentInterface {`) | n/a (in-process) |
81
+
82
+ Asymmetry worth fixing: `killProcess()` uses the tree killer while `dispose()` on the same class does
83
+ not — e.g. `codex-agent.ts:134-138`
84
+
85
+ ```ts
86
+ 134: killProcess(): void {
87
+ 135: const pid = this.client?.pid
88
+ 136: if (pid) killHarnessProcess(pid)
89
+ 137: else this.client?.kill()
90
+ ```
91
+
92
+ vs `codex-agent.ts:118` `await client.dispose().catch(() => {})` → `stdio-jsonrpc.ts:205`.
93
+
94
+ ### 1.4 (b) Error
95
+
96
+ - `one-shot-cli-agent.ts:442-444` — `child.on('error', ...)` calls `finishTurn(...)` only and **does not
97
+ clear `this.child`** (contrast the `exit` handler `one-shot-cli-agent.ts:445-447` `this.child = null`).
98
+ A later `killChild()` (`one-shot-cli-agent.ts:253-265`) then targets a stale pid.
99
+ - `harness-models.ts:59` `child.on('error', err => reject(err))` — the promise rejects but
100
+ the timeout timer created at `harness-models.ts:60` is **never cleared** and `child.kill()` is never
101
+ called on this path.
102
+ - `stdio-jsonrpc.ts:106-109`, `omp-rpc-client.ts:280-283` — handled (reject / notifyError).
103
+
104
+ ### 1.5 (c) Timeout
105
+
106
+ | adapter | per-turn timeout | on timeout | child killed? | error to UI |
107
+ |---|---|---|---|---|
108
+ | omp | `omp-agent.ts:838` `const idleTimeoutMs = this.config.promptTimeoutMs ?? 600_000` | `omp-agent.ts:915-928` | **yes** — `client.send({ type: 'abort' })` + `this.killProcess()` + `this.client = null` | `TURN_STALLED` error event (921-927) |
109
+ | one-shot | `one-shot-cli-agent.ts:206,238` `?? 600_000` | `one-shot-cli-agent.ts:495-502` | **yes** — `this.killChild()` (496) | `TURN_STALLED` (497-501) |
110
+ | codex | `codex-agent.ts:238,278` `?? 600_000` | `codex-agent.ts:463-469` | **no** — only `turn/interrupt` (464) | `CODEX_TURN_STALLED` (466-467) |
111
+ | claude | `claude-agent.ts:221,262` | `claude-agent.ts:391-397` | no — `this.session?.interrupt?.()` (392) | `CLAUDE_TURN_STALLED` (394) |
112
+ | dsh | `dsh-agent.ts:237,277` | `dsh-agent.ts:417-423` | no — `session/cancel` notify (418) | `DSH_TURN_STALLED` (420) |
113
+ | hermes | `hermes-agent.ts:209,249` | `hermes-agent.ts:379-385` | no | `HERMES_TURN_STALLED` (382) |
114
+ | qwen | `qwen-agent.ts:259,299` | `qwen-agent.ts:407-413` | no | `QWEN_TURN_STALLED` (410) |
115
+ | opencode | `opencode-agent.ts:349,391` | `opencode-agent.ts:505-516` | no — `POST /abort` (507) | `OPENCODE_TURN_STALLED` (510) |
116
+ | mock | none | — | — | — |
117
+
118
+ Non-killing timeout paths leave the pending promise resolved (they `enqueue`), so nothing hangs — but
119
+ the child process keeps running and keeps its model turn burning tokens.
120
+
121
+ Per-request (not per-turn) timeouts: `stdio-jsonrpc.ts:133-134`
122
+ `reject(new Error(\`${this.options.name} 请求超时: ${method} (id=${id},${timeoutMs ?? this.options.requestTimeoutMs ?? 60_000}ms)\`))`
123
+ (adapters pass `requestTimeoutMs: 60_000` — codex-agent.ts:613, dsh-agent.ts:500, qwen-agent.ts:486,
124
+ hermes-agent.ts:457 — except `harness-models.ts:110` `requestTimeoutMs: 30_000`);
125
+ `omp-rpc-client.ts:309-312` `reject(new Error(\`omp RPC 命令超时: ${command.type} (id=${id})\`))`, 60 s.
126
+
127
+ ### 1.6 (d) Parent process exit — **not guaranteed**
128
+
129
+ There is **no** `process.on('exit' | 'SIGINT' | 'SIGTERM' | 'beforeExit')` anywhere under `server/`
130
+ (only `unhandledRejection`: `plugins/workshop.ts:88`, `plugins/dev-stability-guard.ts:56`;
131
+ `uncaughtException`: `plugins/dev-stability-guard.ts:59`). Cleanup depends entirely on the Nitro
132
+ `close` hook (`plugins/workshop.ts:168`). Two concrete consequence paths:
133
+
134
+ 1. `plugins/dev-stability-guard.ts:53-54`
135
+ ```ts
136
+ 53: console.error(`[stability-guard] fatal ${kind}, exiting:\n${describe(reason)}`)
137
+ 54: process.exit(1)
138
+ ```
139
+ `process.exit(1)` skips the `close` hook entirely → **every live harness child is orphaned**.
140
+ The exemption regex only knows four engines — `plugins/dev-stability-guard.ts:16`
141
+ `const ENGINE_BOUNDARY = /\b(opencode|omp|codex|dsh) API\b/i` — so failures from
142
+ claude/gemini/copilot/cursor/crush/goose/qwen/pi/hermes are not exempted.
143
+ 2. The pid registry is process-local: `harness-process.ts:36`
144
+ `const registry = new Map<number, HarnessProcessEntry>()`. After a restart, orphaned children are
145
+ unreachable — `listAliveHarnessProcessesByAgent` (`harness-process.ts:87-89`) can only see pids
146
+ registered in the current process; there is no OS process-table scan.
147
+
148
+ ### 1.7 Windows-specific handling
149
+
150
+ - `windowsHide: true` — `line-spawn.ts:109`, `line-spawn.ts:118`, `omp-rpc-client.ts:250`,
151
+ `harness-process.ts:130`.
152
+ - `.cmd/.bat` shim: `line-spawn.ts:63-66` `if (lower.endsWith('.cmd') || lower.endsWith('.bat')) return { file, needsCmd: true }`
153
+ → `line-spawn.ts:99-112` fixed `'cmd.exe'`, `/d /s /c`, per-arg `assertCmdSafeArg` (`line-spawn.ts:78-83`
154
+ `/["\r\n\0]/.test(arg)`), `windowsVerbatimArguments: true` (111).
155
+ - Tree kill is Windows-`taskkill`-only (`harness-process.ts:130`); `process.kill(-pid, 'SIGKILL')`
156
+ (`harness-process.ts:139`) is guarded by `if (process.platform === 'win32')` at line 129, so on Windows
157
+ the POSIX branch never runs.
158
+ - `process.kill(pid, 0)` liveness probe: `harness-process.ts:107-116` (EPERM treated as alive, 114).
159
+ - `resolveOnPath` PATHEXT resolution: `line-spawn.ts:29-55`, incl. `.cmd` last-resort bare name (51-53).
160
+ - `one-shot-cli-agent.ts:104-106 sanitizePromptArg` exists specifically because `arg` delivery goes
161
+ through the cmd wrapper on Windows.
162
+
163
+ ### 1.8 stdio pipes drained?
164
+
165
+ | consumer | stdout | stderr |
166
+ |---|---|---|
167
+ | `stdio-jsonrpc.ts:97-105` | drained | drained (8 KB tail) |
168
+ | `omp-rpc-client.ts:253-279` | drained (8 MB line cap) | drained (1 MB cap, `STDERR_CAP` 130) |
169
+ | `one-shot-cli-agent.ts:404-432` | drained | drained (8 KB tail) |
170
+ | `opencode-agent.ts:745-748` | **NOT drained — no `child.stdout` reference in the file** | drained |
171
+ | `harness-models.ts:55-58` | drained | **NOT drained — no `child.stderr` reference in the file** |
172
+
173
+ `opencode serve` is long-lived (`opencode-agent.ts:734`), so an unread stdout that exceeds the OS pipe
174
+ buffer will block the engine mid-turn. `harness-models.collect()` is bounded by its 45–60 s timeout
175
+ (`harness-models.ts:79,144`), so it degrades to a timeout rather than a permanent hang, but returns a
176
+ truncated catalog.
177
+
178
+ ## 2. Unhandled promise rejection risk
179
+
180
+ **Overall: floating promises are overwhelmingly `.catch()`-guarded — I found no unguarded floating
181
+ promise that could reject.** The real rejection risk is *synchronous throws inside `async` methods*
182
+ (§4.3/§4.4), which the call sites do catch.
183
+
184
+ ### 2.1 Floating calls (all verified guarded)
185
+
186
+ `void`-guarded: `omp-rpc-client.ts:466`; `omp-agent.ts:169,348,455,596,1065,1171,1172`;
187
+ `claude-agent.ts:136,379,392,521`; `codex-agent.ts:430,464,528,556`; `dsh-agent.ts:389,573`;
188
+ `qwen-agent.ts:387,535`; `hermes-agent.ts:352,523`; `opencode-agent.ts:475,507,705,892`.
189
+
190
+ Floating but `.catch()`-ed (no `void`): `omp-agent.ts:873` `client.send({ type: 'abort' }).catch(() => {})`,
191
+ `omp-agent.ts:916` same shape.
192
+
193
+ ### 2.2 `async` setTimeout/setInterval callbacks without try/catch
194
+
195
+ There is **no `setInterval`** in any of the audited files. Every timer body is synchronous; the two
196
+ async timers-adjacent loops have internal try/catch:
197
+ `opencode-agent.ts:855-891` (`const connect = async (): Promise<void> => { while (...) { try { ... } catch (err) {...} } }`)
198
+ and `claude-agent.ts:521-533` `void (async () => { try { for await (const msg of session) ... } catch ... finally ... })()`.
199
+
200
+ ### 2.3 `timer.unref()`
201
+
202
+ Exactly three uses in the whole agents tree:
203
+ `tool-approvals.ts:83` `timer.unref?.()`, `harness-terminal.ts:301` `session.parkTimer.unref?.()`,
204
+ `opencode-agent.ts:92` `srv.unref()`.
205
+ **No per-turn / stall / poll / abort-fallback timer is unref'd.** (`AbortSignal.timeout` at
206
+ `opencode-agent.ts:766,912` is fine — verified at runtime that Node unrefs it: no `Timeout` appears in
207
+ `process.getActiveResourcesInfo()` after `AbortSignal.timeout(60000)`.)
208
+
209
+ ### 2.4 Leaked timers (never cleared, never unref'd)
210
+
211
+ | file:line | timer | note |
212
+ |---|---|---|
213
+ | `omp-rpc-client.ts:294` | `setTimeout(() => { if (!this.ready) reject(new Error('omp RPC ready 超时(10s)')) }, 10_000)` | no handle stored → refs the loop 10 s after every successful `start()` |
214
+ | `omp-agent.ts:620` | `const timer = setTimeout(abortTurn, timeoutMs)` | **not** cleared on the early-return path `omp-agent.ts:625-629` `if (opts.signal.aborted) { unsub(); resolve([]); return }` → later fires `omp-agent.ts:596` `void this.client?.send({ type: 'abort' }).catch(() => {})` against the shared omp subprocess, cancelling an unrelated live turn |
215
+ | `one-shot-cli-agent.ts:506-509` | `setTimeout(() => { resolveWait = null; r() }, Math.min(remaining + 100, 5000))` | no variable |
216
+ | `codex-agent.ts:473-476` | `setTimeout(() => { resolveWait = null; r() }, remaining + 100)` | no variable |
217
+ | `claude-agent.ts:401-404` | same shape | no variable |
218
+ | `dsh-agent.ts:427-430` | same shape | no variable |
219
+ | `qwen-agent.ts:417-420` | same shape | no variable |
220
+ | `hermes-agent.ts:389-392` | same shape | no variable |
221
+ | `codex-agent.ts:431-433` | `setTimeout(() => { if (!isDone) enqueue({ kind: 'done', ... }) }, 5000)` | abort fallback |
222
+ | `claude-agent.ts:380-382`, `dsh-agent.ts:381-383`, `qwen-agent.ts:380-382`, `hermes-agent.ts:345-347` | same 5 s abort fallback | |
223
+ | `opencode-agent.ts:477` | `setTimeout(() => finishTurn(), 5000)` | abort fallback |
224
+ | `harness-models.ts:60-63` | `const timer = setTimeout(...)` | cleared only on `exit` (65); the `error` path (59) leaks it |
225
+ | `omp-agent.ts:533`, `harness-terminal.ts:545` | `setTimeout(resolve, 150)` per poll iteration | bounded by 20 s / 8 s deadlines |
226
+
227
+ Correctly-cleared counterparts (for contrast): `opencode-agent.ts:520-528,536` and
228
+ `omp-agent.ts:932-940,948`.
229
+
230
+ ### 2.5 Leaked listeners
231
+
232
+ 1. **`adapters/omp-rpc-client.ts:269`** `this.eventListeners.add(onReady as (event: AgentSessionEvent) => void)`
233
+ — added inside `start()` on every (re)spawn, never removed; only `dispose()` clears
234
+ (`omp-rpc-client.ts:397` `this.eventListeners.clear()`). `handleExit` does not. The `onReady`
235
+ closure also captures the **previous** `resolve`/`reject` of an already-settled promise.
236
+ 2. **`adapters/stdio-jsonrpc.ts:208`** `this.child.once('exit', () => { clearTimeout(timer); resolve() })`
237
+ — on the 3 s timeout path (`stdio-jsonrpc.ts:204-207`) the promise resolves via the timer branch but
238
+ this listener is left attached.
239
+ 3. `adapters/stdio-jsonrpc.ts:102-105`, `:106-109`, `:110-117` — child listeners never removed
240
+ (`removeListener`/`off(` never appears in the file); bounded by child lifetime.
241
+ 4. `harness-terminal.ts:387-393 detachTerminalTap` — clears `unsubRaw` but not `session.batchTimer`,
242
+ so the pending 50 ms flush (`harness-terminal.ts:175-181`) survives detach.
243
+ 5. `adapters/one-shot-cli-agent.ts:406,430` and `opencode-agent.ts:746` — `data` listeners never
244
+ removed; bounded per-turn (one-shot) / per-server (opencode).
245
+ 6. No `request.destroy()`, no stream `destroy()`, and no `stdin.destroy()` anywhere; the only
246
+ teardown is `stdin.end()` (`stdio-jsonrpc.ts:199`, `omp-rpc-client.ts:371`, `one-shot-cli-agent.ts:484,488`).
247
+
248
+ ### 2.6 "Dangerous by construction" — `.then()` on an `AsyncGenerator`
249
+
250
+ `opencode-agent.ts:396-402`
251
+
252
+ ```ts
253
+ 396: private runTurn(
254
+ 397: prompt: string,
255
+ 398: taskId: string | undefined,
256
+ 399: opts: { timeoutMs: number, signal?: AbortSignal, beforeStart?: () => void, onDone?: () => void },
257
+ 400: ): AsyncGenerator<AgentEvent, void, unknown> {
258
+ 401: return this._runTurn(prompt, taskId, opts)
259
+ 402: }
260
+ ```
261
+
262
+ used at `opencode-agent.ts:301-323` `return await this.runTurn(prompt, undefined, {...}).then((events) => {...})`.
263
+ Compiler: `opencode-agent.ts(310,8): error TS2339: Property 'then' does not exist on type 'AsyncGenerator<AgentEvent, void, unknown>'`.
264
+ At runtime this is `TypeError: ... .then is not a function` inside `async supervise`, contradicting the
265
+ in-file intent at `opencode-agent.ts:281-282` ("绝不让引擎故障以 unhandledRejection 形态逃逸"). It is
266
+ caught downstream by `runtime/scheduler-loop.ts:309-312`, so opencode's LLM lead-scheduling silently
267
+ degrades to the rule engine on every tick.
268
+
269
+ ## 3. NDJSON / JSON-RPC streaming correctness
270
+
271
+ | site | cross-chunk buffer | `\r\n` | split JSON line | non-JSON banner |
272
+ |---|---|---|---|---|
273
+ | `adapters/stdio-jsonrpc.ts:234-252` | ✔ | ✔ via `line.trim()` (240) | ✔ | ✔ `catch { continue }` (246-248) |
274
+ | `adapters/omp-rpc-client.ts:404-424` | ✔ | ✔ via `line.trim()` (414) | ✔ | ✔ (420-422) |
275
+ | `opencode-agent.ts:866-883` (SSE) | ✔ | ✗ only `\n\n` (870) | ✔ (871) | ✔ (877-880) |
276
+ | `adapters/one-shot-cli-agent.ts:406-428` | ✗ **BUG** | ✔ `/\r?\n/` (411) | ✗ **lost** | ✗ dropped (418) |
277
+
278
+ Correct pattern (verbatim, `stdio-jsonrpc.ts:234-238`):
279
+
280
+ ```ts
281
+ 234: private onStdout(data: string): void {
282
+ 235: this.stdoutBuf += data
283
+ 236: if (this.stdoutBuf.length > 8 * 1024 * 1024) this.stdoutBuf = ''
284
+ 237: const lines = this.stdoutBuf.split('\n')
285
+ 238: this.stdoutBuf = lines.pop() ?? ''
286
+ ```
287
+
288
+ Caveat on 236: the cap check runs *before* the split, discarding the accumulated partial line — a
289
+ single frame > 8 MB desynchronises the stream (the remainder is then parsed as a fresh line).
290
+
291
+ ### 3.1 BUG — `one-shot-cli-agent.ts:406-428` parses each chunk with no line buffering
292
+
293
+ ```ts
294
+ 406: child.stdout?.on('data', (chunk: string) => {
295
+ ...
296
+ 411: for (const rawLine of chunk.split(/\r?\n/)) {
297
+ 412: const line = rawLine.trim()
298
+ 413: if (!line) continue
299
+ 414: const json = tryParse(line)
300
+ 415: if (json === null) {
301
+ 416: // 无结构化输出面的引擎:stdout 纯文本行即回复增量;其余(横幅/告警)忽略
302
+ 417: if (this.spec.plainTextStdout === true) sink.delta(line)
303
+ 418: continue
304
+ 419: }
305
+ ```
306
+
307
+ Concrete breaking input (executed — `scripts/_audit/ndjson-partial-line-repro.mjs`), one logical
308
+ NDJSON stream delivered as two `data` events because the payload exceeds the pipe read size (64 KiB):
309
+
310
+ ```
311
+ chunk#1 {"type":"message","role":"assistant","content":"hello wor
312
+ chunk#2 ld"}\n{"type":"result","usage":{"input_tokens":42}}\n
313
+ ```
314
+
315
+ Observed:
316
+
317
+ ```
318
+ A one-shot-cli-agent.ts loop : frames=1 ["result"] drops=2 ["{\"type\":\"message\",...,\"hello wor","ld\"}"] assistantText=""
319
+ B stdio-jsonrpc.ts loop : frames=2 ["message","result"]
320
+ ```
321
+
322
+ The whole assistant message is silently lost (never becomes a `delta`), and one frame disappears.
323
+ Affects every `OneShotCliAgentImpl` subclass without `plainTextStdout`: gemini, copilot, cursor,
324
+ goose, pi. `crush` sets `plainTextStdout: true` (`crush-agent.ts:67`) so it survives but with each
325
+ fragment `.trim()`-ed (411-412), altering leading/trailing whitespace of the answer.
326
+
327
+ Additional unbounded buffer: `one-shot-cli-agent.ts:405-409`
328
+
329
+ ```ts
330
+ 405: let stdoutAll = ''
331
+ 406: child.stdout?.on('data', (chunk: string) => {
332
+ 407: if (this.spec.wholeJsonAtExit === true) {
333
+ 408: stdoutAll += chunk
334
+ ```
335
+
336
+ `stdoutAll` has no cap. Latent only — no shipped spec sets `wholeJsonAtExit`
337
+ (only `crush-agent.ts:67` sets `plainTextStdout`).
338
+
339
+ ### 3.2 SSE caveat — `opencode-agent.ts:866-883`
340
+
341
+ ```ts
342
+ 869: buf += decoder.decode(value, { stream: true })
343
+ 870: const chunks = buf.split('\n\n')
344
+ 871: buf = chunks.pop() ?? ''
345
+ ```
346
+
347
+ Correct for `\n\n`-delimited SSE. Two gaps: (a) a CRLF-delimited stream (`\r\n\r\n`) never splits and
348
+ `buf` grows without bound; (b) multi-line `data:` payloads are parsed line-by-line (873-879), so a
349
+ payload split over two `data:` lines is rejected as non-JSON and dropped (880).
350
+
351
+ ### 3.3 Non-stream splits (safe)
352
+
353
+ `harness-models.ts:82` `for (const rawLine of out.split('\n'))`, `:146`, `:184` — `out` is the fully
354
+ collected stdout string, not a chunk. No `readline` usage anywhere in the tree.
355
+
356
+ ## 4. Timeout / retry / error propagation
357
+
358
+ ### 4.1 Per-turn timeout (quoted) — see table in §1.5
359
+
360
+ Every process-based adapter has one except `mock`. All default to `600_000` ms; supervise defaults to
361
+ `150_000` (`base-agent.ts:170`, `omp-agent.ts:576`, `opencode-agent.ts:300`, `qwen-agent.ts:219`).
362
+
363
+ ### 4.2 Correct propagation to `{ kind: 'error' }`
364
+
365
+ Timeout → error event, verified for all nine: `omp-agent.ts:921-927`, `one-shot-cli-agent.ts:497-501`,
366
+ `codex-agent.ts:465-468`, `claude-agent.ts:393-396`, `dsh-agent.ts:419-422`, `hermes-agent.ts:381-384`,
367
+ `qwen-agent.ts:409-412`, `opencode-agent.ts:508-514`. Non-zero child exit → error event:
368
+ `one-shot-cli-agent.ts:469-479`
369
+
370
+ ```ts
371
+ 469: if (code === 0) {
372
+ 470: finishTurn({ kind: 'done' })
373
+ 471: }
374
+ 472: else {
375
+ 473: const custom = this.spec.exitErrorMessage?.(code ?? -1, stderrTail)
376
+ 474: finishTurn({
377
+ 475: kind: 'error',
378
+ 476: code: `${this.spec.harnessId.toUpperCase()}_EXIT_${code ?? -1}`,
379
+ ```
380
+
381
+ Spawn failure → error event: `one-shot-cli-agent.ts:368-377`, `omp-agent.ts:652-660`.
382
+
383
+ ### 4.3 Swallowed errors (verbatim)
384
+
385
+ - `base-agent.ts:160-162`
386
+ ```ts
387
+ 160: catch {
388
+ 161: return []
389
+ 162: }
390
+ ```
391
+ `supervise()` failure produces **no AgentEvent at all** — every adapter that relies on the base
392
+ implementation (all except omp/opencode/qwen) loses the reason.
393
+ - `qwen-agent.ts:229-231` — the same `catch { return [] }`, duplicated.
394
+ - `opencode-agent.ts:320-323` `}).catch(() => { this.supervising = false; return [] })` and
395
+ `opencode-agent.ts:286-289` `catch (err) { log.warn(...); return [] }`.
396
+ - `codex-agent.ts:208-210` compact failure → `log.warn(... 放行)`; `opencode-agent.ts:270-272` same.
397
+ - `codex-agent.ts:725-727` `catch (err) { log.warn(\`[CodexAgent:${this.selfAgentId}] CODEX_HOME config 写入失败(信任全局配置):\`, ...) }`
398
+ — if the MCP section is not written, the agent runs **without tools** and the turn still reports `done`.
399
+ - `opencode-agent.ts:794-796` `catch (err) { log.warn(\`[OpenCodeAgent:${this.selfAgentId}] MCP 桥注册失败(host tools 不可用):\`, ...) }` — same class of silent capability loss.
400
+ - `claude-agent.ts:527-529` `catch (err) { log.warn(\`[ClaudeSdk:${this.selfAgentId}] 消息流异常: ...\`) }` — the SDK stream dies but `streamTurn` keeps waiting until the 600 s stall timer; the UI sees nothing until then.
401
+ - `omp-rpc-client.ts:420-422` `// 非 JSON 行(理论上不应出现):忽略` and `:549-551` `// chunk 重组失败:忽略`.
402
+ - `stdio-jsonrpc.ts:246-248` `catch { continue // 非 JSON 行(横幅/日志混流)忽略 }` — combined with a lost frame this is invisible.
403
+ - `harness-models.ts:142` `catch { /* 无凭据则按未登录目录输出 */ }`, `:243` `catch { /* 无 settings.yaml/解析失败 → 仅内置目录 */ }`.
404
+
405
+ ### 4.4 `async` methods that throw before doing any work
406
+
407
+ | method | throw | compiler evidence |
408
+ |---|---|---|
409
+ | `QwenAgentImpl.supervise` | `qwen-agent.ts:209` `const prompt = supervisePrompt({` — **`supervisePrompt` is not imported** (`qwen-agent.ts:30` imports only `peerPrompt, systemManual, toolArgsPreview, workerPrompt`) → `ReferenceError`; next failure would be `qwen-agent.ts:219` `const events = await this.collectTurn(...)` (the method is `collectTurnEvents`, `qwen-agent.ts:435`) and `qwen-agent.ts:226` `extractJsonArray(text)` (also not imported) | `qwen-agent.ts(209,20): TS2304: Cannot find name 'supervisePrompt'`; `(219,33): TS2339: Property 'collectTurn' does not exist`; `(226,22): TS2304: Cannot find name 'extractJsonArray'`; `(208,14)/(217,10)/(233,12): TS2341: Property 'supervising' is private and only accessible within class 'BaseAgentImpl'` |
410
+ | `OpenCodeAgentImpl.supervise` | `opencode-agent.ts:301` `.then(...)` on an AsyncGenerator | `opencode-agent.ts(310,8): TS2339` |
411
+ | `OpenCodeAgentImpl.respondHitl` | `opencode-agent.ts:252` `if (pending.timer) clearTimeout(p.timer)` — `p` is undefined in this scope (the loop variable `p` lives at 652 and 191) → `ReferenceError` **after** the engine was already answered (241/246/249) but **before** `this.pendingHitl.delete(id)` (253) and `getHitlRegistry().resolve(...)` (254) → the local map entry and the global HITL item leak forever, and the REST caller gets a 500 (`server/api/workshop/hitl/respond.post.ts:80` `await manager.respondHarnessHitl(...)` → `runtime/manager.ts:2821` `const ok = await runtime.respondHitl(kind, id, outcome)`) | `opencode-agent.ts(252,37): TS2304: Cannot find name 'p'` |
412
+ | `OpenCodeAgentImpl.startServer` | `opencode-agent.ts:805-808` — `await` binds tighter than `?:`, so `created` is a **Promise**, not the session object, and `String(created?.id ?? '')` is always `''`; entry into the 3× retry loop at 811-815 is therefore guaranteed (≥2.5 s `await sleep(2500)`) and the first, real, session is created and abandoned | `opencode-agent.ts(808,38): TS2339: Property 'id' does not exist on type 'Promise<Record<string, unknown>>'`; reproduced in `scripts/_audit/opencode-await-ternary-repro.mjs` (`created instanceof Promise = true`, `this.sessionId = ""`) |
413
+
414
+ ```ts
415
+ 805: const created = await (this.config.permission ?? DEFAULT_PERMISSION)
416
+ 806: ? createWith({ permission: this.config.permission ?? DEFAULT_PERMISSION }).catch(() => createWith(undefined))
417
+ 807: : createWith(undefined)
418
+ 808: this.sessionId = String(created?.id ?? '')
419
+ ```
420
+
421
+ Also note the ternary condition `this.config.permission ?? DEFAULT_PERMISSION` can never be falsy
422
+ (`DEFAULT_PERMISSION` is a 4-line array literal, `opencode-agent.ts:82-86`), so the `: createWith(undefined)`
423
+ branch at 807 is dead code and `permission` is always sent on the first attempt.
424
+
425
+ ## 5. DUPLICATION INVENTORY
426
+
427
+ Line ranges are exact. "Copies" counts textual copies of the same block; near-copies with token
428
+ renames are flagged.
429
+
430
+ ### 5.1 MCP-bridge env setup (`AW_BASE_URL` / `AW_AGENT_ID` / `AW_AGENT_TOKEN`)
431
+
432
+ | # | function / block | file:lines | copies |
433
+ |---|---|---|---|
434
+ | D1 | `generateMcpBridgeEnv({ agentId, token, baseUrl, bridgePath })` call site | `codex-agent.ts:606-612`, `codex-agent.ts:690`, `claude-agent.ts:452-457`, `dsh-agent.ts:477-484`, `qwen-agent.ts:461-466`, `hermes-agent.ts:438-443`, `adapters/one-shot-cli-agent.ts:296-301`, `gemini-agent.ts:119` | **8 sites / 7 files** |
435
+ | D2 | Redundant repeat calls of the *same* expression inside one function | `dsh-agent.ts:485`, `dsh-agent.ts:486` (three identical `generateMcpBridgeEnv(...)` evaluations in one call) | 3 extra evaluations |
436
+ | D3 | Hand-rolled `AW_*` literal object duplicating `harness-env.ts:41-53` | `opencode-agent.ts:786-790` vs `harness-env.ts:44-47` | **2 copies** |
437
+ | D4 | `\` ${k} = "${v}"\`` TOML env expansion | `codex-agent.ts:691` | 1 (no dup) |
438
+ | D5 | bridge launch pair `process.execPath` + bridge path | `codex-agent.ts:695-696`, `claude-agent.ts:506-508`, `qwen-agent.ts:75`, `gemini-agent.ts:49-51`, `copilot-agent.ts:61`, `cursor-agent.ts:46`, `opencode-agent.ts:784`, `crush-agent.ts:39-43`, `goose-agent.ts:40-41` | **9 copies** |
439
+
440
+ Canonical source being duplicated: `harness-env.ts:43-48`
441
+
442
+ ```ts
443
+ 43: const bridgeEnv = {
444
+ 44: AW_BASE_URL: resolvePlatformBaseUrl(input.baseUrl),
445
+ 45: AW_AGENT_ID: input.agentId,
446
+ 46: AW_AGENT_TOKEN: input.token ?? '',
447
+ 47: AW_MCP_TOOL_TIMEOUT_MS: String(200_000),
448
+ 48: }
449
+ ```
450
+
451
+ ### 5.2 `resolveCli` / binary path resolution
452
+
453
+ | # | function | file:lines | copies |
454
+ |---|---|---|---|
455
+ | D6 | `resolveCommand` one-liner `config => (typeof config.command === 'string' && config.command.trim() !== '' ? config.command.trim() : harnessSettings().X_command)` | `gemini-agent.ts:60`, `copilot-agent.ts:85`, `cursor-agent.ts:54`, `crush-agent.ts:59`, `goose-agent.ts:33`, `pi-agent.ts:52` | **6 byte-identical copies** (only the settings key differs) |
456
+ | D7 | same rule re-implemented for the registry probe | `registry.ts:106-107` `const cmdFrom = (config) => typeof config?.command === 'string' && config.command.trim() !== '' ? config.command.trim() : ''` | +1 |
457
+ | D8 | `getProcessInfo` fallback command strings `'opencode serve' / 'dsh --profile acp' / 'qwen --experimental-acp' / 'hermes acp' / 'codex app-server'` re-stating the spawn argv | `opencode-agent.ts:166`, `dsh-agent.ts:135`, `qwen-agent.ts:158`, `hermes-agent.ts:113`, `codex-agent.ts:131` | 5 |
458
+ | D9 | PATH probing: `probeExecutable` re-implements the explicit-path test and the POSIX PATH walk already in `resolveOnPath` | `harness-availability.ts:55-67` vs `adapters/line-spawn.ts:29-55` (explicit-path test `harness-availability.ts:58` ≈ `line-spawn.ts:39`) | 2 |
459
+ | D10 | `safeId(agentId)` (identical 4-line body) | `copilot-agent.ts:28-31`, `goose-agent.ts:26-29`, `pi-agent.ts:27-30` | **3 identical copies** |
460
+ | D11 | "absolute path, no `..`" override validation | `copilot-agent.ts:37-40`, `pi-agent.ts:36-39` | 2 |
461
+
462
+ ### 5.3 `spawn` option assembly
463
+
464
+ | # | block | file:lines | copies |
465
+ |---|---|---|---|
466
+ | D12 | `stdio: ['pipe', 'pipe', 'pipe']` literal | `adapters/line-spawn.ts:106`, `:115`, `adapters/omp-rpc-client.ts:247` | 3 (omp-rpc-client bypasses the shared helper) |
467
+ | D13 | `{ cwd: this.config.cwd ?? process.cwd(), env, windowsHide: true }` + `new StdioJsonRpcClient({...})` | `codex-agent.ts:601-614`, `dsh-agent.ts:494-501`, `qwen-agent.ts:480-487`, `hermes-agent.ts:451-458`, `harness-models.ts:110` | **5 copies** |
468
+ | D14 | `env = { ...bridge.bridgeEnv, ...(engine-specific keys) }` | `dsh-agent.ts:477-493`, `qwen-agent.ts:468-474`, `hermes-agent.ts:444-449`, `one-shot-cli-agent.ts:315-318`, `gemini-agent.ts:67-70`, `copilot-agent.ts:104-107`, `cursor-agent.ts:62-64`, `crush-agent.ts:68-73`, `goose-agent.ts:47-60`, `pi-agent.ts:66-71`, `claude-agent.ts:458-462`, `opencode-agent.ts:736-740` | **12 copies** |
469
+
470
+ ### 5.4 prompt / context assembly
471
+
472
+ | # | block | file:lines | copies |
473
+ |---|---|---|---|
474
+ | D15 | `const taskText = request.message.parts.map((p) => { if ('text' in p) ... }).join('\n')` — a re-implementation of `base-agent.ts:189-197 partsText()` | `codex-agent.ts:222-228`, `claude-agent.ts:205-211`, `dsh-agent.ts:221-227`, `qwen-agent.ts:243-249`, `hermes-agent.ts:193-199`, `opencode-agent.ts:332-338`, `omp-agent.ts:669-675` | **7 copies** |
475
+ | D16 | same block for `msgText` in `peerTurn` | `codex-agent.ts:256-262`, `claude-agent.ts:240-246`, `dsh-agent.ts:255-261`, `qwen-agent.ts:277-283`, `hermes-agent.ts:227-233`, `opencode-agent.ts:369-375`, `omp-agent.ts:722-728` | **7 copies** |
476
+ | D17 | `fromId` / `requireReply` / `crossChannel` / `toolState.replyContext` prelude | `codex-agent.ts:248-255`, `claude-agent.ts:232-239`, `dsh-agent.ts:247-254`, `qwen-agent.ts:269-276`, `hermes-agent.ts:219-226`, `opencode-agent.ts:361-368`, `one-shot-cli-agent.ts:215-222`, `omp-agent.ts:719-740` | **8 copies** |
477
+ | D18 | `workerTurn` skeleton (taskId → `toolState.currentTaskId` → prompt → `yield* streamTurn`) incl. `finally { this.toolState.currentTaskId = null }` | `codex-agent.ts:216-243`, `claude-agent.ts:198-226`, `dsh-agent.ts:215-242`, `qwen-agent.ts:237-264`, `hermes-agent.ts:187-214`, `opencode-agent.ts:326-356`, `one-shot-cli-agent.ts:192-211`, `omp-agent.ts:642-688` | **8 copies** |
478
+ | D19 | `peerTurn` skeleton | `codex-agent.ts:245-279`, `claude-agent.ts:228-263`, `dsh-agent.ts:244-278`, `qwen-agent.ts:266-300`, `hermes-agent.ts:216-250`, `opencode-agent.ts:358-392`, `one-shot-cli-agent.ts:213-239`, `omp-agent.ts:695-759` | **8 copies** |
479
+ | D20 | constructor identity block `super({ agentId: typeof config.agentId === 'string' ? ... , role: config.role === 'lead' ? 'lead' : 'worker', ... })` | `codex-agent.ts:95-100`, `claude-agent.ts:96-101`, `dsh-agent.ts:99-104`, `qwen-agent.ts:123-128`, `hermes-agent.ts:76-81`, `opencode-agent.ts:144-149`, `one-shot-cli-agent.ts:130-135`, `omp-agent.ts:398-403` | **8 copies** |
480
+ | D21 | `contextPrefix()` / `systemManual()` per-turn assembly paired with `workerPrompt`/`peerPrompt` | same 8 files, `workerTurn`/`peerTurn` bodies (see D18/D19) | 8 |
481
+ | D22 | `partsText` twin in the base itself | `base-agent.ts:189-197` — canonical, already exists | (target, not duplicate) |
482
+
483
+ ### 5.5 `parseXxxLine` / event-line mappers
484
+
485
+ | # | function | file:lines | copies |
486
+ |---|---|---|---|
487
+ | D23 | ACP `pushUpdate(params)` notification mapper (`agent_message_chunk` / `tool_call` / `tool_call_update` / usage) | `dsh-agent.ts:327-371`, `hermes-agent.ts:293-336` | **2 near-identical copies (~95 %)**; only `DSH_ACP_METHODS` vs `HERMES_ACP_METHODS` and 2 comment lines differ |
488
+ | D24 | inner `statusEvent(text)` helper | `dsh-agent.ts:335-344`, `hermes-agent.ts:301-310`, `claude-agent.ts:311-316`, `opencode-agent.ts:551-558`, `one-shot-cli-agent.ts:339-348` | **5 copies** |
489
+ | D25 | `tryParse(line)` JSON guard | `one-shot-cli-agent.ts:108-115` (only one in adapters; `stdio-jsonrpc.ts:244`, `omp-rpc-client.ts:417` are inline `JSON.parse`) | 1 + 2 inline |
490
+ | D26 | engine `mapLine` dispatch tables | `gemini-agent.ts:76-108`, `copilot-agent.ts:112-129`, `cursor-agent.ts:68-95`, `crush-agent.ts:78-100`, `goose-agent.ts:61-91`, `pi-agent.ts:82-101` | 6 (shape, not text) |
491
+
492
+ ### 5.6 output accumulation loops
493
+
494
+ | # | block | file:lines | copies |
495
+ |---|---|---|---|
496
+ | D27 | `enqueue` closure (artifact-before-done + `isDone` latch + `resolveWait?.()`) | `codex-agent.ts:301-322`, `dsh-agent.ts:304-324`, `hermes-agent.ts:271-291`, `qwen-agent.ts:321-340`, `claude-agent.ts:286-303`, `opencode-agent.ts:423-446`, `one-shot-cli-agent.ts:386-402`, `omp-agent.ts:826-832` | **8** (dsh/hermes/qwen are textually identical except qwen's missing `this.turnActive = false` at dsh:314/hermes:281 — behaviourally equivalent because qwen sets it in the following branch at 332-335) |
497
+ | D28 | artifact literal `{ kind: 'artifact', artifact: { artifactId: randomUUID(), name: 'output', parts: [{ text }], lastChunk: true, totalChunks: 1 } }` | `codex-agent.ts:304-309`, `dsh-agent.ts:307-312`, `hermes-agent.ts:274-279`, `qwen-agent.ts:324-329`, `claude-agent.ts:288-293`, `one-shot-cli-agent.ts:390-395`, `opencode-agent.ts:428-433` + `:460-465`, `omp-agent.ts:1035-1044` | **9** |
498
+ | D29 | drain loop `while (!isDone \|\| queue.length > 0)` + stall watchdog + `await new Promise((r) => { resolveWait = r; setTimeout(...) })` | `codex-agent.ts:460-478`, `claude-agent.ts:388-406`, `dsh-agent.ts:414-432`, `qwen-agent.ts:404-422`, `hermes-agent.ts:376-394`, `opencode-agent.ts:502-529`, `one-shot-cli-agent.ts:492-511`, `omp-agent.ts:912-941` | **8 copies** |
499
+ | D30 | `flushDelta` / `pushDelta` 50 ms delta batching | `codex-agent.ts:324-340`, `omp-agent.ts:845-861` | 2 |
500
+ | D31 | `const queue / let isDone / let resolveWait / let lastActivity / let agentText` state prelude | 8 files (same as D29) | 8 |
501
+ | D32 | abort fallback `setTimeout(() => { if (!isDone) enqueue({ kind: 'done', ... }) }, 5000)` | `codex-agent.ts:431-433`, `claude-agent.ts:380-382`, `dsh-agent.ts:381-383`, `qwen-agent.ts:380-382`, `hermes-agent.ts:345-347`, `opencode-agent.ts:477` | **6 copies** |
502
+ | D33 | `onAbort` handler (log + engine cancel + 5 s fallback) | `codex-agent.ts:428-434`, `claude-agent.ts:377-383`, `dsh-agent.ts:378-385`, `qwen-agent.ts:377-385`, `hermes-agent.ts:342-348`, `opencode-agent.ts:472-478`, `one-shot-cli-agent.ts:434-438`, `omp-agent.ts:871-883` | **8 copies** |
503
+ | D34 | `collectTurnEvents` (byte-identical) | `codex-agent.ts:494-501`, `claude-agent.ts:419-426`, `dsh-agent.ts:446-453`, `qwen-agent.ts:435-442`, `hermes-agent.ts:407-414`, `one-shot-cli-agent.ts:242-249` | **6 identical copies** (omp-agent.ts:145-192 is a 7th, differently implemented) |
504
+
505
+ ```ts
506
+ 494: protected async collectTurnEvents(prompt: string, timeoutMs: number, signal?: AbortSignal): Promise<AgentEvent[]> {
507
+ 495: const events: AgentEvent[] = []
508
+ 496: for await (const e of this.streamTurn(prompt, undefined, timeoutMs, signal)) {
509
+ 497: events.push(e)
510
+ 498: if (e.kind === 'error') break
511
+ 499: }
512
+ 500: return events
513
+ 501: }
514
+ ```
515
+
516
+ ### 5.7 `dispose` / `kill` / process-management bodies
517
+
518
+ | # | function | file:lines | copies |
519
+ |---|---|---|---|
520
+ | D35 | `dispose()` (client teardown + `markHarnessProcessExit` + pending-map timer clear) | `codex-agent.ts:112-125`, `dsh-agent.ts:116-129`, `qwen-agent.ts:140-153`, `hermes-agent.ts:95-108` | **4 near-identical** (+ variants `claude-agent.ts:113-128`, `one-shot-cli-agent.ts:148-151`, `opencode-agent.ts:181-195`, `omp-agent.ts:437-449`) |
521
+ | D36 | `getProcessInfo()` | `codex-agent.ts:127-132`, `dsh-agent.ts:131-136`, `qwen-agent.ts:155-159`, `hermes-agent.ts:110-114`, `opencode-agent.ts:163-167`, `omp-agent.ts:459-464`, `one-shot-cli-agent.ts:153-157` | **7** |
522
+ | D37 | `killProcess()` | `codex-agent.ts:134-138`, `dsh-agent.ts:138-142`, `qwen-agent.ts:161-165`, `hermes-agent.ts:116-120` (byte-identical 5-liners) + `opencode-agent.ts:169-173`, `omp-agent.ts:467-476` | **6** |
523
+ | D38 | `reconcileProcess()` | `codex-agent.ts:140-142`, `dsh-agent.ts:144-146`, `qwen-agent.ts:167-169`, `hermes-agent.ts:122-124` (identical) + `opencode-agent.ts:175-179`, `omp-agent.ts:483-485` | **6** |
524
+ | D39 | `getContextStats()` shape `{ usedTokens, contextWindow, percent, compacting }` | `codex-agent.ts:144-153`, `dsh-agent.ts:148-157`, `hermes-agent.ts:126-135`, `qwen-agent.ts:171-173`, `claude-agent.ts:139-148`, `opencode-agent.ts:199-208`, `omp-agent.ts:241-252`, `one-shot-cli-agent.ts:170-179` | **8** |
525
+ | D40 | `steer()` deferred stub | `dsh-agent.ts:160-162`, `qwen-agent.ts:175-177`, `hermes-agent.ts:137-139`, `one-shot-cli-agent.ts:181-183` | **4** |
526
+ | D41 | `respondHitl()` default throw | `base-agent.ts:102-110`, `one-shot-cli-agent.ts:186-188` | 2 |
527
+ | D42 | `ensureClient(ctx)` guard (`if (!this.workspace) ... ; if (!this.agentInfo) { ...refreshIdentity() } ; if (client?.alive && session) return ; clientStarting ??= startClient().finally(...)`) | `codex-agent.ts:581-597`, `dsh-agent.ts:457-473`, `qwen-agent.ts:446-457`, `hermes-agent.ts:418-434`, `opencode-agent.ts:714-726` (`ensureServer`), `omp-agent.ts:1092-1103` | **6** |
528
+ | D43 | `startClient()` scaffolding (`const command = config.command ?? harnessSettings().X` + `new StdioJsonRpcClient` + pidRef + onExit + `registerHarnessProcess`/`bindHarnessProcess` + handshake + session create) | `codex-agent.ts:599-664`, `dsh-agent.ts:475-545`, `qwen-agent.ts:459-511`, `hermes-agent.ts:436-497` | **4** (~60 lines each) |
529
+ | D44 | `const pidRef = { pid: undefined as number \| undefined }` + `client.onExit(...)` + `registerHarnessProcess` + `bindHarnessProcess` | `codex-agent.ts:615-626`, `dsh-agent.ts:502-513`, `qwen-agent.ts:488-499`, `hermes-agent.ts:459-470`, `one-shot-cli-agent.ts:380-384`, `opencode-agent.ts:749-753` | **6** |
530
+ | D45 | ACP `initialize` + version-retry + `session/new` + sessionId guard | `dsh-agent.ts:525-542`, `hermes-agent.ts:480-494` | **2 near-identical** |
531
+ | D46 | `registerXxxHitl` (registry.register + `harnessSettings().hitl_timeout_ms` + `setTimeout` fail-closed) | `codex-agent.ts:505-533` and `:535-560`, `dsh-agent.ts:547-577`, `hermes-agent.ts:499-527`, `qwen-agent.ts:513-539`, `opencode-agent.ts:686-710`, `claude-agent.ts:539-562` | **7** |
532
+ | D47 | `clearPending(id, resolution)` | `dsh-agent.ts:206-211`, `hermes-agent.ts:178-183` (identical), `qwen-agent.ts:196-201`, `claude-agent.ts:187-194 denyPending` | 4 |
533
+ | D48 | ACP allow/reject option picking | `dsh-agent.ts:182-201`, `hermes-agent.ts:154-173` | **2 identical** |
534
+ | D49 | ensure engine MCP config (read JSON → merge `mcpServers.aw` → write JSON) | `gemini-agent.ts:34-56`, `copilot-agent.ts:47-64`, `cursor-agent.ts:34-50`, `qwen-agent.ts:50-86` | **4** (+ TOML variant `codex-agent.ts:671-728`, bash variant `crush-agent.ts:35-55`) |
535
+
536
+ ### 5.8 Same-key config parsing (config interfaces)
537
+
538
+ | # | duplicated shape | file:lines | copies |
539
+ |---|---|---|---|
540
+ | D50 | `command / args / cwd / model / promptTimeoutMs / superviseTimeoutMs / systemPromptPrefix / scenarioPrompt / agentId / name / role / channelId / token / baseUrl / mcpBridgePath` re-declared | `codex-agent.ts:35-66`, `dsh-agent.ts:44-77`, `claude-agent.ts:39-61`, `hermes-agent.ts:42-62`, `qwen-agent.ts:88-109`, `opencode-agent.ts:40-78` (no index signature) and `one-shot-cli-agent.ts:82-101` (has one) | **7 interfaces**, 15 shared keys each |
541
+ | D51 | `private agentRole: 'lead' \| 'worker' = 'worker'` re-declared over `base-agent.ts:54 protected agentRole` | `codex-agent.ts:77`, `claude-agent.ts:78`, `dsh-agent.ts:88`, `qwen-agent.ts:114`, `hermes-agent.ts:67`, `opencode-agent.ts:119`, `omp-agent.ts:208` | **7 copies**; compiler: `TS2415 … Property 'agentRole' is private in type 'ClaudeSdkAgentImpl' but not in type 'BaseAgentImpl'` (and the same for Hermes/Omp/Qwen); at runtime the field initializer runs **after** `super()` and overwrites the value the base constructor set — masked only because `ensureClient` re-assigns it (`dsh-agent.ts:461`, `codex-agent.ts:585`, `opencode-agent.ts:718`, `hermes-agent.ts:422`, `omp-agent.ts:1099`) |
542
+ | D52 | `private readonly bridgeCtx = { identity: {...}, state: this.toolState, getWorkspace: () => this.workspace }` re-declared over `base-agent.ts:49` | `codex-agent.ts:71-75`, `dsh-agent.ts:82-86`, `opencode-agent.ts:113-117` | **3 copies**; compiler: `TS2415 … Property 'bridgeCtx' is private in type 'CodexAgentImpl' but not in type 'BaseAgentImpl'` (same for Dsh/OpenCode) |
543
+ | D53 | `private supervising = false` re-declared over `base-agent.ts:135` | `opencode-agent.ts:278`, `omp-agent.ts:554` | 2; compiler `TS2415` on `opencode-agent.ts(110,14)` |
544
+ | D54 | `configRecord()` return `Record<string, unknown>` with a non-index-signature config type | `codex-agent.ts:108-110`, `dsh-agent.ts:112-114`, `opencode-agent.ts:157-159` | 3; compiler `TS2322: Type 'CodexAgentConfig' is not assignable to type 'Record<string, unknown>'. Index signature for type 'string' is missing` |
545
+
546
+ ### 5.9 Duplicate object keys / dead code (verified literals)
547
+
548
+ | # | file:line | code |
549
+ |---|---|---|
550
+ | D55 | `omp-agent.ts:1112-1113` | `args: [...(this.config.thinkingLevel ? ['--thinking', this.config.thinkingLevel] : [])],` / `args: this.config.args,` — last key wins, so **`--thinking` is never passed**; compiler `omp-agent.ts(1113,9): error TS1117: An object literal cannot have multiple properties with the same name.` The monitoring registration at `omp-agent.ts:1131` repeats the same (wrong) argv: `args: ['--mode', this.rpcMode, ...(this.config.args ?? [])]` |
551
+ | D56 | `goose-agent.ts:44-45` | `promptDelivery: 'arg',` twice; compiler `goose-agent.ts(45,3): error TS1117` |
552
+ | D57 | `goose-agent.ts:41` | `args.push('--with-extension', \`${nodePath} ${bridgePath}\`)` — two paths pre-joined into one argv element |
553
+ | D58 | `one-shot-cli-agent.ts:117` | `export class OneShotCliAgentImpl extends BaseAgentImpl implements AgentInterface {` — `AgentInterface` is only `import type` at line 20-24, which does not list it; compiler `one-shot-cli-agent.ts(117,67): error TS2304: Cannot find name 'AgentInterface'` |
554
+ | D59 | `qwen-agent.ts:205-235` | third copy of `supervise()` (base `base-agent.ts:137-166`, opencode `opencode-agent.ts:280-324`) — see §4.4 for why it never works |
555
+
556
+ ### 5.10 Proposal — shared base class + util module
557
+
558
+ **Move into `adapters/stdio-jsonrpc.ts` (or a new `adapters/stdio-rpc-agent.ts` subclass base):**
559
+ everything shared by codex / dsh / qwen / hermes —
560
+ `dispose` (`codex-agent.ts:112-125`, `dsh-agent.ts:116-129`, `qwen-agent.ts:140-153`, `hermes-agent.ts:95-108`),
561
+ `getProcessInfo` (D36), `killProcess` (D37), `reconcileProcess` (D38), `getContextStats` (D39),
562
+ `ensureClient` (D42), the `pidRef`/`onExit`/register/bind block (D44), `startClient` scaffolding (D43),
563
+ `collectTurnEvents` (D34), the `enqueue` closure (D27) and the drain loop (D29).
564
+ Net: ≈ **560 lines** of the 4 ACP/JSON-RPC adapters become one ≈ 180-line base.
565
+
566
+ **Move into a new `agents/harness-turn.ts` util:** the event-queue turn machine
567
+ (`enqueue`, `flushDelta`/`pushDelta` when applicable, stall watchdog, `onAbort`, 5 s abort fallback,
568
+ `collectTurnEvents`) currently copied as D27/D29/D30/D32/D33/D34 — ≈ **340 lines across 8 files → ≈ 70**.
569
+
570
+ **Move into `prompt-builder.ts`:** `taskText`/`msgText` (D15/D16) become `partsText()` (already at
571
+ `base-agent.ts:189-197`); `fromId`/`requireReply`/`crossChannel`/`replyContext` (D17) becomes
572
+ `peerContext(request)`; the `workerTurn`/`peerTurn` skeletons (D18/D19) collapse into two base
573
+ template methods. ≈ **300 lines → ≈ 60**.
574
+
575
+ **Move into `harness-env.ts`:** D1 all 8 call sites become `bridgeEnvFor(config, selfAgentId)`; add
576
+ `registerBridgeProcess(client, meta)` covering D44/D5; delete the hand-rolled duplicate at
577
+ `opencode-agent.ts:786-790`.
578
+
579
+ **Move into `harness-process.ts`:** add `spawnKill(pid, child)` so `stdio-jsonrpc.ts:205` and
580
+ `omp-rpc-client.ts:382` use the same tree-kill as `killProcess()`; add `registerAgentProcess(child,
581
+ meta)` covering D44.
582
+
583
+ **Move into `agents/harness-config.ts` (new):** the merge-only MCP config writers (D49) as
584
+ `mergeMcpServer(file, { type?, command, args, trust? })` + `resolveHarnessHome(root, agentId)`
585
+ (covering `safeId`, D10) + `assertSafeAbsolutePath` (D11).
586
+
587
+ **Move into `registry.ts`:** `resolveCommand` (D6/D7) becomes `HarnessDef.resolveCommand(config)` so
588
+ both the probe (`registry.ts:125,134,…`) and the adapter read the same function.
589
+
590
+ **Delete outright:** all `private agentRole` / `private bridgeCtx` / `private supervising`
591
+ re-declarations (D51-D53, 12 declarations), `qwen-agent.ts:205-235` (dead override, D59), the duplicate
592
+ key at `omp-agent.ts:1113` (D55) and `goose-agent.ts:45` (D56), the two redundant
593
+ `generateMcpBridgeEnv` evaluations at `dsh-agent.ts:485-486` (D2).
594
+
595
+ Estimated net reduction: **≈ 1 500 lines** of the ~5 000 lines currently in the 13 adapters, with the
596
+ divergences in D27/D29 and D51-D54 eliminated by construction.
597
+
598
+ ## 6. Registry + base class
599
+
600
+ ### 6.1 Registry enumeration — complete and correct
601
+
602
+ `registry.ts:109-236` `export const HARNESS_REGISTRY: Record<string, HarnessDef> = {` contains
603
+ **14 entries**: `mock` (110), `omp` (119), `opencode` (128), `codex` (137), `dsh` (146), `claude` (155),
604
+ `gemini` (164), `copilot` (173), `cursor` (182), `crush` (191), `goose` (200), `qwen` (209), `pi` (218),
605
+ `hermes` (227).
606
+ That is **exactly one entry per adapter file** (13 harness adapters + `mock-agent.ts`) — no adapter is
607
+ missing and none is registered twice. `factory.ts:10-12` delegates to
608
+ `registry.ts:252-258 createAgentImplByHarness`.
609
+
610
+ Every entry carries a `probe`; the two in-process engines declare
611
+ `probe: { inprocess: true }` — `registry.ts:116` (mock) and `registry.ts:161` (claude) — matching
612
+ `harness-availability.ts:90-92`. The 11 process engines' `probe.command` uses the same
613
+ `cmdFrom(c) || harnessSettings().X_command` rule as the adapters, and
614
+ `settings.ts:87-98` declares exactly those 11 keys (`opencode_command … hermes_command`, no
615
+ `omp_command` because `registry.ts:125` hard-codes `'omp'`, matching `omp-agent.ts:1108`
616
+ `const command = this.config.command ?? 'omp'`).
617
+
618
+ Cross-file enumeration gaps found (outside the agents tree but same fact source):
619
+ - `plugins/dev-stability-guard.ts:16` lists only 4 harnesses (`opencode|omp|codex|dsh`).
620
+ - `scripts/e2e-multi-harness.ts:166` lists 12 (identical union minus `omp`) while
621
+ `harness-models.ts:265-303` covers all 13 (`case 'omp' … case 'hermes'` + `default`).
622
+
623
+ ### 6.2 Which adapters do NOT extend `BaseAgentImpl`
624
+
625
+ Exactly one: **`mock-agent.ts:38`**
626
+
627
+ ```ts
628
+ 38: export class MockAgentImpl implements AgentInterface {
629
+ ```
630
+
631
+ It has no `dispose`, no `killProcess`/`getProcessInfo`, no `respondHitl` and no `onTurnSettled`
632
+ — consistent with its in-process nature, but it also means it does not inherit the base
633
+ `run()` dispatch (`base-agent.ts:114-125`); it re-implements it at `mock-agent.ts:68-81`.
634
+
635
+ Declarations (verbatim):
636
+
637
+ ```ts
638
+ base-agent.ts:46 export abstract class BaseAgentImpl implements AgentInterface {
639
+ adapters/one-shot-cli-agent.ts:117 export class OneShotCliAgentImpl extends BaseAgentImpl implements AgentInterface {
640
+ codex-agent.ts:68 export class CodexAgentImpl extends BaseAgentImpl implements AgentInterface {
641
+ claude-agent.ts:75 export class ClaudeSdkAgentImpl extends BaseAgentImpl implements AgentInterface {
642
+ dsh-agent.ts:79 export class DshAgentImpl extends BaseAgentImpl implements AgentInterface {
643
+ qwen-agent.ts:111 export class QwenAgentImpl extends BaseAgentImpl {
644
+ hermes-agent.ts:64 export class HermesAgentImpl extends BaseAgentImpl implements AgentInterface {
645
+ omp-agent.ts:129 export class OmpRpcAgentImpl extends BaseAgentImpl implements AgentInterface {
646
+ opencode-agent.ts:110 export class OpenCodeAgentImpl extends BaseAgentImpl implements AgentInterface {
647
+ gemini-agent.ts:112 export class GeminiAgentImpl extends OneShotCliAgentImpl {
648
+ copilot-agent.ts:132 export class CopilotAgentImpl extends OneShotCliAgentImpl {
649
+ cursor-agent.ts:98 export class CursorAgentImpl extends OneShotCliAgentImpl {
650
+ crush-agent.ts:103 export class CrushAgentImpl extends OneShotCliAgentImpl {
651
+ goose-agent.ts:94 export class GooseAgentImpl extends OneShotCliAgentImpl {
652
+ pi-agent.ts:104 export class PiAgentImpl extends OneShotCliAgentImpl {
653
+ mock-agent.ts:38 export class MockAgentImpl implements AgentInterface {
654
+ ```
655
+
656
+ So: 8 direct subclasses, 6 indirect (via `OneShotCliAgentImpl`), 1 (`mock`) outside the hierarchy.
657
+ `QwenAgentImpl` is the only direct subclass that omits `implements AgentInterface` (it inherits the
658
+ contract structurally).
659
+
660
+ Two "extends BaseAgentImpl" declarations do not actually satisfy it:
661
+ `opencode-agent.ts(110,14): error TS2515: Non-abstract class 'OpenCodeAgentImpl' does not implement
662
+ inherited abstract member collectTurnEvents from class 'BaseAgentImpl'` — opencode never defines
663
+ `collectTurnEvents` (it routes `supervise` through its own `runTurn` instead), so the base
664
+ `supervise()` at `base-agent.ts:150` would call an undefined method if the override were removed.