agentworkshop 0.8.6 → 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 (1799) hide show
  1. package/.AgentWorkShop/prompts/host-tools.en.json +196 -68
  2. package/.AgentWorkShop/prompts/host-tools.json +5 -5
  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 +5 -5
  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/Buj_DMJ-.js +1 -0
  20. package/.output/public/_nuxt/Bv7dyPx4.js +1 -0
  21. package/.output/public/_nuxt/BvjY-Xks.js +1 -0
  22. package/.output/public/_nuxt/BxC9PAu-2.js +1 -0
  23. package/.output/public/_nuxt/Bzfzp9-f.js +1 -0
  24. package/.output/public/_nuxt/CT4bi_Y4.js +1 -0
  25. package/.output/public/_nuxt/CWcaJnFp.js +1 -0
  26. package/.output/public/_nuxt/CYLe9LKr.js +1 -0
  27. package/.output/public/_nuxt/CeCSjB9O2.js +1 -0
  28. package/.output/public/_nuxt/CnoJJb7B.js +1 -0
  29. package/.output/public/_nuxt/Crf8_Ad02.js +1 -0
  30. package/.output/public/_nuxt/CtMTOx_-2.js +1 -0
  31. package/.output/public/_nuxt/Cv9OcYm3.js +1 -0
  32. package/.output/public/_nuxt/CxIF09Zj2.js +1 -0
  33. package/.output/public/_nuxt/CxR0TyUA.js +1 -0
  34. package/.output/public/_nuxt/D9tNM-1a.js +9 -0
  35. package/.output/public/_nuxt/DL8QM0x5.js +1 -0
  36. package/.output/public/_nuxt/DO9Y3eoU.js +20 -0
  37. package/.output/public/_nuxt/DQLBGo6O.js +1 -0
  38. package/.output/public/_nuxt/DSqQKrMK2.js +1 -0
  39. package/.output/public/_nuxt/DXc4yISs.js +47 -0
  40. package/.output/public/_nuxt/DXmEuVFQ2.js +1 -0
  41. package/.output/public/_nuxt/DeXAMdSa2.js +1 -0
  42. package/.output/public/_nuxt/DjjOAXrj2.js +1 -0
  43. package/.output/public/_nuxt/DkRozlDP2.js +1 -0
  44. package/.output/public/_nuxt/DvI5fMX12.js +1 -0
  45. package/.output/public/_nuxt/DzWyfYJ12.js +2 -0
  46. package/.output/public/_nuxt/EXs4hr_w2.js +2 -0
  47. package/.output/public/_nuxt/LS9Wa05P.js +1 -0
  48. package/.output/public/_nuxt/MmlCf-EZ.js +1 -0
  49. package/.output/public/_nuxt/OmpTerminalPanel.DMWgGwDs.css +1 -0
  50. package/.output/public/_nuxt/PluginSlot.BqBzLD4T.css +1 -0
  51. package/.output/public/_nuxt/TownView.DQaU1HuK.css +1 -0
  52. package/.output/public/_nuxt/TugRY_4O.js +1 -0
  53. package/.output/public/_nuxt/UgCvr7b2.js +1 -0
  54. package/.output/public/_nuxt/WCG1-KXf2.js +16 -0
  55. package/.output/public/_nuxt/WybiLTow2.js +8 -0
  56. package/.output/public/_nuxt/YWsTLN5m.js +1 -0
  57. package/.output/public/_nuxt/Zn0BZpf0.js +3 -0
  58. package/.output/public/_nuxt/_id_.Be5JaH-P.css +1 -0
  59. package/.output/public/_nuxt/_wsId_.DSOfdfx2.css +1 -0
  60. package/.output/public/_nuxt/agents.CRomddYR.css +1 -0
  61. package/.output/public/_nuxt/aml.DgOMpDpv.css +1 -0
  62. package/.output/public/_nuxt/builds/latest.json +1 -1
  63. package/.output/public/_nuxt/builds/meta/02ba4bc7-f353-4183-a619-716921b5f0dc.json +1 -0
  64. package/.output/public/_nuxt/default.CpAx70gC.css +1 -0
  65. package/.output/public/_nuxt/eNEgl-ZF.js +1 -0
  66. package/.output/public/_nuxt/entry.Buc3k7Ha.css +1 -0
  67. package/.output/public/_nuxt/fJv3DH8b.js +1 -0
  68. package/.output/public/_nuxt/logs.6VGjPS34.css +1 -0
  69. package/.output/public/_nuxt/monitor.OoNTwfMJ.css +1 -0
  70. package/.output/public/_nuxt/ontology.D4P756Tc.css +1 -0
  71. package/.output/public/_nuxt/operations.C48ggFa5.css +1 -0
  72. package/.output/public/_nuxt/pages.Dpa28tJW.css +1 -0
  73. package/.output/public/_nuxt/permissions.CrV-4t-6.css +1 -0
  74. package/.output/public/_nuxt/px0VQ09m.js +2 -0
  75. package/.output/public/_nuxt/schedules.DYWOjGHm.css +1 -0
  76. package/.output/public/_nuxt/teams.DEJoJ4QV.css +1 -0
  77. package/.output/public/_nuxt/tokens.DKZWCP5v.css +1 -0
  78. package/.output/public/_nuxt/tools.DP-nsTli.css +1 -0
  79. package/.output/public/_nuxt/workshop.PT1xhP8C.css +1 -0
  80. package/.output/public/favicon.svg +14 -14
  81. package/.output/public/robots.txt +3 -3
  82. package/.output/server/chunks/_/AuthGate-G74Wr5IV.mjs +716 -0
  83. package/.output/server/chunks/_/AuthGate-G74Wr5IV.mjs.map +1 -0
  84. package/.output/server/chunks/_/FormItemContext-DmuQqaeJ.mjs +72 -0
  85. package/.output/server/chunks/_/FormItemContext-DmuQqaeJ.mjs.map +1 -0
  86. package/.output/server/chunks/_/LeftOutlined.mjs.map +1 -1
  87. package/.output/server/chunks/_/OmpTerminalPanel-CVn7GF98.mjs +942 -0
  88. package/.output/server/chunks/_/OmpTerminalPanel-CVn7GF98.mjs.map +1 -0
  89. package/.output/server/chunks/_/PluginSlot-CZlGlRoR.mjs +141 -0
  90. package/.output/server/chunks/_/PluginSlot-CZlGlRoR.mjs.map +1 -0
  91. package/.output/server/chunks/_/RightOutlined.mjs.map +1 -1
  92. package/.output/server/chunks/_/SearchOutlined.mjs +13 -13
  93. package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
  94. package/.output/server/chunks/_/TownView-CaxNtCrZ.mjs +6496 -0
  95. package/.output/server/chunks/_/TownView-CaxNtCrZ.mjs.map +1 -0
  96. package/.output/server/chunks/_/_id_-CvCH8aqA.mjs +2045 -0
  97. package/.output/server/chunks/_/_id_-CvCH8aqA.mjs.map +1 -0
  98. package/.output/server/chunks/_/_id_-X_k47fyM.mjs +392 -0
  99. package/.output/server/chunks/_/_id_-X_k47fyM.mjs.map +1 -0
  100. package/.output/server/chunks/_/_wsId_-CIXvt220.mjs +14589 -0
  101. package/.output/server/chunks/_/_wsId_-CIXvt220.mjs.map +1 -0
  102. package/.output/server/chunks/_/access.mjs +1 -1
  103. package/.output/server/chunks/_/agents-Bipi0xxl.mjs +1078 -0
  104. package/.output/server/chunks/_/agents-Bipi0xxl.mjs.map +1 -0
  105. package/.output/server/chunks/_/alert-CNGhs--Y.mjs +263 -0
  106. package/.output/server/chunks/_/alert-CNGhs--Y.mjs.map +1 -0
  107. package/.output/server/chunks/_/aml-gCTIxLoE.mjs +814 -0
  108. package/.output/server/chunks/_/aml-gCTIxLoE.mjs.map +1 -0
  109. package/.output/server/chunks/_/analysis-BrSFajFi.mjs +533 -0
  110. package/.output/server/chunks/_/analysis-BrSFajFi.mjs.map +1 -0
  111. package/.output/server/chunks/_/api--f4L9O86.mjs +64 -0
  112. package/.output/server/chunks/_/api--f4L9O86.mjs.map +1 -0
  113. package/.output/server/chunks/_/api-CRGCw6io.mjs +53 -0
  114. package/.output/server/chunks/_/api-CRGCw6io.mjs.map +1 -0
  115. package/.output/server/chunks/_/api-DKutH26K.mjs +72 -0
  116. package/.output/server/chunks/_/api-DKutH26K.mjs.map +1 -0
  117. package/.output/server/chunks/_/api-error-BrL8jXVC.mjs +47 -0
  118. package/.output/server/chunks/_/api-error-BrL8jXVC.mjs.map +1 -0
  119. package/.output/server/chunks/_/apiClient-DrCvj3Zb.mjs +81 -0
  120. package/.output/server/chunks/_/apiClient-DrCvj3Zb.mjs.map +1 -0
  121. package/.output/server/chunks/_/binding-authz.mjs +4 -1
  122. package/.output/server/chunks/_/binding-authz.mjs.map +1 -1
  123. package/.output/server/chunks/_/board-DB55AvRS.mjs +189 -0
  124. package/.output/server/chunks/_/board-DB55AvRS.mjs.map +1 -0
  125. package/.output/server/chunks/_/builtin-catalog-edpDcgfL.mjs.map +1 -0
  126. package/.output/server/chunks/_/card-BECE6y_G.mjs +953 -0
  127. package/.output/server/chunks/_/card-BECE6y_G.mjs.map +1 -0
  128. package/.output/server/chunks/_/channel-templates-C0Njk-Ir.mjs +942 -0
  129. package/.output/server/chunks/_/channel-templates-C0Njk-Ir.mjs.map +1 -0
  130. package/.output/server/chunks/_/chart-pipeline-BpoWYMK_.mjs.map +1 -0
  131. package/.output/server/chunks/_/chart-trend-BWeZh5Lv.mjs.map +1 -0
  132. package/.output/server/chunks/_/checkbox-C6xY5uc6.mjs +439 -0
  133. package/.output/server/chunks/_/checkbox-C6xY5uc6.mjs.map +1 -0
  134. package/.output/server/chunks/_/client-only-DQ6Q0w4J.mjs +43 -0
  135. package/.output/server/chunks/_/client-only-DQ6Q0w4J.mjs.map +1 -0
  136. package/.output/server/chunks/_/constants-HPHJvjne.mjs +142 -0
  137. package/.output/server/chunks/_/constants-HPHJvjne.mjs.map +1 -0
  138. package/.output/server/chunks/_/core-CRlsQhzd.mjs +294 -0
  139. package/.output/server/chunks/_/core-CRlsQhzd.mjs.map +1 -0
  140. package/.output/server/chunks/_/daq-VLM0Ud2Y.mjs +1266 -0
  141. package/.output/server/chunks/_/daq-VLM0Ud2Y.mjs.map +1 -0
  142. package/.output/server/chunks/_/data-Bgx_w04W.mjs +481 -0
  143. package/.output/server/chunks/_/data-Bgx_w04W.mjs.map +1 -0
  144. package/.output/server/chunks/_/dcw-BstEJzQ4.mjs +505 -0
  145. package/.output/server/chunks/_/dcw-BstEJzQ4.mjs.map +1 -0
  146. package/.output/server/chunks/_/dcw-driver-badge-Df5wL_ZA.mjs.map +1 -0
  147. package/.output/server/chunks/_/default-Dmo-rt5V.mjs +2353 -0
  148. package/.output/server/chunks/_/default-Dmo-rt5V.mjs.map +1 -0
  149. package/.output/server/chunks/_/descriptions-B3uhDesi.mjs +406 -0
  150. package/.output/server/chunks/_/descriptions-B3uhDesi.mjs.map +1 -0
  151. package/.output/server/chunks/_/drawer-DwXxapMg.mjs +834 -0
  152. package/.output/server/chunks/_/drawer-DwXxapMg.mjs.map +1 -0
  153. package/.output/server/chunks/_/dropdown-DLrGy-Fs.mjs +14 -0
  154. package/.output/server/chunks/_/dropdown-DLrGy-Fs.mjs.map +1 -0
  155. package/.output/server/chunks/_/dropdown-nsGv8Gqx.mjs +540 -0
  156. package/.output/server/chunks/_/dropdown-nsGv8Gqx.mjs.map +1 -0
  157. package/.output/server/chunks/_/entity.mjs +1 -1
  158. package/.output/server/chunks/_/error-500.mjs.map +1 -1
  159. package/.output/server/chunks/_/es-DXSEkmAm.mjs +43 -0
  160. package/.output/server/chunks/_/es-DXSEkmAm.mjs.map +1 -0
  161. package/.output/server/chunks/_/firstNotUndefined-laiThpLD.mjs +2448 -0
  162. package/.output/server/chunks/_/firstNotUndefined-laiThpLD.mjs.map +1 -0
  163. package/.output/server/chunks/_/form-Cw2Ex9w5.mjs +4712 -0
  164. package/.output/server/chunks/_/form-Cw2Ex9w5.mjs.map +1 -0
  165. package/.output/server/chunks/_/hasIn-RYRGomyg.mjs +553 -0
  166. package/.output/server/chunks/_/hasIn-RYRGomyg.mjs.map +1 -0
  167. package/.output/server/chunks/_/hitl-CQowkJ6s.mjs +132 -0
  168. package/.output/server/chunks/_/hitl-CQowkJ6s.mjs.map +1 -0
  169. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  170. package/.output/server/chunks/_/index.mjs +1 -1
  171. package/.output/server/chunks/_/input-CJgB-RL6.mjs +2181 -0
  172. package/.output/server/chunks/_/input-CJgB-RL6.mjs.map +1 -0
  173. package/.output/server/chunks/_/input-number-CQKL42p_.mjs +1120 -0
  174. package/.output/server/chunks/_/input-number-CQKL42p_.mjs.map +1 -0
  175. package/.output/server/chunks/_/interval-CfceaI3F.mjs +9 -0
  176. package/.output/server/chunks/_/interval-CfceaI3F.mjs.map +1 -0
  177. package/.output/server/chunks/_/isNumeric-DQiJ-b15.mjs +7 -0
  178. package/.output/server/chunks/_/isNumeric-DQiJ-b15.mjs.map +1 -0
  179. package/.output/server/chunks/_/line-scope.mjs +1 -1
  180. package/.output/server/chunks/_/logs-Dt4ejjjU.mjs +492 -0
  181. package/.output/server/chunks/_/logs-Dt4ejjjU.mjs.map +1 -0
  182. package/.output/server/chunks/_/menu-xO8ocVtL.mjs +1952 -0
  183. package/.output/server/chunks/_/menu-xO8ocVtL.mjs.map +1 -0
  184. package/.output/server/chunks/_/monitor-vqmGVVN5.mjs +2253 -0
  185. package/.output/server/chunks/_/monitor-vqmGVVN5.mjs.map +1 -0
  186. package/.output/server/chunks/_/narrow-fetch-CcG-BPxc.mjs.map +1 -0
  187. package/.output/server/chunks/_/nitro.mjs +3017 -2781
  188. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  189. package/.output/server/chunks/_/ontology-ih0HgPpL.mjs +1406 -0
  190. package/.output/server/chunks/_/ontology-ih0HgPpL.mjs.map +1 -0
  191. package/.output/server/chunks/_/operations-BHmdVOUk.mjs +311 -0
  192. package/.output/server/chunks/_/operations-BHmdVOUk.mjs.map +1 -0
  193. package/.output/server/chunks/_/optimizer-DyvIYE4A.mjs +202 -0
  194. package/.output/server/chunks/_/optimizer-DyvIYE4A.mjs.map +1 -0
  195. package/.output/server/chunks/_/pages-C2KTn0U1.mjs +542 -0
  196. package/.output/server/chunks/_/pages-C2KTn0U1.mjs.map +1 -0
  197. package/.output/server/chunks/_/pagination-BTzq7dD5.mjs +1346 -0
  198. package/.output/server/chunks/_/pagination-BTzq7dD5.mjs.map +1 -0
  199. package/.output/server/chunks/_/permissions-BbTI02WI.mjs +637 -0
  200. package/.output/server/chunks/_/permissions-BbTI02WI.mjs.map +1 -0
  201. package/.output/server/chunks/_/pipeline-BgNjQ4J3.mjs +212 -0
  202. package/.output/server/chunks/_/pipeline-BgNjQ4J3.mjs.map +1 -0
  203. package/.output/server/chunks/_/plugins-CplEv3mY.mjs +272 -0
  204. package/.output/server/chunks/_/plugins-CplEv3mY.mjs.map +1 -0
  205. package/.output/server/chunks/_/popconfirm-DuGF7ty-.mjs +340 -0
  206. package/.output/server/chunks/_/popconfirm-DuGF7ty-.mjs.map +1 -0
  207. package/.output/server/chunks/_/responsiveObserve-CzRpNXkr.mjs +78 -0
  208. package/.output/server/chunks/_/responsiveObserve-CzRpNXkr.mjs.map +1 -0
  209. package/.output/server/chunks/_/rest-auth.mjs +1 -1
  210. package/.output/server/chunks/_/schedules-BN4t_4PG.mjs +7172 -0
  211. package/.output/server/chunks/_/schedules-BN4t_4PG.mjs.map +1 -0
  212. package/.output/server/chunks/_/segmented-29uEKZ3D.mjs +341 -0
  213. package/.output/server/chunks/_/segmented-29uEKZ3D.mjs.map +1 -0
  214. package/.output/server/chunks/_/select-CJb2XrQf.mjs +3923 -0
  215. package/.output/server/chunks/_/select-CJb2XrQf.mjs.map +1 -0
  216. package/.output/server/chunks/_/settings-BQaAoT4q.mjs +1014 -0
  217. package/.output/server/chunks/_/settings-BQaAoT4q.mjs.map +1 -0
  218. package/.output/server/chunks/_/space-BByD-mFE.mjs +110 -0
  219. package/.output/server/chunks/_/space-BByD-mFE.mjs.map +1 -0
  220. package/.output/server/chunks/_/spin-XhbgGeLP.mjs +357 -0
  221. package/.output/server/chunks/_/spin-XhbgGeLP.mjs.map +1 -0
  222. package/.output/server/chunks/_/studio-D5r5Rzaq.mjs +336 -0
  223. package/.output/server/chunks/_/studio-D5r5Rzaq.mjs.map +1 -0
  224. package/.output/server/chunks/_/switch-DWcwVFxW.mjs +377 -0
  225. package/.output/server/chunks/_/switch-DWcwVFxW.mjs.map +1 -0
  226. package/.output/server/chunks/_/table-Zhuo7Fq-.mjs +7546 -0
  227. package/.output/server/chunks/_/table-Zhuo7Fq-.mjs.map +1 -0
  228. package/.output/server/chunks/_/tabs-BCwBXjNt.mjs +1924 -0
  229. package/.output/server/chunks/_/tabs-BCwBXjNt.mjs.map +1 -0
  230. package/.output/server/chunks/_/tag-CRW-anwy.mjs +1156 -0
  231. package/.output/server/chunks/_/tag-CRW-anwy.mjs.map +1 -0
  232. package/.output/server/chunks/_/teams-BUtsNTet.mjs +1203 -0
  233. package/.output/server/chunks/_/teams-BUtsNTet.mjs.map +1 -0
  234. package/.output/server/chunks/_/tokens-o8lT3x-p.mjs +1062 -0
  235. package/.output/server/chunks/_/tokens-o8lT3x-p.mjs.map +1 -0
  236. package/.output/server/chunks/_/tools-DRb5HTtU.mjs +487 -0
  237. package/.output/server/chunks/_/tools-DRb5HTtU.mjs.map +1 -0
  238. package/.output/server/chunks/_/tooltip-GlMrUZzx.mjs +920 -0
  239. package/.output/server/chunks/_/tooltip-GlMrUZzx.mjs.map +1 -0
  240. package/.output/server/chunks/_/town-BPA3G6yX.mjs +133 -0
  241. package/.output/server/chunks/_/town-BPA3G6yX.mjs.map +1 -0
  242. package/.output/server/chunks/_/town-BV-hbwb5.mjs +75 -0
  243. package/.output/server/chunks/_/town-BV-hbwb5.mjs.map +1 -0
  244. package/.output/server/chunks/_/types-D6J7slEa.mjs +5565 -0
  245. package/.output/server/chunks/_/types-D6J7slEa.mjs.map +1 -0
  246. package/.output/server/chunks/_/types-DWqIeMRP.mjs +76 -0
  247. package/.output/server/chunks/_/types-DWqIeMRP.mjs.map +1 -0
  248. package/.output/server/chunks/_/useAgentHarnessOptions-dDHiEoK2.mjs +124 -0
  249. package/.output/server/chunks/_/useAgentHarnessOptions-dDHiEoK2.mjs.map +1 -0
  250. package/.output/server/chunks/_/useAgentTemplateActions-S3dtH5UW.mjs +77 -0
  251. package/.output/server/chunks/_/useAgentTemplateActions-S3dtH5UW.mjs.map +1 -0
  252. package/.output/server/chunks/_/useAgentTemplateDialogState-CZzpu5og.mjs +67 -0
  253. package/.output/server/chunks/_/useAgentTemplateDialogState-CZzpu5og.mjs.map +1 -0
  254. package/.output/server/chunks/_/useAgentTemplateForm-D8gneIvd.mjs +117 -0
  255. package/.output/server/chunks/_/useAgentTemplateForm-D8gneIvd.mjs.map +1 -0
  256. package/.output/server/chunks/_/useAgentTemplatesCatalog-DHUpubKM.mjs +133 -0
  257. package/.output/server/chunks/_/useAgentTemplatesCatalog-DHUpubKM.mjs.map +1 -0
  258. package/.output/server/chunks/_/useAmlDatasets-CDg3Qbpv.mjs +92 -0
  259. package/.output/server/chunks/_/useAmlDatasets-CDg3Qbpv.mjs.map +1 -0
  260. package/.output/server/chunks/_/useAmlEntities-Bcaput4Y.mjs +86 -0
  261. package/.output/server/chunks/_/useAmlEntities-Bcaput4Y.mjs.map +1 -0
  262. package/.output/server/chunks/_/useAmlEnv-Dga_Nq6z.mjs +194 -0
  263. package/.output/server/chunks/_/useAmlEnv-Dga_Nq6z.mjs.map +1 -0
  264. package/.output/server/chunks/_/useAmlExperiments-CFngqLM3.mjs +89 -0
  265. package/.output/server/chunks/_/useAmlExperiments-CFngqLM3.mjs.map +1 -0
  266. package/.output/server/chunks/_/useAmlFormat-C2sl3MGB.mjs +82 -0
  267. package/.output/server/chunks/_/useAmlFormat-C2sl3MGB.mjs.map +1 -0
  268. package/.output/server/chunks/_/useAmlJobs-C7onZkcR.mjs +267 -0
  269. package/.output/server/chunks/_/useAmlJobs-C7onZkcR.mjs.map +1 -0
  270. package/.output/server/chunks/_/useAmlModels-B2b3mx4d.mjs +93 -0
  271. package/.output/server/chunks/_/useAmlModels-B2b3mx4d.mjs.map +1 -0
  272. package/.output/server/chunks/_/useAmlNotes-6gZX7tbx.mjs +86 -0
  273. package/.output/server/chunks/_/useAmlNotes-6gZX7tbx.mjs.map +1 -0
  274. package/.output/server/chunks/_/useAmlPredict-DwOmM2ke.mjs +130 -0
  275. package/.output/server/chunks/_/useAmlPredict-DwOmM2ke.mjs.map +1 -0
  276. package/.output/server/chunks/_/useAnalysisFeed-CpPsKh_I.mjs +129 -0
  277. package/.output/server/chunks/_/useAnalysisFeed-CpPsKh_I.mjs.map +1 -0
  278. package/.output/server/chunks/_/useDaqAddNode-QtJja03_.mjs +142 -0
  279. package/.output/server/chunks/_/useDaqAddNode-QtJja03_.mjs.map +1 -0
  280. package/.output/server/chunks/_/useDaqDetailBinding-Dd5c4bep.mjs +70 -0
  281. package/.output/server/chunks/_/useDaqDetailBinding-Dd5c4bep.mjs.map +1 -0
  282. package/.output/server/chunks/_/useDaqDetailFrames-C2gvrOr6.mjs +79 -0
  283. package/.output/server/chunks/_/useDaqDetailFrames-C2gvrOr6.mjs.map +1 -0
  284. package/.output/server/chunks/_/useDaqDetailHistory-Bhht_iFw.mjs +176 -0
  285. package/.output/server/chunks/_/useDaqDetailHistory-Bhht_iFw.mjs.map +1 -0
  286. package/.output/server/chunks/_/useDaqDetailNode-BayXtr5W.mjs +99 -0
  287. package/.output/server/chunks/_/useDaqDetailNode-BayXtr5W.mjs.map +1 -0
  288. package/.output/server/chunks/_/useDaqDetailParams-D8d1l3_R.mjs +159 -0
  289. package/.output/server/chunks/_/useDaqDetailParams-D8d1l3_R.mjs.map +1 -0
  290. package/.output/server/chunks/_/useDaqFilters-TYucwywj.mjs +222 -0
  291. package/.output/server/chunks/_/useDaqFilters-TYucwywj.mjs.map +1 -0
  292. package/.output/server/chunks/_/useDaqNodeWindow-1DWj2H5G.mjs +90 -0
  293. package/.output/server/chunks/_/useDaqNodeWindow-1DWj2H5G.mjs.map +1 -0
  294. package/.output/server/chunks/_/useDaqOptimizations-o5hubsm8.mjs +136 -0
  295. package/.output/server/chunks/_/useDaqOptimizations-o5hubsm8.mjs.map +1 -0
  296. package/.output/server/chunks/_/useDaqStream-BCTOU87S.mjs +395 -0
  297. package/.output/server/chunks/_/useDaqStream-BCTOU87S.mjs.map +1 -0
  298. package/.output/server/chunks/_/useDaqTemplates-Fj64LHfn.mjs +187 -0
  299. package/.output/server/chunks/_/useDaqTemplates-Fj64LHfn.mjs.map +1 -0
  300. package/.output/server/chunks/_/useDashboardCharts-D45083s_.mjs +354 -0
  301. package/.output/server/chunks/_/useDashboardCharts-D45083s_.mjs.map +1 -0
  302. package/.output/server/chunks/_/useDashboardData-Cm_-daeI.mjs +153 -0
  303. package/.output/server/chunks/_/useDashboardData-Cm_-daeI.mjs.map +1 -0
  304. package/.output/server/chunks/_/useDcwAddNode-DaqIQSXN.mjs +219 -0
  305. package/.output/server/chunks/_/useDcwAddNode-DaqIQSXN.mjs.map +1 -0
  306. package/.output/server/chunks/_/useDcwCards-OhzgHbAI.mjs +67 -0
  307. package/.output/server/chunks/_/useDcwCards-OhzgHbAI.mjs.map +1 -0
  308. package/.output/server/chunks/_/useDcwDetailScope-CaWcaiBg.mjs +184 -0
  309. package/.output/server/chunks/_/useDcwDetailScope-CaWcaiBg.mjs.map +1 -0
  310. package/.output/server/chunks/_/useDcwDetailTemplates-CrOgqQMX.mjs +148 -0
  311. package/.output/server/chunks/_/useDcwDetailTemplates-CrOgqQMX.mjs.map +1 -0
  312. package/.output/server/chunks/_/useDcwFilter-RH511Ra2.mjs +71 -0
  313. package/.output/server/chunks/_/useDcwFilter-RH511Ra2.mjs.map +1 -0
  314. package/.output/server/chunks/_/useDcwLedger-Dg61GD1J.mjs +79 -0
  315. package/.output/server/chunks/_/useDcwLedger-Dg61GD1J.mjs.map +1 -0
  316. package/.output/server/chunks/_/useDcwLineMutations-CiurWUFF.mjs +137 -0
  317. package/.output/server/chunks/_/useDcwLineMutations-CiurWUFF.mjs.map +1 -0
  318. package/.output/server/chunks/_/useDcwLineRun-DTSemEZb.mjs +104 -0
  319. package/.output/server/chunks/_/useDcwLineRun-DTSemEZb.mjs.map +1 -0
  320. package/.output/server/chunks/_/useDcwParamApprovals-DpnD-yw0.mjs +121 -0
  321. package/.output/server/chunks/_/useDcwParamApprovals-DpnD-yw0.mjs.map +1 -0
  322. package/.output/server/chunks/_/useDcwProducts-CRAl59cn.mjs +93 -0
  323. package/.output/server/chunks/_/useDcwProducts-CRAl59cn.mjs.map +1 -0
  324. package/.output/server/chunks/_/useDcwQuery-Cyh_iGa9.mjs +98 -0
  325. package/.output/server/chunks/_/useDcwQuery-Cyh_iGa9.mjs.map +1 -0
  326. package/.output/server/chunks/_/useDcwQuickActions-BW5-5HFn.mjs +88 -0
  327. package/.output/server/chunks/_/useDcwQuickActions-BW5-5HFn.mjs.map +1 -0
  328. package/.output/server/chunks/_/useDcwRecipes-Ct9bWJwP.mjs +258 -0
  329. package/.output/server/chunks/_/useDcwRecipes-Ct9bWJwP.mjs.map +1 -0
  330. package/.output/server/chunks/_/useDcwStream-BerzMqxo.mjs +455 -0
  331. package/.output/server/chunks/_/useDcwStream-BerzMqxo.mjs.map +1 -0
  332. package/.output/server/chunks/_/useDcwTemplates-PMVeSLNP.mjs +91 -0
  333. package/.output/server/chunks/_/useDcwTemplates-PMVeSLNP.mjs.map +1 -0
  334. package/.output/server/chunks/_/useDcwWrites-CND_sZdb.mjs +140 -0
  335. package/.output/server/chunks/_/useDcwWrites-CND_sZdb.mjs.map +1 -0
  336. package/.output/server/chunks/_/useDeviceTwins-FB6rTm-6.mjs +128 -0
  337. package/.output/server/chunks/_/useDeviceTwins-FB6rTm-6.mjs.map +1 -0
  338. package/.output/server/chunks/_/useExpConfirmations-b0bE75Yq.mjs +107 -0
  339. package/.output/server/chunks/_/useExpConfirmations-b0bE75Yq.mjs.map +1 -0
  340. package/.output/server/chunks/_/useLocalTime-BJ_4vg1E.mjs +55 -0
  341. package/.output/server/chunks/_/useLocalTime-BJ_4vg1E.mjs.map +1 -0
  342. package/.output/server/chunks/_/useLogsFormat-B-o4MHy7.mjs +77 -0
  343. package/.output/server/chunks/_/useLogsFormat-B-o4MHy7.mjs.map +1 -0
  344. package/.output/server/chunks/_/useLogsManual-Cxka55hz.mjs +89 -0
  345. package/.output/server/chunks/_/useLogsManual-Cxka55hz.mjs.map +1 -0
  346. package/.output/server/chunks/_/useLogsQuery-DxMHc7M4.mjs +150 -0
  347. package/.output/server/chunks/_/useLogsQuery-DxMHc7M4.mjs.map +1 -0
  348. package/.output/server/chunks/_/useLogsScope-HuOiW-OR.mjs +83 -0
  349. package/.output/server/chunks/_/useLogsScope-HuOiW-OR.mjs.map +1 -0
  350. package/.output/server/chunks/_/useMonitorColumns-vVnt3r5Q.mjs +217 -0
  351. package/.output/server/chunks/_/useMonitorColumns-vVnt3r5Q.mjs.map +1 -0
  352. package/.output/server/chunks/_/useMonitorData-Bf3w2khj.mjs +135 -0
  353. package/.output/server/chunks/_/useMonitorData-Bf3w2khj.mjs.map +1 -0
  354. package/.output/server/chunks/_/useMonitorFormat-DsiVqWoa.mjs +91 -0
  355. package/.output/server/chunks/_/useMonitorFormat-DsiVqWoa.mjs.map +1 -0
  356. package/.output/server/chunks/_/useMonitorTerminal-Dj4QwRNW.mjs +71 -0
  357. package/.output/server/chunks/_/useMonitorTerminal-Dj4QwRNW.mjs.map +1 -0
  358. package/.output/server/chunks/_/useOperationsFeed-Bg35fcgt.mjs +195 -0
  359. package/.output/server/chunks/_/useOperationsFeed-Bg35fcgt.mjs.map +1 -0
  360. package/.output/server/chunks/_/useOpsLog-BEzBrMf4.mjs +149 -0
  361. package/.output/server/chunks/_/useOpsLog-BEzBrMf4.mjs.map +1 -0
  362. package/.output/server/chunks/_/useRecipeDispatchApprovals-CZfcMRYk.mjs +156 -0
  363. package/.output/server/chunks/_/useRecipeDispatchApprovals-CZfcMRYk.mjs.map +1 -0
  364. package/.output/server/chunks/_/useResponsive-BKDMGTHs.mjs.map +1 -0
  365. package/.output/server/chunks/_/useTeamActions-CmiuiQiG.mjs +79 -0
  366. package/.output/server/chunks/_/useTeamActions-CmiuiQiG.mjs.map +1 -0
  367. package/.output/server/chunks/_/useTeamAddMemberDialog-CMpzf0jO.mjs +84 -0
  368. package/.output/server/chunks/_/useTeamAddMemberDialog-CMpzf0jO.mjs.map +1 -0
  369. package/.output/server/chunks/_/useTeamCreateDialog-BnvjXWso.mjs +97 -0
  370. package/.output/server/chunks/_/useTeamCreateDialog-BnvjXWso.mjs.map +1 -0
  371. package/.output/server/chunks/_/useTeamDeployDialog-C0FOUYep.mjs +80 -0
  372. package/.output/server/chunks/_/useTeamDeployDialog-C0FOUYep.mjs.map +1 -0
  373. package/.output/server/chunks/_/useTeamDialogState-CFRUQxAf.mjs +82 -0
  374. package/.output/server/chunks/_/useTeamDialogState-CFRUQxAf.mjs.map +1 -0
  375. package/.output/server/chunks/_/useTeamPluginDialog-Do-07a47.mjs +103 -0
  376. package/.output/server/chunks/_/useTeamPluginDialog-Do-07a47.mjs.map +1 -0
  377. package/.output/server/chunks/_/useTeamsCatalog-ClG_gBI8.mjs +123 -0
  378. package/.output/server/chunks/_/useTeamsCatalog-ClG_gBI8.mjs.map +1 -0
  379. package/.output/server/chunks/_/useTokenClipboard-CwQpoFeP.mjs +72 -0
  380. package/.output/server/chunks/_/useTokenClipboard-CwQpoFeP.mjs.map +1 -0
  381. package/.output/server/chunks/_/useTokenCreate-C4g5eKd3.mjs +115 -0
  382. package/.output/server/chunks/_/useTokenCreate-C4g5eKd3.mjs.map +1 -0
  383. package/.output/server/chunks/_/useTokenRename-ClWrxpNk.mjs +87 -0
  384. package/.output/server/chunks/_/useTokenRename-ClWrxpNk.mjs.map +1 -0
  385. package/.output/server/chunks/_/useTokenReveal-C8n1Vt9t.mjs +118 -0
  386. package/.output/server/chunks/_/useTokenReveal-C8n1Vt9t.mjs.map +1 -0
  387. package/.output/server/chunks/_/useTokensList-CgiH2W1C.mjs +92 -0
  388. package/.output/server/chunks/_/useTokensList-CgiH2W1C.mjs.map +1 -0
  389. package/.output/server/chunks/_/useTownBus-D9SoIsAN.mjs.map +1 -0
  390. package/.output/server/chunks/_/useWorkbenchAuth-DSstfK5Z.mjs +141 -0
  391. package/.output/server/chunks/_/useWorkbenchAuth-DSstfK5Z.mjs.map +1 -0
  392. package/.output/server/chunks/_/useWorkbenchWorkspaces-l_0SUOzn.mjs +138 -0
  393. package/.output/server/chunks/_/useWorkbenchWorkspaces-l_0SUOzn.mjs.map +1 -0
  394. package/.output/server/chunks/_/useWorkshopApi-Bqe2FlsB.mjs +127 -0
  395. package/.output/server/chunks/_/useWorkshopApi-Bqe2FlsB.mjs.map +1 -0
  396. package/.output/server/chunks/_/useWorkshopWs-DP4MbZsb.mjs +1659 -0
  397. package/.output/server/chunks/_/useWorkshopWs-DP4MbZsb.mjs.map +1 -0
  398. package/.output/server/chunks/_/useWorkspaceAuth-CzDigJGl.mjs +60 -0
  399. package/.output/server/chunks/_/useWorkspaceAuth-CzDigJGl.mjs.map +1 -0
  400. package/.output/server/chunks/_/useWorkspaceChannels-BLtsS6-m.mjs +92 -0
  401. package/.output/server/chunks/_/useWorkspaceChannels-BLtsS6-m.mjs.map +1 -0
  402. package/.output/server/chunks/_/useWorkspacePanels-CTwREmq0.mjs +78 -0
  403. package/.output/server/chunks/_/useWorkspacePanels-CTwREmq0.mjs.map +1 -0
  404. package/.output/server/chunks/_/useWorkspaceShell-rQHWNNWJ.mjs +168 -0
  405. package/.output/server/chunks/_/useWorkspaceShell-rQHWNNWJ.mjs.map +1 -0
  406. package/.output/server/chunks/_/users-BM1ZzxPp.mjs +569 -0
  407. package/.output/server/chunks/_/users-BM1ZzxPp.mjs.map +1 -0
  408. package/.output/server/chunks/_/workshop-CUXCV3RH.mjs +546 -0
  409. package/.output/server/chunks/_/workshop-CUXCV3RH.mjs.map +1 -0
  410. package/.output/server/chunks/_/workspaces-CmW0cpOt.mjs.map +1 -0
  411. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  412. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +1 -1
  413. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +1 -1
  414. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  415. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs.map +1 -1
  416. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +19 -0
  417. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs.map +1 -1
  418. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  419. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
  420. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
  421. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  422. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
  423. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
  424. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
  425. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
  426. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
  427. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
  428. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  429. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  430. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  431. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
  432. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
  433. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
  434. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
  435. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
  436. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
  437. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  438. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  439. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  440. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
  441. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
  442. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  443. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  444. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
  445. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +1 -1
  446. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
  447. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
  448. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
  449. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
  450. package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +1 -1
  451. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +1 -1
  452. package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs +1 -1
  453. package/.output/server/chunks/routes/api/workshop/channels/_id/execution-mode.patch.mjs +1 -1
  454. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
  455. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs +1 -1
  456. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
  457. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  458. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  459. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
  460. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
  461. package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs +1 -1
  462. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  463. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  464. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  465. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  466. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
  467. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  468. package/.output/server/chunks/routes/api/workshop/daq/index2.post.mjs +1 -1
  469. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  470. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  471. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  472. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  473. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  474. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  475. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  476. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  477. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  478. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  479. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  480. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  481. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  482. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  483. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  484. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  485. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  486. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  487. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
  488. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  489. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  490. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  491. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  492. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  493. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  494. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  495. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
  496. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
  497. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
  498. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
  499. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  500. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  501. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  502. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  503. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +1 -1
  504. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  505. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  506. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +1 -1
  507. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  508. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  509. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  510. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  511. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  512. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  513. package/.output/server/chunks/routes/api/workshop/eda/index6.get.mjs +1 -1
  514. package/.output/server/chunks/routes/api/workshop/eda/index6.post.mjs +1 -1
  515. package/.output/server/chunks/routes/api/workshop/eda/vm/predict.post.mjs +1 -1
  516. package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +1 -1
  517. package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +1 -1
  518. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  519. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  520. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  521. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  522. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  523. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  524. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  525. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  526. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +18 -6
  527. package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
  528. package/.output/server/chunks/routes/api/workshop/optimization/index2.mjs +1 -1
  529. package/.output/server/chunks/routes/api/workshop/optimization/profiles/_id/publish.post.mjs +1 -1
  530. package/.output/server/chunks/routes/api/workshop/process-model/datasets.post.mjs +1 -1
  531. package/.output/server/chunks/routes/api/workshop/process-model/eligibility.mjs +1 -1
  532. package/.output/server/chunks/routes/api/workshop/process-model/experiments.mjs +1 -1
  533. package/.output/server/chunks/routes/api/workshop/process-model/index.mjs +1 -1
  534. package/.output/server/chunks/routes/api/workshop/process-model/train.post.mjs +1 -1
  535. package/.output/server/chunks/routes/renderer.mjs +1 -1
  536. package/.output/server/chunks/routes/renderer.mjs.map +1 -1
  537. package/.output/server/chunks/virtual/entry.mjs +394 -376
  538. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  539. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  540. package/.output/server/chunks/virtual/precomputed.mjs.map +1 -1
  541. package/.output/server/index.mjs +1 -1
  542. package/.output/server/package.json +1 -1
  543. package/README-zh.md +4 -3
  544. package/README.md +13 -8
  545. package/app/components/AwLogo.vue +75 -75
  546. package/app/components/aml/AmlDatasetFormModal.vue +279 -279
  547. package/app/components/aml/AmlDatasetTable.vue +319 -319
  548. package/app/components/aml/AmlExperimentsTable.vue +142 -142
  549. package/app/components/aml/AmlInfraBanner.vue +23 -23
  550. package/app/components/aml/AmlJobsTable.vue +248 -248
  551. package/app/components/aml/AmlOverviewBar.vue +62 -62
  552. package/app/components/aml/AmlPageHeader.vue +47 -47
  553. package/app/components/aml/AmlPredictConsole.vue +201 -201
  554. package/app/components/app-header/HitlBell.vue +423 -423
  555. package/app/components/daq/DaqAddNodeModal.vue +209 -209
  556. package/app/components/daq/DaqAlarmBar.vue +46 -46
  557. package/app/components/daq/DaqControlCard.vue +159 -159
  558. package/app/components/daq/DaqInfraBanner.vue +31 -31
  559. package/app/components/daq/DaqLineBanner.vue +47 -47
  560. package/app/components/daq/DaqNodePanel.vue +396 -396
  561. package/app/components/daq/DaqOptPanel.vue +197 -197
  562. package/app/components/daq/DaqTemplateModal.vue +246 -246
  563. package/app/components/dashboard/DashboardGaugeBand.vue +78 -78
  564. package/app/components/dashboard/DashboardHero.vue +209 -209
  565. package/app/components/dashboard/DashboardLineStatePanel.vue +78 -78
  566. package/app/components/dashboard/DashboardNodeStatePanel.vue +46 -46
  567. package/app/components/dashboard/DashboardPipelinePanel.vue +46 -46
  568. package/app/components/dashboard/DashboardTrendPanel.vue +83 -83
  569. package/app/components/dashboard/DashboardWritePanel.vue +52 -52
  570. package/app/components/dcw/DcwCreateLineModal.vue +105 -105
  571. package/app/components/dcw/DcwDeleteLineModal.vue +73 -73
  572. package/app/components/dcw/DcwDetailTemplateModal.vue +238 -238
  573. package/app/components/dcw/DcwLedgerCard.vue +160 -160
  574. package/app/components/dcw/DcwMesArtifacts.vue +140 -140
  575. package/app/components/dcw/DcwProductCreateModal.vue +113 -113
  576. package/app/components/dcw/DcwRecipeDispatchHistoryModal.vue +244 -244
  577. package/app/components/dcw/DcwRecipeEditModal.vue +399 -399
  578. package/app/components/dcw/DcwRecipeHistoryModal.vue +165 -165
  579. package/app/components/dcw/DcwRunDataModal.vue +191 -191
  580. package/app/components/dcw/DcwTemplateModal.vue +227 -227
  581. package/app/components/dcw/DcwWriteHistoryCard.vue +96 -96
  582. package/app/components/dcw/ExpConfirmCard.vue +103 -103
  583. package/app/components/dcw/RecipeDispatchApprovalCard.vue +330 -330
  584. package/app/components/logs/LogsEventTable.vue +36 -3
  585. package/app/components/logs/LogsManualModal.vue +23 -1
  586. package/app/components/logs/LogsPageHead.vue +122 -71
  587. package/app/components/monitor/MonitorAgentTable.vue +143 -143
  588. package/app/components/monitor/MonitorChannelTable.vue +80 -80
  589. package/app/components/monitor/MonitorLoginGate.vue +24 -24
  590. package/app/components/monitor/MonitorPageHead.vue +92 -92
  591. package/app/components/monitor/MonitorProcessTable.vue +159 -159
  592. package/app/components/ontology/OntologyGraph.vue +356 -356
  593. package/app/components/operations/OperationsFilterCard.vue +164 -164
  594. package/app/components/operations/OperationsPageHead.vue +47 -47
  595. package/app/components/tokens/TokenCreateModal.vue +42 -42
  596. package/app/components/tokens/TokenOnceModal.vue +164 -164
  597. package/app/components/tokens/TokenRenameModal.vue +40 -40
  598. package/app/components/tokens/TokensPageHead.vue +76 -76
  599. package/app/components/workshop/A2aRpcDebugger.vue +237 -237
  600. package/app/components/workshop/AgentInspectorDrawer.vue +424 -424
  601. package/app/components/workshop/AgentLanesView.vue +278 -278
  602. package/app/components/workshop/ArtifactCard.vue +120 -120
  603. package/app/components/workshop/AssetLibrary.vue +452 -452
  604. package/app/components/workshop/ChatMemberPanel.vue +556 -556
  605. package/app/components/workshop/CommandPalette.vue +270 -270
  606. package/app/components/workshop/Composer.vue +540 -540
  607. package/app/components/workshop/DaqTemplateIcon.vue +33 -33
  608. package/app/components/workshop/DeviceTwinPanel.vue +167 -167
  609. package/app/components/workshop/FileSelectorModal.vue +188 -188
  610. package/app/components/workshop/InspectorPanel.vue +301 -301
  611. package/app/components/workshop/PluginSlot.vue +120 -120
  612. package/app/components/workshop/TranscriptTimeline.vue +223 -223
  613. package/app/components/workshop/agents/AgentTemplateEditModal.vue +139 -139
  614. package/app/components/workshop/blocks/ClusterArtifact.vue +61 -61
  615. package/app/components/workshop/blocks/ClusterError.vue +85 -85
  616. package/app/components/workshop/blocks/ClusterLife.vue +87 -87
  617. package/app/components/workshop/blocks/ClusterMember.vue +95 -95
  618. package/app/components/workshop/blocks/ClusterMemory.vue +84 -84
  619. package/app/components/workshop/blocks/ClusterOther.vue +67 -67
  620. package/app/components/workshop/blocks/ClusterStatus.vue +149 -149
  621. package/app/components/workshop/blocks/ClusterTool.vue +176 -176
  622. package/app/components/workshop/blocks/EventBlockAvatar.vue +114 -114
  623. package/app/components/workshop/blocks/EventBlockHead.vue +232 -232
  624. package/app/components/workshop/composer/ComposerToolbar.vue +278 -278
  625. package/app/components/workshop/composer/MentionMenu.vue +135 -135
  626. package/app/components/workshop/composer/ReplyChip.vue +65 -65
  627. package/app/components/workshop/composer/StatusChip.vue +171 -171
  628. package/app/components/workshop/console/Dock.vue +71 -71
  629. package/app/components/workshop/console/LeftPane.vue +84 -84
  630. package/app/components/workshop/device-twin/DeviceTwinCard.vue +265 -265
  631. package/app/components/workshop/device-twin/DeviceTwinDcwSection.vue +203 -203
  632. package/app/components/workshop/lanes/AddMemberModal.vue +270 -270
  633. package/app/components/workshop/lanes/EditMemberModal.vue +106 -106
  634. package/app/components/workshop/lanes/LanesToolbar.vue +97 -97
  635. package/app/components/workshop/session-list/MountChannelModal.vue +124 -124
  636. package/app/components/workshop/session-list/SaveTemplateModal.vue +93 -93
  637. package/app/components/workshop/task-board/Card.vue +172 -172
  638. package/app/components/workshop/task-board/Column.vue +151 -151
  639. package/app/components/workshop/task-board/List.vue +157 -157
  640. package/app/components/workshop/task-board/StatusMenu.vue +88 -88
  641. package/app/components/workshop/teams/TeamAddMemberModal.vue +53 -53
  642. package/app/components/workshop/teams/TeamCreateModal.vue +94 -94
  643. package/app/components/workshop/teams/TeamDeployModal.vue +40 -40
  644. package/app/components/workshop/teams/TeamPluginModal.vue +119 -119
  645. package/app/components/workshop/terminal/OmpTerminalPanel.vue +270 -270
  646. package/app/components/workshop/terminal/TerminalHitlCard.vue +170 -170
  647. package/app/components/workshop/town/TownScene.ts +466 -466
  648. package/app/components/workshop/town/TownView.vue +561 -561
  649. package/app/components/workshop/town/components/AutoModeConfirmModal.vue +94 -94
  650. package/app/components/workshop/town/components/TownAgentBindings.vue +417 -405
  651. package/app/components/workshop/town/components/TownAgentInspector.vue +554 -554
  652. package/app/components/workshop/town/components/TownAlarmList.vue +147 -147
  653. package/app/components/workshop/town/components/TownBoundaryPanel.vue +350 -350
  654. package/app/components/workshop/town/components/TownCalloutLayer.vue +147 -147
  655. package/app/components/workshop/town/components/TownChannelDock.vue +116 -116
  656. package/app/components/workshop/town/components/TownControlDock.vue +405 -405
  657. package/app/components/workshop/town/components/TownDaqNodeInspector.vue +345 -345
  658. package/app/components/workshop/town/components/TownDaqTree.vue +366 -366
  659. package/app/components/workshop/town/components/TownDcwBindSection.vue +473 -473
  660. package/app/components/workshop/town/components/TownDcwNodeInspector.vue +185 -185
  661. package/app/components/workshop/town/components/TownDcwTree.vue +280 -280
  662. package/app/components/workshop/town/components/TownDeviceBindings.vue +394 -394
  663. package/app/components/workshop/town/components/TownDeviceTransform.vue +248 -248
  664. package/app/components/workshop/town/components/TownEventList.vue +120 -120
  665. package/app/components/workshop/town/components/TownHealthBody.vue +100 -100
  666. package/app/components/workshop/town/components/TownKpiStrip.vue +207 -207
  667. package/app/components/workshop/town/components/TownLeftRail.vue +308 -308
  668. package/app/components/workshop/town/components/TownLoadingMask.vue +61 -61
  669. package/app/components/workshop/town/components/TownNavMap.vue +154 -154
  670. package/app/components/workshop/town/components/TownRightRail.vue +543 -543
  671. package/app/components/workshop/town/components/TownStage.vue +281 -281
  672. package/app/components/workshop/town/components/TownStageTop.vue +238 -238
  673. package/app/components/workshop/town/components/TownStatusBar.vue +108 -108
  674. package/app/components/workshop/town/components/TownTopNav.vue +367 -367
  675. package/app/components/workshop/town/components/TownTrendDock.vue +178 -178
  676. package/app/components/workshop/town/scene/town-scene-agents.ts +254 -254
  677. package/app/components/workshop/town/scene/town-scene-behavior.ts +194 -194
  678. package/app/components/workshop/town/scene/town-scene-bubbles.ts +96 -96
  679. package/app/components/workshop/town/scene/town-scene-core.ts +158 -158
  680. package/app/components/workshop/town/scene/town-scene-models.ts +109 -109
  681. package/app/components/workshop/town/scene/town-scene-visuals.ts +279 -279
  682. package/app/components/workshop/town/scene/town-scene3d-agents.ts +308 -308
  683. package/app/components/workshop/town/scene/town-scene3d-blocks.ts +297 -297
  684. package/app/components/workshop/town/scene/town-scene3d-bubbles.ts +281 -281
  685. package/app/components/workshop/town/scene/town-scene3d-camera.ts +282 -282
  686. package/app/components/workshop/town/scene/town-scene3d-devices.ts +433 -433
  687. package/app/components/workshop/town/scene/town-scene3d-editing.ts +490 -490
  688. package/app/components/workshop/town/scene/town-scene3d-events.ts +173 -173
  689. package/app/components/workshop/town/scene/town-scene3d-factory.ts +412 -412
  690. package/app/components/workshop/town/scene/town-scene3d-hud.ts +110 -110
  691. package/app/components/workshop/town/scene/town-scene3d-lifecycle.ts +144 -144
  692. package/app/components/workshop/town/scene/town-scene3d-links.ts +141 -141
  693. package/app/components/workshop/town/scene/town-scene3d-loop.ts +286 -286
  694. package/app/components/workshop/town/scene/town-scene3d-models.ts +154 -154
  695. package/app/components/workshop/town/scene/town-scene3d-nodes.ts +562 -562
  696. package/app/components/workshop/town/scene/town-scene3d-ranges.ts +273 -273
  697. package/app/components/workshop/town/scene/town-scene3d-renderer.ts +320 -320
  698. package/app/components/workshop/town/scene/town-scene3d-selection.ts +257 -257
  699. package/app/components/workshop/town/scene/town-scene3d-types.ts +264 -264
  700. package/app/components/workshop/transcript/TranscriptBlockList.vue +68 -68
  701. package/app/components/workshop/transcript/TranscriptEarlierPager.vue +81 -81
  702. package/app/components/workshop/transcript/TranscriptFilterBar.vue +126 -126
  703. package/app/components/workshop/workbench/CreateWorkspaceModal.vue +36 -36
  704. package/app/components/workshop/workbench/WorkspaceEmpty.vue +56 -56
  705. package/app/composables/useResponsive.ts +88 -88
  706. package/app/composables/workshop/device-twin-types.ts +29 -29
  707. package/app/composables/workshop/event-blocks/attention.ts +58 -58
  708. package/app/composables/workshop/event-blocks/classify.ts +44 -44
  709. package/app/composables/workshop/event-blocks/clusterer.ts +231 -231
  710. package/app/composables/workshop/event-blocks/fold-stream.ts +45 -45
  711. package/app/composables/workshop/event-blocks/markdown.ts +81 -81
  712. package/app/composables/workshop/event-blocks/mentions.ts +49 -49
  713. package/app/composables/workshop/event-blocks/text-utils.ts +100 -100
  714. package/app/composables/workshop/event-blocks/types.ts +40 -40
  715. package/app/composables/workshop/town/town-relay-props.ts +231 -231
  716. package/app/composables/workshop/town/town-view-types.ts +145 -145
  717. package/app/composables/workshop/town/useTownAgentBindings.ts +183 -182
  718. package/app/composables/workshop/town/useTownAgentChat.ts +203 -203
  719. package/app/composables/workshop/town/useTownAlarms.ts +36 -36
  720. package/app/composables/workshop/town/useTownCallouts.ts +174 -174
  721. package/app/composables/workshop/town/useTownChannels.ts +220 -220
  722. package/app/composables/workshop/town/useTownHealth.ts +66 -66
  723. package/app/composables/workshop/town/useTownHudTickers.ts +77 -77
  724. package/app/composables/workshop/town/useTownLayout.ts +277 -277
  725. package/app/composables/workshop/town/useTownNavMap.ts +301 -301
  726. package/app/composables/workshop/town/useTownNodeBindings.ts +345 -345
  727. package/app/composables/workshop/town/useTownPanelDrag.ts +91 -91
  728. package/app/composables/workshop/town/useTownRailData.ts +421 -421
  729. package/app/composables/workshop/town/useTownSceneControl.ts +92 -92
  730. package/app/composables/workshop/town/useTownSceneInput.ts +275 -275
  731. package/app/composables/workshop/town/useTownSceneRuntime.ts +390 -390
  732. package/app/composables/workshop/town/useTownSheets.ts +41 -41
  733. package/app/composables/workshop/town/useTownTrends.ts +93 -93
  734. package/app/composables/workshop/useChannelList.ts +88 -88
  735. package/app/composables/workshop/useChannelTerminals.ts +65 -65
  736. package/app/composables/workshop/useComposerMentions.ts +130 -130
  737. package/app/composables/workshop/useDcwStream.ts +377 -374
  738. package/app/composables/workshop/useDeviceTwinDcwWrite.ts +77 -77
  739. package/app/composables/workshop/useDeviceTwinPanel.ts +56 -56
  740. package/app/composables/workshop/useEscClose.ts +44 -44
  741. package/app/composables/workshop/useEventBlockView.ts +159 -159
  742. package/app/composables/workshop/useEventBlocks.ts +33 -33
  743. package/app/composables/workshop/useHitlAnswer.ts +184 -184
  744. package/app/composables/workshop/useLaneWidths.ts +27 -27
  745. package/app/composables/workshop/useOmpTerminalSession.ts +424 -424
  746. package/app/composables/workshop/useOpsLog.ts +1 -1
  747. package/app/composables/workshop/usePluginAdmin.ts +152 -152
  748. package/app/composables/workshop/usePluginPanels.ts +72 -72
  749. package/app/composables/workshop/useRuntimeConfigDraft.ts +118 -118
  750. package/app/composables/workshop/useSettingsGroups.ts +243 -243
  751. package/app/composables/workshop/useTaskBoardColumns.ts +47 -47
  752. package/app/composables/workshop/useTerminalRenderer.ts +308 -308
  753. package/app/composables/workshop/useTranscriptEnterStage.ts +48 -48
  754. package/app/composables/workshop/useTranscriptHistory.ts +52 -52
  755. package/app/composables/workshop/useTranscriptScroll.ts +113 -113
  756. package/app/composables/workshop/useVisibleInterval.ts +42 -42
  757. package/app/composables/workshop/useWorkshopWs.ts +265 -265
  758. package/app/config/index.ts +1 -1
  759. package/app/middleware/locale-cookie.global.ts +22 -22
  760. package/app/pages/aml/api.ts +6 -6
  761. package/app/pages/aml/composables/useAmlDatasets.ts +38 -38
  762. package/app/pages/aml/composables/useAmlEntities.ts +57 -57
  763. package/app/pages/aml/composables/useAmlEnv.ts +191 -191
  764. package/app/pages/aml/composables/useAmlExperiments.ts +45 -45
  765. package/app/pages/aml/composables/useAmlFormat.ts +44 -44
  766. package/app/pages/aml/composables/useAmlJobs.ts +131 -131
  767. package/app/pages/aml/composables/useAmlModels.ts +56 -56
  768. package/app/pages/aml/composables/useAmlNotes.ts +47 -47
  769. package/app/pages/aml/composables/useAmlPredict.ts +93 -93
  770. package/app/pages/aml/constants.ts +63 -63
  771. package/app/pages/aml/index.vue +236 -236
  772. package/app/pages/composables/useDashboardCharts.ts +192 -192
  773. package/app/pages/composables/useDashboardData.ts +144 -144
  774. package/app/pages/daq/composables/useDaqAddNode.ts +126 -126
  775. package/app/pages/daq/composables/useDaqDetailBinding.ts +29 -29
  776. package/app/pages/daq/composables/useDaqDetailFrames.ts +42 -42
  777. package/app/pages/daq/composables/useDaqDetailNode.ts +53 -53
  778. package/app/pages/daq/composables/useDaqDetailParams.ts +138 -138
  779. package/app/pages/daq/composables/useDaqFilters.ts +187 -187
  780. package/app/pages/daq/composables/useDaqNodeWindow.ts +86 -86
  781. package/app/pages/daq/composables/useDaqOptimizations.ts +99 -99
  782. package/app/pages/daq/composables/useDaqTemplates.ts +152 -152
  783. package/app/pages/daq/index.vue +260 -260
  784. package/app/pages/dcw/composables/useDcwCards.ts +27 -27
  785. package/app/pages/dcw/composables/useDcwDetailScope.ts +145 -145
  786. package/app/pages/dcw/composables/useDcwDetailTemplates.ts +94 -94
  787. package/app/pages/dcw/composables/useDcwFilter.ts +29 -29
  788. package/app/pages/dcw/composables/useDcwLedger.ts +34 -34
  789. package/app/pages/dcw/composables/useDcwLineMutations.ts +115 -115
  790. package/app/pages/dcw/composables/useDcwLineRun.ts +60 -60
  791. package/app/pages/dcw/composables/useDcwProducts.ts +54 -54
  792. package/app/pages/dcw/composables/useDcwQuery.ts +68 -68
  793. package/app/pages/dcw/composables/useDcwQuickActions.ts +47 -47
  794. package/app/pages/dcw/composables/useDcwRecipes.ts +256 -256
  795. package/app/pages/dcw/composables/useDcwTemplates.ts +50 -50
  796. package/app/pages/dcw/index.vue +195 -195
  797. package/app/pages/dcw/types.ts +9 -9
  798. package/app/pages/index.vue +126 -126
  799. package/app/pages/logs/composables/useLogsFormat.ts +43 -43
  800. package/app/pages/logs/composables/useLogsManual.ts +3 -0
  801. package/app/pages/logs/composables/useLogsScope.ts +39 -39
  802. package/app/pages/logs/index.vue +34 -1
  803. package/app/pages/monitor/types.ts +61 -61
  804. package/app/pages/operations.vue +61 -61
  805. package/app/pages/permissions/index.vue +369 -369
  806. package/app/pages/tokens/composables/useTokenClipboard.ts +33 -33
  807. package/app/pages/tokens/composables/useTokenCreate.ts +93 -93
  808. package/app/pages/tokens/composables/useTokenRename.ts +54 -54
  809. package/app/pages/tokens/composables/useTokenReveal.ts +84 -84
  810. package/app/pages/tokens/composables/useTokensList.ts +60 -60
  811. package/app/pages/tokens.vue +111 -111
  812. package/app/pages/tools/index.vue +98 -98
  813. package/app/pages/workshop/agents.vue +130 -130
  814. package/app/pages/workshop/composables/useAgentHarnessOptions.ts +59 -59
  815. package/app/pages/workshop/composables/useAgentTemplateActions.ts +42 -42
  816. package/app/pages/workshop/composables/useAgentTemplateDialogState.ts +24 -24
  817. package/app/pages/workshop/composables/useAgentTemplateForm.ts +88 -88
  818. package/app/pages/workshop/composables/useAgentTemplatesCatalog.ts +92 -92
  819. package/app/pages/workshop/composables/useTeamActions.ts +44 -44
  820. package/app/pages/workshop/composables/useTeamAddMemberDialog.ts +49 -49
  821. package/app/pages/workshop/composables/useTeamCreateDialog.ts +67 -67
  822. package/app/pages/workshop/composables/useTeamDeployDialog.ts +49 -49
  823. package/app/pages/workshop/composables/useTeamDialogState.ts +46 -46
  824. package/app/pages/workshop/composables/useTeamPluginDialog.ts +72 -72
  825. package/app/pages/workshop/composables/useTeamsCatalog.ts +100 -100
  826. package/app/pages/workshop/composables/useWorkbenchWorkspaces.ts +123 -123
  827. package/app/pages/workshop/composables/useWorkspaceAuth.ts +31 -31
  828. package/app/pages/workshop/composables/useWorkspaceChannels.ts +62 -62
  829. package/app/pages/workshop/composables/useWorkspaceShell.ts +136 -136
  830. package/app/pages/workshop/schedules.vue +553 -553
  831. package/app/pages/workshop/w/[wsId].vue +221 -221
  832. package/app/plugins/aw-plugins.client.ts +213 -213
  833. package/app/plugins/esc-close.client.ts +31 -31
  834. package/app/stores/workshop/hitl.ts +183 -183
  835. package/app/stores/workshop/narrow-fetch.ts +23 -23
  836. package/app/utils/api-error.ts +75 -75
  837. package/app/utils/builtin-catalog.ts +104 -104
  838. package/app/utils/chart-trend.ts +97 -97
  839. package/app/utils/dcw-driver-badge.ts +16 -16
  840. package/app/utils/dcw-recipe-form.ts +26 -26
  841. package/cli/commands/tui.mjs +28 -28
  842. package/cli/commands/update.mjs +124 -124
  843. package/cli/core/child-lifecycle.mjs +136 -136
  844. package/cli/core/meta.mjs +38 -38
  845. package/cli/core/post-build.mjs +96 -96
  846. package/config.yml +1 -1
  847. package/docs/cli.en.md +2 -2
  848. package/docs/cli.md +2 -2
  849. package/docs/mcp.en.md +27 -27
  850. package/docs/multi-harness-architecture.md +248 -248
  851. package/docs/plugins.en.md +1 -1
  852. package/docs/plugins.md +1 -1
  853. package/docs/sdk.en.md +1 -1
  854. package/docs/sdk.md +1 -1
  855. package/docs/tui.md +43 -43
  856. package/i18n/dicts/_en.json +1551 -1551
  857. package/i18n/dicts/_en2.json +300 -300
  858. package/i18n/dicts/_en4.json +114 -114
  859. package/i18n/dicts/agentLanesView.json +61 -61
  860. package/i18n/dicts/appHeader.json +17 -17
  861. package/i18n/dicts/channelSessionList.json +51 -51
  862. package/i18n/dicts/chat.json +79 -79
  863. package/i18n/dicts/clusterTool.json +4 -4
  864. package/i18n/dicts/composer.json +38 -38
  865. package/i18n/dicts/ctpl.json +37 -37
  866. package/i18n/dicts/dcwDetail.json +219 -219
  867. package/i18n/dicts/lineOps.json +14 -14
  868. package/i18n/dicts/multiChannelView.json +13 -13
  869. package/i18n/dicts/notifications.json +13 -13
  870. package/i18n/dicts/taskInspectorDrawer.json +25 -25
  871. package/i18n/dicts/teamPlugins.json +10 -10
  872. package/i18n/dicts/townView.json +211 -209
  873. package/i18n/locales/en.ts +9 -0
  874. package/i18n/locales/zh-CN.ts +9 -0
  875. package/mcp/discovery.mjs +227 -227
  876. package/package.json +3 -1
  877. package/public/favicon.svg +14 -14
  878. package/public/robots.txt +3 -3
  879. package/scripts/_audit/_live-mqtt-e2e-20261028.mjs +219 -219
  880. package/scripts/_audit/audit-harness-adapters.md +664 -664
  881. package/scripts/_audit/aw-mcp-live-e2e.mjs +293 -293
  882. package/scripts/_audit/bump-version.mjs +51 -51
  883. package/scripts/_audit/detached-instance.mjs +112 -112
  884. package/scripts/_audit/detached-start.mjs +103 -103
  885. package/scripts/_audit/eda-ui-fix-acceptance.mjs +212 -212
  886. package/scripts/_audit/guard-upstream-liveness.mjs +104 -104
  887. package/scripts/_audit/http-api-authz-audit.md +657 -657
  888. package/scripts/_audit/kb-team-mock-e2e.mjs +146 -146
  889. package/scripts/_audit/kb-team-omp-e2e.mjs +229 -229
  890. package/scripts/_audit/prompt-injection-probe.mts +76 -76
  891. package/scripts/_audit/run.mjs +21 -21
  892. package/scripts/_audit/runtime-audit.md +716 -716
  893. package/scripts/_audit/skills-guided-e2e.mjs +316 -316
  894. package/scripts/_audit/stability-soak.mjs +252 -252
  895. package/scripts/_audit/stubs/nuxt-imports.mjs +67 -67
  896. package/scripts/_audit/ts-register-hook.mjs +12 -12
  897. package/scripts/_audit/ts-resolve-hook.mjs +96 -96
  898. package/scripts/_aw0746-stage12.mjs +94 -94
  899. package/scripts/_aw0746-stage34.mjs +136 -136
  900. package/scripts/_aw0746-stage6b-train-sweep.mjs +145 -145
  901. package/scripts/_aw0746-stage6c-jobsmoke.mjs +69 -69
  902. package/scripts/_dbg-configroot-audit.mjs +86 -86
  903. package/scripts/_dbg-daq-intervals-func.mjs +115 -115
  904. package/scripts/_dbg-perms-e2e.mjs +142 -142
  905. package/scripts/_dbg-protocol-matrix.mjs +462 -462
  906. package/scripts/_dbg-render-regression.mjs +193 -193
  907. package/scripts/_dbg-schedule-e2e.mjs +262 -262
  908. package/scripts/_e2e-ui-functional.mjs +371 -371
  909. package/scripts/_lib-aml-python-run.mjs +17 -17
  910. package/scripts/_plc-sim-detached.cjs +22 -22
  911. package/scripts/_provision-injection-line.mjs +39 -39
  912. package/scripts/_run-matrix.ps1 +53 -53
  913. package/scripts/_sweep-button-contrast.mjs +87 -87
  914. package/scripts/acceptance-aml-hybrid-e2e.ts +396 -396
  915. package/scripts/acceptance-aml-hybrid-live.mjs +93 -93
  916. package/scripts/acceptance-aml-model-identity.ts +137 -137
  917. package/scripts/agent-daq-isolation-e2e.mjs +91 -91
  918. package/scripts/api-contract-smoke.mjs +126 -126
  919. package/scripts/ask-hitl-e2e.mjs +96 -96
  920. package/scripts/aw-expose.mjs +159 -159
  921. package/scripts/channel-interaction-smoke.mjs +80 -80
  922. package/scripts/data-studio-ui-e2e.mjs +163 -163
  923. package/scripts/demo-group-chat-all-real.ts +279 -279
  924. package/scripts/dev-modbus-simulator.mjs +55 -55
  925. package/scripts/docs-shots.mjs +36 -36
  926. package/scripts/e2e-agentteam-chat.mjs +473 -473
  927. package/scripts/e2e-agentteam-real-triage.mjs +421 -421
  928. package/scripts/e2e-aml-decoupled.mjs +162 -162
  929. package/scripts/e2e-analysis-ledger.mjs +202 -0
  930. package/scripts/e2e-aw-tui-global.mjs +277 -277
  931. package/scripts/e2e-binding-modes-real.mjs +442 -0
  932. package/scripts/e2e-business-loop-real.mjs +391 -0
  933. package/scripts/e2e-closedloop/cleanup.mjs +27 -27
  934. package/scripts/e2e-closedloop/lib.mjs +109 -109
  935. package/scripts/e2e-closedloop/main.mjs +59 -59
  936. package/scripts/e2e-closedloop/scenarios-accounts.mjs +210 -210
  937. package/scripts/e2e-closedloop/scenarios-authz.mjs +196 -196
  938. package/scripts/e2e-closedloop/scenarios-daq-dcw.mjs +222 -222
  939. package/scripts/e2e-closedloop/scenarios-plugins.mjs +169 -169
  940. package/scripts/e2e-closedloop/state.mjs +10 -10
  941. package/scripts/e2e-config-groups.mjs +238 -238
  942. package/scripts/e2e-core-bridges-matrix.mjs +303 -0
  943. package/scripts/e2e-crash-cycle.mjs +108 -108
  944. package/scripts/e2e-error-handling.mjs +190 -0
  945. package/scripts/e2e-full-closedloop.mjs +16 -16
  946. package/scripts/e2e-golive-matrix.mjs +515 -0
  947. package/scripts/e2e-hil-multi-user.mjs +307 -307
  948. package/scripts/e2e-hil-restart.mjs +339 -339
  949. package/scripts/e2e-line-governance.mjs +352 -352
  950. package/scripts/e2e-mes-mirror-real.mjs +418 -0
  951. package/scripts/e2e-multiexpert-remediation-real.mjs +453 -453
  952. package/scripts/e2e-node-binding-3mode-real.mjs +792 -697
  953. package/scripts/e2e-node-binding-authz.mjs +372 -332
  954. package/scripts/e2e-ontology.mjs +393 -393
  955. package/scripts/e2e-optimizer-live.mjs +4 -0
  956. package/scripts/e2e-physical-effect-real.mjs +570 -0
  957. package/scripts/e2e-plc-plugin-closedloop.mjs +549 -549
  958. package/scripts/full-stack-shots.mjs +145 -145
  959. package/scripts/full-tool-injection-harness-e2e.mjs +214 -214
  960. package/scripts/hitl-reject-e2e.mjs +131 -131
  961. package/scripts/line-log-smoke.mjs +260 -260
  962. package/scripts/live-aml-mockomp.mjs +304 -304
  963. package/scripts/live-aml-optloop-resume.mjs +322 -322
  964. package/scripts/live-aml-optloop.mjs +588 -588
  965. package/scripts/live-aml-stage9.mjs +169 -169
  966. package/scripts/live-aml-two-goals.mjs +315 -315
  967. package/scripts/live-demo-seed.mjs +157 -0
  968. package/scripts/live-optloop-two-modes.mjs +857 -857
  969. package/scripts/mes-agent-integration-e2e.mjs +361 -361
  970. package/scripts/ops-plugins-e2e.mjs +85 -85
  971. package/scripts/scenario-suite-setup.mjs +337 -337
  972. package/scripts/scenario-suite-stability.mjs +144 -144
  973. package/scripts/security-acceptance.mjs +218 -218
  974. package/scripts/team-coordination-e2e.mjs +96 -96
  975. package/scripts/test-agentteam-workflow.ts +472 -472
  976. package/scripts/test-aw-skills.mjs +102 -102
  977. package/scripts/test-daq-frame-race.mjs +358 -358
  978. package/scripts/test-data-root.mjs +208 -208
  979. package/scripts/test-events-index.mjs +176 -176
  980. package/scripts/test-group-chat-unit/lib.ts +186 -186
  981. package/scripts/test-group-chat-unit/main.ts +45 -45
  982. package/scripts/test-group-chat-unit.ts +35 -35
  983. package/scripts/test-hitl-decision.ts +526 -526
  984. package/scripts/test-hitl-registry.ts +112 -112
  985. package/scripts/test-log-flooding.mjs +160 -160
  986. package/scripts/test-lru.mjs +101 -101
  987. package/scripts/test-plugin-hardening.mjs +90 -90
  988. package/scripts/test-plugin-lifecycle.mjs +173 -173
  989. package/scripts/test-rollback-index.mjs +137 -137
  990. package/scripts/test-schedule-runtime.ts +309 -309
  991. package/scripts/test-sdk-surface.mjs +158 -158
  992. package/scripts/test-serial-bridge.mjs +418 -418
  993. package/scripts/test-tui-commands.mjs +148 -148
  994. package/scripts/test-tui-reducers.mjs +72 -72
  995. package/scripts/three-system-e2e/lib.mjs +79 -79
  996. package/scripts/three-system-e2e/main.mjs +40 -40
  997. package/scripts/three-system-e2e/phases/phase-0-user-token.mjs +42 -42
  998. package/scripts/three-system-e2e/phases/phase-0a2-line-autoselect.mjs +35 -35
  999. package/scripts/three-system-e2e/phases/phase-0b-fixture-grants.mjs +39 -39
  1000. package/scripts/three-system-e2e/phases/phase-0c-plugin-outbound-auth.mjs +95 -95
  1001. package/scripts/three-system-e2e/phases/stage-1-health.mjs +47 -47
  1002. package/scripts/three-system-e2e/phases/stage-2-5-team-plugins.mjs +84 -84
  1003. package/scripts/three-system-e2e/phases/stage-2-teams-tools-hitl.mjs +184 -184
  1004. package/scripts/three-system-e2e/phases/stage-3-diag.mjs +73 -73
  1005. package/scripts/three-system-e2e/phases/stage-4-plugin-toggle.mjs +53 -53
  1006. package/scripts/three-system-e2e/state.mjs +87 -87
  1007. package/scripts/three-system-e2e.mjs +40 -40
  1008. package/scripts/tool-face-batch-identity-e2e.mjs +222 -222
  1009. package/scripts/tsconfig.json +14 -14
  1010. package/scripts/tui-smoke.mjs +100 -100
  1011. package/scripts/typecheck.mjs +75 -75
  1012. package/scripts/ui/md-lint.mjs +80 -80
  1013. package/scripts/ui/readme-assets.mjs +30 -30
  1014. package/scripts/ui/readme-shots.mjs +42 -42
  1015. package/scripts/ui/record-demo.mjs +557 -557
  1016. package/scripts/ui/record.mjs +225 -225
  1017. package/scripts/ui/seed-admin.mjs +68 -68
  1018. package/scripts/ui/seed-demo.mjs +83 -83
  1019. package/scripts/ui/seed-industrial-demo.mjs +171 -171
  1020. package/scripts/ui/shot-hero.mjs +25 -25
  1021. package/scripts/ui/shots.mjs +75 -75
  1022. package/scripts/ui/verify-nav.mjs +51 -51
  1023. package/scripts/ui/verify-responsive.mjs +285 -285
  1024. package/sdk/client.d.mts +110 -110
  1025. package/sdk/examples/line-sentinel/index.mjs +105 -105
  1026. package/sdk/examples/ops-notifier/index.mjs +34 -34
  1027. package/sdk/examples/sample-insight/index.mjs +39 -39
  1028. package/server/api/plugins/client/[name].get.ts +18 -18
  1029. package/server/api/plugins/i18n.get.ts +12 -12
  1030. package/server/api/plugins/manifest.get.ts +10 -10
  1031. package/server/api/system/backup/list.get.ts +32 -32
  1032. package/server/api/system/backup/run.post.ts +21 -21
  1033. package/server/api/system/config-groups/[id].delete.ts +21 -21
  1034. package/server/api/system/config-groups/[id].patch.ts +26 -26
  1035. package/server/api/system/config-groups/index.get.ts +21 -21
  1036. package/server/api/system/config-groups/index.post.ts +33 -33
  1037. package/server/api/system/timezone.get.ts +20 -20
  1038. package/server/api/users/tokens/[id]/token.get.ts +11 -11
  1039. package/server/api/workshop/[...path].ts +13 -13
  1040. package/server/api/workshop/agent-tools/approvals/index.get.ts +45 -43
  1041. package/server/api/workshop/agent-tools/bindings/[id].delete.ts +26 -26
  1042. package/server/api/workshop/agent-tools/bindings/grant.post.ts +45 -45
  1043. package/server/api/workshop/agent-tools/bindings/index.get.ts +41 -41
  1044. package/server/api/workshop/agent-tools/bindings/index.post.ts +38 -16
  1045. package/server/api/workshop/agent-tools/bindings/revoke.post.ts +42 -42
  1046. package/server/api/workshop/aml/datasets/[id]/preview.get.ts +68 -68
  1047. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -39
  1048. package/server/api/workshop/aml/datasets/[id].get.ts +53 -53
  1049. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -30
  1050. package/server/api/workshop/aml/datasets/index.get.ts +20 -20
  1051. package/server/api/workshop/aml/datasets/index.post.ts +27 -27
  1052. package/server/api/workshop/aml/entities/index.get.ts +13 -13
  1053. package/server/api/workshop/aml/entities/prune.post.ts +28 -28
  1054. package/server/api/workshop/aml/env/index.get.ts +13 -13
  1055. package/server/api/workshop/aml/env/recheck.post.ts +14 -14
  1056. package/server/api/workshop/aml/env/uv.post.ts +21 -21
  1057. package/server/api/workshop/aml/env/venv.post.ts +24 -24
  1058. package/server/api/workshop/aml/experiments/index.get.ts +35 -35
  1059. package/server/api/workshop/aml/index.get.ts +37 -37
  1060. package/server/api/workshop/aml/jobs/[id]/cancel.post.ts +21 -21
  1061. package/server/api/workshop/aml/jobs/[id]/logs.get.ts +23 -23
  1062. package/server/api/workshop/aml/jobs/[id]/retry.post.ts +20 -20
  1063. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -44
  1064. package/server/api/workshop/aml/jobs/[id].get.ts +23 -23
  1065. package/server/api/workshop/aml/jobs/index.get.ts +26 -26
  1066. package/server/api/workshop/aml/models/[id]/predict.post.ts +24 -24
  1067. package/server/api/workshop/aml/models/[id]/promote.post.ts +30 -30
  1068. package/server/api/workshop/aml/models/index.get.ts +48 -48
  1069. package/server/api/workshop/aml/training-plans/[id]/train.post.ts +18 -18
  1070. package/server/api/workshop/aml/training-plans/[id].delete.ts +18 -18
  1071. package/server/api/workshop/aml/training-plans/[id].patch.ts +30 -30
  1072. package/server/api/workshop/aml/training-plans/index.get.ts +9 -9
  1073. package/server/api/workshop/aml/training-plans/index.post.ts +43 -43
  1074. package/server/api/workshop/analysis/index.post.ts +54 -54
  1075. package/server/api/workshop/approvals/[id]/decide.post.ts +30 -30
  1076. package/server/api/workshop/approvals/index.get.ts +22 -22
  1077. package/server/api/workshop/audit.get.ts +43 -43
  1078. package/server/api/workshop/channels/[id]/chat/messages/[messageId]/read.post.ts +22 -22
  1079. package/server/api/workshop/channels/[id]/chat/messages/index.get.ts +29 -29
  1080. package/server/api/workshop/channels/[id]/chat/messages/index.post.ts +51 -51
  1081. package/server/api/workshop/channels/[id]/chat/permissions.get.ts +35 -35
  1082. package/server/api/workshop/channels/[id]/index.patch.ts +64 -64
  1083. package/server/api/workshop/channels/[id]/members/[userId]/approve.post.ts +20 -20
  1084. package/server/api/workshop/channels/[id]/members/[userId].delete.ts +21 -21
  1085. package/server/api/workshop/channels/[id]/members/index.get.ts +23 -23
  1086. package/server/api/workshop/channels/[id]/members/leave.post.ts +20 -20
  1087. package/server/api/workshop/channels/[id]/twin-profile.get.ts +45 -45
  1088. package/server/api/workshop/channels/[id]/twin-profile.patch.ts +72 -72
  1089. package/server/api/workshop/daq/[id]/test.post.ts +1 -1
  1090. package/server/api/workshop/dcw/[id]/write.post.ts +4 -4
  1091. package/server/api/workshop/dcw/[id].delete.ts +41 -41
  1092. package/server/api/workshop/dcw/mes-test-read.post.ts +24 -24
  1093. package/server/api/workshop/dcw/params/[id]/write.post.ts +21 -21
  1094. package/server/api/workshop/dcw/params/[id].delete.ts +19 -19
  1095. package/server/api/workshop/dcw/params/[id].patch.ts +23 -23
  1096. package/server/api/workshop/dcw/params/index.get.ts +27 -27
  1097. package/server/api/workshop/dcw/params/index.post.ts +25 -25
  1098. package/server/api/workshop/dcw/templates/[key].delete.ts +14 -14
  1099. package/server/api/workshop/dcw/templates/[key].patch.ts +16 -16
  1100. package/server/api/workshop/dcw/templates/index.post.ts +15 -15
  1101. package/server/api/workshop/device-twins/[id].delete.ts +25 -25
  1102. package/server/api/workshop/eda/runs/[id]/labels.patch.ts +25 -25
  1103. package/server/api/workshop/eda/templates/[id].delete.ts +14 -14
  1104. package/server/api/workshop/eda/templates/[id].get.ts +15 -15
  1105. package/server/api/workshop/eda/templates/[id].patch.ts +20 -20
  1106. package/server/api/workshop/eda/templates/index.get.ts +11 -11
  1107. package/server/api/workshop/eda/templates/index.post.ts +20 -20
  1108. package/server/api/workshop/exp/confirmations/[id]/decide.post.ts +41 -41
  1109. package/server/api/workshop/exp/confirmations/index.get.ts +25 -25
  1110. package/server/api/workshop/harnesses/[id]/providers.get.ts +16 -16
  1111. package/server/api/workshop/hitl/respond.post.ts +94 -94
  1112. package/server/api/workshop/notifications/index.get.ts +60 -60
  1113. package/server/api/workshop/notifications/read.post.ts +31 -31
  1114. package/server/api/workshop/ontology/drafts/[draftId]/subgraph.ts +24 -24
  1115. package/server/api/workshop/ops-logs/index.post.ts +20 -2
  1116. package/server/api/workshop/plugins/[name]/disable.post.ts +21 -21
  1117. package/server/api/workshop/plugins/[name]/enable.post.ts +21 -21
  1118. package/server/api/workshop/plugins/[name]/index.get.ts +14 -14
  1119. package/server/api/workshop/schedules/[id]/run.post.ts +15 -15
  1120. package/server/api/workshop/schedules/[id]/runs.get.ts +15 -15
  1121. package/server/api/workshop/schedules/[id].delete.ts +14 -14
  1122. package/server/api/workshop/schedules/[id].get.ts +13 -13
  1123. package/server/api/workshop/schedules/[id].patch.ts +29 -29
  1124. package/server/api/workshop/schedules/index.get.ts +12 -12
  1125. package/server/api/workshop/schedules/index.post.ts +32 -32
  1126. package/server/api/workshop/tasks/[id]/reassign.post.ts +32 -32
  1127. package/server/api/workshop/tasks/[id]/update.post.ts +35 -35
  1128. package/server/api/workshop/teams/[id]/plugins/index.get.ts +36 -36
  1129. package/server/api/workshop/teams/[id]/plugins/index.put.ts +42 -42
  1130. package/server/api/workshop/ws/audience.ts +56 -56
  1131. package/server/api/workshop/ws/db-buffer.ts +68 -68
  1132. package/server/api/workshop/ws/event-mapping.ts +47 -47
  1133. package/server/api/workshop/ws/handlers.ts +132 -132
  1134. package/server/api/workshop/ws/hub.ts +134 -134
  1135. package/server/api/workshop/ws/index.ts +23 -23
  1136. package/server/api/workshop/ws/notification-uplink.ts +77 -77
  1137. package/server/api/workshop/ws/shared.ts +94 -94
  1138. package/server/api/workshop/ws/streams.ts +146 -146
  1139. package/server/middleware/00-security-headers.ts +38 -38
  1140. package/server/middleware/01-rate-guard.ts +101 -101
  1141. package/server/plugins/01-instance-guard.ts +82 -82
  1142. package/server/plugins/aml-twin-worker.ts +32 -32
  1143. package/server/plugins/aw-plugins.ts +4 -1
  1144. package/server/plugins/dev-stability-guard.ts +46 -42
  1145. package/server/plugins/error-ledger.ts +21 -0
  1146. package/server/plugins-builtin/diag-bridge/host/constants.mjs +25 -25
  1147. package/server/plugins-builtin/diag-bridge/host/exports.mjs +104 -104
  1148. package/server/plugins-builtin/diag-bridge/host/index.mjs +15 -15
  1149. package/server/plugins-builtin/diag-bridge/host/intents.mjs +62 -62
  1150. package/server/plugins-builtin/diag-bridge/host/snapshot.mjs +93 -93
  1151. package/server/plugins-builtin/diag-bridge/index.mjs +9 -9
  1152. package/server/plugins-builtin/serial-bridge/client.mjs +211 -211
  1153. package/server/plugins-builtin/serial-bridge/drivers.mjs +409 -409
  1154. package/server/plugins-builtin/serial-bridge/i18n.json +62 -62
  1155. package/server/plugins-builtin/serial-bridge/index.mjs +247 -247
  1156. package/server/plugins-builtin/serial-bridge/lib.mjs +208 -208
  1157. package/server/plugins-builtin/serial-bridge/rtu.mjs +168 -168
  1158. package/server/services/system-config/contracts.ts +29 -29
  1159. package/server/services/system-config/dispose.ts +19 -19
  1160. package/server/services/system-config/facade.ts +26 -26
  1161. package/server/services/system-config/groups.ts +108 -108
  1162. package/server/services/system-config/index.ts +21 -21
  1163. package/server/services/system-config/init.ts +26 -26
  1164. package/server/services/system-config/mutate.ts +103 -103
  1165. package/server/services/system-config/plugins.ts +104 -104
  1166. package/server/services/system-config/snapshot.ts +59 -59
  1167. package/server/services/system-config/state.ts +79 -79
  1168. package/server/services/system-config/types.ts +58 -58
  1169. package/server/services/workshop/agents/adapters/omp-rpc-client/api.ts +111 -111
  1170. package/server/services/workshop/agents/adapters/omp-rpc-client/contracts.ts +22 -22
  1171. package/server/services/workshop/agents/adapters/omp-rpc-client/facade.ts +7 -7
  1172. package/server/services/workshop/agents/adapters/omp-rpc-client/helpers.ts +38 -38
  1173. package/server/services/workshop/agents/adapters/omp-rpc-client/index.ts +25 -25
  1174. package/server/services/workshop/agents/adapters/omp-rpc-client/start.ts +70 -70
  1175. package/server/services/workshop/agents/adapters/omp-rpc-client/state.ts +65 -65
  1176. package/server/services/workshop/agents/adapters/omp-rpc-client/stdout.ts +92 -92
  1177. package/server/services/workshop/agents/adapters/omp-rpc-client/usage.ts +47 -47
  1178. package/server/services/workshop/agents/agent-badge.ts +38 -38
  1179. package/server/services/workshop/agents/agent-dto.ts +54 -54
  1180. package/server/services/workshop/agents/binding-authz.ts +66 -60
  1181. package/server/services/workshop/agents/binding-mode.ts +51 -51
  1182. package/server/services/workshop/agents/codex-agent/client.ts +170 -170
  1183. package/server/services/workshop/agents/codex-agent/core.ts +119 -119
  1184. package/server/services/workshop/agents/codex-agent/facade.ts +8 -8
  1185. package/server/services/workshop/agents/codex-agent/helpers.ts +13 -13
  1186. package/server/services/workshop/agents/codex-agent/hitl.ts +138 -138
  1187. package/server/services/workshop/agents/codex-agent/index.ts +14 -14
  1188. package/server/services/workshop/agents/codex-agent/turn.ts +367 -367
  1189. package/server/services/workshop/agents/codex-agent/types.ts +42 -42
  1190. package/server/services/workshop/agents/harness-process.ts +3 -3
  1191. package/server/services/workshop/agents/harness-spawn-policy.ts +114 -114
  1192. package/server/services/workshop/agents/harness-terminal/api.ts +197 -197
  1193. package/server/services/workshop/agents/harness-terminal/index.ts +17 -17
  1194. package/server/services/workshop/agents/harness-terminal/io.ts +120 -120
  1195. package/server/services/workshop/agents/harness-terminal/park.ts +55 -55
  1196. package/server/services/workshop/agents/harness-terminal/sanitize.ts +98 -98
  1197. package/server/services/workshop/agents/harness-terminal/session.ts +124 -124
  1198. package/server/services/workshop/agents/harness-terminal/shared.ts +74 -74
  1199. package/server/services/workshop/agents/hitl-capabilities.ts +312 -312
  1200. package/server/services/workshop/agents/hitl-decision/answers.ts +32 -32
  1201. package/server/services/workshop/agents/hitl-decision/decide.ts +268 -268
  1202. package/server/services/workshop/agents/hitl-decision/payload.ts +45 -45
  1203. package/server/services/workshop/agents/hitl-decision/shared.ts +108 -108
  1204. package/server/services/workshop/agents/hitl-decision/visibility.ts +94 -94
  1205. package/server/services/workshop/agents/host-tool-bridge/per-agent.ts +17 -3
  1206. package/server/services/workshop/agents/host-tool-bridge/tools/progress.ts +84 -84
  1207. package/server/services/workshop/agents/host-tool-bridge/tools/team-delegation.ts +109 -108
  1208. package/server/services/workshop/agents/host-tool-bridge/tools/team.ts +70 -70
  1209. package/server/services/workshop/agents/industrial/aml-activity.ts +131 -131
  1210. package/server/services/workshop/agents/industrial/audit-query.ts +66 -66
  1211. package/server/services/workshop/agents/industrial/dcw-tools.ts +11 -1
  1212. package/server/services/workshop/agents/industrial/exp-tools.ts +104 -104
  1213. package/server/services/workshop/agents/industrial/ops-tools.ts +8 -2
  1214. package/server/services/workshop/agents/industrial/param-tools.ts +69 -69
  1215. package/server/services/workshop/agents/industrial/recipe-gate.ts +57 -29
  1216. package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +2 -1
  1217. package/server/services/workshop/agents/industrial/tool-verify.ts +23 -3
  1218. package/server/services/workshop/agents/node-bindings.repo.ts +210 -208
  1219. package/server/services/workshop/agents/node-delegation.ts +204 -204
  1220. package/server/services/workshop/agents/omp-agent/core.ts +146 -146
  1221. package/server/services/workshop/agents/omp-agent/facade.ts +8 -8
  1222. package/server/services/workshop/agents/omp-agent/helpers.ts +37 -37
  1223. package/server/services/workshop/agents/omp-agent/index.ts +16 -16
  1224. package/server/services/workshop/agents/omp-agent/types.ts +45 -45
  1225. package/server/services/workshop/agents/opencode-agent/core.ts +77 -77
  1226. package/server/services/workshop/agents/opencode-agent/facade.ts +8 -8
  1227. package/server/services/workshop/agents/opencode-agent/helpers.ts +29 -29
  1228. package/server/services/workshop/agents/opencode-agent/hitl.ts +113 -113
  1229. package/server/services/workshop/agents/opencode-agent/index.ts +16 -16
  1230. package/server/services/workshop/agents/opencode-agent/lifecycle.ts +44 -44
  1231. package/server/services/workshop/agents/opencode-agent/server.ts +244 -244
  1232. package/server/services/workshop/agents/opencode-agent/turn.ts +278 -278
  1233. package/server/services/workshop/agents/opencode-agent/types.ts +54 -54
  1234. package/server/services/workshop/agents/tool-approvals.ts +6 -4
  1235. package/server/services/workshop/agents/tool-classes.ts +44 -44
  1236. package/server/services/workshop/aml/clean.ts +120 -120
  1237. package/server/services/workshop/aml/entity.ts +367 -367
  1238. package/server/services/workshop/aml/job-orchestrator/broadcast.ts +37 -37
  1239. package/server/services/workshop/aml/job-orchestrator/control.ts +94 -94
  1240. package/server/services/workshop/aml/job-orchestrator/failure.ts +96 -96
  1241. package/server/services/workshop/aml/job-orchestrator/index.ts +22 -22
  1242. package/server/services/workshop/aml/job-orchestrator/process.ts +101 -101
  1243. package/server/services/workshop/aml/job-orchestrator/shared.ts +53 -53
  1244. package/server/services/workshop/aml/job-orchestrator/status.ts +20 -20
  1245. package/server/services/workshop/aml/job-orchestrator/tick.ts +37 -37
  1246. package/server/services/workshop/aml/python/train-example.py +92 -92
  1247. package/server/services/workshop/aml/runtime.ts +137 -137
  1248. package/server/services/workshop/aml/stats.ts +140 -140
  1249. package/server/services/workshop/aml/twin/calibration-worker.ts +150 -150
  1250. package/server/services/workshop/aml/twin/model-backed-provider.ts +332 -332
  1251. package/server/services/workshop/aml/twin/physics-spec-draft.ts +185 -185
  1252. package/server/services/workshop/aml/twin/prompt-composer.ts +143 -143
  1253. package/server/services/workshop/aml/twin/training-plans.ts +260 -260
  1254. package/server/services/workshop/aml/twin/write-guard.ts +19 -19
  1255. package/server/services/workshop/assets/character-asset.repo.ts +1 -1
  1256. package/server/services/workshop/assets/device-twin.repo.ts +1 -1
  1257. package/server/services/workshop/daq/daq-controller/contracts.ts +39 -39
  1258. package/server/services/workshop/daq/daq-controller/facade.ts +28 -28
  1259. package/server/services/workshop/daq/daq-controller/frames.ts +137 -137
  1260. package/server/services/workshop/daq/daq-controller/helpers.ts +52 -52
  1261. package/server/services/workshop/daq/daq-controller/index.ts +22 -22
  1262. package/server/services/workshop/daq/drivers/mock.ts +130 -130
  1263. package/server/services/workshop/daq/drivers/modbus-rtu.ts +67 -67
  1264. package/server/services/workshop/daq/drivers/modbus-tcp.ts +310 -310
  1265. package/server/services/workshop/daq/drivers/opcua.ts +227 -227
  1266. package/server/services/workshop/daq/drivers/s7-stub.ts +29 -29
  1267. package/server/services/workshop/daq/host-bindings.ts +71 -71
  1268. package/server/services/workshop/daq/host-ports.ts +65 -65
  1269. package/server/services/workshop/db/aml-team-seeds.ts +118 -118
  1270. package/server/services/workshop/db/backup-registry.ts +33 -33
  1271. package/server/services/workshop/db/channel-member.repo.ts +122 -122
  1272. package/server/services/workshop/db/channel.repo.ts +203 -203
  1273. package/server/services/workshop/db/chat-message.repo.ts +233 -233
  1274. package/server/services/workshop/db/database/index.ts +18 -18
  1275. package/server/services/workshop/db/database/json.ts +14 -14
  1276. package/server/services/workshop/db/database/seed-data.ts +60 -60
  1277. package/server/services/workshop/db/hitl-request.repo.ts +221 -221
  1278. package/server/services/workshop/db/notification.repo.ts +199 -199
  1279. package/server/services/workshop/db/readonly.ts +30 -30
  1280. package/server/services/workshop/db/scheduled-task.repo.ts +235 -235
  1281. package/server/services/workshop/db/transaction.ts +72 -72
  1282. package/server/services/workshop/dcw/dcw-controller/contracts.ts +16 -16
  1283. package/server/services/workshop/dcw/dcw-controller/control.ts +78 -78
  1284. package/server/services/workshop/dcw/dcw-controller/facade.ts +19 -19
  1285. package/server/services/workshop/dcw/dcw-controller/index.ts +22 -22
  1286. package/server/services/workshop/dcw/dcw-controller/params.ts +97 -97
  1287. package/server/services/workshop/dcw/dcw-controller/products.ts +103 -103
  1288. package/server/services/workshop/dcw/dcw-controller/write.ts +12 -0
  1289. package/server/services/workshop/dcw/dcw-node.ts +13 -1
  1290. package/server/services/workshop/dcw/dcw-runtime.ts +2 -1
  1291. package/server/services/workshop/dcw/dcw-templates.ts +136 -136
  1292. package/server/services/workshop/dcw/param-conversion.ts +78 -78
  1293. package/server/services/workshop/dcw/param-map.repo.ts +349 -349
  1294. package/server/services/workshop/dcw/plugin-bridge.ts +45 -45
  1295. package/server/services/workshop/dcw/recipe-rollback-manager/contracts.ts +26 -26
  1296. package/server/services/workshop/dcw/recipe-rollback-manager/facade.ts +13 -13
  1297. package/server/services/workshop/dcw/recipe-rollback-manager/helpers.ts +30 -30
  1298. package/server/services/workshop/dcw/recipe-rollback-manager/index.ts +17 -17
  1299. package/server/services/workshop/dcw/recipe-rollback-manager/internal.ts +33 -33
  1300. package/server/services/workshop/dcw/recipe-rollback-manager/judge.ts +52 -52
  1301. package/server/services/workshop/dcw/recipe-rollback-manager/lock.ts +137 -137
  1302. package/server/services/workshop/dcw/recipe-rollback-manager/state.ts +21 -21
  1303. package/server/services/workshop/dcw/recipe-rollback-manager/types.ts +3 -3
  1304. package/server/services/workshop/dcw/recipe-rollback-manager/views.ts +214 -214
  1305. package/server/services/workshop/eda/template-repo.ts +101 -101
  1306. package/server/services/workshop/exp/exp-collector.ts +275 -275
  1307. package/server/services/workshop/exp/exp-state.repo.ts +339 -339
  1308. package/server/services/workshop/line-scope.ts +80 -80
  1309. package/server/services/workshop/mes/mes-controller.ts +1164 -1155
  1310. package/server/services/workshop/mes/mes-hook.ts +567 -567
  1311. package/server/services/workshop/ontology/subgraph.core.ts +300 -300
  1312. package/server/services/workshop/ontology/subgraph.service.ts +113 -113
  1313. package/server/services/workshop/ops/error-ledger.ts +209 -0
  1314. package/server/services/workshop/plugins/host/api.mjs +90 -90
  1315. package/server/services/workshop/plugins/host/config.mjs +135 -135
  1316. package/server/services/workshop/plugins/host/index.mjs +23 -23
  1317. package/server/services/workshop/plugins/host/init.mjs +109 -109
  1318. package/server/services/workshop/plugins/host/rollback.mjs +72 -72
  1319. package/server/services/workshop/plugins/host/state.mjs +54 -54
  1320. package/server/services/workshop/plugins/host/toggle.mjs +64 -64
  1321. package/server/services/workshop/plugins/host.mjs +9 -9
  1322. package/server/services/workshop/runtime/agent-runtime/facade.ts +7 -7
  1323. package/server/services/workshop/runtime/agent-runtime/helpers.ts +18 -18
  1324. package/server/services/workshop/runtime/agent-runtime/index.ts +19 -19
  1325. package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +137 -137
  1326. package/server/services/workshop/runtime/chat-mention.ts +164 -164
  1327. package/server/services/workshop/runtime/chat-projection.ts +246 -246
  1328. package/server/services/workshop/runtime/manager/admin-agents.ts +268 -268
  1329. package/server/services/workshop/runtime/manager/bus.ts +182 -182
  1330. package/server/services/workshop/runtime/manager/channel-template-constants.ts +20 -20
  1331. package/server/services/workshop/runtime/manager/chat-reply.ts +181 -181
  1332. package/server/services/workshop/runtime/manager/chat.ts +386 -386
  1333. package/server/services/workshop/runtime/manager/facade.ts +24 -24
  1334. package/server/services/workshop/runtime/manager/helpers.ts +119 -119
  1335. package/server/services/workshop/runtime/manager/index.ts +42 -42
  1336. package/server/services/workshop/runtime/manager/internal.ts +73 -73
  1337. package/server/services/workshop/runtime/manager/notifications.ts +108 -108
  1338. package/server/services/workshop/runtime/manager/state.ts +2 -2
  1339. package/server/services/workshop/runtime/manager/teams.ts +148 -148
  1340. package/server/services/workshop/runtime/memory/contracts.ts +18 -18
  1341. package/server/services/workshop/runtime/memory/facade.ts +10 -10
  1342. package/server/services/workshop/runtime/memory/helpers.ts +196 -196
  1343. package/server/services/workshop/runtime/memory/index.ts +27 -27
  1344. package/server/services/workshop/runtime/memory/score.ts +33 -33
  1345. package/server/services/workshop/runtime/memory/state.ts +40 -40
  1346. package/server/services/workshop/runtime/monitor.ts +3 -3
  1347. package/server/services/workshop/runtime/platform-notice.ts +113 -113
  1348. package/server/services/workshop/runtime/schedule-runtime.ts +347 -347
  1349. package/server/services/workshop/runtime/scheduler-loop/contracts.ts +29 -29
  1350. package/server/services/workshop/runtime/scheduler-loop/facade.ts +7 -7
  1351. package/server/services/workshop/runtime/scheduler-loop/helpers.ts +14 -14
  1352. package/server/services/workshop/runtime/scheduler-loop/index.ts +16 -16
  1353. package/server/services/workshop/runtime/task-engine/facade.ts +7 -7
  1354. package/server/services/workshop/runtime/task-engine/index.ts +15 -15
  1355. package/server/services/workshop/runtime/task-engine/types.ts +3 -3
  1356. package/server/services/workshop/runtime/user-notification-hub.ts +192 -192
  1357. package/server/types/pg.d.ts +49 -49
  1358. package/server/utils/approval-gate.ts +67 -67
  1359. package/server/utils/mojibake-guard.ts +29 -29
  1360. package/server/utils/stability-severity.ts +77 -77
  1361. package/shared/config/groups.mjs +241 -241
  1362. package/shared/dcw-protocol/line.ts +4 -1
  1363. package/shared/lru.mjs +97 -97
  1364. package/tui/README.md +74 -74
  1365. package/tui/aw-tui.mjs +445 -445
  1366. package/tui/commands/index.mjs +287 -287
  1367. package/tui/components/chat-log.mjs +42 -42
  1368. package/tui/components/monitor-pane.mjs +39 -39
  1369. package/tui/components/root.mjs +53 -53
  1370. package/tui/components/status-bar.mjs +33 -33
  1371. package/tui/lib/api.mjs +82 -82
  1372. package/tui/lib/pickers.mjs +121 -121
  1373. package/tui/lib/reducers.mjs +218 -218
  1374. package/tui/lib/state.mjs +86 -86
  1375. package/tui/lib/virtual-terminal.mjs +48 -48
  1376. package/tui/lib/ws.mjs +125 -125
  1377. package/tui/theme.mjs +38 -38
  1378. package/.output/.AgentWorkShop/aml-python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  1379. package/.output/.AgentWorkShop/aml-python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1380. package/.output/.AgentWorkShop/aml-python/__pycache__/train-example.cpython-312.pyc +0 -0
  1381. package/.output/.AgentWorkShop/aml-python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  1382. package/.output/public/_nuxt/26OL4Ao82.js +0 -1
  1383. package/.output/public/_nuxt/7op-BMk82.js +0 -1
  1384. package/.output/public/_nuxt/B1SIgyrl.js +0 -1
  1385. package/.output/public/_nuxt/BA2lmfW4.js +0 -1
  1386. package/.output/public/_nuxt/BDXQqSkl2.js +0 -1
  1387. package/.output/public/_nuxt/BI9jj13f2.js +0 -2
  1388. package/.output/public/_nuxt/BPUQZ9Lq2.js +0 -8
  1389. package/.output/public/_nuxt/BVg2R2VB2.js +0 -1
  1390. package/.output/public/_nuxt/BaYDgyaR.js +0 -3
  1391. package/.output/public/_nuxt/BfvuWqSa.js +0 -1
  1392. package/.output/public/_nuxt/BiXqyYNw2.js +0 -1
  1393. package/.output/public/_nuxt/BkEokGX5.js +0 -1
  1394. package/.output/public/_nuxt/BlOm8JIs2.js +0 -1
  1395. package/.output/public/_nuxt/BtZKe9ZV2.js +0 -1
  1396. package/.output/public/_nuxt/BuLoPmcf.js +0 -1
  1397. package/.output/public/_nuxt/BwOK42JQ.js +0 -1
  1398. package/.output/public/_nuxt/BwOko01T.js +0 -47
  1399. package/.output/public/_nuxt/C1RMfPoB2.js +0 -1
  1400. package/.output/public/_nuxt/CBkXv24C2.js +0 -1
  1401. package/.output/public/_nuxt/COfo_Bg3.js +0 -1
  1402. package/.output/public/_nuxt/CY2NkFvI.js +0 -1
  1403. package/.output/public/_nuxt/C_4mzQ5X.js +0 -1
  1404. package/.output/public/_nuxt/CdvMP3lv.js +0 -1
  1405. package/.output/public/_nuxt/CjdxNYpU2.js +0 -1
  1406. package/.output/public/_nuxt/CmuGMxDP.js +0 -1
  1407. package/.output/public/_nuxt/CooauJ7D.js +0 -1
  1408. package/.output/public/_nuxt/D1eVi1zr.js +0 -21
  1409. package/.output/public/_nuxt/D6PUmBb0.js +0 -1
  1410. package/.output/public/_nuxt/D8AvmPUH.js +0 -1
  1411. package/.output/public/_nuxt/DC8sMA36.js +0 -1
  1412. package/.output/public/_nuxt/DDHh85c42.js +0 -2
  1413. package/.output/public/_nuxt/DDXOfmo2.js +0 -20
  1414. package/.output/public/_nuxt/DMFwLxfu.js +0 -1
  1415. package/.output/public/_nuxt/DZqVVvR0.js +0 -1
  1416. package/.output/public/_nuxt/Dr1FVeQG2.js +0 -1
  1417. package/.output/public/_nuxt/DtnsTW7e.js +0 -1
  1418. package/.output/public/_nuxt/DuUc4bbY2.js +0 -1
  1419. package/.output/public/_nuxt/DxDqd6T42.js +0 -16
  1420. package/.output/public/_nuxt/DzU3zEKX.js +0 -1
  1421. package/.output/public/_nuxt/EMbqTHfT.js +0 -1
  1422. package/.output/public/_nuxt/EgO70wrE.js +0 -1
  1423. package/.output/public/_nuxt/HJKu4eEV2.js +0 -1
  1424. package/.output/public/_nuxt/OmpTerminalPanel.ComMDrA8.css +0 -1
  1425. package/.output/public/_nuxt/PluginSlot.CGH0vb95.css +0 -1
  1426. package/.output/public/_nuxt/Rb4o4o-82.js +0 -1
  1427. package/.output/public/_nuxt/Tf6SJSDj.js +0 -1
  1428. package/.output/public/_nuxt/TownView.CC3t-Dte.css +0 -1
  1429. package/.output/public/_nuxt/_id_.BQRWK7J2.css +0 -1
  1430. package/.output/public/_nuxt/_wsId_.CQMH8t8j.css +0 -1
  1431. package/.output/public/_nuxt/agents.D-JPovTZ.css +0 -1
  1432. package/.output/public/_nuxt/aml.PalMp-5n.css +0 -1
  1433. package/.output/public/_nuxt/azOGy_tU2.js +0 -1
  1434. package/.output/public/_nuxt/be-4wyTo.js +0 -1
  1435. package/.output/public/_nuxt/builds/meta/593b65bd-cf1d-4b7f-a993-57e939c38f36.json +0 -1
  1436. package/.output/public/_nuxt/byZYInPk2.js +0 -1
  1437. package/.output/public/_nuxt/dHwWyr6b.js +0 -1
  1438. package/.output/public/_nuxt/dcjPjLPI.js +0 -1
  1439. package/.output/public/_nuxt/default.BEXGWZFQ.css +0 -1
  1440. package/.output/public/_nuxt/entry.D6nBdXet.css +0 -1
  1441. package/.output/public/_nuxt/h-Fn7pRD.js +0 -1
  1442. package/.output/public/_nuxt/logs.BkJPbR_K.css +0 -1
  1443. package/.output/public/_nuxt/monitor.D3yEqqrv.css +0 -1
  1444. package/.output/public/_nuxt/ontology.CkuUThtY.css +0 -1
  1445. package/.output/public/_nuxt/operations.-l6u44Ar.css +0 -1
  1446. package/.output/public/_nuxt/pages.Cdpm_B-G.css +0 -1
  1447. package/.output/public/_nuxt/permissions.DxuOOIqQ.css +0 -1
  1448. package/.output/public/_nuxt/rDvMijKA.js +0 -9
  1449. package/.output/public/_nuxt/schedules.BXNJ9q_I.css +0 -1
  1450. package/.output/public/_nuxt/teams.CLQaXno5.css +0 -1
  1451. package/.output/public/_nuxt/tokens.BDSUWF-L.css +0 -1
  1452. package/.output/public/_nuxt/tools.BwXFAb-X.css +0 -1
  1453. package/.output/public/_nuxt/workshop.BBiFhXuM.css +0 -1
  1454. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs +0 -716
  1455. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs.map +0 -1
  1456. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs +0 -72
  1457. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs.map +0 -1
  1458. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs +0 -942
  1459. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs.map +0 -1
  1460. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs +0 -141
  1461. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs.map +0 -1
  1462. package/.output/server/chunks/build/TownView-BWMDbosY.mjs +0 -6489
  1463. package/.output/server/chunks/build/TownView-BWMDbosY.mjs.map +0 -1
  1464. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs +0 -392
  1465. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs.map +0 -1
  1466. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs +0 -2045
  1467. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs.map +0 -1
  1468. package/.output/server/chunks/build/_wsId_-C871SDPN.mjs +0 -14589
  1469. package/.output/server/chunks/build/_wsId_-C871SDPN.mjs.map +0 -1
  1470. package/.output/server/chunks/build/agents-D7CdEUTv.mjs +0 -1078
  1471. package/.output/server/chunks/build/agents-D7CdEUTv.mjs.map +0 -1
  1472. package/.output/server/chunks/build/alert-D0ivtTGy.mjs +0 -263
  1473. package/.output/server/chunks/build/alert-D0ivtTGy.mjs.map +0 -1
  1474. package/.output/server/chunks/build/aml-DRAFRcGU.mjs +0 -814
  1475. package/.output/server/chunks/build/aml-DRAFRcGU.mjs.map +0 -1
  1476. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs +0 -533
  1477. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs.map +0 -1
  1478. package/.output/server/chunks/build/api-B4Om0mEc.mjs +0 -53
  1479. package/.output/server/chunks/build/api-B4Om0mEc.mjs.map +0 -1
  1480. package/.output/server/chunks/build/api-BEW_ebY_.mjs +0 -64
  1481. package/.output/server/chunks/build/api-BEW_ebY_.mjs.map +0 -1
  1482. package/.output/server/chunks/build/api-BsAgXWxi.mjs +0 -72
  1483. package/.output/server/chunks/build/api-BsAgXWxi.mjs.map +0 -1
  1484. package/.output/server/chunks/build/api-error-BwAQLw44.mjs +0 -47
  1485. package/.output/server/chunks/build/api-error-BwAQLw44.mjs.map +0 -1
  1486. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs +0 -81
  1487. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs.map +0 -1
  1488. package/.output/server/chunks/build/board-CJUc032b.mjs +0 -189
  1489. package/.output/server/chunks/build/board-CJUc032b.mjs.map +0 -1
  1490. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs.map +0 -1
  1491. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs +0 -953
  1492. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs.map +0 -1
  1493. package/.output/server/chunks/build/channel-templates-ggsBacZF.mjs +0 -942
  1494. package/.output/server/chunks/build/channel-templates-ggsBacZF.mjs.map +0 -1
  1495. package/.output/server/chunks/build/chart-pipeline-BpoWYMK_.mjs.map +0 -1
  1496. package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs.map +0 -1
  1497. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs +0 -439
  1498. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs.map +0 -1
  1499. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs +0 -43
  1500. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs.map +0 -1
  1501. package/.output/server/chunks/build/constants-HPHJvjne.mjs +0 -142
  1502. package/.output/server/chunks/build/constants-HPHJvjne.mjs.map +0 -1
  1503. package/.output/server/chunks/build/core-CgTOPS4t.mjs +0 -294
  1504. package/.output/server/chunks/build/core-CgTOPS4t.mjs.map +0 -1
  1505. package/.output/server/chunks/build/daq-CdxcfY_G.mjs +0 -1266
  1506. package/.output/server/chunks/build/daq-CdxcfY_G.mjs.map +0 -1
  1507. package/.output/server/chunks/build/data-D8uX1dnm.mjs +0 -481
  1508. package/.output/server/chunks/build/data-D8uX1dnm.mjs.map +0 -1
  1509. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +0 -505
  1510. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs.map +0 -1
  1511. package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs.map +0 -1
  1512. package/.output/server/chunks/build/default-CNWS6NUw.mjs +0 -2353
  1513. package/.output/server/chunks/build/default-CNWS6NUw.mjs.map +0 -1
  1514. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs +0 -406
  1515. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs.map +0 -1
  1516. package/.output/server/chunks/build/drawer-Caji0PLs.mjs +0 -834
  1517. package/.output/server/chunks/build/drawer-Caji0PLs.mjs.map +0 -1
  1518. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs +0 -14
  1519. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs.map +0 -1
  1520. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs +0 -540
  1521. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs.map +0 -1
  1522. package/.output/server/chunks/build/es-Bxu10NJ2.mjs +0 -43
  1523. package/.output/server/chunks/build/es-Bxu10NJ2.mjs.map +0 -1
  1524. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs +0 -2448
  1525. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs.map +0 -1
  1526. package/.output/server/chunks/build/form-D_UpWPN4.mjs +0 -4712
  1527. package/.output/server/chunks/build/form-D_UpWPN4.mjs.map +0 -1
  1528. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs +0 -553
  1529. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs.map +0 -1
  1530. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs +0 -132
  1531. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs.map +0 -1
  1532. package/.output/server/chunks/build/input-GtPuSEgt.mjs +0 -2181
  1533. package/.output/server/chunks/build/input-GtPuSEgt.mjs.map +0 -1
  1534. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs +0 -1120
  1535. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs.map +0 -1
  1536. package/.output/server/chunks/build/interval-DvHBIIZh.mjs +0 -9
  1537. package/.output/server/chunks/build/interval-DvHBIIZh.mjs.map +0 -1
  1538. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs +0 -7
  1539. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs.map +0 -1
  1540. package/.output/server/chunks/build/logs-pRb-TMWa.mjs +0 -427
  1541. package/.output/server/chunks/build/logs-pRb-TMWa.mjs.map +0 -1
  1542. package/.output/server/chunks/build/menu-BXt-X0dt.mjs +0 -1952
  1543. package/.output/server/chunks/build/menu-BXt-X0dt.mjs.map +0 -1
  1544. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs +0 -2253
  1545. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs.map +0 -1
  1546. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs.map +0 -1
  1547. package/.output/server/chunks/build/ontology-ohICfVVb.mjs +0 -1406
  1548. package/.output/server/chunks/build/ontology-ohICfVVb.mjs.map +0 -1
  1549. package/.output/server/chunks/build/operations-SMQrRAcr.mjs +0 -311
  1550. package/.output/server/chunks/build/operations-SMQrRAcr.mjs.map +0 -1
  1551. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +0 -202
  1552. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs.map +0 -1
  1553. package/.output/server/chunks/build/pages-DsMKUw7i.mjs +0 -542
  1554. package/.output/server/chunks/build/pages-DsMKUw7i.mjs.map +0 -1
  1555. package/.output/server/chunks/build/pagination-DTAconUo.mjs +0 -1346
  1556. package/.output/server/chunks/build/pagination-DTAconUo.mjs.map +0 -1
  1557. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs +0 -637
  1558. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs.map +0 -1
  1559. package/.output/server/chunks/build/pipeline-CkavMBhk.mjs +0 -212
  1560. package/.output/server/chunks/build/pipeline-CkavMBhk.mjs.map +0 -1
  1561. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs +0 -272
  1562. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs.map +0 -1
  1563. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs +0 -340
  1564. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs.map +0 -1
  1565. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs +0 -78
  1566. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs.map +0 -1
  1567. package/.output/server/chunks/build/schedules-Hz2DJUE2.mjs +0 -7172
  1568. package/.output/server/chunks/build/schedules-Hz2DJUE2.mjs.map +0 -1
  1569. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs +0 -341
  1570. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs.map +0 -1
  1571. package/.output/server/chunks/build/select-B3Dsb9yq.mjs +0 -3923
  1572. package/.output/server/chunks/build/select-B3Dsb9yq.mjs.map +0 -1
  1573. package/.output/server/chunks/build/settings-DXLJPq7d.mjs +0 -1014
  1574. package/.output/server/chunks/build/settings-DXLJPq7d.mjs.map +0 -1
  1575. package/.output/server/chunks/build/space-Dwu2Skt8.mjs +0 -110
  1576. package/.output/server/chunks/build/space-Dwu2Skt8.mjs.map +0 -1
  1577. package/.output/server/chunks/build/spin-C2cuvGth.mjs +0 -357
  1578. package/.output/server/chunks/build/spin-C2cuvGth.mjs.map +0 -1
  1579. package/.output/server/chunks/build/studio-hSqH9TYS.mjs +0 -336
  1580. package/.output/server/chunks/build/studio-hSqH9TYS.mjs.map +0 -1
  1581. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs +0 -377
  1582. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs.map +0 -1
  1583. package/.output/server/chunks/build/table-CmVD-cA9.mjs +0 -7546
  1584. package/.output/server/chunks/build/table-CmVD-cA9.mjs.map +0 -1
  1585. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs +0 -1924
  1586. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs.map +0 -1
  1587. package/.output/server/chunks/build/tag-y0sn-xv9.mjs +0 -1156
  1588. package/.output/server/chunks/build/tag-y0sn-xv9.mjs.map +0 -1
  1589. package/.output/server/chunks/build/teams-BbwYJyzv.mjs +0 -1203
  1590. package/.output/server/chunks/build/teams-BbwYJyzv.mjs.map +0 -1
  1591. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs +0 -1062
  1592. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs.map +0 -1
  1593. package/.output/server/chunks/build/tools-CnYi9cou.mjs +0 -487
  1594. package/.output/server/chunks/build/tools-CnYi9cou.mjs.map +0 -1
  1595. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs +0 -920
  1596. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs.map +0 -1
  1597. package/.output/server/chunks/build/town-B5aoiG98.mjs +0 -133
  1598. package/.output/server/chunks/build/town-B5aoiG98.mjs.map +0 -1
  1599. package/.output/server/chunks/build/town-BV-hbwb5.mjs +0 -75
  1600. package/.output/server/chunks/build/town-BV-hbwb5.mjs.map +0 -1
  1601. package/.output/server/chunks/build/types-D6J7slEa.mjs +0 -5565
  1602. package/.output/server/chunks/build/types-D6J7slEa.mjs.map +0 -1
  1603. package/.output/server/chunks/build/types-DWqIeMRP.mjs +0 -76
  1604. package/.output/server/chunks/build/types-DWqIeMRP.mjs.map +0 -1
  1605. package/.output/server/chunks/build/useAgentHarnessOptions-Dq0l0Z6d.mjs +0 -124
  1606. package/.output/server/chunks/build/useAgentHarnessOptions-Dq0l0Z6d.mjs.map +0 -1
  1607. package/.output/server/chunks/build/useAgentTemplateActions-BFOHb5-L.mjs +0 -77
  1608. package/.output/server/chunks/build/useAgentTemplateActions-BFOHb5-L.mjs.map +0 -1
  1609. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +0 -67
  1610. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs.map +0 -1
  1611. package/.output/server/chunks/build/useAgentTemplateForm-CuJPOPcK.mjs +0 -117
  1612. package/.output/server/chunks/build/useAgentTemplateForm-CuJPOPcK.mjs.map +0 -1
  1613. package/.output/server/chunks/build/useAgentTemplatesCatalog-B2bIhZLA.mjs +0 -133
  1614. package/.output/server/chunks/build/useAgentTemplatesCatalog-B2bIhZLA.mjs.map +0 -1
  1615. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs +0 -92
  1616. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs.map +0 -1
  1617. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs +0 -86
  1618. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs.map +0 -1
  1619. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs +0 -194
  1620. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs.map +0 -1
  1621. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs +0 -89
  1622. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs.map +0 -1
  1623. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs +0 -82
  1624. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs.map +0 -1
  1625. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs +0 -267
  1626. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs.map +0 -1
  1627. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs +0 -93
  1628. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs.map +0 -1
  1629. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs +0 -86
  1630. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs.map +0 -1
  1631. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs +0 -130
  1632. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs.map +0 -1
  1633. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs +0 -129
  1634. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs.map +0 -1
  1635. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +0 -142
  1636. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs.map +0 -1
  1637. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs +0 -70
  1638. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs.map +0 -1
  1639. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs +0 -79
  1640. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs.map +0 -1
  1641. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs +0 -176
  1642. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs.map +0 -1
  1643. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +0 -99
  1644. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs.map +0 -1
  1645. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +0 -159
  1646. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs.map +0 -1
  1647. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +0 -222
  1648. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs.map +0 -1
  1649. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +0 -90
  1650. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs.map +0 -1
  1651. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs +0 -136
  1652. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs.map +0 -1
  1653. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +0 -395
  1654. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs.map +0 -1
  1655. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +0 -187
  1656. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs.map +0 -1
  1657. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs +0 -354
  1658. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs.map +0 -1
  1659. package/.output/server/chunks/build/useDashboardData-NJ7rKxhx.mjs +0 -153
  1660. package/.output/server/chunks/build/useDashboardData-NJ7rKxhx.mjs.map +0 -1
  1661. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +0 -219
  1662. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs.map +0 -1
  1663. package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs +0 -67
  1664. package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs.map +0 -1
  1665. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs +0 -184
  1666. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs.map +0 -1
  1667. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs +0 -148
  1668. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs.map +0 -1
  1669. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs +0 -71
  1670. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs.map +0 -1
  1671. package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs +0 -79
  1672. package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs.map +0 -1
  1673. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs +0 -137
  1674. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs.map +0 -1
  1675. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs +0 -104
  1676. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs.map +0 -1
  1677. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs +0 -121
  1678. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs.map +0 -1
  1679. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs +0 -93
  1680. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs.map +0 -1
  1681. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs +0 -98
  1682. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs.map +0 -1
  1683. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs +0 -88
  1684. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs.map +0 -1
  1685. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs +0 -258
  1686. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs.map +0 -1
  1687. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +0 -452
  1688. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs.map +0 -1
  1689. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs +0 -91
  1690. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs.map +0 -1
  1691. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs +0 -140
  1692. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs.map +0 -1
  1693. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs +0 -128
  1694. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs.map +0 -1
  1695. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs +0 -107
  1696. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs.map +0 -1
  1697. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs +0 -55
  1698. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs.map +0 -1
  1699. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs +0 -77
  1700. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs.map +0 -1
  1701. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs +0 -88
  1702. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs.map +0 -1
  1703. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs +0 -150
  1704. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs.map +0 -1
  1705. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs +0 -83
  1706. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs.map +0 -1
  1707. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs +0 -217
  1708. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs.map +0 -1
  1709. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs +0 -135
  1710. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs.map +0 -1
  1711. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs +0 -91
  1712. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs.map +0 -1
  1713. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +0 -71
  1714. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs.map +0 -1
  1715. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs +0 -195
  1716. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs.map +0 -1
  1717. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs +0 -149
  1718. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs.map +0 -1
  1719. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs +0 -156
  1720. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs.map +0 -1
  1721. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +0 -1
  1722. package/.output/server/chunks/build/useTeamActions-BDjU06LP.mjs +0 -79
  1723. package/.output/server/chunks/build/useTeamActions-BDjU06LP.mjs.map +0 -1
  1724. package/.output/server/chunks/build/useTeamAddMemberDialog-J3oFn3FI.mjs +0 -84
  1725. package/.output/server/chunks/build/useTeamAddMemberDialog-J3oFn3FI.mjs.map +0 -1
  1726. package/.output/server/chunks/build/useTeamCreateDialog-fbn4ixYu.mjs +0 -97
  1727. package/.output/server/chunks/build/useTeamCreateDialog-fbn4ixYu.mjs.map +0 -1
  1728. package/.output/server/chunks/build/useTeamDeployDialog-BNezMD2k.mjs +0 -80
  1729. package/.output/server/chunks/build/useTeamDeployDialog-BNezMD2k.mjs.map +0 -1
  1730. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +0 -82
  1731. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs.map +0 -1
  1732. package/.output/server/chunks/build/useTeamPluginDialog-BZznrOVe.mjs +0 -103
  1733. package/.output/server/chunks/build/useTeamPluginDialog-BZznrOVe.mjs.map +0 -1
  1734. package/.output/server/chunks/build/useTeamsCatalog-DuZFP3oG.mjs +0 -123
  1735. package/.output/server/chunks/build/useTeamsCatalog-DuZFP3oG.mjs.map +0 -1
  1736. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +0 -72
  1737. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs.map +0 -1
  1738. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs +0 -115
  1739. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs.map +0 -1
  1740. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs +0 -87
  1741. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs.map +0 -1
  1742. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs +0 -118
  1743. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs.map +0 -1
  1744. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs +0 -92
  1745. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs.map +0 -1
  1746. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs.map +0 -1
  1747. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs +0 -141
  1748. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs.map +0 -1
  1749. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs +0 -138
  1750. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs.map +0 -1
  1751. package/.output/server/chunks/build/useWorkshopApi-BxHn-4iR.mjs +0 -127
  1752. package/.output/server/chunks/build/useWorkshopApi-BxHn-4iR.mjs.map +0 -1
  1753. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs +0 -1659
  1754. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs.map +0 -1
  1755. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs +0 -60
  1756. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs.map +0 -1
  1757. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs +0 -92
  1758. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs.map +0 -1
  1759. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs +0 -78
  1760. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs.map +0 -1
  1761. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs +0 -168
  1762. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs.map +0 -1
  1763. package/.output/server/chunks/build/users-DjiVC_tS.mjs +0 -569
  1764. package/.output/server/chunks/build/users-DjiVC_tS.mjs.map +0 -1
  1765. package/.output/server/chunks/build/workshop-1gKeDASV.mjs +0 -546
  1766. package/.output/server/chunks/build/workshop-1gKeDASV.mjs.map +0 -1
  1767. package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs.map +0 -1
  1768. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.json +0 -1
  1769. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/1459e6269990a5d229b9228c8b2f62ffaa7d350068380ae8b875fee0db45cca6.source +0 -180
  1770. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/c2991e909c70c5c12b90a407c7adcf63384c51668a2b334e6e047fa675c268fe.source +0 -305
  1771. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/e09129039d1e27e3fac24becc9bdafd2d1a7c8049bff24173df007be865f0165.source +0 -264
  1772. package/app/.mimosa/hook-status/sess_05189059-e42d-4188-8911-4f7baabe009b-28ef7c75ea.json +0 -14
  1773. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.json +0 -1
  1774. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/942d2679b87b96c612b4f2a425c3ccc5b6f3234f0cf589a8441602f866fbe277.source +0 -41
  1775. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/dd617a82339d2c61e49e28e416aabeb2fc100fb3cb1beca18d02dfb833214af6.source +0 -51
  1776. package/server/.mimosa/hook-status/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2-e67b6b91bf.json +0 -14
  1777. package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json +0 -1
  1778. package/server/services/workshop/.mimosa/hook-status/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f-e6b75bbfe6.json +0 -14
  1779. package/server/services/workshop/aml/python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  1780. package/server/services/workshop/aml/python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1781. package/server/services/workshop/aml/python/__pycache__/train-example.cpython-312.pyc +0 -0
  1782. package/server/services/workshop/aml/python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  1783. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.json +0 -1
  1784. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.mvjqkcs6-68688-fb7131a89c.baseline/190a6772a4e43801737b4ba6072eb9d53d3099b5d8a9e6f57bc5e8592a26a6c4.source +0 -274
  1785. package/server/services/workshop/optimization/python/.mimosa/hook-status/session_187ec97f45d4bd02369bbe94da527cf1-01ed7f04fa.json +0 -14
  1786. package/server/services/workshop/optimization/python/__pycache__/problems.cpython-312.pyc +0 -0
  1787. /package/.output/public/_nuxt/{6P4ZAzxa2.js → 6P4ZAzxa.js} +0 -0
  1788. /package/.output/public/_nuxt/{9j2J4k4w.js → 9j2J4k4w2.js} +0 -0
  1789. /package/.output/public/_nuxt/{DgrK8UCQ.js → BvRk9kiK2.js} +0 -0
  1790. /package/.output/public/_nuxt/{dVw8IHY62.js → dVw8IHY6.js} +0 -0
  1791. /package/.output/public/_nuxt/{k9b520K-.js → k9b520K-2.js} +0 -0
  1792. /package/.output/server/chunks/{build → _}/builtin-catalog-edpDcgfL.mjs +0 -0
  1793. /package/.output/server/chunks/{build → _}/chart-pipeline-BpoWYMK_.mjs +0 -0
  1794. /package/.output/server/chunks/{build → _}/chart-trend-BWeZh5Lv.mjs +0 -0
  1795. /package/.output/server/chunks/{build → _}/dcw-driver-badge-Df5wL_ZA.mjs +0 -0
  1796. /package/.output/server/chunks/{build → _}/narrow-fetch-CcG-BPxc.mjs +0 -0
  1797. /package/.output/server/chunks/{build → _}/useResponsive-BKDMGTHs.mjs +0 -0
  1798. /package/.output/server/chunks/{build → _}/useTownBus-D9SoIsAN.mjs +0 -0
  1799. /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.