agentworkshop 0.8.2 → 0.8.4
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.
- package/.output/.AgentWorkShop/aml-python/train-example.py +92 -92
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{BCLUwdP52.js → 39W1CH-l2.js} +1 -1
- package/.output/public/_nuxt/7xbYPfY6.js +1 -0
- package/.output/public/_nuxt/{BfvuWqSa.js → ATAvN55g.js} +1 -1
- package/.output/public/_nuxt/{B2NbzUau2.js → B3eCVqcT2.js} +1 -1
- package/.output/public/_nuxt/B4iJT5PX2.js +2 -0
- package/.output/public/_nuxt/{DuUc4bbY2.js → B9qIhT7k2.js} +1 -1
- package/.output/public/_nuxt/{BkEokGX5.js → BE9oKpOt.js} +1 -1
- package/.output/public/_nuxt/BNUaS1jv.js +20 -0
- package/.output/public/_nuxt/BhJA-E372.js +1 -0
- package/.output/public/_nuxt/Bq8YzXzs2.js +1 -0
- package/.output/public/_nuxt/{dHwWyr6b.js → CT4bi_Y4.js} +1 -1
- package/.output/public/_nuxt/{26OL4Ao82.js → CeCSjB9O2.js} +1 -1
- package/.output/public/_nuxt/Cf7ER7e2.js +1 -0
- package/.output/public/_nuxt/{Dyxf2xZw.js → Cot5VNae.js} +1 -1
- package/.output/public/_nuxt/{BVg2R2VB2.js → Crf8_Ad02.js} +1 -1
- package/.output/public/_nuxt/{rDvMijKA.js → D9tNM-1a.js} +2 -2
- package/.output/public/_nuxt/{YAA98rWJ.js → DAug2CPf.js} +7 -7
- package/.output/public/_nuxt/{DrlnrdvY2.js → DPnjnDtg.js} +1 -1
- package/.output/public/_nuxt/{CQSxS_Ek.js → DbhTN7-T.js} +1 -1
- package/.output/public/_nuxt/DgGzwjAr2.js +2 -0
- package/.output/public/_nuxt/DgTqKyYF2.js +1 -0
- package/.output/public/_nuxt/DkRozlDP2.js +1 -0
- package/.output/public/_nuxt/{Byiiiwc72.js → DxH5focQ.js} +1 -1
- package/.output/public/_nuxt/Dyr3LPGL.js +1 -0
- package/.output/public/_nuxt/{CC2Pv8VL2.js → MC_i34H42.js} +1 -1
- package/.output/public/_nuxt/MmlCf-EZ.js +1 -0
- package/.output/public/_nuxt/OmpTerminalPanel.DMWgGwDs.css +1 -0
- package/.output/public/_nuxt/PluginSlot.BqBzLD4T.css +1 -0
- package/.output/public/_nuxt/TownView.Cn8SPG7S.css +1 -0
- package/.output/public/_nuxt/{CmuGMxDP.js → TugRY_4O.js} +1 -1
- package/.output/public/_nuxt/{BPUQZ9Lq2.js → WybiLTow2.js} +1 -1
- package/.output/public/_nuxt/{BaYDgyaR.js → Zn0BZpf0.js} +3 -3
- package/.output/public/_nuxt/{_id_.BQRWK7J2.css → _id_.Be5JaH-P.css} +1 -1
- package/.output/public/_nuxt/{_wsId_.DCnKQQdY.css → _wsId_.p_vAYtTp.css} +1 -1
- package/.output/public/_nuxt/{agents.D-JPovTZ.css → agents.CRomddYR.css} +1 -1
- package/.output/public/_nuxt/aml.DgOMpDpv.css +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/8a151630-3285-41b8-a1e5-063fee2002ac.json +1 -0
- package/.output/public/_nuxt/{default.BEXGWZFQ.css → default.CpAx70gC.css} +1 -1
- package/.output/public/_nuxt/{entry.C7koBPom.css → entry.D6nBdXet.css} +1 -1
- package/.output/public/_nuxt/{logs.BkJPbR_K.css → logs.DcSvz6vi.css} +1 -1
- package/.output/public/_nuxt/{monitor.D3yEqqrv.css → monitor.OoNTwfMJ.css} +1 -1
- package/.output/public/_nuxt/ontology.D4P756Tc.css +1 -0
- package/.output/public/_nuxt/{operations.-l6u44Ar.css → operations.C48ggFa5.css} +1 -1
- package/.output/public/_nuxt/{pages.Cdpm_B-G.css → pages.Dpa28tJW.css} +1 -1
- package/.output/public/_nuxt/permissions.CrV-4t-6.css +1 -0
- package/.output/public/_nuxt/pipeline.NFs5z5V-.css +1 -0
- package/.output/public/_nuxt/{BfeXib9G.js → rcdmiszh2.js} +1 -1
- package/.output/public/_nuxt/schedules.DYWOjGHm.css +1 -0
- package/.output/public/_nuxt/{teams.CLQaXno5.css → teams.DEJoJ4QV.css} +1 -1
- package/.output/public/_nuxt/{tokens.BDSUWF-L.css → tokens.DKZWCP5v.css} +1 -1
- package/.output/public/_nuxt/tools.DP-nsTli.css +1 -0
- package/.output/public/_nuxt/wK6Pp4Zc2.js +2 -0
- package/.output/public/_nuxt/{workshop.BBiFhXuM.css → workshop.PT1xhP8C.css} +1 -1
- package/.output/public/favicon.svg +14 -14
- package/.output/public/robots.txt +3 -3
- package/.output/server/chunks/_/LeftOutlined.mjs.map +1 -1
- package/.output/server/chunks/_/RightOutlined.mjs.map +1 -1
- package/.output/server/chunks/_/SearchOutlined.mjs +1230 -1261
- package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
- package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
- package/.output/server/chunks/_/chart-repo.mjs +1 -1
- package/.output/server/chunks/_/chart-repo.mjs.map +1 -1
- package/.output/server/chunks/_/eda-db.mjs +12 -0
- package/.output/server/chunks/_/eda-db.mjs.map +1 -1
- package/.output/server/chunks/_/error-500.mjs.map +1 -1
- package/.output/server/chunks/_/host-bindings.mjs +1 -1
- package/.output/server/chunks/_/nitro.mjs +3258 -3313
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
- package/.output/server/chunks/_/template-repo.mjs +97 -0
- package/.output/server/chunks/_/template-repo.mjs.map +1 -0
- package/.output/server/chunks/build/AuthGate-G74Wr5IV.mjs +704 -0
- package/.output/server/chunks/build/AuthGate-G74Wr5IV.mjs.map +1 -0
- package/.output/server/chunks/build/FormItemContext-DmuQqaeJ.mjs +77 -0
- package/.output/server/chunks/build/FormItemContext-DmuQqaeJ.mjs.map +1 -0
- package/.output/server/chunks/build/OmpTerminalPanel-5cB-78zp.mjs +889 -0
- package/.output/server/chunks/build/OmpTerminalPanel-5cB-78zp.mjs.map +1 -0
- package/.output/server/chunks/build/PluginSlot-CZlGlRoR.mjs +131 -0
- package/.output/server/chunks/build/PluginSlot-CZlGlRoR.mjs.map +1 -0
- package/.output/server/chunks/build/TownView-CcUPLqF1.mjs +5960 -0
- package/.output/server/chunks/build/TownView-CcUPLqF1.mjs.map +1 -0
- package/.output/server/chunks/build/_id_-AgACEyL6.mjs +1922 -0
- package/.output/server/chunks/build/_id_-AgACEyL6.mjs.map +1 -0
- package/.output/server/chunks/build/_id_-B3yCK2lD.mjs +373 -0
- package/.output/server/chunks/build/_id_-B3yCK2lD.mjs.map +1 -0
- package/.output/server/chunks/build/_wsId_-kcDriA4i.mjs +13707 -0
- package/.output/server/chunks/build/_wsId_-kcDriA4i.mjs.map +1 -0
- package/.output/server/chunks/build/agents-DRod4lTC.mjs +1047 -0
- package/.output/server/chunks/build/agents-DRod4lTC.mjs.map +1 -0
- package/.output/server/chunks/build/alert-CNGhs--Y.mjs +260 -0
- package/.output/server/chunks/build/alert-CNGhs--Y.mjs.map +1 -0
- package/.output/server/chunks/build/aml-B3Umz4DR.mjs +729 -0
- package/.output/server/chunks/build/aml-B3Umz4DR.mjs.map +1 -0
- package/.output/server/chunks/build/analysis-CMsMTMCg.mjs +502 -0
- package/.output/server/chunks/build/analysis-CMsMTMCg.mjs.map +1 -0
- package/.output/server/chunks/build/{api-B4Om0mEc.mjs → api-D-zkgkj-.mjs} +8 -10
- package/.output/server/chunks/build/api-D-zkgkj-.mjs.map +1 -0
- package/.output/server/chunks/build/{api-BsAgXWxi.mjs → api-D3gy2e2q.mjs} +22 -24
- package/.output/server/chunks/build/api-D3gy2e2q.mjs.map +1 -0
- package/.output/server/chunks/build/{api-BEW_ebY_.mjs → api-bn4OKkl_.mjs} +17 -19
- package/.output/server/chunks/build/api-bn4OKkl_.mjs.map +1 -0
- package/.output/server/chunks/build/api-error-CnW_xiNI.mjs +46 -0
- package/.output/server/chunks/build/api-error-CnW_xiNI.mjs.map +1 -0
- package/.output/server/chunks/build/apiClient-DIXx9sfD.mjs +70 -0
- package/.output/server/chunks/build/apiClient-DIXx9sfD.mjs.map +1 -0
- package/.output/server/chunks/build/board-B2oYXGBy.mjs +172 -0
- package/.output/server/chunks/build/board-B2oYXGBy.mjs.map +1 -0
- package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs +81 -94
- package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs.map +1 -1
- package/.output/server/chunks/build/card-BECE6y_G.mjs +922 -0
- package/.output/server/chunks/build/card-BECE6y_G.mjs.map +1 -0
- package/.output/server/chunks/build/channel-templates-R2TInv8B.mjs +950 -0
- package/.output/server/chunks/build/channel-templates-R2TInv8B.mjs.map +1 -0
- package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs +113 -112
- package/.output/server/chunks/build/chart-trend-BWeZh5Lv.mjs.map +1 -1
- package/.output/server/chunks/build/checkbox-C6xY5uc6.mjs +429 -0
- package/.output/server/chunks/build/checkbox-C6xY5uc6.mjs.map +1 -0
- package/.output/server/chunks/build/client-only-S7k53PIm.mjs +42 -0
- package/.output/server/chunks/build/client-only-S7k53PIm.mjs.map +1 -0
- package/.output/server/chunks/build/constants-HPHJvjne.mjs +65 -75
- package/.output/server/chunks/build/constants-HPHJvjne.mjs.map +1 -1
- package/.output/server/chunks/build/core-CRlsQhzd.mjs +292 -0
- package/.output/server/chunks/build/core-CRlsQhzd.mjs.map +1 -0
- package/.output/server/chunks/build/daq-DFQQOtcZ.mjs +1210 -0
- package/.output/server/chunks/build/daq-DFQQOtcZ.mjs.map +1 -0
- package/.output/server/chunks/build/data-Cl4wRZO6.mjs +459 -0
- package/.output/server/chunks/build/data-Cl4wRZO6.mjs.map +1 -0
- package/.output/server/chunks/build/dcw-8415S3Km.mjs +467 -0
- package/.output/server/chunks/build/dcw-8415S3Km.mjs.map +1 -0
- package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs +3 -15
- package/.output/server/chunks/build/dcw-driver-badge-Df5wL_ZA.mjs.map +1 -1
- package/.output/server/chunks/build/default-DDRKP2Mb.mjs +2246 -0
- package/.output/server/chunks/build/default-DDRKP2Mb.mjs.map +1 -0
- package/.output/server/chunks/build/descriptions-B3uhDesi.mjs +401 -0
- package/.output/server/chunks/build/descriptions-B3uhDesi.mjs.map +1 -0
- package/.output/server/chunks/build/drawer-DwXxapMg.mjs +822 -0
- package/.output/server/chunks/build/drawer-DwXxapMg.mjs.map +1 -0
- package/.output/server/chunks/build/dropdown-DLrGy-Fs.mjs +12 -0
- package/.output/server/chunks/build/dropdown-DLrGy-Fs.mjs.map +1 -0
- package/.output/server/chunks/build/dropdown-nsGv8Gqx.mjs +530 -0
- package/.output/server/chunks/build/dropdown-nsGv8Gqx.mjs.map +1 -0
- package/.output/server/chunks/build/{es-Bxu10NJ2.mjs → es-DXSEkmAm.mjs} +1 -2
- package/.output/server/chunks/build/es-DXSEkmAm.mjs.map +1 -0
- package/.output/server/chunks/build/firstNotUndefined-laiThpLD.mjs +2082 -0
- package/.output/server/chunks/build/firstNotUndefined-laiThpLD.mjs.map +1 -0
- package/.output/server/chunks/build/form-Cw2Ex9w5.mjs +3543 -0
- package/.output/server/chunks/build/form-Cw2Ex9w5.mjs.map +1 -0
- package/.output/server/chunks/build/hasIn-RYRGomyg.mjs +192 -0
- package/.output/server/chunks/build/hasIn-RYRGomyg.mjs.map +1 -0
- package/.output/server/chunks/build/hitl-B4cHRlkC.mjs +120 -0
- package/.output/server/chunks/build/hitl-B4cHRlkC.mjs.map +1 -0
- package/.output/server/chunks/build/input-CJgB-RL6.mjs +1705 -0
- package/.output/server/chunks/build/input-CJgB-RL6.mjs.map +1 -0
- package/.output/server/chunks/build/input-number-CQKL42p_.mjs +1027 -0
- package/.output/server/chunks/build/input-number-CQKL42p_.mjs.map +1 -0
- package/.output/server/chunks/build/interval-DiAUqODq.mjs +8 -0
- package/.output/server/chunks/build/interval-DiAUqODq.mjs.map +1 -0
- package/.output/server/chunks/build/isNumeric-DQiJ-b15.mjs +6 -0
- package/.output/server/chunks/build/isNumeric-DQiJ-b15.mjs.map +1 -0
- package/.output/server/chunks/build/logs-C-dWpJ80.mjs +381 -0
- package/.output/server/chunks/build/logs-C-dWpJ80.mjs.map +1 -0
- package/.output/server/chunks/build/menu-xO8ocVtL.mjs +1833 -0
- package/.output/server/chunks/build/menu-xO8ocVtL.mjs.map +1 -0
- package/.output/server/chunks/build/monitor-BNrG6v3b.mjs +2216 -0
- package/.output/server/chunks/build/monitor-BNrG6v3b.mjs.map +1 -0
- package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs +0 -2
- package/.output/server/chunks/build/narrow-fetch-CcG-BPxc.mjs.map +1 -1
- package/.output/server/chunks/build/ontology-DoXAsa2y.mjs +1416 -0
- package/.output/server/chunks/build/ontology-DoXAsa2y.mjs.map +1 -0
- package/.output/server/chunks/build/operations-Ch6tZIKo.mjs +278 -0
- package/.output/server/chunks/build/operations-Ch6tZIKo.mjs.map +1 -0
- package/.output/server/chunks/build/optimizer-DaTyaY3c.mjs +202 -0
- package/.output/server/chunks/build/optimizer-DaTyaY3c.mjs.map +1 -0
- package/.output/server/chunks/build/pages-CQOfwKB4.mjs +439 -0
- package/.output/server/chunks/build/pages-CQOfwKB4.mjs.map +1 -0
- package/.output/server/chunks/build/pagination-BTzq7dD5.mjs +1330 -0
- package/.output/server/chunks/build/pagination-BTzq7dD5.mjs.map +1 -0
- package/.output/server/chunks/build/permissions-qmimwB0M.mjs +649 -0
- package/.output/server/chunks/build/permissions-qmimwB0M.mjs.map +1 -0
- package/.output/server/chunks/build/pipeline-eo2RWN3f.mjs +226 -0
- package/.output/server/chunks/build/pipeline-eo2RWN3f.mjs.map +1 -0
- package/.output/server/chunks/build/plugins-Dh_goy-k.mjs +269 -0
- package/.output/server/chunks/build/plugins-Dh_goy-k.mjs.map +1 -0
- package/.output/server/chunks/build/popconfirm-DuGF7ty-.mjs +333 -0
- package/.output/server/chunks/build/popconfirm-DuGF7ty-.mjs.map +1 -0
- package/.output/server/chunks/build/responsiveObserve-CzRpNXkr.mjs +77 -0
- package/.output/server/chunks/build/responsiveObserve-CzRpNXkr.mjs.map +1 -0
- package/.output/server/chunks/build/schedules-C2_x38gj.mjs +7039 -0
- package/.output/server/chunks/build/schedules-C2_x38gj.mjs.map +1 -0
- package/.output/server/chunks/build/segmented-29uEKZ3D.mjs +332 -0
- package/.output/server/chunks/build/segmented-29uEKZ3D.mjs.map +1 -0
- package/.output/server/chunks/build/select-CJb2XrQf.mjs +3734 -0
- package/.output/server/chunks/build/select-CJb2XrQf.mjs.map +1 -0
- package/.output/server/chunks/build/settings-Cz2Plds0.mjs +944 -0
- package/.output/server/chunks/build/settings-Cz2Plds0.mjs.map +1 -0
- package/.output/server/chunks/build/space-BByD-mFE.mjs +107 -0
- package/.output/server/chunks/build/space-BByD-mFE.mjs.map +1 -0
- package/.output/server/chunks/build/spin-XhbgGeLP.mjs +313 -0
- package/.output/server/chunks/build/spin-XhbgGeLP.mjs.map +1 -0
- package/.output/server/chunks/build/studio-CwYXl00G.mjs +329 -0
- package/.output/server/chunks/build/studio-CwYXl00G.mjs.map +1 -0
- package/.output/server/chunks/build/switch-DWcwVFxW.mjs +374 -0
- package/.output/server/chunks/build/switch-DWcwVFxW.mjs.map +1 -0
- package/.output/server/chunks/build/table-Zhuo7Fq-.mjs +7249 -0
- package/.output/server/chunks/build/table-Zhuo7Fq-.mjs.map +1 -0
- package/.output/server/chunks/build/tabs-BCwBXjNt.mjs +1838 -0
- package/.output/server/chunks/build/tabs-BCwBXjNt.mjs.map +1 -0
- package/.output/server/chunks/build/tag-CRW-anwy.mjs +1010 -0
- package/.output/server/chunks/build/tag-CRW-anwy.mjs.map +1 -0
- package/.output/server/chunks/build/teams-CwhFdcYn.mjs +1160 -0
- package/.output/server/chunks/build/teams-CwhFdcYn.mjs.map +1 -0
- package/.output/server/chunks/build/tokens-C5ODO1HA.mjs +992 -0
- package/.output/server/chunks/build/tokens-C5ODO1HA.mjs.map +1 -0
- package/.output/server/chunks/build/tools-C0YKragH.mjs +487 -0
- package/.output/server/chunks/build/tools-C0YKragH.mjs.map +1 -0
- package/.output/server/chunks/build/tooltip-GlMrUZzx.mjs +888 -0
- package/.output/server/chunks/build/tooltip-GlMrUZzx.mjs.map +1 -0
- package/.output/server/chunks/build/town-BV-hbwb5.mjs +16 -29
- package/.output/server/chunks/build/town-BV-hbwb5.mjs.map +1 -1
- package/.output/server/chunks/build/town-DLFB4SZl.mjs +117 -0
- package/.output/server/chunks/build/town-DLFB4SZl.mjs.map +1 -0
- package/.output/server/chunks/build/types-D6J7slEa.mjs.map +1 -1
- package/.output/server/chunks/build/types-DWqIeMRP.mjs +28 -29
- package/.output/server/chunks/build/types-DWqIeMRP.mjs.map +1 -1
- package/.output/server/chunks/build/useAgentHarnessOptions-CYKuLtZ2.mjs +120 -0
- package/.output/server/chunks/build/useAgentHarnessOptions-CYKuLtZ2.mjs.map +1 -0
- package/.output/server/chunks/build/useAgentTemplateActions-Da_V1LSD.mjs +71 -0
- package/.output/server/chunks/build/useAgentTemplateActions-Da_V1LSD.mjs.map +1 -0
- package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +16 -23
- package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs.map +1 -1
- package/.output/server/chunks/build/useAgentTemplateForm-BWvax5_E.mjs +112 -0
- package/.output/server/chunks/build/useAgentTemplateForm-BWvax5_E.mjs.map +1 -0
- package/.output/server/chunks/build/useAgentTemplatesCatalog-BnYjZy59.mjs +140 -0
- package/.output/server/chunks/build/useAgentTemplatesCatalog-BnYjZy59.mjs.map +1 -0
- package/.output/server/chunks/build/useAmlDatasets-nGi10DAl.mjs +88 -0
- package/.output/server/chunks/build/useAmlDatasets-nGi10DAl.mjs.map +1 -0
- package/.output/server/chunks/build/useAmlEntities-CTgNAgcZ.mjs +79 -0
- package/.output/server/chunks/build/useAmlEntities-CTgNAgcZ.mjs.map +1 -0
- package/.output/server/chunks/build/useAmlEnv-Da2TVfyK.mjs +188 -0
- package/.output/server/chunks/build/useAmlEnv-Da2TVfyK.mjs.map +1 -0
- package/.output/server/chunks/build/useAmlExperiments-U9AQ52RI.mjs +86 -0
- package/.output/server/chunks/build/useAmlExperiments-U9AQ52RI.mjs.map +1 -0
- package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs +32 -37
- package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs.map +1 -1
- package/.output/server/chunks/build/useAmlJobs-BM1mu5iH.mjs +251 -0
- package/.output/server/chunks/build/useAmlJobs-BM1mu5iH.mjs.map +1 -0
- package/.output/server/chunks/build/useAmlModels-C1DwIOMi.mjs +90 -0
- package/.output/server/chunks/build/useAmlModels-C1DwIOMi.mjs.map +1 -0
- package/.output/server/chunks/build/useAmlNotes-CNm47QdS.mjs +80 -0
- package/.output/server/chunks/build/useAmlNotes-CNm47QdS.mjs.map +1 -0
- package/.output/server/chunks/build/useAmlPredict-m8I1AdRn.mjs +126 -0
- package/.output/server/chunks/build/useAmlPredict-m8I1AdRn.mjs.map +1 -0
- package/.output/server/chunks/build/useAnalysisFeed-CpbOaiBD.mjs +120 -0
- package/.output/server/chunks/build/useAnalysisFeed-CpbOaiBD.mjs.map +1 -0
- package/.output/server/chunks/build/useDaqAddNode-D_1EBuR3.mjs +141 -0
- package/.output/server/chunks/build/useDaqAddNode-D_1EBuR3.mjs.map +1 -0
- package/.output/server/chunks/build/useDaqDetailBinding-j05iSApd.mjs +72 -0
- package/.output/server/chunks/build/useDaqDetailBinding-j05iSApd.mjs.map +1 -0
- package/.output/server/chunks/build/useDaqDetailFrames-BKciVJ78.mjs +78 -0
- package/.output/server/chunks/build/useDaqDetailFrames-BKciVJ78.mjs.map +1 -0
- package/.output/server/chunks/build/useDaqDetailHistory-DgemICkr.mjs +166 -0
- package/.output/server/chunks/build/useDaqDetailHistory-DgemICkr.mjs.map +1 -0
- package/.output/server/chunks/build/useDaqDetailNode-Cn7_og6t.mjs +103 -0
- package/.output/server/chunks/build/useDaqDetailNode-Cn7_og6t.mjs.map +1 -0
- package/.output/server/chunks/build/useDaqDetailParams-DX_vjFyK.mjs +157 -0
- package/.output/server/chunks/build/useDaqDetailParams-DX_vjFyK.mjs.map +1 -0
- package/.output/server/chunks/build/useDaqFilters-DMS4GN20.mjs +224 -0
- package/.output/server/chunks/build/useDaqFilters-DMS4GN20.mjs.map +1 -0
- package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +43 -44
- package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs.map +1 -1
- package/.output/server/chunks/build/useDaqOptimizations-OPbdy5YB.mjs +132 -0
- package/.output/server/chunks/build/useDaqOptimizations-OPbdy5YB.mjs.map +1 -0
- package/.output/server/chunks/build/useDaqStream-CS1G6iro.mjs +385 -0
- package/.output/server/chunks/build/useDaqStream-CS1G6iro.mjs.map +1 -0
- package/.output/server/chunks/build/useDaqTemplates-DqhRYo88.mjs +181 -0
- package/.output/server/chunks/build/useDaqTemplates-DqhRYo88.mjs.map +1 -0
- package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs +312 -310
- package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs.map +1 -1
- package/.output/server/chunks/build/useDashboardData-CeaMjEA9.mjs +139 -0
- package/.output/server/chunks/build/useDashboardData-CeaMjEA9.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwAddNode-Cytz_odQ.mjs +217 -0
- package/.output/server/chunks/build/useDcwAddNode-Cytz_odQ.mjs.map +1 -0
- package/.output/server/chunks/build/{useDcwCards-SaiImIYQ.mjs → useDcwCards-BKCFqkRd.mjs} +20 -23
- package/.output/server/chunks/build/useDcwCards-BKCFqkRd.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwDetailScope-CvdvcKAv.mjs +184 -0
- package/.output/server/chunks/build/useDcwDetailScope-CvdvcKAv.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwDetailTemplates-CC2FcEge.mjs +143 -0
- package/.output/server/chunks/build/useDcwDetailTemplates-CC2FcEge.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwFilter-CVoiXbZh.mjs +65 -0
- package/.output/server/chunks/build/useDcwFilter-CVoiXbZh.mjs.map +1 -0
- package/.output/server/chunks/build/{useDcwLedger-0ie-0WTc.mjs → useDcwLedger-Cd-ckHoJ.mjs} +29 -35
- package/.output/server/chunks/build/useDcwLedger-Cd-ckHoJ.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwLineMutations-BOQs-fw3.mjs +133 -0
- package/.output/server/chunks/build/useDcwLineMutations-BOQs-fw3.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwLineRun-D9qvcyTM.mjs +100 -0
- package/.output/server/chunks/build/useDcwLineRun-D9qvcyTM.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwParamApprovals-D36q4can.mjs +119 -0
- package/.output/server/chunks/build/useDcwParamApprovals-D36q4can.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwProducts-BozctrwT.mjs +88 -0
- package/.output/server/chunks/build/useDcwProducts-BozctrwT.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwQuery-C8FikKgu.mjs +93 -0
- package/.output/server/chunks/build/useDcwQuery-C8FikKgu.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwQuickActions-IyQ8Rkpe.mjs +84 -0
- package/.output/server/chunks/build/useDcwQuickActions-IyQ8Rkpe.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwRecipes-k9HGhMwF.mjs +263 -0
- package/.output/server/chunks/build/useDcwRecipes-k9HGhMwF.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwStream-BnBOiawo.mjs +455 -0
- package/.output/server/chunks/build/useDcwStream-BnBOiawo.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwTemplates-CnyYOOy0.mjs +87 -0
- package/.output/server/chunks/build/useDcwTemplates-CnyYOOy0.mjs.map +1 -0
- package/.output/server/chunks/build/useDcwWrites-Cco590iv.mjs +136 -0
- package/.output/server/chunks/build/useDcwWrites-Cco590iv.mjs.map +1 -0
- package/.output/server/chunks/build/useDeviceTwins-DL-VLFeX.mjs +118 -0
- package/.output/server/chunks/build/useDeviceTwins-DL-VLFeX.mjs.map +1 -0
- package/.output/server/chunks/build/useExpConfirmations-DgwqTb9O.mjs +104 -0
- package/.output/server/chunks/build/useExpConfirmations-DgwqTb9O.mjs.map +1 -0
- package/.output/server/chunks/build/useLocalTime-C__kwn8h.mjs +52 -0
- package/.output/server/chunks/build/useLocalTime-C__kwn8h.mjs.map +1 -0
- package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs +30 -33
- package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs.map +1 -1
- package/.output/server/chunks/build/useLogsManual-BcfanT0s.mjs +80 -0
- package/.output/server/chunks/build/useLogsManual-BcfanT0s.mjs.map +1 -0
- package/.output/server/chunks/build/useLogsQuery-BGlKVKpV.mjs +136 -0
- package/.output/server/chunks/build/useLogsQuery-BGlKVKpV.mjs.map +1 -0
- package/.output/server/chunks/build/useLogsScope-C-yrta-v.mjs +75 -0
- package/.output/server/chunks/build/useLogsScope-C-yrta-v.mjs.map +1 -0
- package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs +155 -166
- package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs.map +1 -1
- package/.output/server/chunks/build/useMonitorData-BUey2Xly.mjs +128 -0
- package/.output/server/chunks/build/useMonitorData-BUey2Xly.mjs.map +1 -0
- package/.output/server/chunks/build/useMonitorFormat-rhs7FlNo.mjs +77 -0
- package/.output/server/chunks/build/useMonitorFormat-rhs7FlNo.mjs.map +1 -0
- package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +20 -27
- package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs.map +1 -1
- package/.output/server/chunks/build/useOperationsFeed-DWfCjP4l.mjs +182 -0
- package/.output/server/chunks/build/useOperationsFeed-DWfCjP4l.mjs.map +1 -0
- package/.output/server/chunks/build/useOpsLog--yf8erUi.mjs +139 -0
- package/.output/server/chunks/build/useOpsLog--yf8erUi.mjs.map +1 -0
- package/.output/server/chunks/build/useRecipeDispatchApprovals-CKF2sB9P.mjs +146 -0
- package/.output/server/chunks/build/useRecipeDispatchApprovals-CKF2sB9P.mjs.map +1 -0
- package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs +23 -39
- package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +1 -1
- package/.output/server/chunks/build/useTeamActions-C08sAVqY.mjs +71 -0
- package/.output/server/chunks/build/useTeamActions-C08sAVqY.mjs.map +1 -0
- package/.output/server/chunks/build/useTeamAddMemberDialog-fzTmflr8.mjs +78 -0
- package/.output/server/chunks/build/useTeamAddMemberDialog-fzTmflr8.mjs.map +1 -0
- package/.output/server/chunks/build/useTeamCreateDialog-De63ep-X.mjs +91 -0
- package/.output/server/chunks/build/useTeamCreateDialog-De63ep-X.mjs.map +1 -0
- package/.output/server/chunks/build/useTeamDeployDialog-CpAtG5Jy.mjs +76 -0
- package/.output/server/chunks/build/useTeamDeployDialog-CpAtG5Jy.mjs.map +1 -0
- package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +31 -38
- package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs.map +1 -1
- package/.output/server/chunks/build/useTeamPluginDialog-C1OOe1sL.mjs +99 -0
- package/.output/server/chunks/build/useTeamPluginDialog-C1OOe1sL.mjs.map +1 -0
- package/.output/server/chunks/build/useTeamsCatalog-DA41SMDu.mjs +124 -0
- package/.output/server/chunks/build/useTeamsCatalog-DA41SMDu.mjs.map +1 -0
- package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +21 -28
- package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs.map +1 -1
- package/.output/server/chunks/build/useTokenCreate-XHTQExra.mjs +106 -0
- package/.output/server/chunks/build/useTokenCreate-XHTQExra.mjs.map +1 -0
- package/.output/server/chunks/build/useTokenRename-Cf1B0cRy.mjs +81 -0
- package/.output/server/chunks/build/useTokenRename-Cf1B0cRy.mjs.map +1 -0
- package/.output/server/chunks/build/useTokenReveal-C8n1Vt9t.mjs +108 -0
- package/.output/server/chunks/build/useTokenReveal-C8n1Vt9t.mjs.map +1 -0
- package/.output/server/chunks/build/useTokensList-MMIq24E-.mjs +86 -0
- package/.output/server/chunks/build/useTokensList-MMIq24E-.mjs.map +1 -0
- package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs +16 -17
- package/.output/server/chunks/build/useTownBus-D9SoIsAN.mjs.map +1 -1
- package/.output/server/chunks/build/useWorkbenchAuth-Dyc_czui.mjs +131 -0
- package/.output/server/chunks/build/useWorkbenchAuth-Dyc_czui.mjs.map +1 -0
- package/.output/server/chunks/build/useWorkbenchWorkspaces-DT33HbBD.mjs +128 -0
- package/.output/server/chunks/build/useWorkbenchWorkspaces-DT33HbBD.mjs.map +1 -0
- package/.output/server/chunks/build/useWorkshopApi-BkEgGBIM.mjs +118 -0
- package/.output/server/chunks/build/useWorkshopApi-BkEgGBIM.mjs.map +1 -0
- package/.output/server/chunks/build/useWorkshopWs-BWrVj4jL.mjs +1577 -0
- package/.output/server/chunks/build/useWorkshopWs-BWrVj4jL.mjs.map +1 -0
- package/.output/server/chunks/build/{useWorkspaceAuth-Dlvj9csD.mjs → useWorkspaceAuth-TahC9EC7.mjs} +4 -16
- package/.output/server/chunks/build/useWorkspaceAuth-TahC9EC7.mjs.map +1 -0
- package/.output/server/chunks/build/useWorkspaceChannels-BVAHmhN3.mjs +94 -0
- package/.output/server/chunks/build/useWorkspaceChannels-BVAHmhN3.mjs.map +1 -0
- package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs +30 -33
- package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs.map +1 -1
- package/.output/server/chunks/build/useWorkspaceShell-rQHWNNWJ.mjs +150 -0
- package/.output/server/chunks/build/useWorkspaceShell-rQHWNNWJ.mjs.map +1 -0
- package/.output/server/chunks/build/users-pVCK50z-.mjs +566 -0
- package/.output/server/chunks/build/users-pVCK50z-.mjs.map +1 -0
- package/.output/server/chunks/build/workshop-DAgsBgG4.mjs +499 -0
- package/.output/server/chunks/build/workshop-DAgsBgG4.mjs.map +1 -0
- package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs +111 -121
- package/.output/server/chunks/build/workspaces-CmW0cpOt.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index8.get.mjs +33 -0
- package/.output/server/chunks/routes/api/workshop/eda/index8.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/eda/index8.post.mjs +41 -0
- package/.output/server/chunks/routes/api/workshop/eda/index8.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.delete.mjs +36 -0
- package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.delete.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.get.mjs +37 -0
- package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.patch.mjs +42 -0
- package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.patch.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/index10.post.mjs +33 -0
- package/.output/server/chunks/routes/api/workshop/index10.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/index2.post.mjs +45 -46
- package/.output/server/chunks/routes/api/workshop/index2.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.post.mjs +46 -23
- package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs +10 -9
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.post.mjs +22 -19
- package/.output/server/chunks/routes/api/workshop/index5.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.post.mjs +18 -42
- package/.output/server/chunks/routes/api/workshop/index6.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index7.post.mjs +43 -17
- package/.output/server/chunks/routes/api/workshop/index7.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index8.post.mjs +13 -15
- package/.output/server/chunks/routes/api/workshop/index8.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index9.post.mjs +18 -4
- package/.output/server/chunks/routes/api/workshop/index9.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/process-model/datasets.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/process-model/eligibility.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/process-model/experiments.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs.map +1 -1
- package/.output/server/chunks/virtual/entry.mjs +9581 -10848
- package/.output/server/chunks/virtual/entry.mjs.map +1 -1
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/chunks/virtual/precomputed.mjs.map +1 -1
- package/.output/server/package.json +1 -1
- package/README-zh.md +8 -5
- package/README.md +9 -6
- package/app/components/AwChart.vue +14 -0
- package/app/components/AwLogo.vue +75 -75
- package/app/components/aml/AmlDatasetFormModal.vue +279 -279
- package/app/components/aml/AmlDatasetTable.vue +319 -319
- package/app/components/aml/AmlExperimentsTable.vue +142 -142
- package/app/components/aml/AmlInfraBanner.vue +23 -23
- package/app/components/aml/AmlJobsTable.vue +248 -248
- package/app/components/aml/AmlOverviewBar.vue +62 -62
- package/app/components/aml/AmlPageHeader.vue +47 -47
- package/app/components/aml/AmlPredictConsole.vue +201 -201
- package/app/components/app-header/HitlBell.vue +423 -423
- package/app/components/daq/DaqAddNodeModal.vue +209 -209
- package/app/components/daq/DaqAlarmBar.vue +46 -46
- package/app/components/daq/DaqControlCard.vue +159 -159
- package/app/components/daq/DaqInfraBanner.vue +31 -31
- package/app/components/daq/DaqLineBanner.vue +47 -47
- package/app/components/daq/DaqNodePanel.vue +396 -396
- package/app/components/daq/DaqOptPanel.vue +197 -197
- package/app/components/daq/DaqTemplateModal.vue +246 -246
- package/app/components/dashboard/DashboardGaugeBand.vue +78 -78
- package/app/components/dashboard/DashboardHero.vue +209 -209
- package/app/components/dashboard/DashboardLineStatePanel.vue +78 -78
- package/app/components/dashboard/DashboardNodeStatePanel.vue +46 -46
- package/app/components/dashboard/DashboardPipelinePanel.vue +46 -46
- package/app/components/dashboard/DashboardTrendPanel.vue +83 -83
- package/app/components/dashboard/DashboardWritePanel.vue +52 -52
- package/app/components/dcw/DcwCreateLineModal.vue +105 -105
- package/app/components/dcw/DcwDeleteLineModal.vue +73 -73
- package/app/components/dcw/DcwDetailTemplateModal.vue +238 -238
- package/app/components/dcw/DcwLedgerCard.vue +160 -160
- package/app/components/dcw/DcwMesArtifacts.vue +140 -140
- package/app/components/dcw/DcwProductCreateModal.vue +113 -113
- package/app/components/dcw/DcwRecipeDispatchHistoryModal.vue +244 -244
- package/app/components/dcw/DcwRecipeEditModal.vue +399 -399
- package/app/components/dcw/DcwRecipeHistoryModal.vue +165 -165
- package/app/components/dcw/DcwRunDataModal.vue +191 -191
- package/app/components/dcw/DcwTemplateModal.vue +227 -227
- package/app/components/dcw/DcwWriteHistoryCard.vue +96 -96
- package/app/components/dcw/ExpConfirmCard.vue +103 -103
- package/app/components/dcw/RecipeDispatchApprovalCard.vue +330 -330
- package/app/components/logs/LogsPageHead.vue +71 -71
- package/app/components/monitor/MonitorAgentTable.vue +143 -143
- package/app/components/monitor/MonitorChannelTable.vue +80 -80
- package/app/components/monitor/MonitorLoginGate.vue +24 -24
- package/app/components/monitor/MonitorPageHead.vue +92 -92
- package/app/components/monitor/MonitorProcessTable.vue +159 -159
- package/app/components/ontology/OntologyGraph.vue +356 -356
- package/app/components/operations/OperationsFilterCard.vue +164 -164
- package/app/components/operations/OperationsPageHead.vue +47 -47
- package/app/components/tokens/TokenCreateModal.vue +42 -42
- package/app/components/tokens/TokenOnceModal.vue +164 -164
- package/app/components/tokens/TokenRenameModal.vue +40 -40
- package/app/components/tokens/TokensPageHead.vue +76 -76
- package/app/components/workshop/A2aRpcDebugger.vue +237 -237
- package/app/components/workshop/AgentInspectorDrawer.vue +424 -424
- package/app/components/workshop/AgentLanesView.vue +278 -278
- package/app/components/workshop/ArtifactCard.vue +120 -120
- package/app/components/workshop/AssetLibrary.vue +452 -452
- package/app/components/workshop/ChatMemberPanel.vue +556 -556
- package/app/components/workshop/CommandPalette.vue +270 -270
- package/app/components/workshop/Composer.vue +540 -540
- package/app/components/workshop/DaqTemplateIcon.vue +33 -33
- package/app/components/workshop/DeviceTwinPanel.vue +167 -167
- package/app/components/workshop/FileSelectorModal.vue +188 -188
- package/app/components/workshop/InspectorPanel.vue +301 -301
- package/app/components/workshop/PluginSlot.vue +120 -120
- package/app/components/workshop/TranscriptTimeline.vue +223 -223
- package/app/components/workshop/agents/AgentTemplateEditModal.vue +139 -139
- package/app/components/workshop/blocks/ClusterArtifact.vue +61 -61
- package/app/components/workshop/blocks/ClusterError.vue +85 -85
- package/app/components/workshop/blocks/ClusterLife.vue +87 -87
- package/app/components/workshop/blocks/ClusterMember.vue +95 -95
- package/app/components/workshop/blocks/ClusterMemory.vue +84 -84
- package/app/components/workshop/blocks/ClusterOther.vue +67 -67
- package/app/components/workshop/blocks/ClusterStatus.vue +149 -149
- package/app/components/workshop/blocks/ClusterTool.vue +176 -176
- package/app/components/workshop/blocks/EventBlockAvatar.vue +114 -114
- package/app/components/workshop/blocks/EventBlockHead.vue +232 -232
- package/app/components/workshop/composer/ComposerToolbar.vue +278 -278
- package/app/components/workshop/composer/MentionMenu.vue +135 -135
- package/app/components/workshop/composer/ReplyChip.vue +65 -65
- package/app/components/workshop/composer/StatusChip.vue +171 -171
- package/app/components/workshop/console/Dock.vue +71 -71
- package/app/components/workshop/console/LeftPane.vue +84 -84
- package/app/components/workshop/device-twin/DeviceTwinCard.vue +265 -265
- package/app/components/workshop/device-twin/DeviceTwinDcwSection.vue +203 -203
- package/app/components/workshop/lanes/AddMemberModal.vue +270 -270
- package/app/components/workshop/lanes/EditMemberModal.vue +106 -106
- package/app/components/workshop/lanes/LanesToolbar.vue +97 -97
- package/app/components/workshop/session-list/ChannelSettingsModal.vue +3 -3
- package/app/components/workshop/session-list/MountChannelModal.vue +124 -124
- package/app/components/workshop/session-list/SaveTemplateModal.vue +93 -93
- package/app/components/workshop/task-board/Card.vue +172 -172
- package/app/components/workshop/task-board/Column.vue +151 -151
- package/app/components/workshop/task-board/List.vue +157 -157
- package/app/components/workshop/task-board/StatusMenu.vue +88 -88
- package/app/components/workshop/teams/TeamAddMemberModal.vue +53 -53
- package/app/components/workshop/teams/TeamCreateModal.vue +94 -94
- package/app/components/workshop/teams/TeamDeployModal.vue +40 -40
- package/app/components/workshop/teams/TeamPluginModal.vue +119 -119
- package/app/components/workshop/terminal/OmpTerminalPanel.vue +270 -270
- package/app/components/workshop/terminal/TerminalHitlCard.vue +170 -170
- package/app/components/workshop/town/TownScene.ts +466 -466
- package/app/components/workshop/town/TownView.vue +561 -561
- package/app/components/workshop/town/components/AutoModeConfirmModal.vue +94 -94
- package/app/components/workshop/town/components/TownAgentBindings.vue +405 -405
- package/app/components/workshop/town/components/TownAgentInspector.vue +554 -554
- package/app/components/workshop/town/components/TownAlarmList.vue +147 -147
- package/app/components/workshop/town/components/TownBoundaryPanel.vue +350 -350
- package/app/components/workshop/town/components/TownCalloutLayer.vue +147 -147
- package/app/components/workshop/town/components/TownChannelDock.vue +116 -116
- package/app/components/workshop/town/components/TownControlDock.vue +405 -405
- package/app/components/workshop/town/components/TownDaqNodeInspector.vue +345 -345
- package/app/components/workshop/town/components/TownDaqTree.vue +366 -366
- package/app/components/workshop/town/components/TownDcwBindSection.vue +473 -473
- package/app/components/workshop/town/components/TownDcwNodeInspector.vue +185 -185
- package/app/components/workshop/town/components/TownDcwTree.vue +280 -280
- package/app/components/workshop/town/components/TownDeviceBindings.vue +394 -394
- package/app/components/workshop/town/components/TownDeviceTransform.vue +248 -248
- package/app/components/workshop/town/components/TownEventList.vue +120 -120
- package/app/components/workshop/town/components/TownHealthBody.vue +100 -100
- package/app/components/workshop/town/components/TownKpiStrip.vue +207 -207
- package/app/components/workshop/town/components/TownLeftRail.vue +308 -308
- package/app/components/workshop/town/components/TownLoadingMask.vue +61 -61
- package/app/components/workshop/town/components/TownNavMap.vue +154 -154
- package/app/components/workshop/town/components/TownRightRail.vue +543 -543
- package/app/components/workshop/town/components/TownStage.vue +281 -281
- package/app/components/workshop/town/components/TownStageTop.vue +238 -238
- package/app/components/workshop/town/components/TownStatusBar.vue +108 -108
- package/app/components/workshop/town/components/TownTopNav.vue +367 -367
- package/app/components/workshop/town/components/TownTrendDock.vue +178 -178
- package/app/components/workshop/town/scene/town-scene-agents.ts +254 -254
- package/app/components/workshop/town/scene/town-scene-behavior.ts +194 -194
- package/app/components/workshop/town/scene/town-scene-bubbles.ts +96 -96
- package/app/components/workshop/town/scene/town-scene-core.ts +158 -158
- package/app/components/workshop/town/scene/town-scene-models.ts +109 -109
- package/app/components/workshop/town/scene/town-scene-visuals.ts +279 -279
- package/app/components/workshop/town/scene/town-scene3d-agents.ts +308 -308
- package/app/components/workshop/town/scene/town-scene3d-blocks.ts +297 -297
- package/app/components/workshop/town/scene/town-scene3d-bubbles.ts +281 -281
- package/app/components/workshop/town/scene/town-scene3d-camera.ts +282 -282
- package/app/components/workshop/town/scene/town-scene3d-devices.ts +433 -433
- package/app/components/workshop/town/scene/town-scene3d-editing.ts +490 -490
- package/app/components/workshop/town/scene/town-scene3d-events.ts +173 -173
- package/app/components/workshop/town/scene/town-scene3d-factory.ts +412 -412
- package/app/components/workshop/town/scene/town-scene3d-hud.ts +110 -110
- package/app/components/workshop/town/scene/town-scene3d-lifecycle.ts +144 -144
- package/app/components/workshop/town/scene/town-scene3d-links.ts +141 -141
- package/app/components/workshop/town/scene/town-scene3d-loop.ts +286 -286
- package/app/components/workshop/town/scene/town-scene3d-models.ts +154 -154
- package/app/components/workshop/town/scene/town-scene3d-nodes.ts +562 -562
- package/app/components/workshop/town/scene/town-scene3d-ranges.ts +273 -273
- package/app/components/workshop/town/scene/town-scene3d-renderer.ts +320 -320
- package/app/components/workshop/town/scene/town-scene3d-selection.ts +257 -257
- package/app/components/workshop/town/scene/town-scene3d-types.ts +264 -264
- package/app/components/workshop/transcript/TranscriptBlockList.vue +68 -68
- package/app/components/workshop/transcript/TranscriptEarlierPager.vue +81 -81
- package/app/components/workshop/transcript/TranscriptFilterBar.vue +126 -126
- package/app/components/workshop/workbench/CreateWorkspaceModal.vue +36 -36
- package/app/components/workshop/workbench/WorkspaceEmpty.vue +56 -56
- package/app/composables/useResponsive.ts +88 -88
- package/app/composables/workshop/device-twin-types.ts +29 -29
- package/app/composables/workshop/event-blocks/attention.ts +58 -58
- package/app/composables/workshop/event-blocks/classify.ts +44 -44
- package/app/composables/workshop/event-blocks/clusterer.ts +231 -231
- package/app/composables/workshop/event-blocks/fold-stream.ts +45 -45
- package/app/composables/workshop/event-blocks/markdown.ts +81 -81
- package/app/composables/workshop/event-blocks/mentions.ts +49 -49
- package/app/composables/workshop/event-blocks/text-utils.ts +100 -100
- package/app/composables/workshop/event-blocks/types.ts +40 -40
- package/app/composables/workshop/town/town-relay-props.ts +231 -231
- package/app/composables/workshop/town/town-view-types.ts +145 -145
- package/app/composables/workshop/town/useTownAgentBindings.ts +182 -182
- package/app/composables/workshop/town/useTownAgentChat.ts +203 -203
- package/app/composables/workshop/town/useTownAlarms.ts +36 -36
- package/app/composables/workshop/town/useTownCallouts.ts +174 -174
- package/app/composables/workshop/town/useTownChannels.ts +220 -220
- package/app/composables/workshop/town/useTownHealth.ts +66 -66
- package/app/composables/workshop/town/useTownHudTickers.ts +77 -77
- package/app/composables/workshop/town/useTownLayout.ts +277 -277
- package/app/composables/workshop/town/useTownNavMap.ts +301 -301
- package/app/composables/workshop/town/useTownNodeBindings.ts +345 -345
- package/app/composables/workshop/town/useTownPanelDrag.ts +91 -91
- package/app/composables/workshop/town/useTownRailData.ts +421 -421
- package/app/composables/workshop/town/useTownSceneControl.ts +92 -92
- package/app/composables/workshop/town/useTownSceneInput.ts +275 -275
- package/app/composables/workshop/town/useTownSceneRuntime.ts +390 -390
- package/app/composables/workshop/town/useTownSheets.ts +41 -41
- package/app/composables/workshop/town/useTownTrends.ts +93 -93
- package/app/composables/workshop/useChannelList.ts +88 -88
- package/app/composables/workshop/useChannelTerminals.ts +65 -65
- package/app/composables/workshop/useComposerMentions.ts +130 -130
- package/app/composables/workshop/useDcwStream.ts +374 -374
- package/app/composables/workshop/useDeviceTwinDcwWrite.ts +77 -77
- package/app/composables/workshop/useDeviceTwinPanel.ts +56 -56
- package/app/composables/workshop/useEscClose.ts +44 -44
- package/app/composables/workshop/useEventBlockView.ts +159 -159
- package/app/composables/workshop/useEventBlocks.ts +33 -33
- package/app/composables/workshop/useHitlAnswer.ts +184 -184
- package/app/composables/workshop/useLaneWidths.ts +27 -27
- package/app/composables/workshop/useOmpTerminalSession.ts +424 -424
- package/app/composables/workshop/usePluginAdmin.ts +152 -152
- package/app/composables/workshop/usePluginPanels.ts +72 -72
- package/app/composables/workshop/useRuntimeConfigDraft.ts +118 -118
- package/app/composables/workshop/useSettingsGroups.ts +243 -243
- package/app/composables/workshop/useTaskBoardColumns.ts +47 -47
- package/app/composables/workshop/useTerminalRenderer.ts +308 -308
- package/app/composables/workshop/useTranscriptEnterStage.ts +48 -48
- package/app/composables/workshop/useTranscriptHistory.ts +52 -52
- package/app/composables/workshop/useTranscriptScroll.ts +113 -113
- package/app/composables/workshop/useVisibleInterval.ts +42 -42
- package/app/composables/workshop/useWorkshopWs.ts +265 -265
- package/app/config/index.ts +1 -1
- package/app/middleware/locale-cookie.global.ts +22 -22
- package/app/pages/aml/api.ts +6 -6
- package/app/pages/aml/composables/useAmlDatasets.ts +38 -38
- package/app/pages/aml/composables/useAmlEntities.ts +57 -57
- package/app/pages/aml/composables/useAmlEnv.ts +191 -191
- package/app/pages/aml/composables/useAmlExperiments.ts +45 -45
- package/app/pages/aml/composables/useAmlFormat.ts +44 -44
- package/app/pages/aml/composables/useAmlJobs.ts +131 -131
- package/app/pages/aml/composables/useAmlModels.ts +56 -56
- package/app/pages/aml/composables/useAmlNotes.ts +47 -47
- package/app/pages/aml/composables/useAmlPredict.ts +93 -93
- package/app/pages/aml/constants.ts +63 -63
- package/app/pages/aml/index.vue +236 -236
- package/app/pages/composables/useDashboardCharts.ts +192 -192
- package/app/pages/composables/useDashboardData.ts +144 -144
- package/app/pages/daq/composables/useDaqAddNode.ts +126 -126
- package/app/pages/daq/composables/useDaqDetailBinding.ts +29 -29
- package/app/pages/daq/composables/useDaqDetailFrames.ts +42 -42
- package/app/pages/daq/composables/useDaqDetailNode.ts +53 -53
- package/app/pages/daq/composables/useDaqDetailParams.ts +138 -138
- package/app/pages/daq/composables/useDaqFilters.ts +187 -187
- package/app/pages/daq/composables/useDaqNodeWindow.ts +86 -86
- package/app/pages/daq/composables/useDaqOptimizations.ts +99 -99
- package/app/pages/daq/composables/useDaqTemplates.ts +152 -152
- package/app/pages/daq/index.vue +260 -260
- package/app/pages/dcw/composables/useDcwCards.ts +27 -27
- package/app/pages/dcw/composables/useDcwDetailScope.ts +145 -145
- package/app/pages/dcw/composables/useDcwDetailTemplates.ts +94 -94
- package/app/pages/dcw/composables/useDcwFilter.ts +29 -29
- package/app/pages/dcw/composables/useDcwLedger.ts +34 -34
- package/app/pages/dcw/composables/useDcwLineMutations.ts +115 -115
- package/app/pages/dcw/composables/useDcwLineRun.ts +60 -60
- package/app/pages/dcw/composables/useDcwProducts.ts +54 -54
- package/app/pages/dcw/composables/useDcwQuery.ts +68 -68
- package/app/pages/dcw/composables/useDcwQuickActions.ts +47 -47
- package/app/pages/dcw/composables/useDcwRecipes.ts +256 -256
- package/app/pages/dcw/composables/useDcwTemplates.ts +50 -50
- package/app/pages/dcw/index.vue +195 -195
- package/app/pages/dcw/types.ts +9 -9
- package/app/pages/index.vue +126 -126
- package/app/pages/logs/composables/useLogsFormat.ts +43 -43
- package/app/pages/logs/composables/useLogsScope.ts +39 -39
- package/app/pages/monitor/types.ts +61 -61
- package/app/pages/ontology/index.vue +1 -1
- package/app/pages/operations.vue +61 -61
- package/app/pages/permissions/index.vue +369 -369
- package/app/pages/studio/pipeline.vue +812 -0
- package/app/pages/tokens/composables/useTokenClipboard.ts +33 -33
- package/app/pages/tokens/composables/useTokenCreate.ts +93 -93
- package/app/pages/tokens/composables/useTokenRename.ts +54 -54
- package/app/pages/tokens/composables/useTokenReveal.ts +84 -84
- package/app/pages/tokens/composables/useTokensList.ts +60 -60
- package/app/pages/tokens.vue +111 -111
- package/app/pages/tools/index.vue +98 -98
- package/app/pages/workshop/agents.vue +130 -130
- package/app/pages/workshop/composables/useAgentHarnessOptions.ts +59 -59
- package/app/pages/workshop/composables/useAgentTemplateActions.ts +42 -42
- package/app/pages/workshop/composables/useAgentTemplateDialogState.ts +24 -24
- package/app/pages/workshop/composables/useAgentTemplateForm.ts +88 -88
- package/app/pages/workshop/composables/useAgentTemplatesCatalog.ts +92 -92
- package/app/pages/workshop/composables/useTeamActions.ts +44 -44
- package/app/pages/workshop/composables/useTeamAddMemberDialog.ts +49 -49
- package/app/pages/workshop/composables/useTeamCreateDialog.ts +67 -67
- package/app/pages/workshop/composables/useTeamDeployDialog.ts +49 -49
- package/app/pages/workshop/composables/useTeamDialogState.ts +46 -46
- package/app/pages/workshop/composables/useTeamPluginDialog.ts +72 -72
- package/app/pages/workshop/composables/useTeamsCatalog.ts +100 -100
- package/app/pages/workshop/composables/useWorkbenchWorkspaces.ts +123 -123
- package/app/pages/workshop/composables/useWorkspaceAuth.ts +31 -31
- package/app/pages/workshop/composables/useWorkspaceChannels.ts +62 -62
- package/app/pages/workshop/composables/useWorkspaceShell.ts +136 -136
- package/app/pages/workshop/schedules.vue +553 -553
- package/app/pages/workshop/w/[wsId].vue +221 -221
- package/app/plugins/aw-plugins.client.ts +213 -213
- package/app/plugins/esc-close.client.ts +31 -31
- package/app/stores/workshop/hitl.ts +183 -183
- package/app/stores/workshop/narrow-fetch.ts +23 -23
- package/app/utils/api-error.ts +75 -75
- package/app/utils/builtin-catalog.ts +104 -104
- package/app/utils/chart-pipeline.ts +193 -0
- package/app/utils/chart-trend.ts +97 -97
- package/app/utils/dcw-driver-badge.ts +16 -16
- package/app/utils/dcw-recipe-form.ts +26 -26
- package/cli/commands/tui.mjs +28 -28
- package/cli/commands/update.mjs +124 -124
- package/cli/core/child-lifecycle.mjs +136 -136
- package/cli/core/meta.mjs +38 -38
- package/cli/core/post-build.mjs +96 -96
- package/config.yml +1 -1
- package/docs/cli.en.md +2 -2
- package/docs/cli.md +2 -2
- package/docs/mcp.en.md +27 -27
- package/docs/multi-harness-architecture.md +248 -248
- package/docs/plugins.en.md +1 -1
- package/docs/plugins.md +1 -1
- package/docs/sdk.en.md +1 -1
- package/docs/sdk.md +1 -1
- package/docs/tui.md +43 -43
- package/i18n/dicts/_en.json +1551 -1551
- package/i18n/dicts/_en2.json +300 -300
- package/i18n/dicts/_en4.json +114 -114
- package/i18n/dicts/agentLanesView.json +61 -61
- package/i18n/dicts/appHeader.json +17 -17
- package/i18n/dicts/channelSessionList.json +51 -51
- package/i18n/dicts/chat.json +79 -79
- package/i18n/dicts/clusterTool.json +4 -4
- package/i18n/dicts/composer.json +38 -38
- package/i18n/dicts/ctpl.json +37 -37
- package/i18n/dicts/dcwDetail.json +219 -219
- package/i18n/dicts/lineOps.json +14 -14
- package/i18n/dicts/multiChannelView.json +13 -13
- package/i18n/dicts/notifications.json +13 -13
- package/i18n/dicts/taskInspectorDrawer.json +25 -25
- package/i18n/dicts/teamPlugins.json +10 -10
- package/i18n/dicts/townView.json +209 -209
- package/i18n/locales/en.ts +46 -0
- package/i18n/locales/zh-CN.ts +46 -0
- package/mcp/discovery.mjs +227 -227
- package/package.json +1 -1
- package/public/favicon.svg +14 -14
- package/public/robots.txt +3 -3
- package/scripts/_audit/audit-harness-adapters.md +664 -664
- package/scripts/_audit/aw-mcp-live-e2e.mjs +293 -293
- package/scripts/_audit/bump-version.mjs +51 -51
- package/scripts/_audit/detached-instance.mjs +112 -112
- package/scripts/_audit/detached-start.mjs +103 -103
- package/scripts/_audit/eda-ui-fix-acceptance.mjs +212 -212
- package/scripts/_audit/guard-upstream-liveness.mjs +104 -104
- package/scripts/_audit/http-api-authz-audit.md +657 -657
- package/scripts/_audit/kb-team-mock-e2e.mjs +146 -146
- package/scripts/_audit/kb-team-omp-e2e.mjs +229 -229
- package/scripts/_audit/run.mjs +21 -21
- package/scripts/_audit/runtime-audit.md +716 -716
- package/scripts/_audit/skills-guided-e2e.mjs +316 -316
- package/scripts/_audit/stability-soak.mjs +252 -252
- package/scripts/_audit/stubs/nuxt-imports.mjs +67 -67
- package/scripts/_audit/ts-register-hook.mjs +12 -12
- package/scripts/_audit/ts-resolve-hook.mjs +96 -96
- package/scripts/_aw-packaged-start.cjs +22 -22
- package/scripts/_aw0746-stage12.mjs +94 -94
- package/scripts/_aw0746-stage34.mjs +136 -136
- package/scripts/_aw0746-stage6b-train-sweep.mjs +145 -145
- package/scripts/_aw0746-stage6c-jobsmoke.mjs +69 -69
- package/scripts/_dbg-configroot-audit.mjs +86 -86
- package/scripts/_dbg-daq-intervals-func.mjs +115 -115
- package/scripts/_dbg-perms-e2e.mjs +142 -142
- package/scripts/_dbg-protocol-matrix.mjs +462 -462
- package/scripts/_dbg-render-regression.mjs +193 -193
- package/scripts/_dbg-schedule-e2e.mjs +262 -262
- package/scripts/_e2e-ui-functional.mjs +371 -371
- package/scripts/_i18n-en-cjk-scan.mjs +28 -28
- package/scripts/_i18n-en-verify.mjs +107 -107
- package/scripts/_i18n-extra-checks.mjs +53 -53
- package/scripts/_i18n-scan-hardcoded.mjs +180 -180
- package/scripts/_lib-aml-python-run.mjs +17 -17
- package/scripts/_lint-reflow.mjs +105 -105
- package/scripts/_loop-biax-campaign.mjs +130 -130
- package/scripts/_plc-sim-detached.cjs +22 -22
- package/scripts/_probe-daq-omp-task.mjs +100 -100
- package/scripts/_probe-daq-scope-default.mjs +123 -123
- package/scripts/_probe-model-channel-link.cjs +25 -25
- package/scripts/_probe-recipe-switch.mjs +92 -92
- package/scripts/_provision-injection-line.mjs +39 -39
- package/scripts/_run-matrix.ps1 +53 -53
- package/scripts/_sweep-button-contrast.mjs +87 -87
- package/scripts/acceptance-aml-hybrid-e2e.ts +396 -396
- package/scripts/acceptance-aml-hybrid-live.mjs +93 -93
- package/scripts/acceptance-aml-model-identity.ts +137 -137
- package/scripts/agent-daq-isolation-e2e.mjs +91 -91
- package/scripts/api-contract-smoke.mjs +126 -126
- package/scripts/ask-hitl-e2e.mjs +96 -96
- package/scripts/aw-expose.mjs +159 -159
- package/scripts/channel-interaction-smoke.mjs +80 -80
- package/scripts/check-docs-sync.mjs +1 -1
- package/scripts/data-studio-ui-e2e.mjs +163 -163
- package/scripts/demo-group-chat-all-real.ts +279 -279
- package/scripts/demo-group-chat-omp-cases.ts +210 -210
- package/scripts/demo-group-chat-omp.ts +184 -184
- package/scripts/demo-group-chat-order.ts +197 -197
- package/scripts/dev-modbus-simulator.mjs +55 -55
- package/scripts/docs-shots.mjs +36 -36
- package/scripts/e2e-agentteam-chat.mjs +473 -473
- package/scripts/e2e-agentteam-real-triage.mjs +421 -421
- package/scripts/e2e-aml-decoupled.mjs +162 -162
- package/scripts/e2e-aw-tui-global.mjs +277 -277
- package/scripts/e2e-closedloop/cleanup.mjs +27 -27
- package/scripts/e2e-closedloop/lib.mjs +109 -109
- package/scripts/e2e-closedloop/main.mjs +59 -59
- package/scripts/e2e-closedloop/scenarios-accounts.mjs +210 -210
- package/scripts/e2e-closedloop/scenarios-authz.mjs +196 -196
- package/scripts/e2e-closedloop/scenarios-daq-dcw.mjs +222 -222
- package/scripts/e2e-closedloop/scenarios-plugins.mjs +169 -169
- package/scripts/e2e-closedloop/state.mjs +10 -10
- package/scripts/e2e-config-groups.mjs +238 -238
- package/scripts/e2e-crash-cycle.mjs +108 -108
- package/scripts/e2e-eda-pipeline.mjs +286 -0
- package/scripts/e2e-full-closedloop.mjs +16 -16
- package/scripts/e2e-hil-multi-user.mjs +307 -307
- package/scripts/e2e-hil-restart.mjs +339 -339
- package/scripts/e2e-injection-recipe-closedloop.mjs +203 -203
- package/scripts/e2e-line-governance.mjs +352 -352
- package/scripts/e2e-ontology.mjs +393 -393
- package/scripts/e2e-plc-plugin-closedloop.mjs +549 -549
- package/scripts/e2e-resume-crash.mjs +20 -6
- package/scripts/e2e-timezone-settings.mjs +59 -57
- package/scripts/full-stack-shots.mjs +145 -145
- package/scripts/full-tool-injection-harness-e2e.mjs +214 -214
- package/scripts/hitl-reject-e2e.mjs +131 -131
- package/scripts/line-log-smoke.mjs +260 -260
- package/scripts/live-aml-mockomp.mjs +304 -304
- package/scripts/live-aml-optloop-resume.mjs +322 -322
- package/scripts/live-aml-optloop.mjs +588 -588
- package/scripts/live-aml-stage9.mjs +169 -169
- package/scripts/live-aml-two-goals.mjs +315 -315
- package/scripts/live-optloop-two-modes.mjs +857 -857
- package/scripts/mes-agent-integration-e2e.mjs +361 -361
- package/scripts/ops-plugins-e2e.mjs +85 -85
- package/scripts/proof-omp-real.ts +189 -189
- package/scripts/scenario-suite-setup.mjs +337 -337
- package/scripts/scenario-suite-stability.mjs +144 -144
- package/scripts/smoke-optimization-verify.ts +72 -72
- package/scripts/team-coordination-e2e.mjs +96 -96
- package/scripts/test-agentteam-task-chat-flow.ts +420 -420
- package/scripts/test-agentteam-workflow.ts +472 -472
- package/scripts/test-aw-skills.mjs +102 -102
- package/scripts/test-cli-exit.mjs +343 -343
- package/scripts/test-daq-frame-race.mjs +358 -358
- package/scripts/test-data-root.mjs +208 -208
- package/scripts/test-events-index.mjs +176 -176
- package/scripts/test-group-chat-hardening.ts +265 -265
- package/scripts/test-group-chat-unit/lib.ts +186 -186
- package/scripts/test-group-chat-unit/main.ts +45 -45
- package/scripts/test-group-chat-unit/section-a-migration.ts +75 -75
- package/scripts/test-group-chat-unit/section-b-permission-matrix.ts +88 -88
- package/scripts/test-group-chat-unit/section-c-member-lifecycle.ts +64 -64
- package/scripts/test-group-chat-unit/section-d-mention-resolution.ts +36 -36
- package/scripts/test-group-chat-unit/section-e-chat-facts.ts +97 -97
- package/scripts/test-group-chat-unit/section-f-user-notifications.ts +52 -52
- package/scripts/test-group-chat-unit/section-g-member-projection.ts +44 -44
- package/scripts/test-group-chat-unit/section-h-outbox-consistency.ts +30 -30
- package/scripts/test-group-chat-unit/section-i-read-idempotency.ts +24 -24
- package/scripts/test-group-chat-unit/section-j-permission-scope.ts +150 -150
- package/scripts/test-group-chat-unit.ts +35 -35
- package/scripts/test-hitl-decision.ts +526 -526
- package/scripts/test-hitl-legacy-channel-auth.ts +143 -143
- package/scripts/test-hitl-registry.ts +112 -112
- package/scripts/test-log-flooding.mjs +160 -160
- package/scripts/test-lru.mjs +101 -101
- package/scripts/test-memory-month-query.mjs +70 -70
- package/scripts/test-plugin-hardening.mjs +90 -90
- package/scripts/test-plugin-lifecycle.mjs +173 -173
- package/scripts/test-rollback-index.mjs +137 -137
- package/scripts/test-schedule-runtime.ts +309 -309
- package/scripts/test-scheduler-loop/scenarios-supervise.ts +25 -25
- package/scripts/test-sdk-surface.mjs +158 -158
- package/scripts/test-serial-bridge.mjs +418 -418
- package/scripts/test-tui-commands.mjs +148 -148
- package/scripts/test-tui-reducers.mjs +72 -72
- package/scripts/three-system-e2e/lib.mjs +79 -79
- package/scripts/three-system-e2e/main.mjs +40 -40
- package/scripts/three-system-e2e/phases/phase-0-user-token.mjs +42 -42
- package/scripts/three-system-e2e/phases/phase-0a2-line-autoselect.mjs +35 -35
- package/scripts/three-system-e2e/phases/phase-0b-fixture-grants.mjs +39 -39
- package/scripts/three-system-e2e/phases/phase-0c-plugin-outbound-auth.mjs +95 -95
- package/scripts/three-system-e2e/phases/stage-1-health.mjs +47 -47
- package/scripts/three-system-e2e/phases/stage-2-5-team-plugins.mjs +84 -84
- package/scripts/three-system-e2e/phases/stage-2-teams-tools-hitl.mjs +184 -184
- package/scripts/three-system-e2e/phases/stage-3-diag.mjs +73 -73
- package/scripts/three-system-e2e/phases/stage-4-plugin-toggle.mjs +53 -53
- package/scripts/three-system-e2e/state.mjs +87 -87
- package/scripts/three-system-e2e.mjs +40 -40
- package/scripts/tool-face-batch-identity-e2e.mjs +222 -222
- package/scripts/tsconfig.json +14 -14
- package/scripts/tui-smoke.mjs +100 -100
- package/scripts/typecheck.mjs +75 -75
- package/scripts/ui/admin-shots.mjs +46 -46
- package/scripts/ui/bump-microfont.mjs +39 -39
- package/scripts/ui/linkcheck2.mjs +37 -37
- package/scripts/ui/live-render-check.mjs +72 -72
- package/scripts/ui/md-lint.mjs +80 -80
- package/scripts/ui/perf-audit.mjs +132 -132
- package/scripts/ui/readme-assets.mjs +30 -30
- package/scripts/ui/readme-shots.mjs +42 -42
- package/scripts/ui/record-demo.mjs +557 -557
- package/scripts/ui/record.mjs +225 -225
- package/scripts/ui/seed-admin.mjs +68 -68
- package/scripts/ui/seed-demo.mjs +83 -83
- package/scripts/ui/seed-industrial-demo.mjs +171 -171
- package/scripts/ui/shot-hero.mjs +25 -25
- package/scripts/ui/shots.mjs +75 -75
- package/scripts/ui/sim-ui-shot.mjs +16 -16
- package/scripts/ui/smoke-refactor.mjs +258 -258
- package/scripts/ui/verify-nav.mjs +51 -51
- package/scripts/ui/verify-responsive.mjs +285 -285
- package/sdk/client.d.mts +110 -110
- package/sdk/examples/line-sentinel/index.mjs +105 -105
- package/sdk/examples/ops-notifier/index.mjs +34 -34
- package/sdk/examples/sample-insight/index.mjs +39 -39
- package/server/api/plugins/client/[name].get.ts +18 -18
- package/server/api/plugins/i18n.get.ts +12 -12
- package/server/api/plugins/manifest.get.ts +10 -10
- package/server/api/system/backup/list.get.ts +32 -32
- package/server/api/system/backup/run.post.ts +21 -21
- package/server/api/system/config-groups/[id].delete.ts +21 -21
- package/server/api/system/config-groups/[id].patch.ts +26 -26
- package/server/api/system/config-groups/index.get.ts +21 -21
- package/server/api/system/config-groups/index.post.ts +33 -33
- package/server/api/system/timezone.get.ts +20 -20
- package/server/api/users/tokens/[id]/token.get.ts +11 -11
- package/server/api/workshop/[...path].ts +13 -13
- package/server/api/workshop/agent-tools/approvals/index.get.ts +43 -43
- package/server/api/workshop/agent-tools/bindings/[id].delete.ts +26 -26
- package/server/api/workshop/agent-tools/bindings/grant.post.ts +45 -45
- package/server/api/workshop/agent-tools/bindings/index.get.ts +41 -41
- package/server/api/workshop/agent-tools/bindings/revoke.post.ts +42 -42
- package/server/api/workshop/aml/datasets/[id]/preview.get.ts +68 -68
- package/server/api/workshop/aml/datasets/[id].delete.ts +39 -39
- package/server/api/workshop/aml/datasets/[id].get.ts +53 -53
- package/server/api/workshop/aml/datasets/[id].patch.ts +30 -30
- package/server/api/workshop/aml/datasets/index.get.ts +20 -20
- package/server/api/workshop/aml/datasets/index.post.ts +27 -27
- package/server/api/workshop/aml/entities/index.get.ts +13 -13
- package/server/api/workshop/aml/entities/prune.post.ts +28 -28
- package/server/api/workshop/aml/env/index.get.ts +13 -13
- package/server/api/workshop/aml/env/recheck.post.ts +14 -14
- package/server/api/workshop/aml/env/uv.post.ts +21 -21
- package/server/api/workshop/aml/env/venv.post.ts +24 -24
- package/server/api/workshop/aml/experiments/index.get.ts +35 -35
- package/server/api/workshop/aml/index.get.ts +37 -37
- package/server/api/workshop/aml/jobs/[id]/cancel.post.ts +21 -21
- package/server/api/workshop/aml/jobs/[id]/logs.get.ts +23 -23
- package/server/api/workshop/aml/jobs/[id]/retry.post.ts +20 -20
- package/server/api/workshop/aml/jobs/[id].delete.ts +44 -44
- package/server/api/workshop/aml/jobs/[id].get.ts +23 -23
- package/server/api/workshop/aml/jobs/index.get.ts +26 -26
- package/server/api/workshop/aml/models/[id]/predict.post.ts +24 -24
- package/server/api/workshop/aml/models/[id]/promote.post.ts +30 -30
- package/server/api/workshop/aml/models/index.get.ts +48 -48
- package/server/api/workshop/aml/training-plans/[id]/train.post.ts +18 -18
- package/server/api/workshop/aml/training-plans/[id].delete.ts +18 -18
- package/server/api/workshop/aml/training-plans/[id].patch.ts +30 -30
- package/server/api/workshop/aml/training-plans/index.get.ts +9 -9
- package/server/api/workshop/aml/training-plans/index.post.ts +43 -43
- package/server/api/workshop/analysis/index.post.ts +54 -0
- package/server/api/workshop/approvals/[id]/decide.post.ts +30 -30
- package/server/api/workshop/approvals/index.get.ts +22 -22
- package/server/api/workshop/audit.get.ts +43 -43
- package/server/api/workshop/channels/[id]/chat/messages/[messageId]/read.post.ts +22 -22
- package/server/api/workshop/channels/[id]/chat/messages/index.get.ts +29 -29
- package/server/api/workshop/channels/[id]/chat/messages/index.post.ts +51 -51
- package/server/api/workshop/channels/[id]/chat/permissions.get.ts +35 -35
- package/server/api/workshop/channels/[id]/index.patch.ts +64 -64
- package/server/api/workshop/channels/[id]/members/[userId]/approve.post.ts +20 -20
- package/server/api/workshop/channels/[id]/members/[userId].delete.ts +21 -21
- package/server/api/workshop/channels/[id]/members/index.get.ts +23 -23
- package/server/api/workshop/channels/[id]/members/leave.post.ts +20 -20
- package/server/api/workshop/channels/[id]/twin-profile.get.ts +45 -45
- package/server/api/workshop/channels/[id]/twin-profile.patch.ts +72 -72
- package/server/api/workshop/daq/[id]/test.post.ts +1 -1
- package/server/api/workshop/daq/alarms.get.ts +16 -16
- package/server/api/workshop/dcw/[id]/write.post.ts +4 -4
- package/server/api/workshop/dcw/[id].delete.ts +41 -41
- package/server/api/workshop/dcw/[id].patch.ts +40 -40
- package/server/api/workshop/dcw/mes-test-read.post.ts +24 -24
- package/server/api/workshop/dcw/params/[id]/read.post.ts +17 -17
- package/server/api/workshop/dcw/params/[id]/write.post.ts +21 -21
- package/server/api/workshop/dcw/params/[id].delete.ts +19 -19
- package/server/api/workshop/dcw/params/[id].patch.ts +23 -23
- package/server/api/workshop/dcw/params/index.get.ts +27 -27
- package/server/api/workshop/dcw/params/index.post.ts +25 -25
- package/server/api/workshop/dcw/products/[id].delete.ts +16 -16
- package/server/api/workshop/dcw/products/[id].patch.ts +17 -17
- package/server/api/workshop/dcw/recipes/[id]/index.patch.ts +22 -22
- package/server/api/workshop/dcw/recipes/[id]/versions.get.ts +14 -14
- package/server/api/workshop/dcw/recipes/[id].delete.ts +25 -25
- package/server/api/workshop/dcw/recipes/index.get.ts +12 -12
- package/server/api/workshop/dcw/runs/[id]/close.post.ts +15 -15
- package/server/api/workshop/dcw/templates/[key].delete.ts +14 -14
- package/server/api/workshop/dcw/templates/[key].patch.ts +16 -16
- package/server/api/workshop/dcw/templates/index.post.ts +15 -15
- package/server/api/workshop/dcw/test-driver.post.ts +16 -16
- package/server/api/workshop/device-twins/[id].delete.ts +25 -25
- package/server/api/workshop/eda/runs/[id]/labels.patch.ts +25 -25
- package/server/api/workshop/eda/templates/[id].delete.ts +14 -0
- package/server/api/workshop/eda/templates/[id].get.ts +15 -0
- package/server/api/workshop/eda/templates/[id].patch.ts +20 -0
- package/server/api/workshop/eda/templates/index.get.ts +11 -0
- package/server/api/workshop/eda/templates/index.post.ts +20 -0
- package/server/api/workshop/exp/confirmations/[id]/decide.post.ts +41 -41
- package/server/api/workshop/exp/confirmations/index.get.ts +25 -25
- package/server/api/workshop/harnesses/[id]/providers.get.ts +16 -16
- package/server/api/workshop/hitl/respond.post.ts +94 -94
- package/server/api/workshop/notifications/index.get.ts +60 -60
- package/server/api/workshop/notifications/read.post.ts +31 -31
- package/server/api/workshop/ontology/drafts/[draftId]/subgraph.ts +24 -24
- package/server/api/workshop/plugins/[name]/disable.post.ts +21 -21
- package/server/api/workshop/plugins/[name]/enable.post.ts +21 -21
- package/server/api/workshop/plugins/[name]/index.get.ts +14 -14
- package/server/api/workshop/schedules/[id]/run.post.ts +15 -15
- package/server/api/workshop/schedules/[id]/runs.get.ts +15 -15
- package/server/api/workshop/schedules/[id].delete.ts +14 -14
- package/server/api/workshop/schedules/[id].get.ts +13 -13
- package/server/api/workshop/schedules/[id].patch.ts +29 -29
- package/server/api/workshop/schedules/index.get.ts +12 -12
- package/server/api/workshop/schedules/index.post.ts +32 -32
- package/server/api/workshop/tasks/[id]/reassign.post.ts +32 -32
- package/server/api/workshop/tasks/[id]/update.post.ts +35 -35
- package/server/api/workshop/teams/[id]/plugins/index.get.ts +36 -36
- package/server/api/workshop/teams/[id]/plugins/index.put.ts +42 -42
- package/server/api/workshop/ws/audience.ts +56 -56
- package/server/api/workshop/ws/db-buffer.ts +68 -68
- package/server/api/workshop/ws/event-mapping.ts +47 -47
- package/server/api/workshop/ws/handlers.ts +132 -132
- package/server/api/workshop/ws/hub.ts +133 -133
- package/server/api/workshop/ws/index.ts +23 -23
- package/server/api/workshop/ws/notification-uplink.ts +77 -77
- package/server/api/workshop/ws/shared.ts +94 -94
- package/server/api/workshop/ws/streams.ts +146 -146
- package/server/middleware/00-security-headers.ts +38 -38
- package/server/middleware/01-rate-guard.ts +101 -101
- package/server/plugins/aml-twin-worker.ts +32 -32
- package/server/plugins/dev-stability-guard.ts +42 -42
- package/server/plugins-builtin/diag-bridge/host/constants.mjs +25 -25
- package/server/plugins-builtin/diag-bridge/host/exports.mjs +104 -104
- package/server/plugins-builtin/diag-bridge/host/helpers.mjs +2 -2
- package/server/plugins-builtin/diag-bridge/host/index.mjs +15 -15
- package/server/plugins-builtin/diag-bridge/host/intents.mjs +62 -62
- package/server/plugins-builtin/diag-bridge/host/plugin.mjs +5 -3
- package/server/plugins-builtin/diag-bridge/host/snapshot.mjs +93 -93
- package/server/plugins-builtin/diag-bridge/index.mjs +9 -9
- package/server/plugins-builtin/serial-bridge/client.mjs +211 -211
- package/server/plugins-builtin/serial-bridge/drivers.mjs +409 -409
- package/server/plugins-builtin/serial-bridge/i18n.json +62 -62
- package/server/plugins-builtin/serial-bridge/index.mjs +247 -247
- package/server/plugins-builtin/serial-bridge/lib.mjs +208 -208
- package/server/plugins-builtin/serial-bridge/rtu.mjs +168 -168
- package/server/services/system-config/contracts.ts +29 -29
- package/server/services/system-config/dispose.ts +19 -19
- package/server/services/system-config/facade.ts +26 -26
- package/server/services/system-config/groups.ts +108 -108
- package/server/services/system-config/index.ts +21 -21
- package/server/services/system-config/init.ts +26 -26
- package/server/services/system-config/mutate.ts +103 -103
- package/server/services/system-config/plugins.ts +104 -104
- package/server/services/system-config/snapshot.ts +59 -59
- package/server/services/system-config/state.ts +79 -79
- package/server/services/system-config/types.ts +58 -58
- package/server/services/workshop/agents/adapters/omp-rpc-client/api.ts +111 -111
- package/server/services/workshop/agents/adapters/omp-rpc-client/contracts.ts +22 -22
- package/server/services/workshop/agents/adapters/omp-rpc-client/facade.ts +7 -7
- package/server/services/workshop/agents/adapters/omp-rpc-client/frames.ts +0 -18
- package/server/services/workshop/agents/adapters/omp-rpc-client/helpers.ts +38 -38
- package/server/services/workshop/agents/adapters/omp-rpc-client/index.ts +25 -25
- package/server/services/workshop/agents/adapters/omp-rpc-client/start.ts +70 -70
- package/server/services/workshop/agents/adapters/omp-rpc-client/state.ts +65 -65
- package/server/services/workshop/agents/adapters/omp-rpc-client/stdout.ts +92 -92
- package/server/services/workshop/agents/adapters/omp-rpc-client/usage.ts +47 -47
- package/server/services/workshop/agents/agent-badge.ts +38 -38
- package/server/services/workshop/agents/binding-authz.ts +60 -60
- package/server/services/workshop/agents/binding-mode.ts +51 -51
- package/server/services/workshop/agents/codex-agent/client.ts +170 -170
- package/server/services/workshop/agents/codex-agent/core.ts +119 -119
- package/server/services/workshop/agents/codex-agent/facade.ts +8 -8
- package/server/services/workshop/agents/codex-agent/helpers.ts +13 -13
- package/server/services/workshop/agents/codex-agent/hitl.ts +138 -138
- package/server/services/workshop/agents/codex-agent/index.ts +14 -14
- package/server/services/workshop/agents/codex-agent/turn.ts +367 -367
- package/server/services/workshop/agents/codex-agent/types.ts +42 -42
- package/server/services/workshop/agents/harness-process.ts +3 -3
- package/server/services/workshop/agents/harness-terminal/api.ts +197 -197
- package/server/services/workshop/agents/harness-terminal/index.ts +17 -17
- package/server/services/workshop/agents/harness-terminal/io.ts +120 -120
- package/server/services/workshop/agents/harness-terminal/park.ts +55 -55
- package/server/services/workshop/agents/harness-terminal/sanitize.ts +98 -98
- package/server/services/workshop/agents/harness-terminal/session.ts +124 -124
- package/server/services/workshop/agents/harness-terminal/shared.ts +74 -74
- package/server/services/workshop/agents/hitl-capabilities.ts +312 -312
- package/server/services/workshop/agents/hitl-decision/answers.ts +32 -32
- package/server/services/workshop/agents/hitl-decision/decide.ts +268 -268
- package/server/services/workshop/agents/hitl-decision/payload.ts +45 -45
- package/server/services/workshop/agents/hitl-decision/shared.ts +108 -108
- package/server/services/workshop/agents/hitl-decision/visibility.ts +94 -94
- package/server/services/workshop/agents/host-tool-bridge/tools/progress.ts +84 -84
- package/server/services/workshop/agents/host-tool-bridge/tools/team-delegation.ts +104 -104
- package/server/services/workshop/agents/host-tool-bridge/tools/team.ts +70 -70
- package/server/services/workshop/agents/industrial/aml-activity.ts +131 -131
- package/server/services/workshop/agents/industrial/audit-query.ts +66 -66
- package/server/services/workshop/agents/industrial/daq-tools.ts +352 -352
- package/server/services/workshop/agents/industrial/exp-tools.ts +104 -104
- package/server/services/workshop/agents/industrial/ops-tools.ts +16 -54
- package/server/services/workshop/agents/industrial/param-tools.ts +69 -69
- package/server/services/workshop/agents/industrial/recipe-gate.ts +6 -19
- package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +1 -1
- package/server/services/workshop/agents/node-bindings.repo.ts +207 -207
- package/server/services/workshop/agents/node-delegation.ts +159 -159
- package/server/services/workshop/agents/omp-agent/core.ts +146 -146
- package/server/services/workshop/agents/omp-agent/facade.ts +8 -8
- package/server/services/workshop/agents/omp-agent/helpers.ts +37 -37
- package/server/services/workshop/agents/omp-agent/index.ts +16 -16
- package/server/services/workshop/agents/omp-agent/tools-steer.ts +1 -18
- package/server/services/workshop/agents/omp-agent/types.ts +45 -45
- package/server/services/workshop/agents/opencode-agent/core.ts +77 -77
- package/server/services/workshop/agents/opencode-agent/facade.ts +8 -8
- package/server/services/workshop/agents/opencode-agent/helpers.ts +29 -29
- package/server/services/workshop/agents/opencode-agent/hitl.ts +113 -113
- package/server/services/workshop/agents/opencode-agent/index.ts +16 -16
- package/server/services/workshop/agents/opencode-agent/lifecycle.ts +44 -44
- package/server/services/workshop/agents/opencode-agent/server.ts +244 -244
- package/server/services/workshop/agents/opencode-agent/turn.ts +278 -278
- package/server/services/workshop/agents/opencode-agent/types.ts +54 -54
- package/server/services/workshop/agents/tool-classes.ts +44 -44
- package/server/services/workshop/aml/clean.ts +120 -120
- package/server/services/workshop/aml/entity.ts +367 -367
- package/server/services/workshop/aml/job-orchestrator/broadcast.ts +37 -37
- package/server/services/workshop/aml/job-orchestrator/control.ts +94 -94
- package/server/services/workshop/aml/job-orchestrator/failure.ts +96 -96
- package/server/services/workshop/aml/job-orchestrator/index.ts +22 -22
- package/server/services/workshop/aml/job-orchestrator/process.ts +101 -101
- package/server/services/workshop/aml/job-orchestrator/shared.ts +53 -53
- package/server/services/workshop/aml/job-orchestrator/status.ts +20 -20
- package/server/services/workshop/aml/job-orchestrator/tick.ts +37 -37
- package/server/services/workshop/aml/python/train-example.py +92 -92
- package/server/services/workshop/aml/runtime.ts +137 -137
- package/server/services/workshop/aml/stats.ts +140 -140
- package/server/services/workshop/aml/twin/calibration-worker.ts +150 -150
- package/server/services/workshop/aml/twin/model-backed-provider.ts +332 -332
- package/server/services/workshop/aml/twin/physics-spec-draft.ts +185 -185
- package/server/services/workshop/aml/twin/prompt-composer.ts +143 -143
- package/server/services/workshop/aml/twin/training-plans.ts +260 -260
- package/server/services/workshop/aml/twin/write-guard.ts +19 -19
- package/server/services/workshop/assets/character-asset.repo.ts +1 -1
- package/server/services/workshop/assets/device-twin.repo.ts +1 -1
- package/server/services/workshop/daq/bus/index.ts +5 -12
- package/server/services/workshop/daq/daq-controller/contracts.ts +39 -39
- package/server/services/workshop/daq/daq-controller/facade.ts +28 -28
- package/server/services/workshop/daq/daq-controller/frames.ts +137 -137
- package/server/services/workshop/daq/daq-controller/helpers.ts +52 -52
- package/server/services/workshop/daq/daq-controller/index.ts +22 -22
- package/server/services/workshop/daq/daq-controller/runtime-control.ts +72 -72
- package/server/services/workshop/daq/daq-controller/sweep-alarms.ts +176 -176
- package/server/services/workshop/daq/daq-controller/tsdb-twin.ts +138 -138
- package/server/services/workshop/daq/drivers/http.ts +95 -95
- package/server/services/workshop/daq/drivers/mock.ts +130 -130
- package/server/services/workshop/daq/drivers/modbus-rtu.ts +67 -67
- package/server/services/workshop/daq/drivers/modbus-tcp.ts +307 -307
- package/server/services/workshop/daq/drivers/opcua.ts +227 -227
- package/server/services/workshop/daq/drivers/s7-stub.ts +29 -29
- package/server/services/workshop/daq/host-bindings.ts +71 -71
- package/server/services/workshop/daq/host-ports.ts +65 -65
- package/server/services/workshop/db/aml-team-seeds.ts +118 -118
- package/server/services/workshop/db/backup-registry.ts +33 -33
- package/server/services/workshop/db/channel-member.repo.ts +122 -122
- package/server/services/workshop/db/channel.repo.ts +203 -203
- package/server/services/workshop/db/chat-message.repo.ts +233 -233
- package/server/services/workshop/db/database/index.ts +18 -18
- package/server/services/workshop/db/database/json.ts +14 -14
- package/server/services/workshop/db/database/open.ts +97 -97
- package/server/services/workshop/db/database/seed-data.ts +60 -60
- package/server/services/workshop/db/hitl-request.repo.ts +221 -221
- package/server/services/workshop/db/notification.repo.ts +199 -199
- package/server/services/workshop/db/readonly.ts +30 -30
- package/server/services/workshop/db/scheduled-task.repo.ts +235 -235
- package/server/services/workshop/db/transaction.ts +72 -72
- package/server/services/workshop/dcw/dcw-controller/contracts.ts +16 -16
- package/server/services/workshop/dcw/dcw-controller/control.ts +78 -78
- package/server/services/workshop/dcw/dcw-controller/facade.ts +19 -19
- package/server/services/workshop/dcw/dcw-controller/index.ts +22 -22
- package/server/services/workshop/dcw/dcw-controller/params.ts +97 -97
- package/server/services/workshop/dcw/dcw-controller/products.ts +103 -103
- package/server/services/workshop/dcw/dcw-controller/write-audit.ts +49 -49
- package/server/services/workshop/dcw/dcw-templates.ts +136 -136
- package/server/services/workshop/dcw/param-conversion.ts +78 -78
- package/server/services/workshop/dcw/param-map.repo.ts +349 -349
- package/server/services/workshop/dcw/plugin-bridge.ts +45 -45
- package/server/services/workshop/dcw/recipe-rollback-manager/contracts.ts +26 -26
- package/server/services/workshop/dcw/recipe-rollback-manager/facade.ts +13 -13
- package/server/services/workshop/dcw/recipe-rollback-manager/helpers.ts +30 -30
- package/server/services/workshop/dcw/recipe-rollback-manager/index.ts +17 -17
- package/server/services/workshop/dcw/recipe-rollback-manager/internal.ts +33 -33
- package/server/services/workshop/dcw/recipe-rollback-manager/judge.ts +52 -52
- package/server/services/workshop/dcw/recipe-rollback-manager/lock.ts +137 -137
- package/server/services/workshop/dcw/recipe-rollback-manager/rollback.ts +190 -190
- package/server/services/workshop/dcw/recipe-rollback-manager/state.ts +21 -21
- package/server/services/workshop/dcw/recipe-rollback-manager/sweep.ts +77 -77
- package/server/services/workshop/dcw/recipe-rollback-manager/types.ts +3 -3
- package/server/services/workshop/dcw/recipe-rollback-manager/views.ts +214 -214
- package/server/services/workshop/eda/chart-repo.ts +1 -1
- package/server/services/workshop/eda/eda-db.ts +13 -0
- package/server/services/workshop/eda/template-repo.ts +101 -0
- package/server/services/workshop/exp/exp-collector.ts +275 -275
- package/server/services/workshop/exp/exp-state.repo.ts +339 -339
- package/server/services/workshop/mes/mes-controller.ts +1155 -1155
- package/server/services/workshop/mes/mes-hook.ts +567 -567
- package/server/services/workshop/ontology/subgraph.core.ts +300 -300
- package/server/services/workshop/ontology/subgraph.service.ts +113 -113
- package/server/services/workshop/plugins/host/api.mjs +90 -90
- package/server/services/workshop/plugins/host/config.mjs +135 -135
- package/server/services/workshop/plugins/host/index.mjs +23 -23
- package/server/services/workshop/plugins/host/init.mjs +109 -109
- package/server/services/workshop/plugins/host/load.mjs +321 -321
- package/server/services/workshop/plugins/host/reload.mjs +94 -94
- package/server/services/workshop/plugins/host/rollback.mjs +72 -72
- package/server/services/workshop/plugins/host/state.mjs +54 -54
- package/server/services/workshop/plugins/host/toggle.mjs +64 -64
- package/server/services/workshop/plugins/host.mjs +9 -9
- package/server/services/workshop/runtime/agent-runtime/facade.ts +7 -7
- package/server/services/workshop/runtime/agent-runtime/helpers.ts +18 -18
- package/server/services/workshop/runtime/agent-runtime/index.ts +19 -19
- package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +137 -137
- package/server/services/workshop/runtime/chat-mention.ts +164 -164
- package/server/services/workshop/runtime/chat-projection.ts +246 -246
- package/server/services/workshop/runtime/manager/admin-agents.ts +268 -268
- package/server/services/workshop/runtime/manager/bus.ts +182 -182
- package/server/services/workshop/runtime/manager/channel-template-constants.ts +20 -20
- package/server/services/workshop/runtime/manager/chat-reply.ts +181 -181
- package/server/services/workshop/runtime/manager/chat.ts +384 -384
- package/server/services/workshop/runtime/manager/facade.ts +24 -24
- package/server/services/workshop/runtime/manager/helpers.ts +119 -119
- package/server/services/workshop/runtime/manager/index.ts +42 -42
- package/server/services/workshop/runtime/manager/internal.ts +73 -73
- package/server/services/workshop/runtime/manager/notifications.ts +108 -108
- package/server/services/workshop/runtime/manager/teams.ts +148 -148
- package/server/services/workshop/runtime/memory/contracts.ts +18 -18
- package/server/services/workshop/runtime/memory/facade.ts +10 -10
- package/server/services/workshop/runtime/memory/helpers.ts +196 -196
- package/server/services/workshop/runtime/memory/index.ts +27 -27
- package/server/services/workshop/runtime/memory/score.ts +33 -33
- package/server/services/workshop/runtime/memory/state.ts +40 -40
- package/server/services/workshop/runtime/monitor.ts +3 -3
- package/server/services/workshop/runtime/platform-notice.ts +113 -113
- package/server/services/workshop/runtime/schedule-runtime.ts +347 -347
- package/server/services/workshop/runtime/scheduler-loop/contracts.ts +29 -29
- package/server/services/workshop/runtime/scheduler-loop/facade.ts +7 -7
- package/server/services/workshop/runtime/scheduler-loop/helpers.ts +14 -14
- package/server/services/workshop/runtime/scheduler-loop/index.ts +16 -16
- package/server/services/workshop/runtime/task-engine/facade.ts +7 -7
- package/server/services/workshop/runtime/task-engine/index.ts +15 -15
- package/server/services/workshop/runtime/task-engine/types.ts +3 -3
- package/server/services/workshop/runtime/user-notification-hub.ts +192 -192
- package/server/types/pg.d.ts +49 -49
- package/server/utils/approval-gate.ts +67 -67
- package/server/utils/mojibake-guard.ts +29 -29
- package/server/utils/stability-severity.ts +77 -77
- package/shared/config/groups.mjs +241 -241
- package/shared/dcw-protocol/catalog.ts +232 -232
- package/shared/dcw-protocol/closed-loop.ts +137 -137
- package/shared/lru.mjs +97 -97
- package/tui/README.md +74 -74
- package/tui/aw-tui.mjs +445 -445
- package/tui/commands/index.mjs +287 -287
- package/tui/components/chat-log.mjs +42 -42
- package/tui/components/monitor-pane.mjs +39 -39
- package/tui/components/root.mjs +53 -53
- package/tui/components/status-bar.mjs +33 -33
- package/tui/lib/api.mjs +82 -82
- package/tui/lib/pickers.mjs +121 -121
- package/tui/lib/reducers.mjs +218 -218
- package/tui/lib/state.mjs +86 -86
- package/tui/lib/virtual-terminal.mjs +48 -48
- package/tui/lib/ws.mjs +125 -125
- package/tui/theme.mjs +38 -38
- package/.output/.AgentWorkShop/aml-python/__pycache__/aml_eval.cpython-312.pyc +0 -0
- package/.output/.AgentWorkShop/aml-python/__pycache__/amlkit.cpython-312.pyc +0 -0
- package/.output/.AgentWorkShop/aml-python/__pycache__/train-example.cpython-312.pyc +0 -0
- package/.output/.AgentWorkShop/aml-python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
- package/.output/public/_nuxt/BRYBzVMJ.js +0 -1
- package/.output/public/_nuxt/BW2uTUx52.js +0 -2
- package/.output/public/_nuxt/BtZKe9ZV.js +0 -1
- package/.output/public/_nuxt/CfFUK6932.js +0 -2
- package/.output/public/_nuxt/D6FhDrYe2.js +0 -1
- package/.output/public/_nuxt/DF9ETYJ32.js +0 -1
- package/.output/public/_nuxt/DGu_fna7.js +0 -1
- package/.output/public/_nuxt/D_59BNP1.js +0 -14
- package/.output/public/_nuxt/DhW7cFOa.js +0 -1
- package/.output/public/_nuxt/Dz9C2pTa.js +0 -1
- package/.output/public/_nuxt/OmpTerminalPanel.ComMDrA8.css +0 -1
- package/.output/public/_nuxt/PluginSlot.CGH0vb95.css +0 -1
- package/.output/public/_nuxt/TownView.CC3t-Dte.css +0 -1
- package/.output/public/_nuxt/YNhAoK-R2.js +0 -1
- package/.output/public/_nuxt/aml.PalMp-5n.css +0 -1
- package/.output/public/_nuxt/builds/meta/20934eea-96ab-412d-b0cd-0061716d8cc4.json +0 -1
- package/.output/public/_nuxt/ontology.B_3Wn907.css +0 -1
- package/.output/public/_nuxt/permissions.DxuOOIqQ.css +0 -1
- package/.output/public/_nuxt/schedules.BXNJ9q_I.css +0 -1
- package/.output/public/_nuxt/tools.BwXFAb-X.css +0 -1
- package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs +0 -716
- package/.output/server/chunks/build/AuthGate-nF1evO4v.mjs.map +0 -1
- package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs +0 -72
- package/.output/server/chunks/build/FormItemContext-BlyzocS0.mjs.map +0 -1
- package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs +0 -942
- package/.output/server/chunks/build/OmpTerminalPanel-BhvhQ1gG.mjs.map +0 -1
- package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs +0 -141
- package/.output/server/chunks/build/PluginSlot-BUKXwV2X.mjs.map +0 -1
- package/.output/server/chunks/build/TownView-BWMDbosY.mjs +0 -6489
- package/.output/server/chunks/build/TownView-BWMDbosY.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-BK-t8nRG.mjs +0 -392
- package/.output/server/chunks/build/_id_-BK-t8nRG.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-CZPlPDm4.mjs +0 -2045
- package/.output/server/chunks/build/_id_-CZPlPDm4.mjs.map +0 -1
- package/.output/server/chunks/build/_wsId_-BPy-Aj9L.mjs +0 -14297
- package/.output/server/chunks/build/_wsId_-BPy-Aj9L.mjs.map +0 -1
- package/.output/server/chunks/build/agents-CpNLdI8E.mjs +0 -1078
- package/.output/server/chunks/build/agents-CpNLdI8E.mjs.map +0 -1
- package/.output/server/chunks/build/alert-D0ivtTGy.mjs +0 -263
- package/.output/server/chunks/build/alert-D0ivtTGy.mjs.map +0 -1
- package/.output/server/chunks/build/aml-DRAFRcGU.mjs +0 -814
- package/.output/server/chunks/build/aml-DRAFRcGU.mjs.map +0 -1
- package/.output/server/chunks/build/analysis-p-dBkjoK.mjs +0 -533
- package/.output/server/chunks/build/analysis-p-dBkjoK.mjs.map +0 -1
- package/.output/server/chunks/build/api-B4Om0mEc.mjs.map +0 -1
- package/.output/server/chunks/build/api-BEW_ebY_.mjs.map +0 -1
- package/.output/server/chunks/build/api-BsAgXWxi.mjs.map +0 -1
- package/.output/server/chunks/build/api-error-BwAQLw44.mjs +0 -47
- package/.output/server/chunks/build/api-error-BwAQLw44.mjs.map +0 -1
- package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs +0 -81
- package/.output/server/chunks/build/apiClient-BvXtNzC8.mjs.map +0 -1
- package/.output/server/chunks/build/board-Dl2Ar22r.mjs +0 -178
- package/.output/server/chunks/build/board-Dl2Ar22r.mjs.map +0 -1
- package/.output/server/chunks/build/card-Cqk0Ur-L.mjs +0 -953
- package/.output/server/chunks/build/card-Cqk0Ur-L.mjs.map +0 -1
- package/.output/server/chunks/build/channel-templates-ByHOQQkO.mjs +0 -942
- package/.output/server/chunks/build/channel-templates-ByHOQQkO.mjs.map +0 -1
- package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs +0 -439
- package/.output/server/chunks/build/checkbox-CrT4cnfu.mjs.map +0 -1
- package/.output/server/chunks/build/client-only-qNA2OVV_.mjs +0 -43
- package/.output/server/chunks/build/client-only-qNA2OVV_.mjs.map +0 -1
- package/.output/server/chunks/build/core-CgTOPS4t.mjs +0 -294
- package/.output/server/chunks/build/core-CgTOPS4t.mjs.map +0 -1
- package/.output/server/chunks/build/daq-CdxcfY_G.mjs +0 -1266
- package/.output/server/chunks/build/daq-CdxcfY_G.mjs.map +0 -1
- package/.output/server/chunks/build/data-D8uX1dnm.mjs +0 -481
- package/.output/server/chunks/build/data-D8uX1dnm.mjs.map +0 -1
- package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +0 -505
- package/.output/server/chunks/build/dcw-BlDQtS4q.mjs.map +0 -1
- package/.output/server/chunks/build/default-CNWS6NUw.mjs +0 -2353
- package/.output/server/chunks/build/default-CNWS6NUw.mjs.map +0 -1
- package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs +0 -406
- package/.output/server/chunks/build/descriptions-BNlfKG9y.mjs.map +0 -1
- package/.output/server/chunks/build/drawer-Caji0PLs.mjs +0 -834
- package/.output/server/chunks/build/drawer-Caji0PLs.mjs.map +0 -1
- package/.output/server/chunks/build/dropdown-BNwTVGde.mjs +0 -14
- package/.output/server/chunks/build/dropdown-BNwTVGde.mjs.map +0 -1
- package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs +0 -540
- package/.output/server/chunks/build/dropdown-Cd-xPhR6.mjs.map +0 -1
- package/.output/server/chunks/build/es-Bxu10NJ2.mjs.map +0 -1
- package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs +0 -2448
- package/.output/server/chunks/build/firstNotUndefined-8H5_qHUu.mjs.map +0 -1
- package/.output/server/chunks/build/form-D_UpWPN4.mjs +0 -4712
- package/.output/server/chunks/build/form-D_UpWPN4.mjs.map +0 -1
- package/.output/server/chunks/build/hasIn-DBdElbjM.mjs +0 -553
- package/.output/server/chunks/build/hasIn-DBdElbjM.mjs.map +0 -1
- package/.output/server/chunks/build/hitl-Bd30yr1J.mjs +0 -132
- package/.output/server/chunks/build/hitl-Bd30yr1J.mjs.map +0 -1
- package/.output/server/chunks/build/input-GtPuSEgt.mjs +0 -2181
- package/.output/server/chunks/build/input-GtPuSEgt.mjs.map +0 -1
- package/.output/server/chunks/build/input-number-BNlNDK7H.mjs +0 -1120
- package/.output/server/chunks/build/input-number-BNlNDK7H.mjs.map +0 -1
- package/.output/server/chunks/build/interval-DvHBIIZh.mjs +0 -9
- package/.output/server/chunks/build/interval-DvHBIIZh.mjs.map +0 -1
- package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs +0 -7
- package/.output/server/chunks/build/isNumeric-CP7q_yhz.mjs.map +0 -1
- package/.output/server/chunks/build/logs-pRb-TMWa.mjs +0 -427
- package/.output/server/chunks/build/logs-pRb-TMWa.mjs.map +0 -1
- package/.output/server/chunks/build/menu-BXt-X0dt.mjs +0 -1952
- package/.output/server/chunks/build/menu-BXt-X0dt.mjs.map +0 -1
- package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs +0 -2253
- package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs.map +0 -1
- package/.output/server/chunks/build/ontology-DK0Mf0zT.mjs +0 -1406
- package/.output/server/chunks/build/ontology-DK0Mf0zT.mjs.map +0 -1
- package/.output/server/chunks/build/operations-SMQrRAcr.mjs +0 -311
- package/.output/server/chunks/build/operations-SMQrRAcr.mjs.map +0 -1
- package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +0 -202
- package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs.map +0 -1
- package/.output/server/chunks/build/pages-AFRP4-EL.mjs +0 -542
- package/.output/server/chunks/build/pages-AFRP4-EL.mjs.map +0 -1
- package/.output/server/chunks/build/pagination-DTAconUo.mjs +0 -1346
- package/.output/server/chunks/build/pagination-DTAconUo.mjs.map +0 -1
- package/.output/server/chunks/build/permissions-DgXQZSyx.mjs +0 -637
- package/.output/server/chunks/build/permissions-DgXQZSyx.mjs.map +0 -1
- package/.output/server/chunks/build/plugins-LRjaSEZy.mjs +0 -272
- package/.output/server/chunks/build/plugins-LRjaSEZy.mjs.map +0 -1
- package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs +0 -340
- package/.output/server/chunks/build/popconfirm-DxYPGRgS.mjs.map +0 -1
- package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs +0 -78
- package/.output/server/chunks/build/responsiveObserve-DM3hpzhU.mjs.map +0 -1
- package/.output/server/chunks/build/schedules-dSnr8url.mjs +0 -7172
- package/.output/server/chunks/build/schedules-dSnr8url.mjs.map +0 -1
- package/.output/server/chunks/build/segmented-D3HWtHPw.mjs +0 -341
- package/.output/server/chunks/build/segmented-D3HWtHPw.mjs.map +0 -1
- package/.output/server/chunks/build/select-B3Dsb9yq.mjs +0 -3923
- package/.output/server/chunks/build/select-B3Dsb9yq.mjs.map +0 -1
- package/.output/server/chunks/build/settings-BrIhnS2Z.mjs +0 -1014
- package/.output/server/chunks/build/settings-BrIhnS2Z.mjs.map +0 -1
- package/.output/server/chunks/build/space-Dwu2Skt8.mjs +0 -110
- package/.output/server/chunks/build/space-Dwu2Skt8.mjs.map +0 -1
- package/.output/server/chunks/build/spin-C2cuvGth.mjs +0 -357
- package/.output/server/chunks/build/spin-C2cuvGth.mjs.map +0 -1
- package/.output/server/chunks/build/studio-cdoNCfyy.mjs +0 -332
- package/.output/server/chunks/build/studio-cdoNCfyy.mjs.map +0 -1
- package/.output/server/chunks/build/switch-CyR-H6Fb.mjs +0 -377
- package/.output/server/chunks/build/switch-CyR-H6Fb.mjs.map +0 -1
- package/.output/server/chunks/build/table-CmVD-cA9.mjs +0 -7546
- package/.output/server/chunks/build/table-CmVD-cA9.mjs.map +0 -1
- package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs +0 -1924
- package/.output/server/chunks/build/tabs-Vg0e7cZE.mjs.map +0 -1
- package/.output/server/chunks/build/tag-y0sn-xv9.mjs +0 -1156
- package/.output/server/chunks/build/tag-y0sn-xv9.mjs.map +0 -1
- package/.output/server/chunks/build/teams-B1d32eHK.mjs +0 -1203
- package/.output/server/chunks/build/teams-B1d32eHK.mjs.map +0 -1
- package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs +0 -1062
- package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs.map +0 -1
- package/.output/server/chunks/build/tools-s_9U1Djj.mjs +0 -487
- package/.output/server/chunks/build/tools-s_9U1Djj.mjs.map +0 -1
- package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs +0 -920
- package/.output/server/chunks/build/tooltip-C2n2nNiQ.mjs.map +0 -1
- package/.output/server/chunks/build/town-B5aoiG98.mjs +0 -133
- package/.output/server/chunks/build/town-B5aoiG98.mjs.map +0 -1
- package/.output/server/chunks/build/useAgentHarnessOptions-DOrQHeBh.mjs +0 -124
- package/.output/server/chunks/build/useAgentHarnessOptions-DOrQHeBh.mjs.map +0 -1
- package/.output/server/chunks/build/useAgentTemplateActions-CzlplRWh.mjs +0 -77
- package/.output/server/chunks/build/useAgentTemplateActions-CzlplRWh.mjs.map +0 -1
- package/.output/server/chunks/build/useAgentTemplateForm-DQo1enf2.mjs +0 -117
- package/.output/server/chunks/build/useAgentTemplateForm-DQo1enf2.mjs.map +0 -1
- package/.output/server/chunks/build/useAgentTemplatesCatalog-DP-iMmqz.mjs +0 -133
- package/.output/server/chunks/build/useAgentTemplatesCatalog-DP-iMmqz.mjs.map +0 -1
- package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs +0 -92
- package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs.map +0 -1
- package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs +0 -86
- package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs.map +0 -1
- package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs +0 -194
- package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs.map +0 -1
- package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs +0 -89
- package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs.map +0 -1
- package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs +0 -267
- package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs.map +0 -1
- package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs +0 -93
- package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs.map +0 -1
- package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs +0 -86
- package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs.map +0 -1
- package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs +0 -130
- package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs.map +0 -1
- package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs +0 -129
- package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +0 -142
- package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs +0 -70
- package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs +0 -79
- package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs +0 -176
- package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +0 -99
- package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +0 -159
- package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +0 -222
- package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs +0 -136
- package/.output/server/chunks/build/useDaqOptimizations-CmX_dpBc.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +0 -395
- package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +0 -187
- package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs.map +0 -1
- package/.output/server/chunks/build/useDashboardData-B36wVWo2.mjs +0 -153
- package/.output/server/chunks/build/useDashboardData-B36wVWo2.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +0 -219
- package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwCards-SaiImIYQ.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs +0 -184
- package/.output/server/chunks/build/useDcwDetailScope-DLOklSMO.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs +0 -148
- package/.output/server/chunks/build/useDcwDetailTemplates-ClmIdZ40.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs +0 -71
- package/.output/server/chunks/build/useDcwFilter-CPMyCltx.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwLedger-0ie-0WTc.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs +0 -137
- package/.output/server/chunks/build/useDcwLineMutations-DNxo66yM.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs +0 -104
- package/.output/server/chunks/build/useDcwLineRun-CHskwscT.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs +0 -121
- package/.output/server/chunks/build/useDcwParamApprovals-DtScUc-W.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs +0 -93
- package/.output/server/chunks/build/useDcwProducts-BMaxzLu6.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs +0 -98
- package/.output/server/chunks/build/useDcwQuery-TVU3Eo0M.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs +0 -88
- package/.output/server/chunks/build/useDcwQuickActions-BREFmR9T.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs +0 -258
- package/.output/server/chunks/build/useDcwRecipes-Bc9urA1N.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +0 -452
- package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs +0 -91
- package/.output/server/chunks/build/useDcwTemplates-BzagZztS.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs +0 -140
- package/.output/server/chunks/build/useDcwWrites-BROwTLCn.mjs.map +0 -1
- package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs +0 -128
- package/.output/server/chunks/build/useDeviceTwins-BqwVJaZg.mjs.map +0 -1
- package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs +0 -107
- package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs.map +0 -1
- package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs +0 -55
- package/.output/server/chunks/build/useLocalTime-uVSM44Um.mjs.map +0 -1
- package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs +0 -88
- package/.output/server/chunks/build/useLogsManual-cVBZQ_Mt.mjs.map +0 -1
- package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs +0 -150
- package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs.map +0 -1
- package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs +0 -83
- package/.output/server/chunks/build/useLogsScope-aaPQeTRm.mjs.map +0 -1
- package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs +0 -135
- package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs.map +0 -1
- package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs +0 -91
- package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs.map +0 -1
- package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs +0 -195
- package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs.map +0 -1
- package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs +0 -149
- package/.output/server/chunks/build/useOpsLog-C-M6Eace.mjs.map +0 -1
- package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs +0 -156
- package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs.map +0 -1
- package/.output/server/chunks/build/useTeamActions-I_8QWp9w.mjs +0 -79
- package/.output/server/chunks/build/useTeamActions-I_8QWp9w.mjs.map +0 -1
- package/.output/server/chunks/build/useTeamAddMemberDialog-BLn4nTuy.mjs +0 -84
- package/.output/server/chunks/build/useTeamAddMemberDialog-BLn4nTuy.mjs.map +0 -1
- package/.output/server/chunks/build/useTeamCreateDialog-Bp5qKtpI.mjs +0 -97
- package/.output/server/chunks/build/useTeamCreateDialog-Bp5qKtpI.mjs.map +0 -1
- package/.output/server/chunks/build/useTeamDeployDialog-DwIaz6Cx.mjs +0 -80
- package/.output/server/chunks/build/useTeamDeployDialog-DwIaz6Cx.mjs.map +0 -1
- package/.output/server/chunks/build/useTeamPluginDialog-B932gZOI.mjs +0 -103
- package/.output/server/chunks/build/useTeamPluginDialog-B932gZOI.mjs.map +0 -1
- package/.output/server/chunks/build/useTeamsCatalog-DBwaLQBw.mjs +0 -123
- package/.output/server/chunks/build/useTeamsCatalog-DBwaLQBw.mjs.map +0 -1
- package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs +0 -115
- package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs.map +0 -1
- package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs +0 -87
- package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs.map +0 -1
- package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs +0 -118
- package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs.map +0 -1
- package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs +0 -92
- package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs.map +0 -1
- package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs +0 -141
- package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs.map +0 -1
- package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs +0 -138
- package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs.map +0 -1
- package/.output/server/chunks/build/useWorkshopApi-CaSItJVq.mjs +0 -119
- package/.output/server/chunks/build/useWorkshopApi-CaSItJVq.mjs.map +0 -1
- package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs +0 -1659
- package/.output/server/chunks/build/useWorkshopWs-YQ5URrbt.mjs.map +0 -1
- package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs.map +0 -1
- package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs +0 -92
- package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs.map +0 -1
- package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs +0 -168
- package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs.map +0 -1
- package/.output/server/chunks/build/users-DjiVC_tS.mjs +0 -569
- package/.output/server/chunks/build/users-DjiVC_tS.mjs.map +0 -1
- package/.output/server/chunks/build/workshop-1gKeDASV.mjs +0 -546
- package/.output/server/chunks/build/workshop-1gKeDASV.mjs.map +0 -1
- package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.json +0 -1
- package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/1459e6269990a5d229b9228c8b2f62ffaa7d350068380ae8b875fee0db45cca6.source +0 -180
- package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/c2991e909c70c5c12b90a407c7adcf63384c51668a2b334e6e047fa675c268fe.source +0 -305
- package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/e09129039d1e27e3fac24becc9bdafd2d1a7c8049bff24173df007be865f0165.source +0 -264
- package/app/.mimosa/hook-status/sess_05189059-e42d-4188-8911-4f7baabe009b-28ef7c75ea.json +0 -14
- package/scripts/e2e-direct-rest-simulator-paper.mjs +0 -624
- package/scripts/e2e-pi-simulator-paper.mjs +0 -2316
- package/scripts/e2e-registered-harness-simulator-paper.mjs +0 -1926
- package/scripts/e2e-simulator-optimizer-paper.mjs +0 -264
- package/scripts/fixtures/omp-paper-harness.mjs +0 -163
- package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.json +0 -1
- package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/942d2679b87b96c612b4f2a425c3ccc5b6f3234f0cf589a8441602f866fbe277.source +0 -41
- package/server/.mimosa/hook-state/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2.mvhn1irp-99488-e3fdc1cbfc.baseline/dd617a82339d2c61e49e28e416aabeb2fc100fb3cb1beca18d02dfb833214af6.source +0 -51
- package/server/.mimosa/hook-status/sess_869e5bfd-07f4-4b6e-a991-6221fcf6b7d2-e67b6b91bf.json +0 -14
- package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json +0 -1
- package/server/services/workshop/.mimosa/hook-status/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f-e6b75bbfe6.json +0 -14
- package/server/services/workshop/agents/omp-agent/supervision-history.ts +0 -38
- package/server/services/workshop/aml/python/__pycache__/aml_eval.cpython-312.pyc +0 -0
- package/server/services/workshop/aml/python/__pycache__/amlkit.cpython-312.pyc +0 -0
- package/server/services/workshop/aml/python/__pycache__/train-example.cpython-312.pyc +0 -0
- package/server/services/workshop/aml/python/__pycache__/train-hybrid-example.cpython-312.pyc +0 -0
- package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.json +0 -1
- package/server/services/workshop/optimization/python/.mimosa/hook-state/session_187ec97f45d4bd02369bbe94da527cf1.mvjqkcs6-68688-fb7131a89c.baseline/190a6772a4e43801737b4ba6072eb9d53d3099b5d8a9e6f57bc5e8592a26a6c4.source +0 -274
- package/server/services/workshop/optimization/python/.mimosa/hook-status/session_187ec97f45d4bd02369bbe94da527cf1-01ed7f04fa.json +0 -14
- package/server/services/workshop/optimization/python/__pycache__/problems.cpython-312.pyc +0 -0
- /package/.output/public/_nuxt/{9j2J4k4w.js → 9j2J4k4w2.js} +0 -0
- /package/.output/public/_nuxt/{BY3Lbz3h2.js → BY3Lbz3h.js} +0 -0
- /package/.output/public/_nuxt/{DgrK8UCQ.js → BvRk9kiK2.js} +0 -0
- /package/.output/public/_nuxt/{Iub61dX92.js → Iub61dX9.js} +0 -0
- /package/.output/public/_nuxt/{Q-JpBT032.js → Q-JpBT03.js} +0 -0
- /package/.output/public/_nuxt/{dVw8IHY62.js → dVw8IHY6.js} +0 -0
- /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.
|