agentworkshop 0.8.2 → 0.8.3

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 (1557) hide show
  1. package/.output/.AgentWorkShop/aml-python/train-example.py +92 -92
  2. package/.output/nitro.json +1 -1
  3. package/.output/public/_nuxt/{BCLUwdP52.js → 39W1CH-l2.js} +1 -1
  4. package/.output/public/_nuxt/7xbYPfY6.js +1 -0
  5. package/.output/public/_nuxt/{BfvuWqSa.js → ATAvN55g.js} +1 -1
  6. package/.output/public/_nuxt/{B2NbzUau2.js → B3eCVqcT2.js} +1 -1
  7. package/.output/public/_nuxt/{DuUc4bbY2.js → B9qIhT7k2.js} +1 -1
  8. package/.output/public/_nuxt/{BkEokGX5.js → BE9oKpOt.js} +1 -1
  9. package/.output/public/_nuxt/{D_59BNP1.js → Bbk1XCCM.js} +3 -3
  10. package/.output/public/_nuxt/{Dz9C2pTa.js → CMzExk8F.js} +1 -1
  11. package/.output/public/_nuxt/{dHwWyr6b.js → CT4bi_Y4.js} +1 -1
  12. package/.output/public/_nuxt/{26OL4Ao82.js → CeCSjB9O2.js} +1 -1
  13. package/.output/public/_nuxt/{Dyxf2xZw.js → Cot5VNae.js} +1 -1
  14. package/.output/public/_nuxt/{BVg2R2VB2.js → Crf8_Ad02.js} +1 -1
  15. package/.output/public/_nuxt/{rDvMijKA.js → D9tNM-1a.js} +2 -2
  16. package/.output/public/_nuxt/{YAA98rWJ.js → DAug2CPf.js} +7 -7
  17. package/.output/public/_nuxt/{CQSxS_Ek.js → DbhTN7-T.js} +1 -1
  18. package/.output/public/_nuxt/DgGzwjAr2.js +2 -0
  19. package/.output/public/_nuxt/DkRozlDP2.js +1 -0
  20. package/.output/public/_nuxt/{DGu_fna7.js → DoChWkff.js} +1 -1
  21. package/.output/public/_nuxt/{Byiiiwc72.js → DxH5focQ2.js} +1 -1
  22. package/.output/public/_nuxt/Dyr3LPGL.js +1 -0
  23. package/.output/public/_nuxt/{CC2Pv8VL2.js → MC_i34H42.js} +1 -1
  24. package/.output/public/_nuxt/OmpTerminalPanel.DMWgGwDs.css +1 -0
  25. package/.output/public/_nuxt/PluginSlot.BqBzLD4T.css +1 -0
  26. package/.output/public/_nuxt/TownView.Cn8SPG7S.css +1 -0
  27. package/.output/public/_nuxt/{CmuGMxDP.js → TugRY_4O.js} +1 -1
  28. package/.output/public/_nuxt/{BPUQZ9Lq2.js → WybiLTow2.js} +1 -1
  29. package/.output/public/_nuxt/{BaYDgyaR.js → Zn0BZpf0.js} +3 -3
  30. package/.output/public/_nuxt/{_id_.BQRWK7J2.css → _id_.Be5JaH-P.css} +1 -1
  31. package/.output/public/_nuxt/{_wsId_.DCnKQQdY.css → _wsId_.p_vAYtTp.css} +1 -1
  32. package/.output/public/_nuxt/{agents.D-JPovTZ.css → agents.CRomddYR.css} +1 -1
  33. package/.output/public/_nuxt/aml.DgOMpDpv.css +1 -0
  34. package/.output/public/_nuxt/builds/latest.json +1 -1
  35. package/.output/public/_nuxt/builds/meta/fd0033e4-1eaa-42f8-9a04-3132717a703b.json +1 -0
  36. package/.output/public/_nuxt/{default.BEXGWZFQ.css → default.CpAx70gC.css} +1 -1
  37. package/.output/public/_nuxt/{logs.BkJPbR_K.css → logs.DcSvz6vi.css} +1 -1
  38. package/.output/public/_nuxt/{monitor.D3yEqqrv.css → monitor.OoNTwfMJ.css} +1 -1
  39. package/.output/public/_nuxt/{ontology.B_3Wn907.css → ontology.JqJ6PjV1.css} +1 -1
  40. package/.output/public/_nuxt/{operations.-l6u44Ar.css → operations.C48ggFa5.css} +1 -1
  41. package/.output/public/_nuxt/{pages.Cdpm_B-G.css → pages.Dpa28tJW.css} +1 -1
  42. package/.output/public/_nuxt/permissions.CrV-4t-6.css +1 -0
  43. package/.output/public/_nuxt/{BfeXib9G.js → rcdmiszh2.js} +1 -1
  44. package/.output/public/_nuxt/schedules.DYWOjGHm.css +1 -0
  45. package/.output/public/_nuxt/{teams.CLQaXno5.css → teams.DEJoJ4QV.css} +1 -1
  46. package/.output/public/_nuxt/{tokens.BDSUWF-L.css → tokens.DKZWCP5v.css} +1 -1
  47. package/.output/public/_nuxt/tools.DP-nsTli.css +1 -0
  48. package/.output/public/_nuxt/wK6Pp4Zc2.js +2 -0
  49. package/.output/public/_nuxt/{workshop.BBiFhXuM.css → workshop.PT1xhP8C.css} +1 -1
  50. package/.output/public/favicon.svg +14 -14
  51. package/.output/public/robots.txt +3 -3
  52. package/.output/server/chunks/_/LeftOutlined.mjs.map +1 -1
  53. package/.output/server/chunks/_/RightOutlined.mjs.map +1 -1
  54. package/.output/server/chunks/_/SearchOutlined.mjs +1230 -1261
  55. package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
  56. package/.output/server/chunks/_/error-500.mjs.map +1 -1
  57. package/.output/server/chunks/_/nitro.mjs +3243 -3324
  58. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  59. package/.output/server/chunks/build/AuthGate-G74Wr5IV.mjs +704 -0
  60. package/.output/server/chunks/build/AuthGate-G74Wr5IV.mjs.map +1 -0
  61. package/.output/server/chunks/build/FormItemContext-DmuQqaeJ.mjs +77 -0
  62. package/.output/server/chunks/build/FormItemContext-DmuQqaeJ.mjs.map +1 -0
  63. package/.output/server/chunks/build/OmpTerminalPanel-5cB-78zp.mjs +889 -0
  64. package/.output/server/chunks/build/OmpTerminalPanel-5cB-78zp.mjs.map +1 -0
  65. package/.output/server/chunks/build/PluginSlot-CZlGlRoR.mjs +131 -0
  66. package/.output/server/chunks/build/PluginSlot-CZlGlRoR.mjs.map +1 -0
  67. package/.output/server/chunks/build/TownView-CUbzOT_M.mjs +5960 -0
  68. package/.output/server/chunks/build/TownView-CUbzOT_M.mjs.map +1 -0
  69. package/.output/server/chunks/build/_id_-BHWZiRQZ.mjs +373 -0
  70. package/.output/server/chunks/build/_id_-BHWZiRQZ.mjs.map +1 -0
  71. package/.output/server/chunks/build/_id_-JaGx0yBE.mjs +1922 -0
  72. package/.output/server/chunks/build/_id_-JaGx0yBE.mjs.map +1 -0
  73. package/.output/server/chunks/build/_wsId_-C4DKkEqv.mjs +13707 -0
  74. package/.output/server/chunks/build/_wsId_-C4DKkEqv.mjs.map +1 -0
  75. package/.output/server/chunks/build/agents-DRod4lTC.mjs +1047 -0
  76. package/.output/server/chunks/build/agents-DRod4lTC.mjs.map +1 -0
  77. package/.output/server/chunks/build/alert-CNGhs--Y.mjs +260 -0
  78. package/.output/server/chunks/build/alert-CNGhs--Y.mjs.map +1 -0
  79. package/.output/server/chunks/build/aml-B3Umz4DR.mjs +729 -0
  80. package/.output/server/chunks/build/aml-B3Umz4DR.mjs.map +1 -0
  81. package/.output/server/chunks/build/analysis-tNpFLtMt.mjs +502 -0
  82. package/.output/server/chunks/build/analysis-tNpFLtMt.mjs.map +1 -0
  83. package/.output/server/chunks/build/{api-B4Om0mEc.mjs → api-D-zkgkj-.mjs} +8 -10
  84. package/.output/server/chunks/build/api-D-zkgkj-.mjs.map +1 -0
  85. package/.output/server/chunks/build/{api-BsAgXWxi.mjs → api-D3gy2e2q.mjs} +22 -24
  86. package/.output/server/chunks/build/api-D3gy2e2q.mjs.map +1 -0
  87. package/.output/server/chunks/build/{api-BEW_ebY_.mjs → api-bn4OKkl_.mjs} +17 -19
  88. package/.output/server/chunks/build/api-bn4OKkl_.mjs.map +1 -0
  89. package/.output/server/chunks/build/api-error-CnW_xiNI.mjs +46 -0
  90. package/.output/server/chunks/build/api-error-CnW_xiNI.mjs.map +1 -0
  91. package/.output/server/chunks/build/apiClient-DIXx9sfD.mjs +70 -0
  92. package/.output/server/chunks/build/apiClient-DIXx9sfD.mjs.map +1 -0
  93. package/.output/server/chunks/build/board-B2oYXGBy.mjs +172 -0
  94. package/.output/server/chunks/build/board-B2oYXGBy.mjs.map +1 -0
  95. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs +81 -94
  96. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs.map +1 -1
  97. package/.output/server/chunks/build/card-BECE6y_G.mjs +922 -0
  98. package/.output/server/chunks/build/card-BECE6y_G.mjs.map +1 -0
  99. package/.output/server/chunks/build/channel-templates-R2TInv8B.mjs +950 -0
  100. package/.output/server/chunks/build/channel-templates-R2TInv8B.mjs.map +1 -0
  101. package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs +113 -112
  102. package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs.map +1 -1
  103. package/.output/server/chunks/build/checkbox-C6xY5uc6.mjs +429 -0
  104. package/.output/server/chunks/build/checkbox-C6xY5uc6.mjs.map +1 -0
  105. package/.output/server/chunks/build/client-only-S7k53PIm.mjs +42 -0
  106. package/.output/server/chunks/build/client-only-S7k53PIm.mjs.map +1 -0
  107. package/.output/server/chunks/build/constants-HPHJvjne.mjs +65 -75
  108. package/.output/server/chunks/build/constants-HPHJvjne.mjs.map +1 -1
  109. package/.output/server/chunks/build/core-CRlsQhzd.mjs +292 -0
  110. package/.output/server/chunks/build/core-CRlsQhzd.mjs.map +1 -0
  111. package/.output/server/chunks/build/daq-DHsYtWC-.mjs +1210 -0
  112. package/.output/server/chunks/build/daq-DHsYtWC-.mjs.map +1 -0
  113. package/.output/server/chunks/build/data-Cl4wRZO6.mjs +459 -0
  114. package/.output/server/chunks/build/data-Cl4wRZO6.mjs.map +1 -0
  115. package/.output/server/chunks/build/dcw-DnjOM6p1.mjs +467 -0
  116. package/.output/server/chunks/build/dcw-DnjOM6p1.mjs.map +1 -0
  117. package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs +3 -15
  118. package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs.map +1 -1
  119. package/.output/server/chunks/build/default-DDRKP2Mb.mjs +2246 -0
  120. package/.output/server/chunks/build/default-DDRKP2Mb.mjs.map +1 -0
  121. package/.output/server/chunks/build/descriptions-B3uhDesi.mjs +401 -0
  122. package/.output/server/chunks/build/descriptions-B3uhDesi.mjs.map +1 -0
  123. package/.output/server/chunks/build/drawer-DwXxapMg.mjs +822 -0
  124. package/.output/server/chunks/build/drawer-DwXxapMg.mjs.map +1 -0
  125. package/.output/server/chunks/build/dropdown-DLrGy-Fs.mjs +12 -0
  126. package/.output/server/chunks/build/dropdown-DLrGy-Fs.mjs.map +1 -0
  127. package/.output/server/chunks/build/dropdown-nsGv8Gqx.mjs +530 -0
  128. package/.output/server/chunks/build/dropdown-nsGv8Gqx.mjs.map +1 -0
  129. package/.output/server/chunks/build/{es-Bxu10NJ2.mjs → es-DXSEkmAm.mjs} +1 -2
  130. package/.output/server/chunks/build/es-DXSEkmAm.mjs.map +1 -0
  131. package/.output/server/chunks/build/firstNotUndefined-laiThpLD.mjs +2082 -0
  132. package/.output/server/chunks/build/firstNotUndefined-laiThpLD.mjs.map +1 -0
  133. package/.output/server/chunks/build/form-Cw2Ex9w5.mjs +3543 -0
  134. package/.output/server/chunks/build/form-Cw2Ex9w5.mjs.map +1 -0
  135. package/.output/server/chunks/build/hasIn-RYRGomyg.mjs +192 -0
  136. package/.output/server/chunks/build/hasIn-RYRGomyg.mjs.map +1 -0
  137. package/.output/server/chunks/build/hitl-B4cHRlkC.mjs +120 -0
  138. package/.output/server/chunks/build/hitl-B4cHRlkC.mjs.map +1 -0
  139. package/.output/server/chunks/build/input-CJgB-RL6.mjs +1705 -0
  140. package/.output/server/chunks/build/input-CJgB-RL6.mjs.map +1 -0
  141. package/.output/server/chunks/build/input-number-CQKL42p_.mjs +1027 -0
  142. package/.output/server/chunks/build/input-number-CQKL42p_.mjs.map +1 -0
  143. package/.output/server/chunks/build/interval-DiAUqODq.mjs +8 -0
  144. package/.output/server/chunks/build/interval-DiAUqODq.mjs.map +1 -0
  145. package/.output/server/chunks/build/isNumeric-DQiJ-b15.mjs +6 -0
  146. package/.output/server/chunks/build/isNumeric-DQiJ-b15.mjs.map +1 -0
  147. package/.output/server/chunks/build/logs-C4vKFkHQ.mjs +381 -0
  148. package/.output/server/chunks/build/logs-C4vKFkHQ.mjs.map +1 -0
  149. package/.output/server/chunks/build/menu-xO8ocVtL.mjs +1833 -0
  150. package/.output/server/chunks/build/menu-xO8ocVtL.mjs.map +1 -0
  151. package/.output/server/chunks/build/monitor-BNrG6v3b.mjs +2216 -0
  152. package/.output/server/chunks/build/monitor-BNrG6v3b.mjs.map +1 -0
  153. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs +0 -2
  154. package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs.map +1 -1
  155. package/.output/server/chunks/build/ontology-B_0Vm6j-.mjs +1416 -0
  156. package/.output/server/chunks/build/ontology-B_0Vm6j-.mjs.map +1 -0
  157. package/.output/server/chunks/build/operations-D8D6-Jm-.mjs +278 -0
  158. package/.output/server/chunks/build/operations-D8D6-Jm-.mjs.map +1 -0
  159. package/.output/server/chunks/build/optimizer-DaTyaY3c.mjs +202 -0
  160. package/.output/server/chunks/build/optimizer-DaTyaY3c.mjs.map +1 -0
  161. package/.output/server/chunks/build/pages-Dac4icQC.mjs +439 -0
  162. package/.output/server/chunks/build/pages-Dac4icQC.mjs.map +1 -0
  163. package/.output/server/chunks/build/pagination-BTzq7dD5.mjs +1330 -0
  164. package/.output/server/chunks/build/pagination-BTzq7dD5.mjs.map +1 -0
  165. package/.output/server/chunks/build/permissions-qmimwB0M.mjs +649 -0
  166. package/.output/server/chunks/build/permissions-qmimwB0M.mjs.map +1 -0
  167. package/.output/server/chunks/build/plugins-Dh_goy-k.mjs +269 -0
  168. package/.output/server/chunks/build/plugins-Dh_goy-k.mjs.map +1 -0
  169. package/.output/server/chunks/build/popconfirm-DuGF7ty-.mjs +333 -0
  170. package/.output/server/chunks/build/popconfirm-DuGF7ty-.mjs.map +1 -0
  171. package/.output/server/chunks/build/responsiveObserve-CzRpNXkr.mjs +77 -0
  172. package/.output/server/chunks/build/responsiveObserve-CzRpNXkr.mjs.map +1 -0
  173. package/.output/server/chunks/build/schedules-C2_x38gj.mjs +7039 -0
  174. package/.output/server/chunks/build/schedules-C2_x38gj.mjs.map +1 -0
  175. package/.output/server/chunks/build/segmented-29uEKZ3D.mjs +332 -0
  176. package/.output/server/chunks/build/segmented-29uEKZ3D.mjs.map +1 -0
  177. package/.output/server/chunks/build/select-CJb2XrQf.mjs +3734 -0
  178. package/.output/server/chunks/build/select-CJb2XrQf.mjs.map +1 -0
  179. package/.output/server/chunks/build/settings-Cz2Plds0.mjs +944 -0
  180. package/.output/server/chunks/build/settings-Cz2Plds0.mjs.map +1 -0
  181. package/.output/server/chunks/build/space-BByD-mFE.mjs +107 -0
  182. package/.output/server/chunks/build/space-BByD-mFE.mjs.map +1 -0
  183. package/.output/server/chunks/build/spin-XhbgGeLP.mjs +313 -0
  184. package/.output/server/chunks/build/spin-XhbgGeLP.mjs.map +1 -0
  185. package/.output/server/chunks/build/studio-CwYXl00G.mjs +329 -0
  186. package/.output/server/chunks/build/studio-CwYXl00G.mjs.map +1 -0
  187. package/.output/server/chunks/build/switch-DWcwVFxW.mjs +374 -0
  188. package/.output/server/chunks/build/switch-DWcwVFxW.mjs.map +1 -0
  189. package/.output/server/chunks/build/table-Zhuo7Fq-.mjs +7249 -0
  190. package/.output/server/chunks/build/table-Zhuo7Fq-.mjs.map +1 -0
  191. package/.output/server/chunks/build/tabs-BCwBXjNt.mjs +1838 -0
  192. package/.output/server/chunks/build/tabs-BCwBXjNt.mjs.map +1 -0
  193. package/.output/server/chunks/build/tag-CRW-anwy.mjs +1010 -0
  194. package/.output/server/chunks/build/tag-CRW-anwy.mjs.map +1 -0
  195. package/.output/server/chunks/build/teams-CwhFdcYn.mjs +1160 -0
  196. package/.output/server/chunks/build/teams-CwhFdcYn.mjs.map +1 -0
  197. package/.output/server/chunks/build/tokens-C5ODO1HA.mjs +992 -0
  198. package/.output/server/chunks/build/tokens-C5ODO1HA.mjs.map +1 -0
  199. package/.output/server/chunks/build/tools-C0YKragH.mjs +487 -0
  200. package/.output/server/chunks/build/tools-C0YKragH.mjs.map +1 -0
  201. package/.output/server/chunks/build/tooltip-GlMrUZzx.mjs +888 -0
  202. package/.output/server/chunks/build/tooltip-GlMrUZzx.mjs.map +1 -0
  203. package/.output/server/chunks/build/town-BV-hbwb5.mjs +16 -29
  204. package/.output/server/chunks/build/town-BV-hbwb5.mjs.map +1 -1
  205. package/.output/server/chunks/build/town-LkDwWnKA.mjs +117 -0
  206. package/.output/server/chunks/build/town-LkDwWnKA.mjs.map +1 -0
  207. package/.output/server/chunks/build/types-D6J7slEa.mjs.map +1 -1
  208. package/.output/server/chunks/build/types-DWqIeMRP.mjs +28 -29
  209. package/.output/server/chunks/build/types-DWqIeMRP.mjs.map +1 -1
  210. package/.output/server/chunks/build/useAgentHarnessOptions-CYKuLtZ2.mjs +120 -0
  211. package/.output/server/chunks/build/useAgentHarnessOptions-CYKuLtZ2.mjs.map +1 -0
  212. package/.output/server/chunks/build/useAgentTemplateActions-Da_V1LSD.mjs +71 -0
  213. package/.output/server/chunks/build/useAgentTemplateActions-Da_V1LSD.mjs.map +1 -0
  214. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +16 -23
  215. package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs.map +1 -1
  216. package/.output/server/chunks/build/useAgentTemplateForm-BWvax5_E.mjs +112 -0
  217. package/.output/server/chunks/build/useAgentTemplateForm-BWvax5_E.mjs.map +1 -0
  218. package/.output/server/chunks/build/useAgentTemplatesCatalog-BnYjZy59.mjs +140 -0
  219. package/.output/server/chunks/build/useAgentTemplatesCatalog-BnYjZy59.mjs.map +1 -0
  220. package/.output/server/chunks/build/useAmlDatasets-nGi10DAl.mjs +88 -0
  221. package/.output/server/chunks/build/useAmlDatasets-nGi10DAl.mjs.map +1 -0
  222. package/.output/server/chunks/build/useAmlEntities-CTgNAgcZ.mjs +79 -0
  223. package/.output/server/chunks/build/useAmlEntities-CTgNAgcZ.mjs.map +1 -0
  224. package/.output/server/chunks/build/useAmlEnv-Da2TVfyK.mjs +188 -0
  225. package/.output/server/chunks/build/useAmlEnv-Da2TVfyK.mjs.map +1 -0
  226. package/.output/server/chunks/build/useAmlExperiments-U9AQ52RI.mjs +86 -0
  227. package/.output/server/chunks/build/useAmlExperiments-U9AQ52RI.mjs.map +1 -0
  228. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs +32 -37
  229. package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs.map +1 -1
  230. package/.output/server/chunks/build/useAmlJobs-BM1mu5iH.mjs +251 -0
  231. package/.output/server/chunks/build/useAmlJobs-BM1mu5iH.mjs.map +1 -0
  232. package/.output/server/chunks/build/useAmlModels-C1DwIOMi.mjs +90 -0
  233. package/.output/server/chunks/build/useAmlModels-C1DwIOMi.mjs.map +1 -0
  234. package/.output/server/chunks/build/useAmlNotes-CNm47QdS.mjs +80 -0
  235. package/.output/server/chunks/build/useAmlNotes-CNm47QdS.mjs.map +1 -0
  236. package/.output/server/chunks/build/useAmlPredict-m8I1AdRn.mjs +126 -0
  237. package/.output/server/chunks/build/useAmlPredict-m8I1AdRn.mjs.map +1 -0
  238. package/.output/server/chunks/build/useAnalysisFeed-CpbOaiBD.mjs +120 -0
  239. package/.output/server/chunks/build/useAnalysisFeed-CpbOaiBD.mjs.map +1 -0
  240. package/.output/server/chunks/build/useDaqAddNode-CRorxgOY.mjs +141 -0
  241. package/.output/server/chunks/build/useDaqAddNode-CRorxgOY.mjs.map +1 -0
  242. package/.output/server/chunks/build/useDaqDetailBinding-Ck-YUW9J.mjs +72 -0
  243. package/.output/server/chunks/build/useDaqDetailBinding-Ck-YUW9J.mjs.map +1 -0
  244. package/.output/server/chunks/build/useDaqDetailFrames-CLMoreaz.mjs +78 -0
  245. package/.output/server/chunks/build/useDaqDetailFrames-CLMoreaz.mjs.map +1 -0
  246. package/.output/server/chunks/build/useDaqDetailHistory-BVNQXwC_.mjs +166 -0
  247. package/.output/server/chunks/build/useDaqDetailHistory-BVNQXwC_.mjs.map +1 -0
  248. package/.output/server/chunks/build/useDaqDetailNode-BC0e9OfX.mjs +103 -0
  249. package/.output/server/chunks/build/useDaqDetailNode-BC0e9OfX.mjs.map +1 -0
  250. package/.output/server/chunks/build/useDaqDetailParams-D173iwFg.mjs +157 -0
  251. package/.output/server/chunks/build/useDaqDetailParams-D173iwFg.mjs.map +1 -0
  252. package/.output/server/chunks/build/useDaqFilters-CC-o_21d.mjs +224 -0
  253. package/.output/server/chunks/build/useDaqFilters-CC-o_21d.mjs.map +1 -0
  254. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +43 -44
  255. package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs.map +1 -1
  256. package/.output/server/chunks/build/useDaqOptimizations-4vK2w1yn.mjs +132 -0
  257. package/.output/server/chunks/build/useDaqOptimizations-4vK2w1yn.mjs.map +1 -0
  258. package/.output/server/chunks/build/useDaqStream-BHKpSJFd.mjs +385 -0
  259. package/.output/server/chunks/build/useDaqStream-BHKpSJFd.mjs.map +1 -0
  260. package/.output/server/chunks/build/useDaqTemplates-CsXSc7yI.mjs +181 -0
  261. package/.output/server/chunks/build/useDaqTemplates-CsXSc7yI.mjs.map +1 -0
  262. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs +312 -310
  263. package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs.map +1 -1
  264. package/.output/server/chunks/build/useDashboardData-DuKjuJTz.mjs +139 -0
  265. package/.output/server/chunks/build/useDashboardData-DuKjuJTz.mjs.map +1 -0
  266. package/.output/server/chunks/build/useDcwAddNode-C5DcxsHF.mjs +217 -0
  267. package/.output/server/chunks/build/useDcwAddNode-C5DcxsHF.mjs.map +1 -0
  268. package/.output/server/chunks/build/{useDcwCards-SaiImIYQ.mjs → useDcwCards-0bAVo6uB.mjs} +20 -23
  269. package/.output/server/chunks/build/useDcwCards-0bAVo6uB.mjs.map +1 -0
  270. package/.output/server/chunks/build/useDcwDetailScope-BNFOlt2v.mjs +184 -0
  271. package/.output/server/chunks/build/useDcwDetailScope-BNFOlt2v.mjs.map +1 -0
  272. package/.output/server/chunks/build/useDcwDetailTemplates-DSH-o0tE.mjs +143 -0
  273. package/.output/server/chunks/build/useDcwDetailTemplates-DSH-o0tE.mjs.map +1 -0
  274. package/.output/server/chunks/build/useDcwFilter-W61BFUcT.mjs +65 -0
  275. package/.output/server/chunks/build/useDcwFilter-W61BFUcT.mjs.map +1 -0
  276. package/.output/server/chunks/build/{useDcwLedger-0ie-0WTc.mjs → useDcwLedger-DsColLdc.mjs} +29 -35
  277. package/.output/server/chunks/build/useDcwLedger-DsColLdc.mjs.map +1 -0
  278. package/.output/server/chunks/build/useDcwLineMutations-Cx4Ir7g3.mjs +133 -0
  279. package/.output/server/chunks/build/useDcwLineMutations-Cx4Ir7g3.mjs.map +1 -0
  280. package/.output/server/chunks/build/useDcwLineRun-DQ0vB08z.mjs +100 -0
  281. package/.output/server/chunks/build/useDcwLineRun-DQ0vB08z.mjs.map +1 -0
  282. package/.output/server/chunks/build/useDcwParamApprovals-CYspRuDk.mjs +119 -0
  283. package/.output/server/chunks/build/useDcwParamApprovals-CYspRuDk.mjs.map +1 -0
  284. package/.output/server/chunks/build/useDcwProducts-CTbm_5S_.mjs +88 -0
  285. package/.output/server/chunks/build/useDcwProducts-CTbm_5S_.mjs.map +1 -0
  286. package/.output/server/chunks/build/useDcwQuery-E0yjZs7G.mjs +93 -0
  287. package/.output/server/chunks/build/useDcwQuery-E0yjZs7G.mjs.map +1 -0
  288. package/.output/server/chunks/build/useDcwQuickActions-BvT5VFOY.mjs +84 -0
  289. package/.output/server/chunks/build/useDcwQuickActions-BvT5VFOY.mjs.map +1 -0
  290. package/.output/server/chunks/build/useDcwRecipes-zngShyk0.mjs +263 -0
  291. package/.output/server/chunks/build/useDcwRecipes-zngShyk0.mjs.map +1 -0
  292. package/.output/server/chunks/build/useDcwStream-82IdjJKk.mjs +455 -0
  293. package/.output/server/chunks/build/useDcwStream-82IdjJKk.mjs.map +1 -0
  294. package/.output/server/chunks/build/useDcwTemplates-CpHrcnvJ.mjs +87 -0
  295. package/.output/server/chunks/build/useDcwTemplates-CpHrcnvJ.mjs.map +1 -0
  296. package/.output/server/chunks/build/useDcwWrites-BlOhljp9.mjs +136 -0
  297. package/.output/server/chunks/build/useDcwWrites-BlOhljp9.mjs.map +1 -0
  298. package/.output/server/chunks/build/useDeviceTwins-DL-VLFeX.mjs +118 -0
  299. package/.output/server/chunks/build/useDeviceTwins-DL-VLFeX.mjs.map +1 -0
  300. package/.output/server/chunks/build/useExpConfirmations-DgwqTb9O.mjs +104 -0
  301. package/.output/server/chunks/build/useExpConfirmations-DgwqTb9O.mjs.map +1 -0
  302. package/.output/server/chunks/build/useLocalTime-C__kwn8h.mjs +52 -0
  303. package/.output/server/chunks/build/useLocalTime-C__kwn8h.mjs.map +1 -0
  304. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs +30 -33
  305. package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs.map +1 -1
  306. package/.output/server/chunks/build/useLogsManual-BcfanT0s.mjs +80 -0
  307. package/.output/server/chunks/build/useLogsManual-BcfanT0s.mjs.map +1 -0
  308. package/.output/server/chunks/build/useLogsQuery-BGlKVKpV.mjs +136 -0
  309. package/.output/server/chunks/build/useLogsQuery-BGlKVKpV.mjs.map +1 -0
  310. package/.output/server/chunks/build/useLogsScope-BRyy550Y.mjs +75 -0
  311. package/.output/server/chunks/build/useLogsScope-BRyy550Y.mjs.map +1 -0
  312. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs +155 -166
  313. package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs.map +1 -1
  314. package/.output/server/chunks/build/useMonitorData-BUey2Xly.mjs +128 -0
  315. package/.output/server/chunks/build/useMonitorData-BUey2Xly.mjs.map +1 -0
  316. package/.output/server/chunks/build/useMonitorFormat-rhs7FlNo.mjs +77 -0
  317. package/.output/server/chunks/build/useMonitorFormat-rhs7FlNo.mjs.map +1 -0
  318. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +20 -27
  319. package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs.map +1 -1
  320. package/.output/server/chunks/build/useOperationsFeed-DWfCjP4l.mjs +182 -0
  321. package/.output/server/chunks/build/useOperationsFeed-DWfCjP4l.mjs.map +1 -0
  322. package/.output/server/chunks/build/useOpsLog--yf8erUi.mjs +139 -0
  323. package/.output/server/chunks/build/useOpsLog--yf8erUi.mjs.map +1 -0
  324. package/.output/server/chunks/build/useRecipeDispatchApprovals-CKF2sB9P.mjs +146 -0
  325. package/.output/server/chunks/build/useRecipeDispatchApprovals-CKF2sB9P.mjs.map +1 -0
  326. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs +23 -39
  327. package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +1 -1
  328. package/.output/server/chunks/build/useTeamActions-C08sAVqY.mjs +71 -0
  329. package/.output/server/chunks/build/useTeamActions-C08sAVqY.mjs.map +1 -0
  330. package/.output/server/chunks/build/useTeamAddMemberDialog-fzTmflr8.mjs +78 -0
  331. package/.output/server/chunks/build/useTeamAddMemberDialog-fzTmflr8.mjs.map +1 -0
  332. package/.output/server/chunks/build/useTeamCreateDialog-De63ep-X.mjs +91 -0
  333. package/.output/server/chunks/build/useTeamCreateDialog-De63ep-X.mjs.map +1 -0
  334. package/.output/server/chunks/build/useTeamDeployDialog-CpAtG5Jy.mjs +76 -0
  335. package/.output/server/chunks/build/useTeamDeployDialog-CpAtG5Jy.mjs.map +1 -0
  336. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +31 -38
  337. package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs.map +1 -1
  338. package/.output/server/chunks/build/useTeamPluginDialog-C1OOe1sL.mjs +99 -0
  339. package/.output/server/chunks/build/useTeamPluginDialog-C1OOe1sL.mjs.map +1 -0
  340. package/.output/server/chunks/build/useTeamsCatalog-DA41SMDu.mjs +124 -0
  341. package/.output/server/chunks/build/useTeamsCatalog-DA41SMDu.mjs.map +1 -0
  342. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +21 -28
  343. package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs.map +1 -1
  344. package/.output/server/chunks/build/useTokenCreate-XHTQExra.mjs +106 -0
  345. package/.output/server/chunks/build/useTokenCreate-XHTQExra.mjs.map +1 -0
  346. package/.output/server/chunks/build/useTokenRename-Cf1B0cRy.mjs +81 -0
  347. package/.output/server/chunks/build/useTokenRename-Cf1B0cRy.mjs.map +1 -0
  348. package/.output/server/chunks/build/useTokenReveal-C8n1Vt9t.mjs +108 -0
  349. package/.output/server/chunks/build/useTokenReveal-C8n1Vt9t.mjs.map +1 -0
  350. package/.output/server/chunks/build/useTokensList-MMIq24E-.mjs +86 -0
  351. package/.output/server/chunks/build/useTokensList-MMIq24E-.mjs.map +1 -0
  352. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs +16 -17
  353. package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs.map +1 -1
  354. package/.output/server/chunks/build/useWorkbenchAuth-Dyc_czui.mjs +131 -0
  355. package/.output/server/chunks/build/useWorkbenchAuth-Dyc_czui.mjs.map +1 -0
  356. package/.output/server/chunks/build/useWorkbenchWorkspaces-DT33HbBD.mjs +128 -0
  357. package/.output/server/chunks/build/useWorkbenchWorkspaces-DT33HbBD.mjs.map +1 -0
  358. package/.output/server/chunks/build/useWorkshopApi-BkEgGBIM.mjs +118 -0
  359. package/.output/server/chunks/build/useWorkshopApi-BkEgGBIM.mjs.map +1 -0
  360. package/.output/server/chunks/build/useWorkshopWs-BWrVj4jL.mjs +1577 -0
  361. package/.output/server/chunks/build/useWorkshopWs-BWrVj4jL.mjs.map +1 -0
  362. package/.output/server/chunks/build/{useWorkspaceAuth-Dlvj9csD.mjs → useWorkspaceAuth-TahC9EC7.mjs} +4 -16
  363. package/.output/server/chunks/build/useWorkspaceAuth-TahC9EC7.mjs.map +1 -0
  364. package/.output/server/chunks/build/useWorkspaceChannels-BVAHmhN3.mjs +94 -0
  365. package/.output/server/chunks/build/useWorkspaceChannels-BVAHmhN3.mjs.map +1 -0
  366. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs +30 -33
  367. package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs.map +1 -1
  368. package/.output/server/chunks/build/useWorkspaceShell-rQHWNNWJ.mjs +150 -0
  369. package/.output/server/chunks/build/useWorkspaceShell-rQHWNNWJ.mjs.map +1 -0
  370. package/.output/server/chunks/build/users-pVCK50z-.mjs +566 -0
  371. package/.output/server/chunks/build/users-pVCK50z-.mjs.map +1 -0
  372. package/.output/server/chunks/build/workshop-DAgsBgG4.mjs +499 -0
  373. package/.output/server/chunks/build/workshop-DAgsBgG4.mjs.map +1 -0
  374. package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs +111 -121
  375. package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs.map +1 -1
  376. package/.output/server/chunks/routes/renderer.mjs +1 -1
  377. package/.output/server/chunks/routes/renderer.mjs.map +1 -1
  378. package/.output/server/chunks/virtual/entry.mjs +9357 -10721
  379. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  380. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  381. package/.output/server/chunks/virtual/precomputed.mjs.map +1 -1
  382. package/.output/server/package.json +1 -1
  383. package/README-zh.md +2 -2
  384. package/README.md +3 -3
  385. package/app/components/AwLogo.vue +75 -75
  386. package/app/components/aml/AmlDatasetFormModal.vue +279 -279
  387. package/app/components/aml/AmlDatasetTable.vue +319 -319
  388. package/app/components/aml/AmlExperimentsTable.vue +142 -142
  389. package/app/components/aml/AmlInfraBanner.vue +23 -23
  390. package/app/components/aml/AmlJobsTable.vue +248 -248
  391. package/app/components/aml/AmlOverviewBar.vue +62 -62
  392. package/app/components/aml/AmlPageHeader.vue +47 -47
  393. package/app/components/aml/AmlPredictConsole.vue +201 -201
  394. package/app/components/app-header/HitlBell.vue +423 -423
  395. package/app/components/daq/DaqAddNodeModal.vue +209 -209
  396. package/app/components/daq/DaqAlarmBar.vue +46 -46
  397. package/app/components/daq/DaqControlCard.vue +159 -159
  398. package/app/components/daq/DaqInfraBanner.vue +31 -31
  399. package/app/components/daq/DaqLineBanner.vue +47 -47
  400. package/app/components/daq/DaqNodePanel.vue +396 -396
  401. package/app/components/daq/DaqOptPanel.vue +197 -197
  402. package/app/components/daq/DaqTemplateModal.vue +246 -246
  403. package/app/components/dashboard/DashboardGaugeBand.vue +78 -78
  404. package/app/components/dashboard/DashboardHero.vue +209 -209
  405. package/app/components/dashboard/DashboardLineStatePanel.vue +78 -78
  406. package/app/components/dashboard/DashboardNodeStatePanel.vue +46 -46
  407. package/app/components/dashboard/DashboardPipelinePanel.vue +46 -46
  408. package/app/components/dashboard/DashboardTrendPanel.vue +83 -83
  409. package/app/components/dashboard/DashboardWritePanel.vue +52 -52
  410. package/app/components/dcw/DcwCreateLineModal.vue +105 -105
  411. package/app/components/dcw/DcwDeleteLineModal.vue +73 -73
  412. package/app/components/dcw/DcwDetailTemplateModal.vue +238 -238
  413. package/app/components/dcw/DcwLedgerCard.vue +160 -160
  414. package/app/components/dcw/DcwMesArtifacts.vue +140 -140
  415. package/app/components/dcw/DcwProductCreateModal.vue +113 -113
  416. package/app/components/dcw/DcwRecipeDispatchHistoryModal.vue +244 -244
  417. package/app/components/dcw/DcwRecipeEditModal.vue +399 -399
  418. package/app/components/dcw/DcwRecipeHistoryModal.vue +165 -165
  419. package/app/components/dcw/DcwRunDataModal.vue +191 -191
  420. package/app/components/dcw/DcwTemplateModal.vue +227 -227
  421. package/app/components/dcw/DcwWriteHistoryCard.vue +96 -96
  422. package/app/components/dcw/ExpConfirmCard.vue +103 -103
  423. package/app/components/dcw/RecipeDispatchApprovalCard.vue +330 -330
  424. package/app/components/logs/LogsPageHead.vue +71 -71
  425. package/app/components/monitor/MonitorAgentTable.vue +143 -143
  426. package/app/components/monitor/MonitorChannelTable.vue +80 -80
  427. package/app/components/monitor/MonitorLoginGate.vue +24 -24
  428. package/app/components/monitor/MonitorPageHead.vue +92 -92
  429. package/app/components/monitor/MonitorProcessTable.vue +159 -159
  430. package/app/components/ontology/OntologyGraph.vue +356 -356
  431. package/app/components/operations/OperationsFilterCard.vue +164 -164
  432. package/app/components/operations/OperationsPageHead.vue +47 -47
  433. package/app/components/tokens/TokenCreateModal.vue +42 -42
  434. package/app/components/tokens/TokenOnceModal.vue +164 -164
  435. package/app/components/tokens/TokenRenameModal.vue +40 -40
  436. package/app/components/tokens/TokensPageHead.vue +76 -76
  437. package/app/components/workshop/A2aRpcDebugger.vue +237 -237
  438. package/app/components/workshop/AgentInspectorDrawer.vue +424 -424
  439. package/app/components/workshop/AgentLanesView.vue +278 -278
  440. package/app/components/workshop/ArtifactCard.vue +120 -120
  441. package/app/components/workshop/AssetLibrary.vue +452 -452
  442. package/app/components/workshop/ChatMemberPanel.vue +556 -556
  443. package/app/components/workshop/CommandPalette.vue +270 -270
  444. package/app/components/workshop/Composer.vue +540 -540
  445. package/app/components/workshop/DaqTemplateIcon.vue +33 -33
  446. package/app/components/workshop/DeviceTwinPanel.vue +167 -167
  447. package/app/components/workshop/FileSelectorModal.vue +188 -188
  448. package/app/components/workshop/InspectorPanel.vue +301 -301
  449. package/app/components/workshop/PluginSlot.vue +120 -120
  450. package/app/components/workshop/TranscriptTimeline.vue +223 -223
  451. package/app/components/workshop/agents/AgentTemplateEditModal.vue +139 -139
  452. package/app/components/workshop/blocks/ClusterArtifact.vue +61 -61
  453. package/app/components/workshop/blocks/ClusterError.vue +85 -85
  454. package/app/components/workshop/blocks/ClusterLife.vue +87 -87
  455. package/app/components/workshop/blocks/ClusterMember.vue +95 -95
  456. package/app/components/workshop/blocks/ClusterMemory.vue +84 -84
  457. package/app/components/workshop/blocks/ClusterOther.vue +67 -67
  458. package/app/components/workshop/blocks/ClusterStatus.vue +149 -149
  459. package/app/components/workshop/blocks/ClusterTool.vue +176 -176
  460. package/app/components/workshop/blocks/EventBlockAvatar.vue +114 -114
  461. package/app/components/workshop/blocks/EventBlockHead.vue +232 -232
  462. package/app/components/workshop/composer/ComposerToolbar.vue +278 -278
  463. package/app/components/workshop/composer/MentionMenu.vue +135 -135
  464. package/app/components/workshop/composer/ReplyChip.vue +65 -65
  465. package/app/components/workshop/composer/StatusChip.vue +171 -171
  466. package/app/components/workshop/console/Dock.vue +71 -71
  467. package/app/components/workshop/console/LeftPane.vue +84 -84
  468. package/app/components/workshop/device-twin/DeviceTwinCard.vue +265 -265
  469. package/app/components/workshop/device-twin/DeviceTwinDcwSection.vue +203 -203
  470. package/app/components/workshop/lanes/AddMemberModal.vue +270 -270
  471. package/app/components/workshop/lanes/EditMemberModal.vue +106 -106
  472. package/app/components/workshop/lanes/LanesToolbar.vue +97 -97
  473. package/app/components/workshop/session-list/ChannelSettingsModal.vue +3 -3
  474. package/app/components/workshop/session-list/MountChannelModal.vue +124 -124
  475. package/app/components/workshop/session-list/SaveTemplateModal.vue +93 -93
  476. package/app/components/workshop/task-board/Card.vue +172 -172
  477. package/app/components/workshop/task-board/Column.vue +151 -151
  478. package/app/components/workshop/task-board/List.vue +157 -157
  479. package/app/components/workshop/task-board/StatusMenu.vue +88 -88
  480. package/app/components/workshop/teams/TeamAddMemberModal.vue +53 -53
  481. package/app/components/workshop/teams/TeamCreateModal.vue +94 -94
  482. package/app/components/workshop/teams/TeamDeployModal.vue +40 -40
  483. package/app/components/workshop/teams/TeamPluginModal.vue +119 -119
  484. package/app/components/workshop/terminal/OmpTerminalPanel.vue +270 -270
  485. package/app/components/workshop/terminal/TerminalHitlCard.vue +170 -170
  486. package/app/components/workshop/town/TownScene.ts +466 -466
  487. package/app/components/workshop/town/TownView.vue +561 -561
  488. package/app/components/workshop/town/components/AutoModeConfirmModal.vue +94 -94
  489. package/app/components/workshop/town/components/TownAgentBindings.vue +405 -405
  490. package/app/components/workshop/town/components/TownAgentInspector.vue +554 -554
  491. package/app/components/workshop/town/components/TownAlarmList.vue +147 -147
  492. package/app/components/workshop/town/components/TownBoundaryPanel.vue +350 -350
  493. package/app/components/workshop/town/components/TownCalloutLayer.vue +147 -147
  494. package/app/components/workshop/town/components/TownChannelDock.vue +116 -116
  495. package/app/components/workshop/town/components/TownControlDock.vue +405 -405
  496. package/app/components/workshop/town/components/TownDaqNodeInspector.vue +345 -345
  497. package/app/components/workshop/town/components/TownDaqTree.vue +366 -366
  498. package/app/components/workshop/town/components/TownDcwBindSection.vue +473 -473
  499. package/app/components/workshop/town/components/TownDcwNodeInspector.vue +185 -185
  500. package/app/components/workshop/town/components/TownDcwTree.vue +280 -280
  501. package/app/components/workshop/town/components/TownDeviceBindings.vue +394 -394
  502. package/app/components/workshop/town/components/TownDeviceTransform.vue +248 -248
  503. package/app/components/workshop/town/components/TownEventList.vue +120 -120
  504. package/app/components/workshop/town/components/TownHealthBody.vue +100 -100
  505. package/app/components/workshop/town/components/TownKpiStrip.vue +207 -207
  506. package/app/components/workshop/town/components/TownLeftRail.vue +308 -308
  507. package/app/components/workshop/town/components/TownLoadingMask.vue +61 -61
  508. package/app/components/workshop/town/components/TownNavMap.vue +154 -154
  509. package/app/components/workshop/town/components/TownRightRail.vue +543 -543
  510. package/app/components/workshop/town/components/TownStage.vue +281 -281
  511. package/app/components/workshop/town/components/TownStageTop.vue +238 -238
  512. package/app/components/workshop/town/components/TownStatusBar.vue +108 -108
  513. package/app/components/workshop/town/components/TownTopNav.vue +367 -367
  514. package/app/components/workshop/town/components/TownTrendDock.vue +178 -178
  515. package/app/components/workshop/town/scene/town-scene-agents.ts +254 -254
  516. package/app/components/workshop/town/scene/town-scene-behavior.ts +194 -194
  517. package/app/components/workshop/town/scene/town-scene-bubbles.ts +96 -96
  518. package/app/components/workshop/town/scene/town-scene-core.ts +158 -158
  519. package/app/components/workshop/town/scene/town-scene-models.ts +109 -109
  520. package/app/components/workshop/town/scene/town-scene-visuals.ts +279 -279
  521. package/app/components/workshop/town/scene/town-scene3d-agents.ts +308 -308
  522. package/app/components/workshop/town/scene/town-scene3d-blocks.ts +297 -297
  523. package/app/components/workshop/town/scene/town-scene3d-bubbles.ts +281 -281
  524. package/app/components/workshop/town/scene/town-scene3d-camera.ts +282 -282
  525. package/app/components/workshop/town/scene/town-scene3d-devices.ts +433 -433
  526. package/app/components/workshop/town/scene/town-scene3d-editing.ts +490 -490
  527. package/app/components/workshop/town/scene/town-scene3d-events.ts +173 -173
  528. package/app/components/workshop/town/scene/town-scene3d-factory.ts +412 -412
  529. package/app/components/workshop/town/scene/town-scene3d-hud.ts +110 -110
  530. package/app/components/workshop/town/scene/town-scene3d-lifecycle.ts +144 -144
  531. package/app/components/workshop/town/scene/town-scene3d-links.ts +141 -141
  532. package/app/components/workshop/town/scene/town-scene3d-loop.ts +286 -286
  533. package/app/components/workshop/town/scene/town-scene3d-models.ts +154 -154
  534. package/app/components/workshop/town/scene/town-scene3d-nodes.ts +562 -562
  535. package/app/components/workshop/town/scene/town-scene3d-ranges.ts +273 -273
  536. package/app/components/workshop/town/scene/town-scene3d-renderer.ts +320 -320
  537. package/app/components/workshop/town/scene/town-scene3d-selection.ts +257 -257
  538. package/app/components/workshop/town/scene/town-scene3d-types.ts +264 -264
  539. package/app/components/workshop/transcript/TranscriptBlockList.vue +68 -68
  540. package/app/components/workshop/transcript/TranscriptEarlierPager.vue +81 -81
  541. package/app/components/workshop/transcript/TranscriptFilterBar.vue +126 -126
  542. package/app/components/workshop/workbench/CreateWorkspaceModal.vue +36 -36
  543. package/app/components/workshop/workbench/WorkspaceEmpty.vue +56 -56
  544. package/app/composables/useResponsive.ts +88 -88
  545. package/app/composables/workshop/device-twin-types.ts +29 -29
  546. package/app/composables/workshop/event-blocks/attention.ts +58 -58
  547. package/app/composables/workshop/event-blocks/classify.ts +44 -44
  548. package/app/composables/workshop/event-blocks/clusterer.ts +231 -231
  549. package/app/composables/workshop/event-blocks/fold-stream.ts +45 -45
  550. package/app/composables/workshop/event-blocks/markdown.ts +81 -81
  551. package/app/composables/workshop/event-blocks/mentions.ts +49 -49
  552. package/app/composables/workshop/event-blocks/text-utils.ts +100 -100
  553. package/app/composables/workshop/event-blocks/types.ts +40 -40
  554. package/app/composables/workshop/town/town-relay-props.ts +231 -231
  555. package/app/composables/workshop/town/town-view-types.ts +145 -145
  556. package/app/composables/workshop/town/useTownAgentBindings.ts +182 -182
  557. package/app/composables/workshop/town/useTownAgentChat.ts +203 -203
  558. package/app/composables/workshop/town/useTownAlarms.ts +36 -36
  559. package/app/composables/workshop/town/useTownCallouts.ts +174 -174
  560. package/app/composables/workshop/town/useTownChannels.ts +220 -220
  561. package/app/composables/workshop/town/useTownHealth.ts +66 -66
  562. package/app/composables/workshop/town/useTownHudTickers.ts +77 -77
  563. package/app/composables/workshop/town/useTownLayout.ts +277 -277
  564. package/app/composables/workshop/town/useTownNavMap.ts +301 -301
  565. package/app/composables/workshop/town/useTownNodeBindings.ts +345 -345
  566. package/app/composables/workshop/town/useTownPanelDrag.ts +91 -91
  567. package/app/composables/workshop/town/useTownRailData.ts +421 -421
  568. package/app/composables/workshop/town/useTownSceneControl.ts +92 -92
  569. package/app/composables/workshop/town/useTownSceneInput.ts +275 -275
  570. package/app/composables/workshop/town/useTownSceneRuntime.ts +390 -390
  571. package/app/composables/workshop/town/useTownSheets.ts +41 -41
  572. package/app/composables/workshop/town/useTownTrends.ts +93 -93
  573. package/app/composables/workshop/useChannelList.ts +88 -88
  574. package/app/composables/workshop/useChannelTerminals.ts +65 -65
  575. package/app/composables/workshop/useComposerMentions.ts +130 -130
  576. package/app/composables/workshop/useDcwStream.ts +374 -374
  577. package/app/composables/workshop/useDeviceTwinDcwWrite.ts +77 -77
  578. package/app/composables/workshop/useDeviceTwinPanel.ts +56 -56
  579. package/app/composables/workshop/useEscClose.ts +44 -44
  580. package/app/composables/workshop/useEventBlockView.ts +159 -159
  581. package/app/composables/workshop/useEventBlocks.ts +33 -33
  582. package/app/composables/workshop/useHitlAnswer.ts +184 -184
  583. package/app/composables/workshop/useLaneWidths.ts +27 -27
  584. package/app/composables/workshop/useOmpTerminalSession.ts +424 -424
  585. package/app/composables/workshop/usePluginAdmin.ts +152 -152
  586. package/app/composables/workshop/usePluginPanels.ts +72 -72
  587. package/app/composables/workshop/useRuntimeConfigDraft.ts +118 -118
  588. package/app/composables/workshop/useSettingsGroups.ts +243 -243
  589. package/app/composables/workshop/useTaskBoardColumns.ts +47 -47
  590. package/app/composables/workshop/useTerminalRenderer.ts +308 -308
  591. package/app/composables/workshop/useTranscriptEnterStage.ts +48 -48
  592. package/app/composables/workshop/useTranscriptHistory.ts +52 -52
  593. package/app/composables/workshop/useTranscriptScroll.ts +113 -113
  594. package/app/composables/workshop/useVisibleInterval.ts +42 -42
  595. package/app/composables/workshop/useWorkshopWs.ts +265 -265
  596. package/app/config/index.ts +1 -1
  597. package/app/middleware/locale-cookie.global.ts +22 -22
  598. package/app/pages/aml/api.ts +6 -6
  599. package/app/pages/aml/composables/useAmlDatasets.ts +38 -38
  600. package/app/pages/aml/composables/useAmlEntities.ts +57 -57
  601. package/app/pages/aml/composables/useAmlEnv.ts +191 -191
  602. package/app/pages/aml/composables/useAmlExperiments.ts +45 -45
  603. package/app/pages/aml/composables/useAmlFormat.ts +44 -44
  604. package/app/pages/aml/composables/useAmlJobs.ts +131 -131
  605. package/app/pages/aml/composables/useAmlModels.ts +56 -56
  606. package/app/pages/aml/composables/useAmlNotes.ts +47 -47
  607. package/app/pages/aml/composables/useAmlPredict.ts +93 -93
  608. package/app/pages/aml/constants.ts +63 -63
  609. package/app/pages/aml/index.vue +236 -236
  610. package/app/pages/composables/useDashboardCharts.ts +192 -192
  611. package/app/pages/composables/useDashboardData.ts +144 -144
  612. package/app/pages/daq/composables/useDaqAddNode.ts +126 -126
  613. package/app/pages/daq/composables/useDaqDetailBinding.ts +29 -29
  614. package/app/pages/daq/composables/useDaqDetailFrames.ts +42 -42
  615. package/app/pages/daq/composables/useDaqDetailNode.ts +53 -53
  616. package/app/pages/daq/composables/useDaqDetailParams.ts +138 -138
  617. package/app/pages/daq/composables/useDaqFilters.ts +187 -187
  618. package/app/pages/daq/composables/useDaqNodeWindow.ts +86 -86
  619. package/app/pages/daq/composables/useDaqOptimizations.ts +99 -99
  620. package/app/pages/daq/composables/useDaqTemplates.ts +152 -152
  621. package/app/pages/daq/index.vue +260 -260
  622. package/app/pages/dcw/composables/useDcwCards.ts +27 -27
  623. package/app/pages/dcw/composables/useDcwDetailScope.ts +145 -145
  624. package/app/pages/dcw/composables/useDcwDetailTemplates.ts +94 -94
  625. package/app/pages/dcw/composables/useDcwFilter.ts +29 -29
  626. package/app/pages/dcw/composables/useDcwLedger.ts +34 -34
  627. package/app/pages/dcw/composables/useDcwLineMutations.ts +115 -115
  628. package/app/pages/dcw/composables/useDcwLineRun.ts +60 -60
  629. package/app/pages/dcw/composables/useDcwProducts.ts +54 -54
  630. package/app/pages/dcw/composables/useDcwQuery.ts +68 -68
  631. package/app/pages/dcw/composables/useDcwQuickActions.ts +47 -47
  632. package/app/pages/dcw/composables/useDcwRecipes.ts +256 -256
  633. package/app/pages/dcw/composables/useDcwTemplates.ts +50 -50
  634. package/app/pages/dcw/index.vue +195 -195
  635. package/app/pages/dcw/types.ts +9 -9
  636. package/app/pages/index.vue +126 -126
  637. package/app/pages/logs/composables/useLogsFormat.ts +43 -43
  638. package/app/pages/logs/composables/useLogsScope.ts +39 -39
  639. package/app/pages/monitor/types.ts +61 -61
  640. package/app/pages/operations.vue +61 -61
  641. package/app/pages/permissions/index.vue +369 -369
  642. package/app/pages/tokens/composables/useTokenClipboard.ts +33 -33
  643. package/app/pages/tokens/composables/useTokenCreate.ts +93 -93
  644. package/app/pages/tokens/composables/useTokenRename.ts +54 -54
  645. package/app/pages/tokens/composables/useTokenReveal.ts +84 -84
  646. package/app/pages/tokens/composables/useTokensList.ts +60 -60
  647. package/app/pages/tokens.vue +111 -111
  648. package/app/pages/tools/index.vue +98 -98
  649. package/app/pages/workshop/agents.vue +130 -130
  650. package/app/pages/workshop/composables/useAgentHarnessOptions.ts +59 -59
  651. package/app/pages/workshop/composables/useAgentTemplateActions.ts +42 -42
  652. package/app/pages/workshop/composables/useAgentTemplateDialogState.ts +24 -24
  653. package/app/pages/workshop/composables/useAgentTemplateForm.ts +88 -88
  654. package/app/pages/workshop/composables/useAgentTemplatesCatalog.ts +92 -92
  655. package/app/pages/workshop/composables/useTeamActions.ts +44 -44
  656. package/app/pages/workshop/composables/useTeamAddMemberDialog.ts +49 -49
  657. package/app/pages/workshop/composables/useTeamCreateDialog.ts +67 -67
  658. package/app/pages/workshop/composables/useTeamDeployDialog.ts +49 -49
  659. package/app/pages/workshop/composables/useTeamDialogState.ts +46 -46
  660. package/app/pages/workshop/composables/useTeamPluginDialog.ts +72 -72
  661. package/app/pages/workshop/composables/useTeamsCatalog.ts +100 -100
  662. package/app/pages/workshop/composables/useWorkbenchWorkspaces.ts +123 -123
  663. package/app/pages/workshop/composables/useWorkspaceAuth.ts +31 -31
  664. package/app/pages/workshop/composables/useWorkspaceChannels.ts +62 -62
  665. package/app/pages/workshop/composables/useWorkspaceShell.ts +136 -136
  666. package/app/pages/workshop/schedules.vue +553 -553
  667. package/app/pages/workshop/w/[wsId].vue +221 -221
  668. package/app/plugins/aw-plugins.client.ts +213 -213
  669. package/app/plugins/esc-close.client.ts +31 -31
  670. package/app/stores/workshop/hitl.ts +183 -183
  671. package/app/stores/workshop/narrow-fetch.ts +23 -23
  672. package/app/utils/api-error.ts +75 -75
  673. package/app/utils/builtin-catalog.ts +104 -104
  674. package/app/utils/chart-trend.ts +97 -97
  675. package/app/utils/dcw-driver-badge.ts +16 -16
  676. package/app/utils/dcw-recipe-form.ts +26 -26
  677. package/cli/commands/tui.mjs +28 -28
  678. package/cli/commands/update.mjs +124 -124
  679. package/cli/core/child-lifecycle.mjs +136 -136
  680. package/cli/core/meta.mjs +38 -38
  681. package/cli/core/post-build.mjs +96 -96
  682. package/config.yml +1 -1
  683. package/docs/cli.en.md +2 -2
  684. package/docs/cli.md +2 -2
  685. package/docs/mcp.en.md +27 -27
  686. package/docs/multi-harness-architecture.md +248 -248
  687. package/docs/plugins.en.md +1 -1
  688. package/docs/plugins.md +1 -1
  689. package/docs/sdk.en.md +1 -1
  690. package/docs/sdk.md +1 -1
  691. package/docs/tui.md +43 -43
  692. package/i18n/dicts/_en.json +1551 -1551
  693. package/i18n/dicts/_en2.json +300 -300
  694. package/i18n/dicts/_en4.json +114 -114
  695. package/i18n/dicts/agentLanesView.json +61 -61
  696. package/i18n/dicts/appHeader.json +17 -17
  697. package/i18n/dicts/channelSessionList.json +51 -51
  698. package/i18n/dicts/chat.json +79 -79
  699. package/i18n/dicts/clusterTool.json +4 -4
  700. package/i18n/dicts/composer.json +38 -38
  701. package/i18n/dicts/ctpl.json +37 -37
  702. package/i18n/dicts/dcwDetail.json +219 -219
  703. package/i18n/dicts/lineOps.json +14 -14
  704. package/i18n/dicts/multiChannelView.json +13 -13
  705. package/i18n/dicts/notifications.json +13 -13
  706. package/i18n/dicts/taskInspectorDrawer.json +25 -25
  707. package/i18n/dicts/teamPlugins.json +10 -10
  708. package/i18n/dicts/townView.json +209 -209
  709. package/mcp/discovery.mjs +227 -227
  710. package/package.json +1 -1
  711. package/public/favicon.svg +14 -14
  712. package/public/robots.txt +3 -3
  713. package/scripts/_audit/audit-harness-adapters.md +664 -664
  714. package/scripts/_audit/aw-mcp-live-e2e.mjs +293 -293
  715. package/scripts/_audit/bump-version.mjs +51 -51
  716. package/scripts/_audit/detached-instance.mjs +112 -112
  717. package/scripts/_audit/detached-start.mjs +103 -103
  718. package/scripts/_audit/eda-ui-fix-acceptance.mjs +212 -212
  719. package/scripts/_audit/guard-upstream-liveness.mjs +104 -104
  720. package/scripts/_audit/http-api-authz-audit.md +657 -657
  721. package/scripts/_audit/kb-team-mock-e2e.mjs +146 -146
  722. package/scripts/_audit/kb-team-omp-e2e.mjs +229 -229
  723. package/scripts/_audit/run.mjs +21 -21
  724. package/scripts/_audit/runtime-audit.md +716 -716
  725. package/scripts/_audit/skills-guided-e2e.mjs +316 -316
  726. package/scripts/_audit/stability-soak.mjs +252 -252
  727. package/scripts/_audit/stubs/nuxt-imports.mjs +67 -67
  728. package/scripts/_audit/ts-register-hook.mjs +12 -12
  729. package/scripts/_audit/ts-resolve-hook.mjs +96 -96
  730. package/scripts/_aw-packaged-start.cjs +22 -22
  731. package/scripts/_aw0746-stage12.mjs +94 -94
  732. package/scripts/_aw0746-stage34.mjs +136 -136
  733. package/scripts/_aw0746-stage6b-train-sweep.mjs +145 -145
  734. package/scripts/_aw0746-stage6c-jobsmoke.mjs +69 -69
  735. package/scripts/_dbg-configroot-audit.mjs +86 -86
  736. package/scripts/_dbg-daq-intervals-func.mjs +115 -115
  737. package/scripts/_dbg-perms-e2e.mjs +142 -142
  738. package/scripts/_dbg-protocol-matrix.mjs +462 -462
  739. package/scripts/_dbg-render-regression.mjs +193 -193
  740. package/scripts/_dbg-schedule-e2e.mjs +262 -262
  741. package/scripts/_e2e-ui-functional.mjs +371 -371
  742. package/scripts/_i18n-en-cjk-scan.mjs +28 -28
  743. package/scripts/_i18n-en-verify.mjs +107 -107
  744. package/scripts/_i18n-extra-checks.mjs +53 -53
  745. package/scripts/_i18n-scan-hardcoded.mjs +180 -180
  746. package/scripts/_lib-aml-python-run.mjs +17 -17
  747. package/scripts/_lint-reflow.mjs +105 -105
  748. package/scripts/_loop-biax-campaign.mjs +130 -130
  749. package/scripts/_plc-sim-detached.cjs +22 -22
  750. package/scripts/_probe-daq-omp-task.mjs +100 -100
  751. package/scripts/_probe-daq-scope-default.mjs +123 -123
  752. package/scripts/_probe-model-channel-link.cjs +25 -25
  753. package/scripts/_probe-recipe-switch.mjs +92 -92
  754. package/scripts/_provision-injection-line.mjs +39 -39
  755. package/scripts/_run-matrix.ps1 +53 -53
  756. package/scripts/_sweep-button-contrast.mjs +87 -87
  757. package/scripts/acceptance-aml-hybrid-e2e.ts +396 -396
  758. package/scripts/acceptance-aml-hybrid-live.mjs +93 -93
  759. package/scripts/acceptance-aml-model-identity.ts +137 -137
  760. package/scripts/agent-daq-isolation-e2e.mjs +91 -91
  761. package/scripts/api-contract-smoke.mjs +126 -126
  762. package/scripts/ask-hitl-e2e.mjs +96 -96
  763. package/scripts/aw-expose.mjs +159 -159
  764. package/scripts/channel-interaction-smoke.mjs +80 -80
  765. package/scripts/data-studio-ui-e2e.mjs +163 -163
  766. package/scripts/demo-group-chat-all-real.ts +279 -279
  767. package/scripts/demo-group-chat-omp-cases.ts +210 -210
  768. package/scripts/demo-group-chat-omp.ts +184 -184
  769. package/scripts/demo-group-chat-order.ts +197 -197
  770. package/scripts/dev-modbus-simulator.mjs +55 -55
  771. package/scripts/docs-shots.mjs +36 -36
  772. package/scripts/e2e-agentteam-chat.mjs +473 -473
  773. package/scripts/e2e-agentteam-real-triage.mjs +421 -421
  774. package/scripts/e2e-aml-decoupled.mjs +162 -162
  775. package/scripts/e2e-aw-tui-global.mjs +277 -277
  776. package/scripts/e2e-closedloop/cleanup.mjs +27 -27
  777. package/scripts/e2e-closedloop/lib.mjs +109 -109
  778. package/scripts/e2e-closedloop/main.mjs +59 -59
  779. package/scripts/e2e-closedloop/scenarios-accounts.mjs +210 -210
  780. package/scripts/e2e-closedloop/scenarios-authz.mjs +196 -196
  781. package/scripts/e2e-closedloop/scenarios-daq-dcw.mjs +222 -222
  782. package/scripts/e2e-closedloop/scenarios-plugins.mjs +169 -169
  783. package/scripts/e2e-closedloop/state.mjs +10 -10
  784. package/scripts/e2e-config-groups.mjs +238 -238
  785. package/scripts/e2e-crash-cycle.mjs +108 -108
  786. package/scripts/e2e-full-closedloop.mjs +16 -16
  787. package/scripts/e2e-hil-multi-user.mjs +307 -307
  788. package/scripts/e2e-hil-restart.mjs +339 -339
  789. package/scripts/e2e-injection-recipe-closedloop.mjs +203 -203
  790. package/scripts/e2e-line-governance.mjs +352 -352
  791. package/scripts/e2e-ontology.mjs +393 -393
  792. package/scripts/e2e-plc-plugin-closedloop.mjs +549 -549
  793. package/scripts/e2e-timezone-settings.mjs +57 -57
  794. package/scripts/full-stack-shots.mjs +145 -145
  795. package/scripts/full-tool-injection-harness-e2e.mjs +214 -214
  796. package/scripts/hitl-reject-e2e.mjs +131 -131
  797. package/scripts/line-log-smoke.mjs +260 -260
  798. package/scripts/live-aml-mockomp.mjs +304 -304
  799. package/scripts/live-aml-optloop-resume.mjs +322 -322
  800. package/scripts/live-aml-optloop.mjs +588 -588
  801. package/scripts/live-aml-stage9.mjs +169 -169
  802. package/scripts/live-aml-two-goals.mjs +315 -315
  803. package/scripts/live-optloop-two-modes.mjs +857 -857
  804. package/scripts/mes-agent-integration-e2e.mjs +361 -361
  805. package/scripts/ops-plugins-e2e.mjs +85 -85
  806. package/scripts/proof-omp-real.ts +189 -189
  807. package/scripts/scenario-suite-setup.mjs +337 -337
  808. package/scripts/scenario-suite-stability.mjs +144 -144
  809. package/scripts/smoke-optimization-verify.ts +72 -72
  810. package/scripts/team-coordination-e2e.mjs +96 -96
  811. package/scripts/test-agentteam-task-chat-flow.ts +420 -420
  812. package/scripts/test-agentteam-workflow.ts +472 -472
  813. package/scripts/test-aw-skills.mjs +102 -102
  814. package/scripts/test-cli-exit.mjs +343 -343
  815. package/scripts/test-daq-frame-race.mjs +358 -358
  816. package/scripts/test-data-root.mjs +208 -208
  817. package/scripts/test-events-index.mjs +176 -176
  818. package/scripts/test-group-chat-hardening.ts +265 -265
  819. package/scripts/test-group-chat-unit/lib.ts +186 -186
  820. package/scripts/test-group-chat-unit/main.ts +45 -45
  821. package/scripts/test-group-chat-unit/section-a-migration.ts +75 -75
  822. package/scripts/test-group-chat-unit/section-b-permission-matrix.ts +88 -88
  823. package/scripts/test-group-chat-unit/section-c-member-lifecycle.ts +64 -64
  824. package/scripts/test-group-chat-unit/section-d-mention-resolution.ts +36 -36
  825. package/scripts/test-group-chat-unit/section-e-chat-facts.ts +97 -97
  826. package/scripts/test-group-chat-unit/section-f-user-notifications.ts +52 -52
  827. package/scripts/test-group-chat-unit/section-g-member-projection.ts +44 -44
  828. package/scripts/test-group-chat-unit/section-h-outbox-consistency.ts +30 -30
  829. package/scripts/test-group-chat-unit/section-i-read-idempotency.ts +24 -24
  830. package/scripts/test-group-chat-unit/section-j-permission-scope.ts +150 -150
  831. package/scripts/test-group-chat-unit.ts +35 -35
  832. package/scripts/test-hitl-decision.ts +526 -526
  833. package/scripts/test-hitl-legacy-channel-auth.ts +143 -143
  834. package/scripts/test-hitl-registry.ts +112 -112
  835. package/scripts/test-log-flooding.mjs +160 -160
  836. package/scripts/test-lru.mjs +101 -101
  837. package/scripts/test-memory-month-query.mjs +70 -70
  838. package/scripts/test-plugin-hardening.mjs +90 -90
  839. package/scripts/test-plugin-lifecycle.mjs +173 -173
  840. package/scripts/test-rollback-index.mjs +137 -137
  841. package/scripts/test-schedule-runtime.ts +309 -309
  842. package/scripts/test-scheduler-loop/scenarios-supervise.ts +25 -25
  843. package/scripts/test-sdk-surface.mjs +158 -158
  844. package/scripts/test-serial-bridge.mjs +418 -418
  845. package/scripts/test-tui-commands.mjs +148 -148
  846. package/scripts/test-tui-reducers.mjs +72 -72
  847. package/scripts/three-system-e2e/lib.mjs +79 -79
  848. package/scripts/three-system-e2e/main.mjs +40 -40
  849. package/scripts/three-system-e2e/phases/phase-0-user-token.mjs +42 -42
  850. package/scripts/three-system-e2e/phases/phase-0a2-line-autoselect.mjs +35 -35
  851. package/scripts/three-system-e2e/phases/phase-0b-fixture-grants.mjs +39 -39
  852. package/scripts/three-system-e2e/phases/phase-0c-plugin-outbound-auth.mjs +95 -95
  853. package/scripts/three-system-e2e/phases/stage-1-health.mjs +47 -47
  854. package/scripts/three-system-e2e/phases/stage-2-5-team-plugins.mjs +84 -84
  855. package/scripts/three-system-e2e/phases/stage-2-teams-tools-hitl.mjs +184 -184
  856. package/scripts/three-system-e2e/phases/stage-3-diag.mjs +73 -73
  857. package/scripts/three-system-e2e/phases/stage-4-plugin-toggle.mjs +53 -53
  858. package/scripts/three-system-e2e/state.mjs +87 -87
  859. package/scripts/three-system-e2e.mjs +40 -40
  860. package/scripts/tool-face-batch-identity-e2e.mjs +222 -222
  861. package/scripts/tsconfig.json +14 -14
  862. package/scripts/tui-smoke.mjs +100 -100
  863. package/scripts/typecheck.mjs +75 -75
  864. package/scripts/ui/admin-shots.mjs +46 -46
  865. package/scripts/ui/bump-microfont.mjs +39 -39
  866. package/scripts/ui/linkcheck2.mjs +37 -37
  867. package/scripts/ui/live-render-check.mjs +72 -72
  868. package/scripts/ui/md-lint.mjs +80 -80
  869. package/scripts/ui/perf-audit.mjs +132 -132
  870. package/scripts/ui/readme-assets.mjs +30 -30
  871. package/scripts/ui/readme-shots.mjs +42 -42
  872. package/scripts/ui/record-demo.mjs +557 -557
  873. package/scripts/ui/record.mjs +225 -225
  874. package/scripts/ui/seed-admin.mjs +68 -68
  875. package/scripts/ui/seed-demo.mjs +83 -83
  876. package/scripts/ui/seed-industrial-demo.mjs +171 -171
  877. package/scripts/ui/shot-hero.mjs +25 -25
  878. package/scripts/ui/shots.mjs +75 -75
  879. package/scripts/ui/sim-ui-shot.mjs +16 -16
  880. package/scripts/ui/smoke-refactor.mjs +258 -258
  881. package/scripts/ui/verify-nav.mjs +51 -51
  882. package/scripts/ui/verify-responsive.mjs +285 -285
  883. package/sdk/client.d.mts +110 -110
  884. package/sdk/examples/line-sentinel/index.mjs +105 -105
  885. package/sdk/examples/ops-notifier/index.mjs +34 -34
  886. package/sdk/examples/sample-insight/index.mjs +39 -39
  887. package/server/api/plugins/client/[name].get.ts +18 -18
  888. package/server/api/plugins/i18n.get.ts +12 -12
  889. package/server/api/plugins/manifest.get.ts +10 -10
  890. package/server/api/system/backup/list.get.ts +32 -32
  891. package/server/api/system/backup/run.post.ts +21 -21
  892. package/server/api/system/config-groups/[id].delete.ts +21 -21
  893. package/server/api/system/config-groups/[id].patch.ts +26 -26
  894. package/server/api/system/config-groups/index.get.ts +21 -21
  895. package/server/api/system/config-groups/index.post.ts +33 -33
  896. package/server/api/system/timezone.get.ts +20 -20
  897. package/server/api/users/tokens/[id]/token.get.ts +11 -11
  898. package/server/api/workshop/[...path].ts +13 -13
  899. package/server/api/workshop/agent-tools/approvals/index.get.ts +43 -43
  900. package/server/api/workshop/agent-tools/bindings/[id].delete.ts +26 -26
  901. package/server/api/workshop/agent-tools/bindings/grant.post.ts +45 -45
  902. package/server/api/workshop/agent-tools/bindings/index.get.ts +41 -41
  903. package/server/api/workshop/agent-tools/bindings/revoke.post.ts +42 -42
  904. package/server/api/workshop/aml/datasets/[id]/preview.get.ts +68 -68
  905. package/server/api/workshop/aml/datasets/[id].delete.ts +39 -39
  906. package/server/api/workshop/aml/datasets/[id].get.ts +53 -53
  907. package/server/api/workshop/aml/datasets/[id].patch.ts +30 -30
  908. package/server/api/workshop/aml/datasets/index.get.ts +20 -20
  909. package/server/api/workshop/aml/datasets/index.post.ts +27 -27
  910. package/server/api/workshop/aml/entities/index.get.ts +13 -13
  911. package/server/api/workshop/aml/entities/prune.post.ts +28 -28
  912. package/server/api/workshop/aml/env/index.get.ts +13 -13
  913. package/server/api/workshop/aml/env/recheck.post.ts +14 -14
  914. package/server/api/workshop/aml/env/uv.post.ts +21 -21
  915. package/server/api/workshop/aml/env/venv.post.ts +24 -24
  916. package/server/api/workshop/aml/experiments/index.get.ts +35 -35
  917. package/server/api/workshop/aml/index.get.ts +37 -37
  918. package/server/api/workshop/aml/jobs/[id]/cancel.post.ts +21 -21
  919. package/server/api/workshop/aml/jobs/[id]/logs.get.ts +23 -23
  920. package/server/api/workshop/aml/jobs/[id]/retry.post.ts +20 -20
  921. package/server/api/workshop/aml/jobs/[id].delete.ts +44 -44
  922. package/server/api/workshop/aml/jobs/[id].get.ts +23 -23
  923. package/server/api/workshop/aml/jobs/index.get.ts +26 -26
  924. package/server/api/workshop/aml/models/[id]/predict.post.ts +24 -24
  925. package/server/api/workshop/aml/models/[id]/promote.post.ts +30 -30
  926. package/server/api/workshop/aml/models/index.get.ts +48 -48
  927. package/server/api/workshop/aml/training-plans/[id]/train.post.ts +18 -18
  928. package/server/api/workshop/aml/training-plans/[id].delete.ts +18 -18
  929. package/server/api/workshop/aml/training-plans/[id].patch.ts +30 -30
  930. package/server/api/workshop/aml/training-plans/index.get.ts +9 -9
  931. package/server/api/workshop/aml/training-plans/index.post.ts +43 -43
  932. package/server/api/workshop/approvals/[id]/decide.post.ts +30 -30
  933. package/server/api/workshop/approvals/index.get.ts +22 -22
  934. package/server/api/workshop/audit.get.ts +43 -43
  935. package/server/api/workshop/channels/[id]/chat/messages/[messageId]/read.post.ts +22 -22
  936. package/server/api/workshop/channels/[id]/chat/messages/index.get.ts +29 -29
  937. package/server/api/workshop/channels/[id]/chat/messages/index.post.ts +51 -51
  938. package/server/api/workshop/channels/[id]/chat/permissions.get.ts +35 -35
  939. package/server/api/workshop/channels/[id]/index.patch.ts +64 -64
  940. package/server/api/workshop/channels/[id]/members/[userId]/approve.post.ts +20 -20
  941. package/server/api/workshop/channels/[id]/members/[userId].delete.ts +21 -21
  942. package/server/api/workshop/channels/[id]/members/index.get.ts +23 -23
  943. package/server/api/workshop/channels/[id]/members/leave.post.ts +20 -20
  944. package/server/api/workshop/channels/[id]/twin-profile.get.ts +45 -45
  945. package/server/api/workshop/channels/[id]/twin-profile.patch.ts +72 -72
  946. package/server/api/workshop/daq/[id]/test.post.ts +1 -1
  947. package/server/api/workshop/daq/alarms.get.ts +16 -16
  948. package/server/api/workshop/dcw/[id]/write.post.ts +4 -4
  949. package/server/api/workshop/dcw/[id].delete.ts +41 -41
  950. package/server/api/workshop/dcw/[id].patch.ts +40 -40
  951. package/server/api/workshop/dcw/mes-test-read.post.ts +24 -24
  952. package/server/api/workshop/dcw/params/[id]/read.post.ts +17 -17
  953. package/server/api/workshop/dcw/params/[id]/write.post.ts +21 -21
  954. package/server/api/workshop/dcw/params/[id].delete.ts +19 -19
  955. package/server/api/workshop/dcw/params/[id].patch.ts +23 -23
  956. package/server/api/workshop/dcw/params/index.get.ts +27 -27
  957. package/server/api/workshop/dcw/params/index.post.ts +25 -25
  958. package/server/api/workshop/dcw/products/[id].delete.ts +16 -16
  959. package/server/api/workshop/dcw/products/[id].patch.ts +17 -17
  960. package/server/api/workshop/dcw/recipes/[id]/index.patch.ts +22 -22
  961. package/server/api/workshop/dcw/recipes/[id]/versions.get.ts +14 -14
  962. package/server/api/workshop/dcw/recipes/[id].delete.ts +25 -25
  963. package/server/api/workshop/dcw/recipes/index.get.ts +12 -12
  964. package/server/api/workshop/dcw/runs/[id]/close.post.ts +15 -15
  965. package/server/api/workshop/dcw/templates/[key].delete.ts +14 -14
  966. package/server/api/workshop/dcw/templates/[key].patch.ts +16 -16
  967. package/server/api/workshop/dcw/templates/index.post.ts +15 -15
  968. package/server/api/workshop/dcw/test-driver.post.ts +16 -16
  969. package/server/api/workshop/device-twins/[id].delete.ts +25 -25
  970. package/server/api/workshop/eda/runs/[id]/labels.patch.ts +25 -25
  971. package/server/api/workshop/exp/confirmations/[id]/decide.post.ts +41 -41
  972. package/server/api/workshop/exp/confirmations/index.get.ts +25 -25
  973. package/server/api/workshop/harnesses/[id]/providers.get.ts +16 -16
  974. package/server/api/workshop/hitl/respond.post.ts +94 -94
  975. package/server/api/workshop/notifications/index.get.ts +60 -60
  976. package/server/api/workshop/notifications/read.post.ts +31 -31
  977. package/server/api/workshop/ontology/drafts/[draftId]/subgraph.ts +24 -24
  978. package/server/api/workshop/plugins/[name]/disable.post.ts +21 -21
  979. package/server/api/workshop/plugins/[name]/enable.post.ts +21 -21
  980. package/server/api/workshop/plugins/[name]/index.get.ts +14 -14
  981. package/server/api/workshop/schedules/[id]/run.post.ts +15 -15
  982. package/server/api/workshop/schedules/[id]/runs.get.ts +15 -15
  983. package/server/api/workshop/schedules/[id].delete.ts +14 -14
  984. package/server/api/workshop/schedules/[id].get.ts +13 -13
  985. package/server/api/workshop/schedules/[id].patch.ts +29 -29
  986. package/server/api/workshop/schedules/index.get.ts +12 -12
  987. package/server/api/workshop/schedules/index.post.ts +32 -32
  988. package/server/api/workshop/tasks/[id]/reassign.post.ts +32 -32
  989. package/server/api/workshop/tasks/[id]/update.post.ts +35 -35
  990. package/server/api/workshop/teams/[id]/plugins/index.get.ts +36 -36
  991. package/server/api/workshop/teams/[id]/plugins/index.put.ts +42 -42
  992. package/server/api/workshop/ws/audience.ts +56 -56
  993. package/server/api/workshop/ws/db-buffer.ts +68 -68
  994. package/server/api/workshop/ws/event-mapping.ts +47 -47
  995. package/server/api/workshop/ws/handlers.ts +132 -132
  996. package/server/api/workshop/ws/hub.ts +133 -133
  997. package/server/api/workshop/ws/index.ts +23 -23
  998. package/server/api/workshop/ws/notification-uplink.ts +77 -77
  999. package/server/api/workshop/ws/shared.ts +94 -94
  1000. package/server/api/workshop/ws/streams.ts +146 -146
  1001. package/server/middleware/00-security-headers.ts +38 -38
  1002. package/server/middleware/01-rate-guard.ts +101 -101
  1003. package/server/plugins/aml-twin-worker.ts +32 -32
  1004. package/server/plugins/dev-stability-guard.ts +42 -42
  1005. package/server/plugins-builtin/diag-bridge/host/constants.mjs +25 -25
  1006. package/server/plugins-builtin/diag-bridge/host/exports.mjs +104 -104
  1007. package/server/plugins-builtin/diag-bridge/host/helpers.mjs +2 -2
  1008. package/server/plugins-builtin/diag-bridge/host/index.mjs +15 -15
  1009. package/server/plugins-builtin/diag-bridge/host/intents.mjs +62 -62
  1010. package/server/plugins-builtin/diag-bridge/host/plugin.mjs +5 -3
  1011. package/server/plugins-builtin/diag-bridge/host/snapshot.mjs +93 -93
  1012. package/server/plugins-builtin/diag-bridge/index.mjs +9 -9
  1013. package/server/plugins-builtin/serial-bridge/client.mjs +211 -211
  1014. package/server/plugins-builtin/serial-bridge/drivers.mjs +409 -409
  1015. package/server/plugins-builtin/serial-bridge/i18n.json +62 -62
  1016. package/server/plugins-builtin/serial-bridge/index.mjs +247 -247
  1017. package/server/plugins-builtin/serial-bridge/lib.mjs +208 -208
  1018. package/server/plugins-builtin/serial-bridge/rtu.mjs +168 -168
  1019. package/server/services/system-config/contracts.ts +29 -29
  1020. package/server/services/system-config/dispose.ts +19 -19
  1021. package/server/services/system-config/facade.ts +26 -26
  1022. package/server/services/system-config/groups.ts +108 -108
  1023. package/server/services/system-config/index.ts +21 -21
  1024. package/server/services/system-config/init.ts +26 -26
  1025. package/server/services/system-config/mutate.ts +103 -103
  1026. package/server/services/system-config/plugins.ts +104 -104
  1027. package/server/services/system-config/snapshot.ts +59 -59
  1028. package/server/services/system-config/state.ts +79 -79
  1029. package/server/services/system-config/types.ts +58 -58
  1030. package/server/services/workshop/agents/adapters/omp-rpc-client/api.ts +111 -111
  1031. package/server/services/workshop/agents/adapters/omp-rpc-client/contracts.ts +22 -22
  1032. package/server/services/workshop/agents/adapters/omp-rpc-client/facade.ts +7 -7
  1033. package/server/services/workshop/agents/adapters/omp-rpc-client/frames.ts +0 -18
  1034. package/server/services/workshop/agents/adapters/omp-rpc-client/helpers.ts +38 -38
  1035. package/server/services/workshop/agents/adapters/omp-rpc-client/index.ts +25 -25
  1036. package/server/services/workshop/agents/adapters/omp-rpc-client/start.ts +70 -70
  1037. package/server/services/workshop/agents/adapters/omp-rpc-client/state.ts +65 -65
  1038. package/server/services/workshop/agents/adapters/omp-rpc-client/stdout.ts +92 -92
  1039. package/server/services/workshop/agents/adapters/omp-rpc-client/usage.ts +47 -47
  1040. package/server/services/workshop/agents/agent-badge.ts +38 -38
  1041. package/server/services/workshop/agents/binding-authz.ts +60 -60
  1042. package/server/services/workshop/agents/binding-mode.ts +51 -51
  1043. package/server/services/workshop/agents/codex-agent/client.ts +170 -170
  1044. package/server/services/workshop/agents/codex-agent/core.ts +119 -119
  1045. package/server/services/workshop/agents/codex-agent/facade.ts +8 -8
  1046. package/server/services/workshop/agents/codex-agent/helpers.ts +13 -13
  1047. package/server/services/workshop/agents/codex-agent/hitl.ts +138 -138
  1048. package/server/services/workshop/agents/codex-agent/index.ts +14 -14
  1049. package/server/services/workshop/agents/codex-agent/turn.ts +367 -367
  1050. package/server/services/workshop/agents/codex-agent/types.ts +42 -42
  1051. package/server/services/workshop/agents/harness-process.ts +3 -3
  1052. package/server/services/workshop/agents/harness-terminal/api.ts +197 -197
  1053. package/server/services/workshop/agents/harness-terminal/index.ts +17 -17
  1054. package/server/services/workshop/agents/harness-terminal/io.ts +120 -120
  1055. package/server/services/workshop/agents/harness-terminal/park.ts +55 -55
  1056. package/server/services/workshop/agents/harness-terminal/sanitize.ts +98 -98
  1057. package/server/services/workshop/agents/harness-terminal/session.ts +124 -124
  1058. package/server/services/workshop/agents/harness-terminal/shared.ts +74 -74
  1059. package/server/services/workshop/agents/hitl-capabilities.ts +312 -312
  1060. package/server/services/workshop/agents/hitl-decision/answers.ts +32 -32
  1061. package/server/services/workshop/agents/hitl-decision/decide.ts +268 -268
  1062. package/server/services/workshop/agents/hitl-decision/payload.ts +45 -45
  1063. package/server/services/workshop/agents/hitl-decision/shared.ts +108 -108
  1064. package/server/services/workshop/agents/hitl-decision/visibility.ts +94 -94
  1065. package/server/services/workshop/agents/host-tool-bridge/tools/progress.ts +84 -84
  1066. package/server/services/workshop/agents/host-tool-bridge/tools/team-delegation.ts +104 -104
  1067. package/server/services/workshop/agents/host-tool-bridge/tools/team.ts +70 -70
  1068. package/server/services/workshop/agents/industrial/aml-activity.ts +131 -131
  1069. package/server/services/workshop/agents/industrial/audit-query.ts +66 -66
  1070. package/server/services/workshop/agents/industrial/daq-tools.ts +352 -352
  1071. package/server/services/workshop/agents/industrial/exp-tools.ts +104 -104
  1072. package/server/services/workshop/agents/industrial/ops-tools.ts +16 -54
  1073. package/server/services/workshop/agents/industrial/param-tools.ts +69 -69
  1074. package/server/services/workshop/agents/industrial/recipe-gate.ts +6 -19
  1075. package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +1 -1
  1076. package/server/services/workshop/agents/node-bindings.repo.ts +207 -207
  1077. package/server/services/workshop/agents/node-delegation.ts +159 -159
  1078. package/server/services/workshop/agents/omp-agent/core.ts +146 -146
  1079. package/server/services/workshop/agents/omp-agent/facade.ts +8 -8
  1080. package/server/services/workshop/agents/omp-agent/helpers.ts +37 -37
  1081. package/server/services/workshop/agents/omp-agent/index.ts +16 -16
  1082. package/server/services/workshop/agents/omp-agent/tools-steer.ts +1 -18
  1083. package/server/services/workshop/agents/omp-agent/types.ts +45 -45
  1084. package/server/services/workshop/agents/opencode-agent/core.ts +77 -77
  1085. package/server/services/workshop/agents/opencode-agent/facade.ts +8 -8
  1086. package/server/services/workshop/agents/opencode-agent/helpers.ts +29 -29
  1087. package/server/services/workshop/agents/opencode-agent/hitl.ts +113 -113
  1088. package/server/services/workshop/agents/opencode-agent/index.ts +16 -16
  1089. package/server/services/workshop/agents/opencode-agent/lifecycle.ts +44 -44
  1090. package/server/services/workshop/agents/opencode-agent/server.ts +244 -244
  1091. package/server/services/workshop/agents/opencode-agent/turn.ts +278 -278
  1092. package/server/services/workshop/agents/opencode-agent/types.ts +54 -54
  1093. package/server/services/workshop/agents/tool-classes.ts +44 -44
  1094. package/server/services/workshop/aml/clean.ts +120 -120
  1095. package/server/services/workshop/aml/entity.ts +367 -367
  1096. package/server/services/workshop/aml/job-orchestrator/broadcast.ts +37 -37
  1097. package/server/services/workshop/aml/job-orchestrator/control.ts +94 -94
  1098. package/server/services/workshop/aml/job-orchestrator/failure.ts +96 -96
  1099. package/server/services/workshop/aml/job-orchestrator/index.ts +22 -22
  1100. package/server/services/workshop/aml/job-orchestrator/process.ts +101 -101
  1101. package/server/services/workshop/aml/job-orchestrator/shared.ts +53 -53
  1102. package/server/services/workshop/aml/job-orchestrator/status.ts +20 -20
  1103. package/server/services/workshop/aml/job-orchestrator/tick.ts +37 -37
  1104. package/server/services/workshop/aml/python/train-example.py +92 -92
  1105. package/server/services/workshop/aml/runtime.ts +137 -137
  1106. package/server/services/workshop/aml/stats.ts +140 -140
  1107. package/server/services/workshop/aml/twin/calibration-worker.ts +150 -150
  1108. package/server/services/workshop/aml/twin/model-backed-provider.ts +332 -332
  1109. package/server/services/workshop/aml/twin/physics-spec-draft.ts +185 -185
  1110. package/server/services/workshop/aml/twin/prompt-composer.ts +143 -143
  1111. package/server/services/workshop/aml/twin/training-plans.ts +260 -260
  1112. package/server/services/workshop/aml/twin/write-guard.ts +19 -19
  1113. package/server/services/workshop/assets/character-asset.repo.ts +1 -1
  1114. package/server/services/workshop/assets/device-twin.repo.ts +1 -1
  1115. package/server/services/workshop/daq/bus/index.ts +5 -12
  1116. package/server/services/workshop/daq/daq-controller/contracts.ts +39 -39
  1117. package/server/services/workshop/daq/daq-controller/facade.ts +28 -28
  1118. package/server/services/workshop/daq/daq-controller/frames.ts +137 -137
  1119. package/server/services/workshop/daq/daq-controller/helpers.ts +52 -52
  1120. package/server/services/workshop/daq/daq-controller/index.ts +22 -22
  1121. package/server/services/workshop/daq/daq-controller/runtime-control.ts +72 -72
  1122. package/server/services/workshop/daq/daq-controller/sweep-alarms.ts +176 -176
  1123. package/server/services/workshop/daq/daq-controller/tsdb-twin.ts +138 -138
  1124. package/server/services/workshop/daq/drivers/http.ts +95 -95
  1125. package/server/services/workshop/daq/drivers/mock.ts +130 -130
  1126. package/server/services/workshop/daq/drivers/modbus-rtu.ts +67 -67
  1127. package/server/services/workshop/daq/drivers/modbus-tcp.ts +307 -307
  1128. package/server/services/workshop/daq/drivers/opcua.ts +227 -227
  1129. package/server/services/workshop/daq/drivers/s7-stub.ts +29 -29
  1130. package/server/services/workshop/daq/host-bindings.ts +71 -71
  1131. package/server/services/workshop/daq/host-ports.ts +65 -65
  1132. package/server/services/workshop/db/aml-team-seeds.ts +118 -118
  1133. package/server/services/workshop/db/backup-registry.ts +33 -33
  1134. package/server/services/workshop/db/channel-member.repo.ts +122 -122
  1135. package/server/services/workshop/db/channel.repo.ts +203 -203
  1136. package/server/services/workshop/db/chat-message.repo.ts +233 -233
  1137. package/server/services/workshop/db/database/index.ts +18 -18
  1138. package/server/services/workshop/db/database/json.ts +14 -14
  1139. package/server/services/workshop/db/database/open.ts +97 -97
  1140. package/server/services/workshop/db/database/seed-data.ts +60 -60
  1141. package/server/services/workshop/db/hitl-request.repo.ts +221 -221
  1142. package/server/services/workshop/db/notification.repo.ts +199 -199
  1143. package/server/services/workshop/db/readonly.ts +30 -30
  1144. package/server/services/workshop/db/scheduled-task.repo.ts +235 -235
  1145. package/server/services/workshop/db/transaction.ts +72 -72
  1146. package/server/services/workshop/dcw/dcw-controller/contracts.ts +16 -16
  1147. package/server/services/workshop/dcw/dcw-controller/control.ts +78 -78
  1148. package/server/services/workshop/dcw/dcw-controller/facade.ts +19 -19
  1149. package/server/services/workshop/dcw/dcw-controller/index.ts +22 -22
  1150. package/server/services/workshop/dcw/dcw-controller/params.ts +97 -97
  1151. package/server/services/workshop/dcw/dcw-controller/products.ts +103 -103
  1152. package/server/services/workshop/dcw/dcw-controller/write-audit.ts +49 -49
  1153. package/server/services/workshop/dcw/dcw-templates.ts +136 -136
  1154. package/server/services/workshop/dcw/param-conversion.ts +78 -78
  1155. package/server/services/workshop/dcw/param-map.repo.ts +349 -349
  1156. package/server/services/workshop/dcw/plugin-bridge.ts +45 -45
  1157. package/server/services/workshop/dcw/recipe-rollback-manager/contracts.ts +26 -26
  1158. package/server/services/workshop/dcw/recipe-rollback-manager/facade.ts +13 -13
  1159. package/server/services/workshop/dcw/recipe-rollback-manager/helpers.ts +30 -30
  1160. package/server/services/workshop/dcw/recipe-rollback-manager/index.ts +17 -17
  1161. package/server/services/workshop/dcw/recipe-rollback-manager/internal.ts +33 -33
  1162. package/server/services/workshop/dcw/recipe-rollback-manager/judge.ts +52 -52
  1163. package/server/services/workshop/dcw/recipe-rollback-manager/lock.ts +137 -137
  1164. package/server/services/workshop/dcw/recipe-rollback-manager/rollback.ts +190 -190
  1165. package/server/services/workshop/dcw/recipe-rollback-manager/state.ts +21 -21
  1166. package/server/services/workshop/dcw/recipe-rollback-manager/sweep.ts +77 -77
  1167. package/server/services/workshop/dcw/recipe-rollback-manager/types.ts +3 -3
  1168. package/server/services/workshop/dcw/recipe-rollback-manager/views.ts +214 -214
  1169. package/server/services/workshop/exp/exp-collector.ts +275 -275
  1170. package/server/services/workshop/exp/exp-state.repo.ts +339 -339
  1171. package/server/services/workshop/mes/mes-controller.ts +1155 -1155
  1172. package/server/services/workshop/mes/mes-hook.ts +567 -567
  1173. package/server/services/workshop/ontology/subgraph.core.ts +300 -300
  1174. package/server/services/workshop/ontology/subgraph.service.ts +113 -113
  1175. package/server/services/workshop/plugins/host/api.mjs +90 -90
  1176. package/server/services/workshop/plugins/host/config.mjs +135 -135
  1177. package/server/services/workshop/plugins/host/index.mjs +23 -23
  1178. package/server/services/workshop/plugins/host/init.mjs +109 -109
  1179. package/server/services/workshop/plugins/host/load.mjs +321 -321
  1180. package/server/services/workshop/plugins/host/reload.mjs +94 -94
  1181. package/server/services/workshop/plugins/host/rollback.mjs +72 -72
  1182. package/server/services/workshop/plugins/host/state.mjs +54 -54
  1183. package/server/services/workshop/plugins/host/toggle.mjs +64 -64
  1184. package/server/services/workshop/plugins/host.mjs +9 -9
  1185. package/server/services/workshop/runtime/agent-runtime/facade.ts +7 -7
  1186. package/server/services/workshop/runtime/agent-runtime/helpers.ts +18 -18
  1187. package/server/services/workshop/runtime/agent-runtime/index.ts +19 -19
  1188. package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +137 -137
  1189. package/server/services/workshop/runtime/chat-mention.ts +164 -164
  1190. package/server/services/workshop/runtime/chat-projection.ts +246 -246
  1191. package/server/services/workshop/runtime/manager/admin-agents.ts +268 -268
  1192. package/server/services/workshop/runtime/manager/bus.ts +182 -182
  1193. package/server/services/workshop/runtime/manager/channel-template-constants.ts +20 -20
  1194. package/server/services/workshop/runtime/manager/chat-reply.ts +181 -181
  1195. package/server/services/workshop/runtime/manager/chat.ts +384 -384
  1196. package/server/services/workshop/runtime/manager/facade.ts +24 -24
  1197. package/server/services/workshop/runtime/manager/helpers.ts +119 -119
  1198. package/server/services/workshop/runtime/manager/index.ts +42 -42
  1199. package/server/services/workshop/runtime/manager/internal.ts +73 -73
  1200. package/server/services/workshop/runtime/manager/notifications.ts +108 -108
  1201. package/server/services/workshop/runtime/manager/teams.ts +148 -148
  1202. package/server/services/workshop/runtime/memory/contracts.ts +18 -18
  1203. package/server/services/workshop/runtime/memory/facade.ts +10 -10
  1204. package/server/services/workshop/runtime/memory/helpers.ts +196 -196
  1205. package/server/services/workshop/runtime/memory/index.ts +27 -27
  1206. package/server/services/workshop/runtime/memory/score.ts +33 -33
  1207. package/server/services/workshop/runtime/memory/state.ts +40 -40
  1208. package/server/services/workshop/runtime/monitor.ts +3 -3
  1209. package/server/services/workshop/runtime/platform-notice.ts +113 -113
  1210. package/server/services/workshop/runtime/schedule-runtime.ts +347 -347
  1211. package/server/services/workshop/runtime/scheduler-loop/contracts.ts +29 -29
  1212. package/server/services/workshop/runtime/scheduler-loop/facade.ts +7 -7
  1213. package/server/services/workshop/runtime/scheduler-loop/helpers.ts +14 -14
  1214. package/server/services/workshop/runtime/scheduler-loop/index.ts +16 -16
  1215. package/server/services/workshop/runtime/task-engine/facade.ts +7 -7
  1216. package/server/services/workshop/runtime/task-engine/index.ts +15 -15
  1217. package/server/services/workshop/runtime/task-engine/types.ts +3 -3
  1218. package/server/services/workshop/runtime/user-notification-hub.ts +192 -192
  1219. package/server/types/pg.d.ts +49 -49
  1220. package/server/utils/approval-gate.ts +67 -67
  1221. package/server/utils/mojibake-guard.ts +29 -29
  1222. package/server/utils/stability-severity.ts +77 -77
  1223. package/shared/config/groups.mjs +241 -241
  1224. package/shared/dcw-protocol/catalog.ts +232 -232
  1225. package/shared/dcw-protocol/closed-loop.ts +137 -137
  1226. package/shared/lru.mjs +97 -97
  1227. package/tui/README.md +74 -74
  1228. package/tui/aw-tui.mjs +445 -445
  1229. package/tui/commands/index.mjs +287 -287
  1230. package/tui/components/chat-log.mjs +42 -42
  1231. package/tui/components/monitor-pane.mjs +39 -39
  1232. package/tui/components/root.mjs +53 -53
  1233. package/tui/components/status-bar.mjs +33 -33
  1234. package/tui/lib/api.mjs +82 -82
  1235. package/tui/lib/pickers.mjs +121 -121
  1236. package/tui/lib/reducers.mjs +218 -218
  1237. package/tui/lib/state.mjs +86 -86
  1238. package/tui/lib/virtual-terminal.mjs +48 -48
  1239. package/tui/lib/ws.mjs +125 -125
  1240. package/tui/theme.mjs +38 -38
  1241. package/.output/.AgentWorkShop/aml-python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  1242. package/.output/.AgentWorkShop/aml-python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1243. package/.output/.AgentWorkShop/aml-python/__pycache__/train-example.cpython-312.pyc +0 -0
  1244. package/.output/.AgentWorkShop/aml-python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  1245. package/.output/public/_nuxt/BRYBzVMJ.js +0 -1
  1246. package/.output/public/_nuxt/BW2uTUx52.js +0 -2
  1247. package/.output/public/_nuxt/BtZKe9ZV.js +0 -1
  1248. package/.output/public/_nuxt/CfFUK6932.js +0 -2
  1249. package/.output/public/_nuxt/DhW7cFOa.js +0 -1
  1250. package/.output/public/_nuxt/OmpTerminalPanel.ComMDrA8.css +0 -1
  1251. package/.output/public/_nuxt/PluginSlot.CGH0vb95.css +0 -1
  1252. package/.output/public/_nuxt/TownView.CC3t-Dte.css +0 -1
  1253. package/.output/public/_nuxt/aml.PalMp-5n.css +0 -1
  1254. package/.output/public/_nuxt/builds/meta/20934eea-96ab-412d-b0cd-0061716d8cc4.json +0 -1
  1255. package/.output/public/_nuxt/permissions.DxuOOIqQ.css +0 -1
  1256. package/.output/public/_nuxt/schedules.BXNJ9q_I.css +0 -1
  1257. package/.output/public/_nuxt/tools.BwXFAb-X.css +0 -1
  1258. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs +0 -716
  1259. package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs.map +0 -1
  1260. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs +0 -72
  1261. package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs.map +0 -1
  1262. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs +0 -942
  1263. package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs.map +0 -1
  1264. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs +0 -141
  1265. package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs.map +0 -1
  1266. package/.output/server/chunks/build/TownView-BWMDbosY.mjs +0 -6489
  1267. package/.output/server/chunks/build/TownView-BWMDbosY.mjs.map +0 -1
  1268. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs +0 -392
  1269. package/.output/server/chunks/build/_id_-BK-t8nRG.mjs.map +0 -1
  1270. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs +0 -2045
  1271. package/.output/server/chunks/build/_id_-CZPlPDm4.mjs.map +0 -1
  1272. package/.output/server/chunks/build/_wsId_-BPy-Aj9L.mjs +0 -14297
  1273. package/.output/server/chunks/build/_wsId_-BPy-Aj9L.mjs.map +0 -1
  1274. package/.output/server/chunks/build/agents-CpNLdI8E.mjs +0 -1078
  1275. package/.output/server/chunks/build/agents-CpNLdI8E.mjs.map +0 -1
  1276. package/.output/server/chunks/build/alert-D0ivtTGy.mjs +0 -263
  1277. package/.output/server/chunks/build/alert-D0ivtTGy.mjs.map +0 -1
  1278. package/.output/server/chunks/build/aml-DRAFRcGU.mjs +0 -814
  1279. package/.output/server/chunks/build/aml-DRAFRcGU.mjs.map +0 -1
  1280. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs +0 -533
  1281. package/.output/server/chunks/build/analysis-p-dBkjoK.mjs.map +0 -1
  1282. package/.output/server/chunks/build/api-B4Om0mEc.mjs.map +0 -1
  1283. package/.output/server/chunks/build/api-BEW_ebY_.mjs.map +0 -1
  1284. package/.output/server/chunks/build/api-BsAgXWxi.mjs.map +0 -1
  1285. package/.output/server/chunks/build/api-error-BwAQLw44.mjs +0 -47
  1286. package/.output/server/chunks/build/api-error-BwAQLw44.mjs.map +0 -1
  1287. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs +0 -81
  1288. package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs.map +0 -1
  1289. package/.output/server/chunks/build/board-Dl2Ar22r.mjs +0 -178
  1290. package/.output/server/chunks/build/board-Dl2Ar22r.mjs.map +0 -1
  1291. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs +0 -953
  1292. package/.output/server/chunks/build/card-Cqk0Ur-L.mjs.map +0 -1
  1293. package/.output/server/chunks/build/channel-templates-ByHOQQkO.mjs +0 -942
  1294. package/.output/server/chunks/build/channel-templates-ByHOQQkO.mjs.map +0 -1
  1295. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs +0 -439
  1296. package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs.map +0 -1
  1297. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs +0 -43
  1298. package/.output/server/chunks/build/client-only-qNA2OVV_.mjs.map +0 -1
  1299. package/.output/server/chunks/build/core-CgTOPS4t.mjs +0 -294
  1300. package/.output/server/chunks/build/core-CgTOPS4t.mjs.map +0 -1
  1301. package/.output/server/chunks/build/daq-CdxcfY_G.mjs +0 -1266
  1302. package/.output/server/chunks/build/daq-CdxcfY_G.mjs.map +0 -1
  1303. package/.output/server/chunks/build/data-D8uX1dnm.mjs +0 -481
  1304. package/.output/server/chunks/build/data-D8uX1dnm.mjs.map +0 -1
  1305. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +0 -505
  1306. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs.map +0 -1
  1307. package/.output/server/chunks/build/default-CNWS6NUw.mjs +0 -2353
  1308. package/.output/server/chunks/build/default-CNWS6NUw.mjs.map +0 -1
  1309. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs +0 -406
  1310. package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs.map +0 -1
  1311. package/.output/server/chunks/build/drawer-Caji0PLs.mjs +0 -834
  1312. package/.output/server/chunks/build/drawer-Caji0PLs.mjs.map +0 -1
  1313. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs +0 -14
  1314. package/.output/server/chunks/build/dropdown-BNwTVGde.mjs.map +0 -1
  1315. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs +0 -540
  1316. package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs.map +0 -1
  1317. package/.output/server/chunks/build/es-Bxu10NJ2.mjs.map +0 -1
  1318. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs +0 -2448
  1319. package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs.map +0 -1
  1320. package/.output/server/chunks/build/form-D_UpWPN4.mjs +0 -4712
  1321. package/.output/server/chunks/build/form-D_UpWPN4.mjs.map +0 -1
  1322. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs +0 -553
  1323. package/.output/server/chunks/build/hasIn-DBdElbjM.mjs.map +0 -1
  1324. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs +0 -132
  1325. package/.output/server/chunks/build/hitl-Bd30yr1J.mjs.map +0 -1
  1326. package/.output/server/chunks/build/input-GtPuSEgt.mjs +0 -2181
  1327. package/.output/server/chunks/build/input-GtPuSEgt.mjs.map +0 -1
  1328. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs +0 -1120
  1329. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs.map +0 -1
  1330. package/.output/server/chunks/build/interval-DvHBIIZh.mjs +0 -9
  1331. package/.output/server/chunks/build/interval-DvHBIIZh.mjs.map +0 -1
  1332. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs +0 -7
  1333. package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs.map +0 -1
  1334. package/.output/server/chunks/build/logs-pRb-TMWa.mjs +0 -427
  1335. package/.output/server/chunks/build/logs-pRb-TMWa.mjs.map +0 -1
  1336. package/.output/server/chunks/build/menu-BXt-X0dt.mjs +0 -1952
  1337. package/.output/server/chunks/build/menu-BXt-X0dt.mjs.map +0 -1
  1338. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs +0 -2253
  1339. package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs.map +0 -1
  1340. package/.output/server/chunks/build/ontology-DK0Mf0zT.mjs +0 -1406
  1341. package/.output/server/chunks/build/ontology-DK0Mf0zT.mjs.map +0 -1
  1342. package/.output/server/chunks/build/operations-SMQrRAcr.mjs +0 -311
  1343. package/.output/server/chunks/build/operations-SMQrRAcr.mjs.map +0 -1
  1344. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +0 -202
  1345. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs.map +0 -1
  1346. package/.output/server/chunks/build/pages-AFRP4-EL.mjs +0 -542
  1347. package/.output/server/chunks/build/pages-AFRP4-EL.mjs.map +0 -1
  1348. package/.output/server/chunks/build/pagination-DTAconUo.mjs +0 -1346
  1349. package/.output/server/chunks/build/pagination-DTAconUo.mjs.map +0 -1
  1350. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs +0 -637
  1351. package/.output/server/chunks/build/permissions-DgXQZSyx.mjs.map +0 -1
  1352. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs +0 -272
  1353. package/.output/server/chunks/build/plugins-LRjaSEZy.mjs.map +0 -1
  1354. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs +0 -340
  1355. package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs.map +0 -1
  1356. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs +0 -78
  1357. package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs.map +0 -1
  1358. package/.output/server/chunks/build/schedules-dSnr8url.mjs +0 -7172
  1359. package/.output/server/chunks/build/schedules-dSnr8url.mjs.map +0 -1
  1360. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs +0 -341
  1361. package/.output/server/chunks/build/segmented-D3HWtHPw.mjs.map +0 -1
  1362. package/.output/server/chunks/build/select-B3Dsb9yq.mjs +0 -3923
  1363. package/.output/server/chunks/build/select-B3Dsb9yq.mjs.map +0 -1
  1364. package/.output/server/chunks/build/settings-BrIhnS2Z.mjs +0 -1014
  1365. package/.output/server/chunks/build/settings-BrIhnS2Z.mjs.map +0 -1
  1366. package/.output/server/chunks/build/space-Dwu2Skt8.mjs +0 -110
  1367. package/.output/server/chunks/build/space-Dwu2Skt8.mjs.map +0 -1
  1368. package/.output/server/chunks/build/spin-C2cuvGth.mjs +0 -357
  1369. package/.output/server/chunks/build/spin-C2cuvGth.mjs.map +0 -1
  1370. package/.output/server/chunks/build/studio-cdoNCfyy.mjs +0 -332
  1371. package/.output/server/chunks/build/studio-cdoNCfyy.mjs.map +0 -1
  1372. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs +0 -377
  1373. package/.output/server/chunks/build/switch-CyR-H6Fb.mjs.map +0 -1
  1374. package/.output/server/chunks/build/table-CmVD-cA9.mjs +0 -7546
  1375. package/.output/server/chunks/build/table-CmVD-cA9.mjs.map +0 -1
  1376. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs +0 -1924
  1377. package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs.map +0 -1
  1378. package/.output/server/chunks/build/tag-y0sn-xv9.mjs +0 -1156
  1379. package/.output/server/chunks/build/tag-y0sn-xv9.mjs.map +0 -1
  1380. package/.output/server/chunks/build/teams-B1d32eHK.mjs +0 -1203
  1381. package/.output/server/chunks/build/teams-B1d32eHK.mjs.map +0 -1
  1382. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs +0 -1062
  1383. package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs.map +0 -1
  1384. package/.output/server/chunks/build/tools-s_9U1Djj.mjs +0 -487
  1385. package/.output/server/chunks/build/tools-s_9U1Djj.mjs.map +0 -1
  1386. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs +0 -920
  1387. package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs.map +0 -1
  1388. package/.output/server/chunks/build/town-B5aoiG98.mjs +0 -133
  1389. package/.output/server/chunks/build/town-B5aoiG98.mjs.map +0 -1
  1390. package/.output/server/chunks/build/useAgentHarnessOptions-DOrQHeBh.mjs +0 -124
  1391. package/.output/server/chunks/build/useAgentHarnessOptions-DOrQHeBh.mjs.map +0 -1
  1392. package/.output/server/chunks/build/useAgentTemplateActions-CzlplRWh.mjs +0 -77
  1393. package/.output/server/chunks/build/useAgentTemplateActions-CzlplRWh.mjs.map +0 -1
  1394. package/.output/server/chunks/build/useAgentTemplateForm-DQo1enf2.mjs +0 -117
  1395. package/.output/server/chunks/build/useAgentTemplateForm-DQo1enf2.mjs.map +0 -1
  1396. package/.output/server/chunks/build/useAgentTemplatesCatalog-DP-iMmqz.mjs +0 -133
  1397. package/.output/server/chunks/build/useAgentTemplatesCatalog-DP-iMmqz.mjs.map +0 -1
  1398. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs +0 -92
  1399. package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs.map +0 -1
  1400. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs +0 -86
  1401. package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs.map +0 -1
  1402. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs +0 -194
  1403. package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs.map +0 -1
  1404. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs +0 -89
  1405. package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs.map +0 -1
  1406. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs +0 -267
  1407. package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs.map +0 -1
  1408. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs +0 -93
  1409. package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs.map +0 -1
  1410. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs +0 -86
  1411. package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs.map +0 -1
  1412. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs +0 -130
  1413. package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs.map +0 -1
  1414. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs +0 -129
  1415. package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs.map +0 -1
  1416. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +0 -142
  1417. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs.map +0 -1
  1418. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs +0 -70
  1419. package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs.map +0 -1
  1420. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs +0 -79
  1421. package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs.map +0 -1
  1422. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs +0 -176
  1423. package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs.map +0 -1
  1424. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +0 -99
  1425. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs.map +0 -1
  1426. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +0 -159
  1427. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs.map +0 -1
  1428. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +0 -222
  1429. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs.map +0 -1
  1430. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs +0 -136
  1431. package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs.map +0 -1
  1432. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +0 -395
  1433. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs.map +0 -1
  1434. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +0 -187
  1435. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs.map +0 -1
  1436. package/.output/server/chunks/build/useDashboardData-B36wVWo2.mjs +0 -153
  1437. package/.output/server/chunks/build/useDashboardData-B36wVWo2.mjs.map +0 -1
  1438. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +0 -219
  1439. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs.map +0 -1
  1440. package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs.map +0 -1
  1441. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs +0 -184
  1442. package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs.map +0 -1
  1443. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs +0 -148
  1444. package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs.map +0 -1
  1445. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs +0 -71
  1446. package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs.map +0 -1
  1447. package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs.map +0 -1
  1448. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs +0 -137
  1449. package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs.map +0 -1
  1450. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs +0 -104
  1451. package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs.map +0 -1
  1452. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs +0 -121
  1453. package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs.map +0 -1
  1454. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs +0 -93
  1455. package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs.map +0 -1
  1456. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs +0 -98
  1457. package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs.map +0 -1
  1458. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs +0 -88
  1459. package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs.map +0 -1
  1460. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs +0 -258
  1461. package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs.map +0 -1
  1462. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +0 -452
  1463. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs.map +0 -1
  1464. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs +0 -91
  1465. package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs.map +0 -1
  1466. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs +0 -140
  1467. package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs.map +0 -1
  1468. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs +0 -128
  1469. package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs.map +0 -1
  1470. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs +0 -107
  1471. package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs.map +0 -1
  1472. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs +0 -55
  1473. package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs.map +0 -1
  1474. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs +0 -88
  1475. package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs.map +0 -1
  1476. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs +0 -150
  1477. package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs.map +0 -1
  1478. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs +0 -83
  1479. package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs.map +0 -1
  1480. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs +0 -135
  1481. package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs.map +0 -1
  1482. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs +0 -91
  1483. package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs.map +0 -1
  1484. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs +0 -195
  1485. package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs.map +0 -1
  1486. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs +0 -149
  1487. package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs.map +0 -1
  1488. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs +0 -156
  1489. package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs.map +0 -1
  1490. package/.output/server/chunks/build/useTeamActions-I_8QWp9w.mjs +0 -79
  1491. package/.output/server/chunks/build/useTeamActions-I_8QWp9w.mjs.map +0 -1
  1492. package/.output/server/chunks/build/useTeamAddMemberDialog-BLn4nTuy.mjs +0 -84
  1493. package/.output/server/chunks/build/useTeamAddMemberDialog-BLn4nTuy.mjs.map +0 -1
  1494. package/.output/server/chunks/build/useTeamCreateDialog-Bp5qKtpI.mjs +0 -97
  1495. package/.output/server/chunks/build/useTeamCreateDialog-Bp5qKtpI.mjs.map +0 -1
  1496. package/.output/server/chunks/build/useTeamDeployDialog-DwIaz6Cx.mjs +0 -80
  1497. package/.output/server/chunks/build/useTeamDeployDialog-DwIaz6Cx.mjs.map +0 -1
  1498. package/.output/server/chunks/build/useTeamPluginDialog-B932gZOI.mjs +0 -103
  1499. package/.output/server/chunks/build/useTeamPluginDialog-B932gZOI.mjs.map +0 -1
  1500. package/.output/server/chunks/build/useTeamsCatalog-DBwaLQBw.mjs +0 -123
  1501. package/.output/server/chunks/build/useTeamsCatalog-DBwaLQBw.mjs.map +0 -1
  1502. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs +0 -115
  1503. package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs.map +0 -1
  1504. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs +0 -87
  1505. package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs.map +0 -1
  1506. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs +0 -118
  1507. package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs.map +0 -1
  1508. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs +0 -92
  1509. package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs.map +0 -1
  1510. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs +0 -141
  1511. package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs.map +0 -1
  1512. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs +0 -138
  1513. package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs.map +0 -1
  1514. package/.output/server/chunks/build/useWorkshopApi-CaSItJVq.mjs +0 -119
  1515. package/.output/server/chunks/build/useWorkshopApi-CaSItJVq.mjs.map +0 -1
  1516. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs +0 -1659
  1517. package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs.map +0 -1
  1518. package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs.map +0 -1
  1519. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs +0 -92
  1520. package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs.map +0 -1
  1521. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs +0 -168
  1522. package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs.map +0 -1
  1523. package/.output/server/chunks/build/users-DjiVC_tS.mjs +0 -569
  1524. package/.output/server/chunks/build/users-DjiVC_tS.mjs.map +0 -1
  1525. package/.output/server/chunks/build/workshop-1gKeDASV.mjs +0 -546
  1526. package/.output/server/chunks/build/workshop-1gKeDASV.mjs.map +0 -1
  1527. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.json +0 -1
  1528. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/1459e6269990a5d229b9228c8b2f62ffaa7d350068380ae8b875fee0db45cca6.source +0 -180
  1529. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/c2991e909c70c5c12b90a407c7adcf63384c51668a2b334e6e047fa675c268fe.source +0 -305
  1530. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/e09129039d1e27e3fac24becc9bdafd2d1a7c8049bff24173df007be865f0165.source +0 -264
  1531. package/app/.mimosa/hook-status/sess_05189059-e42d-4188-8911-4f7baabe009b-28ef7c75ea.json +0 -14
  1532. package/scripts/e2e-direct-rest-simulator-paper.mjs +0 -624
  1533. package/scripts/e2e-pi-simulator-paper.mjs +0 -2316
  1534. package/scripts/e2e-registered-harness-simulator-paper.mjs +0 -1926
  1535. package/scripts/e2e-simulator-optimizer-paper.mjs +0 -264
  1536. package/scripts/fixtures/omp-paper-harness.mjs +0 -163
  1537. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.json +0 -1
  1538. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/942d2679b87b96c612b4f2a425c3ccc5b6f3234f0cf589a8441602f866fbe277.source +0 -41
  1539. package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/dd617a82339d2c61e49e28e416aabeb2fc100fb3cb1beca18d02dfb833214af6.source +0 -51
  1540. package/server/.mimosa/hook-status/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2-e67b6b91bf.json +0 -14
  1541. package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json +0 -1
  1542. package/server/services/workshop/.mimosa/hook-status/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f-e6b75bbfe6.json +0 -14
  1543. package/server/services/workshop/agents/omp-agent/supervision-history.ts +0 -38
  1544. package/server/services/workshop/aml/python/__pycache__/aml_eval.cpython-312.pyc +0 -0
  1545. package/server/services/workshop/aml/python/__pycache__/amlkit.cpython-312.pyc +0 -0
  1546. package/server/services/workshop/aml/python/__pycache__/train-example.cpython-312.pyc +0 -0
  1547. package/server/services/workshop/aml/python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
  1548. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.json +0 -1
  1549. package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.mvjqkcs6-68688-fb7131a89c.baseline/190a6772a4e43801737b4ba6072eb9d53d3099b5d8a9e6f57bc5e8592a26a6c4.source +0 -274
  1550. package/server/services/workshop/optimization/python/.mimosa/hook-status/session_187ec97f45d4bd02369bbe94da527cf1-01ed7f04fa.json +0 -14
  1551. package/server/services/workshop/optimization/python/__pycache__/problems.cpython-312.pyc +0 -0
  1552. /package/.output/public/_nuxt/{9j2J4k4w.js → 9j2J4k4w2.js} +0 -0
  1553. /package/.output/public/_nuxt/{BY3Lbz3h2.js → BY3Lbz3h.js} +0 -0
  1554. /package/.output/public/_nuxt/{Iub61dX92.js → Iub61dX9.js} +0 -0
  1555. /package/.output/public/_nuxt/{Q-JpBT032.js → Q-JpBT03.js} +0 -0
  1556. /package/.output/public/_nuxt/{dVw8IHY62.js → dVw8IHY6.js} +0 -0
  1557. /package/.output/public/_nuxt/{k9b520K-.js → k9b520K-2.js} +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.