agentworkshop 0.7.71 → 0.8.1
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/.AgentWorkShop/prompts/host-tools.json +455 -0
- package/.output/.AgentWorkShop/prompts/host-tools.json +455 -0
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{DJJDigim2.js → -FhgRqJl2.js} +1 -1
- package/.output/public/_nuxt/{CGk_VUhO2.js → 0qvcO_KM2.js} +1 -1
- package/.output/public/_nuxt/26OL4Ao82.js +1 -0
- package/.output/public/_nuxt/{sBDZymdy2.js → 2Kwo_j9G2.js} +1 -1
- package/.output/public/_nuxt/{BqYVLAcm.js → 2v5GdspM.js} +1 -1
- package/.output/public/_nuxt/{DkQBMVTs2.js → 8M7wFbEN2.js} +1 -1
- package/.output/public/_nuxt/{DtiY69xi2.js → 8SZLbrI42.js} +1 -1
- package/.output/public/_nuxt/{DF32f5EL2.js → B2NbzUau2.js} +1 -1
- package/.output/public/_nuxt/{CwZW1ZCe2.js → B4JlRHBB2.js} +1 -1
- package/.output/public/_nuxt/{BQOn0q6Y.js → B6C4WofF.js} +1 -1
- package/.output/public/_nuxt/{BC7W6lNm.js → B6UwtJ1a.js} +1 -1
- package/.output/public/_nuxt/{BfQ-ptH0.js → B8HFUsMH.js} +1 -1
- package/.output/public/_nuxt/{DzBbYWrw2.js → BBB_j2LU2.js} +1 -1
- package/.output/public/_nuxt/BCLUwdP52.js +1 -0
- package/.output/public/_nuxt/{CLxmY3Rh.js → BK4wbfGS.js} +1 -1
- package/.output/public/_nuxt/{BRMVDfPl2.js → BKidykmV2.js} +1 -1
- package/.output/public/_nuxt/BPUQZ9Lq2.js +8 -0
- package/.output/public/_nuxt/BRYBzVMJ.js +1 -0
- package/.output/public/_nuxt/{Bj5sjA5O.js → BRci9D_l.js} +1 -1
- package/.output/public/_nuxt/{Dmgqz2np2.js → BVGzwAxr2.js} +1 -1
- package/.output/public/_nuxt/BVg2R2VB2.js +1 -0
- package/.output/public/_nuxt/{C3aUN4Vp2.js → BW2uTUx52.js} +1 -1
- package/.output/public/_nuxt/{B5FKaMM02.js → BY3Lbz3h2.js} +1 -1
- package/.output/public/_nuxt/{DIwmMa_7.js → BYzim_Bn.js} +1 -1
- package/.output/public/_nuxt/{D8xUsQGt.js → B_Obcbiu.js} +1 -1
- package/.output/public/_nuxt/BaYDgyaR.js +3 -0
- package/.output/public/_nuxt/{DZJ11BTI.js → BbACaREb.js} +1 -1
- package/.output/public/_nuxt/{BJrj5JVe2.js → BcosvNXb2.js} +1 -1
- package/.output/public/_nuxt/{B_-vAvzb.js → BfeXib9G.js} +1 -1
- package/.output/public/_nuxt/{CeLqojCJ.js → BfgTar9L.js} +1 -1
- package/.output/public/_nuxt/BfvuWqSa.js +1 -0
- package/.output/public/_nuxt/{D8r8PNQa2.js → BiZWwdcD2.js} +1 -1
- package/.output/public/_nuxt/BkEokGX5.js +1 -0
- package/.output/public/_nuxt/{CJSohaqk2.js → BklGqEto2.js} +2 -2
- package/.output/public/_nuxt/{DkpmSnHX.js → Bko5adbu.js} +1 -1
- package/.output/public/_nuxt/{DTQTGA6v2.js → BmBlIIJo2.js} +1 -1
- package/.output/public/_nuxt/{D_NjL-Hz.js → Bmvt9ydE.js} +1 -1
- package/.output/public/_nuxt/{Cp4r6Eiz.js → BoyuIoSm.js} +1 -1
- package/.output/public/_nuxt/{62J4vljm2.js → Bq-tmkst.js} +1 -1
- package/.output/public/_nuxt/{BMMoqi94.js → BqFaZ4kS.js} +1 -1
- package/.output/public/_nuxt/BsJYieAL2.js +1 -0
- package/.output/public/_nuxt/{DD4J2Otc.js → BtZKe9ZV.js} +1 -1
- package/.output/public/_nuxt/{BnpY_zNx.js → BtumQhZK.js} +1 -1
- package/.output/public/_nuxt/{BjLzqWJH2.js → BwWs9EdO2.js} +1 -1
- package/.output/public/_nuxt/{Bx2a9cuY2.js → BxxpJxZf2.js} +1 -1
- package/.output/public/_nuxt/{qRXa-PM22.js → ByTnUqFw2.js} +1 -1
- package/.output/public/_nuxt/{DvOETuoT2.js → Byiiiwc72.js} +1 -1
- package/.output/public/_nuxt/{Car2lkbb.js → C1-SuwUN.js} +1 -1
- package/.output/public/_nuxt/{Dg81dOEO.js → C14pM5G4.js} +1 -1
- package/.output/public/_nuxt/{MDhaRQq_.js → C2Yp-B8m.js} +1 -1
- package/.output/public/_nuxt/{BJ2nJNlK2.js → C4e6_nom2.js} +1 -1
- package/.output/public/_nuxt/{CiCEprsp2.js → C5OStZJ62.js} +1 -1
- package/.output/public/_nuxt/{ByMj6e7s.js → C6lssmvl.js} +2 -2
- package/.output/public/_nuxt/{C6uBP0Xa.js → CC-GEjfN.js} +1 -1
- package/.output/public/_nuxt/CC2Pv8VL2.js +1 -0
- package/.output/public/_nuxt/{DKiqdYnj.js → CCcMgxV9.js} +1 -1
- package/.output/public/_nuxt/{5S26I34j2.js → CDL30A2z2.js} +1 -1
- package/.output/public/_nuxt/{B8C-QJB5.js → CDYLasP8.js} +1 -1
- package/.output/public/_nuxt/CElzwyXQ.js +1 -0
- package/.output/public/_nuxt/{2KE8xGVm.js → CEvJu-xI.js} +1 -1
- package/.output/public/_nuxt/{CR612R752.js → CFQRFctQ2.js} +1 -1
- package/.output/public/_nuxt/{DnzjxC0u.js → CHk9XxNi.js} +2 -2
- package/.output/public/_nuxt/{Bx4MR0jd.js → CLFmtXU7.js} +1 -1
- package/.output/public/_nuxt/{DW8k_0dQ.js → CMJi6yYS.js} +1 -1
- package/.output/public/_nuxt/{DD-r0S1p.js → CPvFGbr8.js} +1 -1
- package/.output/public/_nuxt/{CCgbgkid.js → CQSxS_Ek.js} +2 -2
- package/.output/public/_nuxt/{jGxHnjW6.js → CQuo31jF.js} +1 -1
- package/.output/public/_nuxt/{SoO2K-di.js → CRCrWy-6.js} +1 -1
- package/.output/public/_nuxt/CUCFFL9m.js +84 -0
- package/.output/public/_nuxt/CZYNy60j2.js +1 -0
- package/.output/public/_nuxt/{WPwdj9pg.js → CZsFf7ck.js} +1 -1
- package/.output/public/_nuxt/CfFUK6932.js +2 -0
- package/.output/public/_nuxt/{DAsjfdZD.js → CfIbFnJz.js} +1 -1
- package/.output/public/_nuxt/{Tk6TQZjU.js → CjF4QY9h.js} +1 -1
- package/.output/public/_nuxt/{DlUQa0wn.js → Cjo1t2IF.js} +1 -1
- package/.output/public/_nuxt/{CDn0eDn8.js → CmuGMxDP.js} +1 -1
- package/.output/public/_nuxt/Cn6EojFe.js +1 -0
- package/.output/public/_nuxt/{DLqSQbGv.js → CnYazk8d.js} +1 -1
- package/.output/public/_nuxt/{DQfy6R_2.js → CnrGVJIr.js} +1 -1
- package/.output/public/_nuxt/{C0YL0HKK.js → CtcBhkci.js} +1 -1
- package/.output/public/_nuxt/{h5gsh8E92.js → Cv-Mv7_h2.js} +1 -1
- package/.output/public/_nuxt/{vPcnBJsa2.js → CzlZrfq82.js} +1 -1
- package/.output/public/_nuxt/{C2YYOgMe.js → CznnUTZx.js} +2 -2
- package/.output/public/_nuxt/{csitHKnE2.js → D-80EfyA2.js} +1 -1
- package/.output/public/_nuxt/{BRdoISnJ2.js → D1C6qtS12.js} +1 -1
- package/.output/public/_nuxt/{Cnrmlixo.js → D1MkndMZ.js} +2 -2
- package/.output/public/_nuxt/{BLwDhlaa.js → D37gODe0.js} +1 -1
- package/.output/public/_nuxt/{NXY37IO62.js → D6FhDrYe2.js} +1 -1
- package/.output/public/_nuxt/{Btx8wL4-.js → D7TZLu4F.js} +1 -1
- package/.output/public/_nuxt/{qoUdVDnC.js → D7tEwf-o.js} +3 -3
- package/.output/public/_nuxt/D8HQPtm62.js +1 -0
- package/.output/public/_nuxt/D9O4L4jK.js +1 -0
- package/.output/public/_nuxt/{aQ1B7BZa2.js → D9lL3fJM2.js} +2 -2
- package/.output/public/_nuxt/{CT-vTjcG2.js → DC-2eKo62.js} +1 -1
- package/.output/public/_nuxt/DF9ETYJ32.js +1 -0
- package/.output/public/_nuxt/DGGBrc0q2.js +1 -0
- package/.output/public/_nuxt/DGu_fna7.js +1 -0
- package/.output/public/_nuxt/{BupBjt6B.js → DKOvbitt.js} +1 -1
- package/.output/public/_nuxt/{B1PzYsqN.js → DNxudyND.js} +1 -1
- package/.output/public/_nuxt/{BfX6_AjY.js → DOT-XQyi.js} +1 -1
- package/.output/public/_nuxt/{BsTZnkVK.js → DPPC9Teq.js} +1 -1
- package/.output/public/_nuxt/{HxohXQ_r.js → DRskyE7l.js} +1 -1
- package/.output/public/_nuxt/{B-U7E_Mc2.js → DW4ZgInh2.js} +1 -1
- package/.output/public/_nuxt/{BErG4kzc2.js → DWe6BMlp2.js} +1 -1
- package/.output/public/_nuxt/DWy0AjON.js +1 -0
- package/.output/public/_nuxt/{Bc_k6AVA.js → DXgw1dVL.js} +4 -4
- package/.output/public/_nuxt/{C3sWJ8SD2.js → DZsKIzKD2.js} +1 -1
- package/.output/public/_nuxt/D_59BNP1.js +14 -0
- package/.output/public/_nuxt/{BQIO4MkA2.js → D_FZ3KZI2.js} +1 -1
- package/.output/public/_nuxt/{n_Njdwii2.js → D__vJGHF2.js} +1 -1
- package/.output/public/_nuxt/{C9gErLQc2.js → DaizNGUm2.js} +1 -1
- package/.output/public/_nuxt/{C-MY-JQE2.js → DdyE0ylS.js} +1 -1
- package/.output/public/_nuxt/DgrK8UCQ.js +0 -0
- package/.output/public/_nuxt/DhLlTxQh2.js +1 -0
- package/.output/public/_nuxt/DhW7cFOa.js +1 -0
- package/.output/public/_nuxt/{Rt2i6k7C2.js → DhjgWrB62.js} +1 -1
- package/.output/public/_nuxt/{KwT4sN_d.js → DiWcX4gj.js} +1 -1
- package/.output/public/_nuxt/DiloA8vK.js +1 -0
- package/.output/public/_nuxt/{DX-c5laM2.js → DlS-SkQ42.js} +1 -1
- package/.output/public/_nuxt/{D_Zspo1y.js → DmHp9yQ3.js} +1 -1
- package/.output/public/_nuxt/{dq1HKoGD.js → DoL9u6wu.js} +1 -1
- package/.output/public/_nuxt/{CIvMT5Ic.js → DqxBCeDe.js} +1 -1
- package/.output/public/_nuxt/{BnNmkGJS2.js → DrlnrdvY2.js} +3 -3
- package/.output/public/_nuxt/{BAcjVcku2.js → Dt8TL8_X2.js} +1 -1
- package/.output/public/_nuxt/{BtfwbNC0.js → Du7gS8RU.js} +1 -1
- package/.output/public/_nuxt/DuUc4bbY2.js +1 -0
- package/.output/public/_nuxt/{DPUXbTg9.js → DudoisLM.js} +1 -1
- package/.output/public/_nuxt/{Ce5R-ZGf2.js → DwgVlehj2.js} +1 -1
- package/.output/public/_nuxt/Dyxf2xZw.js +1 -0
- package/.output/public/_nuxt/Dz9C2pTa.js +1 -0
- package/.output/public/_nuxt/{BYxG9Hb2.js → EMbqTHfT.js} +1 -1
- package/.output/public/_nuxt/{B1SzppY12.js → FsRVXpyF2.js} +1 -1
- package/.output/public/_nuxt/{0MLy6ogg2.js → GQrEW8nk2.js} +1 -1
- package/.output/public/_nuxt/{Tuz5LcLM.js → IXR1BWP5.js} +1 -1
- package/.output/public/_nuxt/{-jpUnM1I2.js → Iub61dX92.js} +1 -1
- package/.output/public/_nuxt/{CQgOzpvI.js → JegDslce.js} +2 -2
- package/.output/public/_nuxt/{DrF3TWoj.js → KzK37yIr.js} +1 -1
- package/.output/public/_nuxt/{Br3MggOL.js → N-CCmCsX.js} +1 -1
- package/.output/public/_nuxt/{DHhmq7s_.js → NfvZ5Lzv.js} +1 -1
- package/.output/public/_nuxt/{CzX_kaPL.js → POTcePF_.js} +1 -1
- package/.output/public/_nuxt/{D7s96J3r2.js → Q-JpBT032.js} +1 -1
- package/.output/public/_nuxt/{DzwIZ81f2.js → R1g64DNi2.js} +1 -1
- package/.output/public/_nuxt/{JgheoP3e.js → R5Pz7BqB.js} +1 -1
- package/.output/public/_nuxt/{yLyz0-Yz.js → SvjzWbn8.js} +1 -1
- package/.output/public/_nuxt/{Dd7MZc_Q.js → XqXoaoDs.js} +1 -1
- package/.output/public/_nuxt/{B6jtLy6z.js → YAA98rWJ.js} +11 -11
- package/.output/public/_nuxt/{HX4_xnak2.js → YLYSczSq2.js} +1 -1
- package/.output/public/_nuxt/{BBw9ylUY2.js → YNhAoK-R2.js} +1 -1
- package/.output/public/_nuxt/Zkbt8Uk5.js +1 -0
- package/.output/public/_nuxt/aml.PalMp-5n.css +1 -0
- package/.output/public/_nuxt/{C41CcsiD.js → b7UcqLKi.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/fa0af8b5-3929-428d-a6de-3b5cc6b8248f.json +1 -0
- package/.output/public/_nuxt/{DVkFSOZi.js → cKj4vSo5.js} +1 -1
- package/.output/public/_nuxt/{r1CpGsFp.js → dHwWyr6b.js} +1 -1
- package/.output/public/_nuxt/{default.BzOcvmSE.css → default.BEXGWZFQ.css} +1 -1
- package/.output/public/_nuxt/{DlcA9Gxl.js → eePbiWEh.js} +1 -1
- package/.output/public/_nuxt/{entry.CL2i0F8o.css → entry.C7koBPom.css} +1 -1
- package/.output/public/_nuxt/{cjRzSvAg2.js → eymRov9Y2.js} +1 -1
- package/.output/public/_nuxt/{B8cViLJT.js → geMze5qw.js} +1 -1
- package/.output/public/_nuxt/{uu1wfdfR2.js → gh-WMxV_2.js} +1 -1
- package/.output/public/_nuxt/{Ce6e1mPk2.js → hCN555XP2.js} +1 -1
- package/.output/public/_nuxt/{rdUE8Khf.js → hZG5MLjK.js} +3 -3
- package/.output/public/_nuxt/{CcX_jP-d.js → hlfahYxK.js} +1 -1
- package/.output/public/_nuxt/{cGSl2GZp2.js → ilJHF1nA2.js} +1 -1
- package/.output/public/_nuxt/{D6ZcgHPz.js → jDuiDtGb.js} +1 -1
- package/.output/public/_nuxt/{DbeNMehP.js → k9b520K-.js} +1 -1
- package/.output/public/_nuxt/ontology.B_3Wn907.css +1 -0
- package/.output/public/_nuxt/optimizer.CLA8I1sy.css +1 -0
- package/.output/public/_nuxt/{DSORcpTJ.js → rDvMijKA.js} +2 -2
- package/.output/public/_nuxt/{CAiHhX8P2.js → rF7mggl72.js} +2 -2
- package/.output/public/_nuxt/ri9UF8rk.js +2 -0
- package/.output/public/_nuxt/{KgnxOsMr.js → toG_qAMH.js} +1 -1
- package/.output/public/_nuxt/{KQZmHR_K.js → u3h4pGpm.js} +2 -2
- package/.output/public/_nuxt/{dJ7gK7C2.js → uomnHjhM.js} +1 -1
- package/.output/public/_nuxt/{BUTg4W_x2.js → v77qozuJ2.js} +1 -1
- package/.output/public/_nuxt/{BcEr7tIB.js → v7cV7hJa.js} +1 -1
- package/.output/public/_nuxt/{D25dVZ822.js → vkQoYNQR2.js} +2 -2
- package/.output/public/_nuxt/{wR_w07322.js → vp3LtnTz2.js} +1 -1
- package/.output/public/_nuxt/{Bnc8HELj2.js → we7-sMSo2.js} +1 -1
- package/.output/public/_nuxt/{kN3ZzR1-.js → wxISMS1i.js} +1 -1
- package/.output/public/_nuxt/{DGrrucbG2.js → zy7efYKR.js} +1 -1
- package/.output/server/chunks/_/access.mjs +1 -1
- package/.output/server/chunks/_/binding-authz.mjs +1 -1
- package/.output/server/chunks/_/catalog-view.mjs +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/_/dashboard-repo.mjs +1 -1
- package/.output/server/chunks/_/data-export.mjs +6 -6
- package/.output/server/chunks/_/data-query.mjs +3 -3
- package/.output/server/chunks/_/eda-run.repo.mjs +2 -2
- package/.output/server/chunks/_/entity.mjs +1 -1
- package/.output/server/chunks/_/features.mjs +5 -5
- package/.output/server/chunks/_/golden.mjs +3 -3
- package/.output/server/chunks/_/host-bindings.mjs +1 -1
- package/.output/server/chunks/_/index.mjs +1 -1
- package/.output/server/chunks/_/mes-console.mjs +1 -1
- package/.output/server/chunks/_/nitro.mjs +7291 -3540
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/_/ocap.mjs +1 -1
- package/.output/server/chunks/_/rest-auth.mjs +1 -1
- package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
- package/.output/server/chunks/_/spc.mjs +2 -2
- package/.output/server/chunks/build/TownView-BWMDbosY.mjs +1 -1
- package/.output/server/chunks/build/{_wsId_-BNKrrV1H.mjs → _wsId_-BPy-Aj9L.mjs} +3 -3
- package/.output/server/chunks/build/{_wsId_-BNKrrV1H.mjs.map → _wsId_-BPy-Aj9L.mjs.map} +1 -1
- package/.output/server/chunks/build/{agents-8tV9xL97.mjs → agents-CpNLdI8E.mjs} +6 -6
- package/.output/server/chunks/build/{agents-8tV9xL97.mjs.map → agents-CpNLdI8E.mjs.map} +1 -1
- package/.output/server/chunks/build/{aml-BNTEDOsl.mjs → aml-DRAFRcGU.mjs} +15 -12
- package/.output/server/chunks/build/{aml-BNTEDOsl.mjs.map → aml-DRAFRcGU.mjs.map} +1 -1
- package/.output/server/chunks/build/api-BEW_ebY_.mjs +64 -0
- package/.output/server/chunks/build/api-BEW_ebY_.mjs.map +1 -0
- package/.output/server/chunks/build/{channel-templates-Iot9Y3vV.mjs → channel-templates-ByHOQQkO.mjs} +2 -2
- package/.output/server/chunks/build/{channel-templates-Iot9Y3vV.mjs.map → channel-templates-ByHOQQkO.mjs.map} +1 -1
- package/.output/server/chunks/build/daq-CdxcfY_G.mjs +1 -1
- package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +1 -1
- package/.output/server/chunks/build/{default-BeB88U7y.mjs → default-CNWS6NUw.mjs} +17 -11
- package/.output/server/chunks/build/{default-BeB88U7y.mjs.map → default-CNWS6NUw.mjs.map} +1 -1
- package/.output/server/chunks/build/{dropdown-CjwsxU39.mjs → dropdown-BNwTVGde.mjs} +2 -2
- package/.output/server/chunks/build/{dropdown-CjwsxU39.mjs.map → dropdown-BNwTVGde.mjs.map} +1 -1
- package/.output/server/chunks/build/{dropdown-C6YH_kSO.mjs → dropdown-Cd-xPhR6.mjs} +2 -2
- package/.output/server/chunks/build/{dropdown-C6YH_kSO.mjs.map → dropdown-Cd-xPhR6.mjs.map} +1 -1
- package/.output/server/chunks/build/input-number-BNlNDK7H.mjs +1 -1
- package/.output/server/chunks/build/{logs-BTfJQ6vQ.mjs → logs-pRb-TMWa.mjs} +3 -3
- package/.output/server/chunks/build/{logs-BTfJQ6vQ.mjs.map → logs-pRb-TMWa.mjs.map} +1 -1
- package/.output/server/chunks/build/{monitor-DvaR3yo8.mjs → monitor-Cq6hRFeQ.mjs} +6 -6
- package/.output/server/chunks/build/{monitor-DvaR3yo8.mjs.map → monitor-Cq6hRFeQ.mjs.map} +1 -1
- package/.output/server/chunks/build/ontology-DK0Mf0zT.mjs +1406 -0
- package/.output/server/chunks/build/ontology-DK0Mf0zT.mjs.map +1 -0
- package/.output/server/chunks/build/{operations-Cl8nVm9D.mjs → operations-SMQrRAcr.mjs} +3 -3
- package/.output/server/chunks/build/{operations-Cl8nVm9D.mjs.map → operations-SMQrRAcr.mjs.map} +1 -1
- package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +202 -0
- package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs.map +1 -0
- package/.output/server/chunks/build/{pagination-KaIvHBzi.mjs → pagination-DTAconUo.mjs} +2 -2
- package/.output/server/chunks/build/{pagination-KaIvHBzi.mjs.map → pagination-DTAconUo.mjs.map} +1 -1
- package/.output/server/chunks/build/{permissions-CVTfixZj.mjs → permissions-DgXQZSyx.mjs} +6 -6
- package/.output/server/chunks/build/{permissions-CVTfixZj.mjs.map → permissions-DgXQZSyx.mjs.map} +1 -1
- package/.output/server/chunks/build/{schedules-BLhn2CLn.mjs → schedules-dSnr8url.mjs} +6 -6
- package/.output/server/chunks/build/{schedules-BLhn2CLn.mjs.map → schedules-dSnr8url.mjs.map} +1 -1
- package/.output/server/chunks/build/{select--XFl7CtY.mjs → select-B3Dsb9yq.mjs} +3 -3
- package/.output/server/chunks/build/{select--XFl7CtY.mjs.map → select-B3Dsb9yq.mjs.map} +1 -1
- package/.output/server/chunks/build/{settings-DIf_iYdu.mjs → settings-BrIhnS2Z.mjs} +2 -2
- package/.output/server/chunks/build/{settings-DIf_iYdu.mjs.map → settings-BrIhnS2Z.mjs.map} +1 -1
- package/.output/server/chunks/build/{table-DIu_YCJN.mjs → table-CmVD-cA9.mjs} +4 -4
- package/.output/server/chunks/build/{table-DIu_YCJN.mjs.map → table-CmVD-cA9.mjs.map} +1 -1
- package/.output/server/chunks/build/{teams-B2J6ouRY.mjs → teams-B1d32eHK.mjs} +4 -4
- package/.output/server/chunks/build/{teams-B2J6ouRY.mjs.map → teams-B1d32eHK.mjs.map} +1 -1
- package/.output/server/chunks/build/{tokens-DFQGaN2n.mjs → tokens-GYaGJ35Z.mjs} +6 -6
- package/.output/server/chunks/build/{tokens-DFQGaN2n.mjs.map → tokens-GYaGJ35Z.mjs.map} +1 -1
- package/.output/server/chunks/build/{tools-DWJFnU_t.mjs → tools-s_9U1Djj.mjs} +6 -6
- package/.output/server/chunks/build/{tools-DWJFnU_t.mjs.map → tools-s_9U1Djj.mjs.map} +1 -1
- package/.output/server/chunks/build/types-D6J7slEa.mjs +6 -2
- package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +1 -1
- package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +1 -1
- package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +1 -1
- package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +1 -1
- package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +1 -1
- package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +1 -1
- package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +1 -1
- package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +1 -1
- package/.output/server/chunks/build/{users-BWw0VCr9.mjs → users-DjiVC_tS.mjs} +6 -6
- package/.output/server/chunks/build/{users-BWw0VCr9.mjs.map → users-DjiVC_tS.mjs.map} +1 -1
- package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
- package/.output/server/chunks/routes/api/system/backup/run.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +17 -4
- package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +8 -2
- package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +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 +2 -2
- 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/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.put.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/index5.get.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/_id/members/join.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/tools/reset.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.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 +7 -7
- package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/export/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.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/dcw/lines/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/commonality.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/features/run.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index3.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index6.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/runs/_id/labels.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/runs.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/vm/predict.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index.mjs +62 -0
- package/.output/server/chunks/routes/api/workshop/index.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index11.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index12.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mes/datasets.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mes/preview.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/autofix.mjs +52 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/autofix.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs +54 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs +51 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs +67 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs +49 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs +35 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs +49 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/subgraph.mjs +38 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/subgraph.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs +35 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs +70 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs +64 -0
- package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/index.mjs +44 -0
- package/.output/server/chunks/routes/api/workshop/ontology/index.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs +43 -0
- package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs +38 -0
- package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs +40 -0
- package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs +63 -0
- package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/optimization/capabilities.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/index.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/index2.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/profiles/_id/publish.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/crosscheck.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/dispatch.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/solve.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +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/process-model/index.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/process-model/specs/_id/publish.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/process-model/train.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tools/_name_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tools/sync.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
- package/.output/server/chunks/routes/renderer.mjs +2 -2
- package/.output/server/chunks/virtual/entry.mjs +323 -18
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/README-zh.md +28 -6
- package/README.md +26 -4
- package/app/components/AppSidebar.vue +1 -0
- package/app/components/aml/AmlModelsTable.vue +5 -0
- package/app/components/ontology/OntologyGraph.vue +356 -0
- package/app/pages/aml/styles.css +1 -0
- package/app/pages/ontology/api.ts +18 -0
- package/app/pages/ontology/index.vue +1062 -0
- package/app/pages/ontology/types.ts +164 -0
- package/app/pages/optimizer/index.vue +21 -4
- package/config.yml +1 -1
- package/docs/cli.en.md +2 -2
- package/docs/cli.md +2 -2
- 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/i18n/locales/en.ts +84 -0
- package/i18n/locales/zh-CN.ts +84 -0
- package/mcp/aw-mcp-server.mjs +53 -1
- package/package.json +1 -1
- package/scripts/docs-shots.mjs +36 -0
- package/scripts/e2e-direct-rest-simulator-paper.mjs +624 -0
- package/scripts/e2e-idd-results.mjs +177 -0
- package/scripts/e2e-model-loop-live.mjs +785 -0
- package/scripts/e2e-ontology-live.mjs +909 -0
- package/scripts/e2e-ontology.mjs +393 -0
- package/scripts/e2e-pi-simulator-paper.mjs +2316 -0
- package/scripts/e2e-registered-harness-simulator-paper.mjs +1926 -0
- package/scripts/e2e-simulator-optimizer-paper.mjs +264 -0
- package/scripts/fixtures/omp-paper-harness.mjs +163 -0
- package/scripts/ontology-idd-rag-e2e.mjs +449 -0
- package/sdk/context.mjs +6 -0
- package/sdk/index.d.mts +2 -0
- package/server/api/workshop/agent-tools/approvals/[id]/decide.post.ts +16 -0
- package/server/api/workshop/aml/models/[id].patch.ts +36 -30
- package/server/api/workshop/ontology/drafts/[draftId]/autofix.ts +31 -0
- package/server/api/workshop/ontology/drafts/[draftId]/compile.ts +39 -0
- package/server/api/workshop/ontology/drafts/[draftId]/evidence.ts +33 -0
- package/server/api/workshop/ontology/drafts/[draftId]/publish.ts +44 -0
- package/server/api/workshop/ontology/drafts/[draftId]/rules/[ruleId]/approval-decision.ts +28 -0
- package/server/api/workshop/ontology/drafts/[draftId]/rules/[ruleId]/approval.ts +17 -0
- package/server/api/workshop/ontology/drafts/[draftId]/rules/[ruleId]/transition.ts +32 -0
- package/server/api/workshop/ontology/drafts/[draftId]/subgraph.ts +24 -0
- package/server/api/workshop/ontology/drafts/[draftId]/validate.ts +16 -0
- package/server/api/workshop/ontology/drafts/[draftId].ts +52 -0
- package/server/api/workshop/ontology/drafts/index.ts +20 -0
- package/server/api/workshop/ontology/export/[ontologyId].ts +50 -0
- package/server/api/workshop/ontology/index.ts +38 -0
- package/server/api/workshop/ontology/scene.ts +34 -0
- package/server/api/workshop/ontology/traces/[ontologyId].ts +19 -0
- package/server/api/workshop/ontology/versions/[ontologyId]/compare.ts +21 -0
- package/server/api/workshop/ontology/versions/[ontologyId].ts +42 -0
- package/server/plugins-builtin/diag-bridge/client.mjs +390 -239
- package/server/plugins-builtin/diag-bridge/host/helpers.mjs +80 -0
- package/server/plugins-builtin/diag-bridge/host/plugin.mjs +264 -2
- package/server/plugins-builtin/diag-bridge/i18n.json +84 -4
- package/server/services/workshop/agents/adapters/omp-rpc-client/frames.ts +129 -111
- package/server/services/workshop/agents/hitl-decision/dispatcher.ts +15 -0
- package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +17 -2
- package/server/services/workshop/agents/industrial/aml-job-tools.ts +602 -569
- package/server/services/workshop/agents/industrial/grant-guard.ts +73 -0
- package/server/services/workshop/agents/industrial/index.ts +38 -32
- package/server/services/workshop/agents/industrial/ontology-tools.ts +380 -0
- package/server/services/workshop/agents/industrial/ops-tools.ts +54 -16
- package/server/services/workshop/agents/industrial/optimizer-tools.ts +81 -0
- package/server/services/workshop/agents/industrial/recipe-gate.ts +19 -6
- package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +1 -1
- package/server/services/workshop/agents/industrial/tool-verify.ts +32 -2
- package/server/services/workshop/agents/omp-agent/supervision-history.ts +38 -0
- package/server/services/workshop/agents/omp-agent/tools-steer.ts +18 -1
- package/server/services/workshop/agents/tool-reference-spec.ts +1 -1
- package/server/services/workshop/aml/aml.repo.ts +16 -0
- package/server/services/workshop/aml/twin/physics-spec.ts +6 -22
- package/server/services/workshop/daq/bus/index.ts +12 -5
- package/server/services/workshop/daq/storage/index.ts +6 -5
- package/server/services/workshop/daq/storage/sqlite.adapter.ts +25 -13
- package/server/services/workshop/db/database/open.ts +97 -95
- package/server/services/workshop/db/database/schema.ts +156 -1
- package/server/services/workshop/ontology/autofix.ts +198 -0
- package/server/services/workshop/ontology/compiler.ts +474 -0
- package/server/services/workshop/ontology/contracts.ts +443 -0
- package/server/services/workshop/ontology/guards.ts +139 -0
- package/server/services/workshop/ontology/index.ts +12 -0
- package/server/services/workshop/ontology/ontology.service.ts +938 -0
- package/server/services/workshop/ontology/repo.ts +449 -0
- package/server/services/workshop/ontology/semantic-binding.service.ts +226 -0
- package/server/services/workshop/ontology/subgraph.core.ts +300 -0
- package/server/services/workshop/ontology/subgraph.service.ts +113 -0
- package/server/services/workshop/ontology/validator.ts +218 -0
- package/server/services/workshop/optimization/binding.repo.ts +7 -0
- package/server/services/workshop/optimization/contracts.ts +16 -0
- package/server/services/workshop/optimization/dispatch.service.ts +16 -0
- package/server/services/workshop/optimization/profile-adopt.service.ts +261 -0
- package/server/services/workshop/optimization/profile.repo.ts +24 -6
- package/server/services/workshop/optimization/python/__pycache__/problems.cpython-312.pyc +0 -0
- package/shared/dimensions.ts +124 -0
- package/.output/public/_nuxt/B3Y5bCrM.js +0 -1
- package/.output/public/_nuxt/B7s2qeyT.js +0 -14
- package/.output/public/_nuxt/B8N8nsad2.js +0 -2
- package/.output/public/_nuxt/BO0BJx3w.js +0 -8
- package/.output/public/_nuxt/BWn-lfCp2.js +0 -1
- package/.output/public/_nuxt/Bcs9zzO62.js +0 -1
- package/.output/public/_nuxt/BwO2Y5FH2.js +0 -1
- package/.output/public/_nuxt/C-LU6xv_.js +0 -1
- package/.output/public/_nuxt/CJ0bjZ6v2.js +0 -1
- package/.output/public/_nuxt/CJ3Vul2u.js +0 -1
- package/.output/public/_nuxt/CNwx04ln.js +0 -84
- package/.output/public/_nuxt/CVCscYzb2.js +0 -1
- package/.output/public/_nuxt/C_A0MCol2.js +0 -1
- package/.output/public/_nuxt/CnP6snIz.js +0 -3
- package/.output/public/_nuxt/D3buuIkE.js +0 -1
- package/.output/public/_nuxt/D4_INWgq.js +0 -1
- package/.output/public/_nuxt/D5kCimyw.js +0 -1
- package/.output/public/_nuxt/DBtXLkyA.js +0 -1
- package/.output/public/_nuxt/DHURbGkn2.js +0 -1
- package/.output/public/_nuxt/DaBzS-iu.js +0 -1
- package/.output/public/_nuxt/DnlhV7Xe.js +0 -1
- package/.output/public/_nuxt/GtI6PUI32.js +0 -1
- package/.output/public/_nuxt/LHIav-Kv.js +0 -1
- package/.output/public/_nuxt/Nw_6OpQZ.js +0 -1
- package/.output/public/_nuxt/RuMLNeQE.js +0 -1
- package/.output/public/_nuxt/Y4sMSPrS.js +0 -1
- package/.output/public/_nuxt/aml.CeLxRzvI.css +0 -1
- package/.output/public/_nuxt/builds/meta/0ae8cb0f-6ce5-4096-9692-9b1fc197b30d.json +0 -1
- package/.output/public/_nuxt/goF_oZHF.js +0 -2
- package/.output/public/_nuxt/optimizer.B8gCbU1b.css +0 -1
- package/.output/public/_nuxt/rJ7To74v2.js +0 -1
- package/.output/server/chunks/build/optimizer-BOtGWEtc.mjs +0 -200
- package/.output/server/chunks/build/optimizer-BOtGWEtc.mjs.map +0 -1
|
@@ -16,7 +16,7 @@ import { getDcwParamRepo } from '../../dcw/param-map.repo'
|
|
|
16
16
|
import { getOps } from '../../ops/ops'
|
|
17
17
|
import { settingOf } from '../../settings'
|
|
18
18
|
import { fanoutQuery, windowOf } from './audit-query'
|
|
19
|
-
import { assertRecipeCreate, assertRecipeOperation, recipeApprovalPayload } from './recipe-gate'
|
|
19
|
+
import { assertRecipeCreate, assertRecipeOperation, recipeApprovalPayload, type ActiveRecipeContext } from './recipe-gate'
|
|
20
20
|
|
|
21
21
|
// ================================================================
|
|
22
22
|
// 运维日志 / Recipe 变更史查询(Agent 自查面:负责产线 scoped)
|
|
@@ -779,7 +779,7 @@ export async function toolRecipeUpdate(agentId: string, args: {
|
|
|
779
779
|
const old = recipe.params.find(x => x.nodeId === String(p.node_id).trim())?.value
|
|
780
780
|
return { nodeId: String(p.node_id).trim(), name: node?.name ?? String(p.node_id), from: old ?? null, to: Number(p.value), unit: node?.unit }
|
|
781
781
|
}),
|
|
782
|
-
|
|
782
|
+
context: gate.activeContext,
|
|
783
783
|
}) },
|
|
784
784
|
)
|
|
785
785
|
if (!gateDecision.approved) {
|
|
@@ -788,7 +788,7 @@ export async function toolRecipeUpdate(agentId: string, args: {
|
|
|
788
788
|
}
|
|
789
789
|
}
|
|
790
790
|
if (gateDecision.comment) hitlNote = `\n人工附言:${gateDecision.comment}`
|
|
791
|
-
const stale = await revalidateApprovedAction(agentId, recipe, 'update', 'recipe_update', { recipe_id: recipeId })
|
|
791
|
+
const stale = await revalidateApprovedAction(agentId, recipe, 'update', 'recipe_update', { recipe_id: recipeId }, gate.activeContext)
|
|
792
792
|
if (stale) return stale
|
|
793
793
|
}
|
|
794
794
|
// 旧值快照(repo.update 原地改写 recipe.params,事后再取会把 before 读成新值)
|
|
@@ -887,7 +887,7 @@ export async function toolRecipeRollback(agentId: string, args: {
|
|
|
887
887
|
recipe.id,
|
|
888
888
|
`${emergency ? '【应急豁免频控】' : ''}配方回退:「${recipe.name}」→ ${toLastGood ? '已知良好批次冻结' : `v${version}`}${dispatch ? '(统一回退:定义回退+整批重下发)' : '(仅定义回退)'} | 理由:${reason} | 批准=执行回退;拒绝可附指导`,
|
|
889
889
|
`${emergency ? '【应急】' : ''}配方回退审批`,
|
|
890
|
-
{ payload: { ...recipeApprovalPayload('rollback', recipe.id, recipe.name, { reason,
|
|
890
|
+
{ payload: { ...recipeApprovalPayload('rollback', recipe.id, recipe.name, { reason, context: gate.activeContext }), ...(emergency ? { emergency: true } : {}) } },
|
|
891
891
|
)
|
|
892
892
|
gateApprovalId = gateDecision.id
|
|
893
893
|
if (!gateDecision.approved) {
|
|
@@ -896,11 +896,15 @@ export async function toolRecipeRollback(agentId: string, args: {
|
|
|
896
896
|
}
|
|
897
897
|
}
|
|
898
898
|
if (gateDecision.comment) hitlNote = `\n人工附言:${gateDecision.comment}`
|
|
899
|
-
const stale = await revalidateApprovedAction(agentId, recipe, 'rollback', 'recipe_rollback', { recipe_id: recipeId })
|
|
899
|
+
const stale = await revalidateApprovedAction(agentId, recipe, 'rollback', 'recipe_rollback', { recipe_id: recipeId }, gate.activeContext)
|
|
900
900
|
if (stale) return stale
|
|
901
901
|
}
|
|
902
902
|
try {
|
|
903
903
|
if (dispatch) {
|
|
904
|
+
if (gate.hitlRequired) {
|
|
905
|
+
const staleAtDispatch = approvedContextError(agentId, recipe, 'rollback', gate.activeContext)
|
|
906
|
+
if (staleAtDispatch) return staleAtDispatch
|
|
907
|
+
}
|
|
904
908
|
const { recipe: updated, run, definitionNoop } = await getDcwController().rollbackRecipeAndDispatch(recipeId, {
|
|
905
909
|
version: toLastGood ? undefined : version,
|
|
906
910
|
toLastGood,
|
|
@@ -979,23 +983,46 @@ async function hitlDispatchGate(agentId: string, recipeId: string, detail: strin
|
|
|
979
983
|
}
|
|
980
984
|
|
|
981
985
|
/**
|
|
982
|
-
*
|
|
983
|
-
*
|
|
986
|
+
* 审批返回「批准」后的二次状态复核:审批可能挂起数分钟,
|
|
987
|
+
* 期间绑定/产线授权/活动产线上下文都可能变化。批准不等于授权与上下文仍然有效:
|
|
984
988
|
* - 重新跑 assertRecipeOperation(绑定/二级认证/运行门);
|
|
989
|
+
* - 将当前 line/product/recipe/run 元组与审批时快照比较,变化即拒绝;
|
|
985
990
|
* - 重新跑 grant-guard(频道属主的产线 grant,收权即失活)。
|
|
986
|
-
* 任一失败 → 本次不执行,回包说明原因(Agent
|
|
991
|
+
* 任一失败 → 本次不执行,回包说明原因(Agent 可据此核实上下文并重新申请)。
|
|
987
992
|
*/
|
|
993
|
+
function approvedContextError(
|
|
994
|
+
agentId: string,
|
|
995
|
+
recipe: { id: string, name: string, lineId?: string, access?: { requireAuth?: boolean, authorizedAgentIds?: string[] } },
|
|
996
|
+
op: 'update' | 'dispatch' | 'trial' | 'rollback',
|
|
997
|
+
expectedContext: ActiveRecipeContext,
|
|
998
|
+
): { text: string, isError: true } | null {
|
|
999
|
+
const currentGate = assertRecipeOperation(agentId, recipe, op)
|
|
1000
|
+
if (!currentGate.ok) {
|
|
1001
|
+
return { text: `人工已批准,但审批期间授权已失效,本次未执行:${currentGate.text}`, isError: true }
|
|
1002
|
+
}
|
|
1003
|
+
const current = currentGate.activeContext
|
|
1004
|
+
if (current.lineId !== expectedContext.lineId
|
|
1005
|
+
|| current.runId !== expectedContext.runId
|
|
1006
|
+
|| current.recipeId !== expectedContext.recipeId
|
|
1007
|
+
|| current.productId !== expectedContext.productId) {
|
|
1008
|
+
return {
|
|
1009
|
+
text: '人工已批准,但审批期间产线/产品/配方/批次上下文已变化,本次未执行。请核查当前运行上下文后重新提交。',
|
|
1010
|
+
isError: true,
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
return null
|
|
1014
|
+
}
|
|
1015
|
+
|
|
988
1016
|
export async function revalidateApprovedAction(
|
|
989
1017
|
agentId: string,
|
|
990
1018
|
recipe: { id: string, name: string, lineId?: string, access?: { requireAuth?: boolean, authorizedAgentIds?: string[] } },
|
|
991
1019
|
op: 'update' | 'dispatch' | 'trial' | 'rollback',
|
|
992
1020
|
toolName: string,
|
|
993
1021
|
args: Record<string, unknown>,
|
|
1022
|
+
expectedContext: ActiveRecipeContext,
|
|
994
1023
|
): Promise<{ text: string, isError: true } | null> {
|
|
995
|
-
const
|
|
996
|
-
if (
|
|
997
|
-
return { text: `人工已批准,但审批期间授权已失效,本次未执行:${again.text}`, isError: true }
|
|
998
|
-
}
|
|
1024
|
+
const initialContextError = approvedContextError(agentId, recipe, op, expectedContext)
|
|
1025
|
+
if (initialContextError) return initialContextError
|
|
999
1026
|
try {
|
|
1000
1027
|
// manager 未装配(单测/嵌入)→ 只做绑定与运行门复核;装配后叠加产线 grant 复核
|
|
1001
1028
|
const g = globalThis as typeof globalThis & {
|
|
@@ -1011,6 +1038,11 @@ export async function revalidateApprovedAction(
|
|
|
1011
1038
|
catch (err) {
|
|
1012
1039
|
return { text: `人工已批准,但审批后权限复核不可用,本次未执行:${err instanceof Error ? err.message : String(err)}。请稍后重试。`, isError: true }
|
|
1013
1040
|
}
|
|
1041
|
+
// Grant lookup is asynchronous. Re-read the active tuple after that await so
|
|
1042
|
+
// queued line/run changes cannot pass between the initial comparison and the
|
|
1043
|
+
// caller's dispatch continuation.
|
|
1044
|
+
const changedAfterGrantCheck = approvedContextError(agentId, recipe, op, expectedContext)
|
|
1045
|
+
if (changedAfterGrantCheck) return changedAfterGrantCheck
|
|
1014
1046
|
return null
|
|
1015
1047
|
}
|
|
1016
1048
|
|
|
@@ -1086,7 +1118,7 @@ export async function toolRecipeTrial(agentId: string, args: {
|
|
|
1086
1118
|
const old = recipe.params.find(x => x.nodeId === p.nodeId)?.value
|
|
1087
1119
|
return { nodeId: p.nodeId, name: node?.name ?? p.nodeId, from: old ?? null, to: p.value, unit: node?.unit }
|
|
1088
1120
|
}),
|
|
1089
|
-
|
|
1121
|
+
context: gate.activeContext,
|
|
1090
1122
|
}), ...(emergency ? { emergency: true } : {}) } },
|
|
1091
1123
|
)
|
|
1092
1124
|
gateApprovalId = gateDecision.id
|
|
@@ -1097,8 +1129,10 @@ export async function toolRecipeTrial(agentId: string, args: {
|
|
|
1097
1129
|
}
|
|
1098
1130
|
// 人工附言随批准回执回流(Agent 与审计都能看到放行时人的原话)
|
|
1099
1131
|
if (gateDecision.comment) hitlNote = `\n人工附言:${gateDecision.comment}`
|
|
1100
|
-
const stale = await revalidateApprovedAction(agentId, recipe, 'trial', 'recipe_trial', { recipe_id: recipeId })
|
|
1132
|
+
const stale = await revalidateApprovedAction(agentId, recipe, 'trial', 'recipe_trial', { recipe_id: recipeId }, gate.activeContext)
|
|
1101
1133
|
if (stale) return stale
|
|
1134
|
+
const staleAtDispatch = approvedContextError(agentId, recipe, 'trial', gate.activeContext)
|
|
1135
|
+
if (staleAtDispatch) return staleAtDispatch
|
|
1102
1136
|
}
|
|
1103
1137
|
const run = await getDcwController().applyRecipe(recipeId, { overrides: list, trial: true, agentDispatch: true, agentApprovalId: gateApprovalId, emergency })
|
|
1104
1138
|
// ACK 鉴定三段口径(2026-10-08):ok 只是命令受理,未证实/失败必须如实回给 Agent
|
|
@@ -1187,7 +1221,7 @@ export async function toolRecipeApply(agentId: string, args: {
|
|
|
1187
1221
|
const node = getDcwController().byId(p.nodeId)
|
|
1188
1222
|
return { nodeId: p.nodeId, name: node?.name ?? p.nodeId, from: null, to: p.value, unit: node?.unit }
|
|
1189
1223
|
}),
|
|
1190
|
-
|
|
1224
|
+
context: gate.activeContext,
|
|
1191
1225
|
}), recipeVersion: dispatch.version, ...(emergency ? { emergency: true } : {}) } },
|
|
1192
1226
|
)
|
|
1193
1227
|
gateApprovalId = gateDecision.id
|
|
@@ -1198,7 +1232,7 @@ export async function toolRecipeApply(agentId: string, args: {
|
|
|
1198
1232
|
}
|
|
1199
1233
|
// 人工附言随批准回执回流(与 recipe_trial 同口径)
|
|
1200
1234
|
if (gateDecision.comment) hitlNote = `\n人工附言:${gateDecision.comment}`
|
|
1201
|
-
const stale = await revalidateApprovedAction(agentId, recipe, 'dispatch', 'recipe_apply', { recipe_id: recipeId })
|
|
1235
|
+
const stale = await revalidateApprovedAction(agentId, recipe, 'dispatch', 'recipe_apply', { recipe_id: recipeId }, gate.activeContext)
|
|
1202
1236
|
if (stale) return stale
|
|
1203
1237
|
}
|
|
1204
1238
|
// 放在最后一次 await 之后,与 applyRecipe 的同步取值/建批之间不再让出执行权。
|
|
@@ -1206,6 +1240,10 @@ export async function toolRecipeApply(agentId: string, args: {
|
|
|
1206
1240
|
if (!currentRecipe || JSON.stringify(currentRecipe) !== approvedDefinition) {
|
|
1207
1241
|
return { text: '配方在审批期间已变更,与本次审批展示的快照不一致,本次未执行。请核查最新配方后重新提交 recipe_apply。', isError: true }
|
|
1208
1242
|
}
|
|
1243
|
+
if (gate.hitlRequired) {
|
|
1244
|
+
const staleAtDispatch = approvedContextError(agentId, recipe, 'dispatch', gate.activeContext)
|
|
1245
|
+
if (staleAtDispatch) return staleAtDispatch
|
|
1246
|
+
}
|
|
1209
1247
|
// 完整覆盖集让控制器复制每个已批准值,逐参数异步写期间也不再共享可变配方参数。
|
|
1210
1248
|
const run = await getDcwController().applyRecipe(recipeId, { overrides: dispatch.params, agentDispatch: true, agentApprovalId: gateApprovalId, emergency })
|
|
1211
1249
|
// ACK 鉴定三段口径(2026-10-08):ok 只是命令受理,未证实/失败必须如实回给 Agent
|
|
@@ -17,6 +17,7 @@ import { getEligibilityRepo } from '../../process-model/eligibility'
|
|
|
17
17
|
import { getProcessModelSpecRepo } from '../../process-model/spec.repo'
|
|
18
18
|
import { cancel, getRunStatus, solve } from '../../optimization/manager'
|
|
19
19
|
import { assertRecommendationUsable } from '../../optimization/recommendation.service'
|
|
20
|
+
import { proposeProfileAdoption } from '../../optimization/profile-adopt.service'
|
|
20
21
|
import { deriveDualState } from '../../optimization/crosscheck.service'
|
|
21
22
|
|
|
22
23
|
function ok(payload: unknown): HostToolResult {
|
|
@@ -191,3 +192,83 @@ export function hasOptimizerBinding(agentId: string): boolean {
|
|
|
191
192
|
return false
|
|
192
193
|
}
|
|
193
194
|
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* 模型采纳提议(OW-adopt):把 AML 新训练登记的模型采纳为指定 Profile 的新版本。
|
|
198
|
+
*
|
|
199
|
+
* AI-first 闭环的"采纳"环节:复制当前已发布 Profile 的全部求解配置 → 换新模型工件 →
|
|
200
|
+
* 草稿新版本 → 挂 HITL 卡等待人类裁决。批准(单一咽喉)= 冻结发布 + 自动重绑所有
|
|
201
|
+
* 绑定在旧版本的 Agent(revision+1,在飞求解 BINDING_STALE 收敛);拒绝/超时 = 零写。
|
|
202
|
+
*
|
|
203
|
+
* 治理:工具属写族(grant-guard operate);Agent 必须已绑定该 Profile(防越权提议);
|
|
204
|
+
* 兼容性(D21 矩阵)在服务层提议时校验;发布仅发生在人类批准后。
|
|
205
|
+
*/
|
|
206
|
+
export async function toolOptimizerProfilePropose(agentId: string, args: Record<string, unknown>): Promise<HostToolResult> {
|
|
207
|
+
try {
|
|
208
|
+
const bindings = listBindingsForAgent(agentId)
|
|
209
|
+
if (bindings.length === 0) {
|
|
210
|
+
return { text: '本 Agent 没有优化器绑定;模型采纳必须由已绑定该 Profile 的 Agent 发起(先在 Channel 设置里绑定)。', isError: true }
|
|
211
|
+
}
|
|
212
|
+
const modelId = String(args.model_id ?? '').trim()
|
|
213
|
+
if (!modelId) return { text: 'model_id 必填(aml_job_submit 训练完成登记的模型 id;aml_leaderboard/aml_model_find 可查)。', isError: true }
|
|
214
|
+
const profileId = String(args.profile_id ?? '').trim() || (() => {
|
|
215
|
+
const bound = bindings.map(b => b.profileId)
|
|
216
|
+
return new Set(bound).size === 1 ? bound[0]! : ''
|
|
217
|
+
})()
|
|
218
|
+
if (!profileId) {
|
|
219
|
+
return { text: `本 Agent 绑定了多个 Profile(${bindings.map(b => b.profileId).join(', ')});必须显式传 profile_id。`, isError: true }
|
|
220
|
+
}
|
|
221
|
+
if (!bindings.some(b => b.profileId === profileId)) {
|
|
222
|
+
return { text: `Profile ${profileId} 不在本 Agent 的绑定面内,不能代为提议采纳(越权拒绝)。`, isError: true }
|
|
223
|
+
}
|
|
224
|
+
const reason = String(args.reason ?? '').trim()
|
|
225
|
+
if (!reason) return { text: 'reason 必填:为什么采纳新模型(证据:训练指标对比/互校结论/业务动因)。', isError: true }
|
|
226
|
+
|
|
227
|
+
const result = await proposeProfileAdoption({
|
|
228
|
+
agentInstanceId: agentId,
|
|
229
|
+
initiatorId: agentId,
|
|
230
|
+
initiatorKind: 'agent',
|
|
231
|
+
profileId,
|
|
232
|
+
modelId,
|
|
233
|
+
templateRef: args.template_ref as Parameters<typeof proposeProfileAdoption>[0]['templateRef'],
|
|
234
|
+
solverRef: args.solver_ref as Parameters<typeof proposeProfileAdoption>[0]['solverRef'],
|
|
235
|
+
reason,
|
|
236
|
+
profileName: str(args.profile_name),
|
|
237
|
+
profileDescription: str(args.profile_description),
|
|
238
|
+
})
|
|
239
|
+
|
|
240
|
+
if (!result.decision.approved) {
|
|
241
|
+
return {
|
|
242
|
+
text: [
|
|
243
|
+
`采纳提议未被批准(卡 ${result.cardId}):`,
|
|
244
|
+
`${result.profileId} v${result.priorVersion} → v${result.version}(模型 ${result.modelId})`,
|
|
245
|
+
`裁决:${result.decision.comment || '拒绝/超时'}`,
|
|
246
|
+
'草稿已保留(零写);可修订理由后重新提议,或由管理员经 REST 发布。',
|
|
247
|
+
].join('\n'),
|
|
248
|
+
isError: true,
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (!result.published) {
|
|
252
|
+
return {
|
|
253
|
+
text: [
|
|
254
|
+
`⚠️ 采纳提议获批准,但发布未由裁决咽喉完成(卡 ${result.cardId}):`,
|
|
255
|
+
`${result.profileId} v${result.priorVersion} → v${result.version} 仍为草稿;请管理员经 REST/管理面发布,或重新发起采纳。`,
|
|
256
|
+
].join('\n'),
|
|
257
|
+
isError: true,
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
text: [
|
|
262
|
+
'✅ 模型采纳完成(HITL 批准):',
|
|
263
|
+
`${result.profileId} v${result.priorVersion} → v${result.version}(published)`,
|
|
264
|
+
`模型:${result.modelId};重绑绑定 ${result.rebindCount} 个(revision+1,在飞求解 BINDING_STALE 收敛)`,
|
|
265
|
+
`裁决意见:${result.decision.comment || '(无)'}`,
|
|
266
|
+
'下一次 optimizer_solve 即使用新模型;旧版本保留可回退(retire/rebind 走管理面)。',
|
|
267
|
+
].join('\n'),
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
catch (err) {
|
|
271
|
+
const message = err instanceof AppError ? `${err.code}: ${err.message}` : String(err)
|
|
272
|
+
return { text: `模型采纳提议失败:${message}`, isError: true }
|
|
273
|
+
}
|
|
274
|
+
}
|
|
@@ -20,12 +20,19 @@ import { getActiveLineRun } from '../../dcw/line-run'
|
|
|
20
20
|
|
|
21
21
|
export type RecipeOp = 'update' | 'dispatch' | 'trial' | 'rollback' | 'create'
|
|
22
22
|
|
|
23
|
+
export type ActiveRecipeContext = {
|
|
24
|
+
lineId: string
|
|
25
|
+
runId: string
|
|
26
|
+
recipeId: string
|
|
27
|
+
productId: string
|
|
28
|
+
}
|
|
29
|
+
|
|
23
30
|
export type RecipeGateResult
|
|
24
|
-
= | { ok: true, binding: AgentNodeBinding, hitlRequired: boolean,
|
|
31
|
+
= | { ok: true, binding: AgentNodeBinding, hitlRequired: boolean, activeContext: ActiveRecipeContext }
|
|
25
32
|
| { ok: false, text: string }
|
|
26
33
|
|
|
27
34
|
/** 运行门:该配方当前是否有活动批次(未结束的 run) */
|
|
28
|
-
export function activeRunOfRecipe(recipeId: string):
|
|
35
|
+
export function activeRunOfRecipe(recipeId: string): ActiveRecipeContext | null {
|
|
29
36
|
const run = getDcwController().listRuns().find(r => r.recipeId === recipeId && !r.endedAt)
|
|
30
37
|
if (!run) return null
|
|
31
38
|
// 反僵尸交叉校验(鲁棒性):DB 行未结束 ≠ 产线在运行 —— 多次 apply/崩溃/重启会泄漏
|
|
@@ -33,8 +40,13 @@ export function activeRunOfRecipe(recipeId: string): { id: string } | null {
|
|
|
33
40
|
// 权威运行态是 line-run 注册表(内存+line-runs.json 落盘,崩溃可恢复):
|
|
34
41
|
// run 所属产线必须在注册表中运行,且注册表的活跃批次就是本批次。
|
|
35
42
|
const active = getActiveLineRun(run.lineId)
|
|
36
|
-
if (!active || active.runId !== run.id) return null
|
|
37
|
-
return {
|
|
43
|
+
if (!active || active.runId !== run.id || active.recipeId !== recipeId) return null
|
|
44
|
+
return {
|
|
45
|
+
lineId: active.lineId,
|
|
46
|
+
runId: active.runId,
|
|
47
|
+
recipeId: active.recipeId,
|
|
48
|
+
productId: active.productId,
|
|
49
|
+
}
|
|
38
50
|
}
|
|
39
51
|
|
|
40
52
|
/** 统一鉴权门:绑定 → 二级认证 → 运行门;返回绑定与 HITL 判定(不做挂起,挂起由调用方执行) */
|
|
@@ -74,7 +86,7 @@ export function assertRecipeOperation(
|
|
|
74
86
|
// ⑤ 全局开关兼容位:security.recipeDispatchApproval 开启时即便 auto 也挂审批(保留语义)
|
|
75
87
|
const globalGate = false // 由调用方按 settingOf('security.recipeDispatchApproval') 叠加(本模块不依赖设置服务)
|
|
76
88
|
void globalGate
|
|
77
|
-
return { ok: true, binding, hitlRequired: binding.mode === 'manual' || lineManual,
|
|
89
|
+
return { ok: true, binding, hitlRequired: binding.mode === 'manual' || lineManual, activeContext: run }
|
|
78
90
|
}
|
|
79
91
|
|
|
80
92
|
/** 新建配方的授权门(尚无 recipe 可绑定):要求 Agent 在该线至少有一个写向绑定
|
|
@@ -116,6 +128,7 @@ export function assertRecipeCreate(agentId: string, lineId: string): { ok: true,
|
|
|
116
128
|
export function recipeApprovalPayload(op: RecipeOp, recipeId: string, recipeName: string, extra: {
|
|
117
129
|
reason: string
|
|
118
130
|
params?: Array<{ nodeId: string, name: string, from: number | null, to: number, unit?: string }>
|
|
131
|
+
context?: ActiveRecipeContext
|
|
119
132
|
runId?: string
|
|
120
133
|
}): Record<string, unknown> {
|
|
121
134
|
return {
|
|
@@ -126,6 +139,6 @@ export function recipeApprovalPayload(op: RecipeOp, recipeId: string, recipeName
|
|
|
126
139
|
recipeName,
|
|
127
140
|
reason: extra.reason,
|
|
128
141
|
...(extra.params ? { params: extra.params } : {}),
|
|
129
|
-
...(extra.runId ? { runId: extra.runId } : {}),
|
|
142
|
+
...(extra.context ? { context: { ...extra.context }, runId: extra.context.runId } : extra.runId ? { runId: extra.runId } : {}),
|
|
130
143
|
}
|
|
131
144
|
}
|
|
@@ -278,7 +278,7 @@ export async function toolRecipePropose(agentId: string, args: {
|
|
|
278
278
|
}
|
|
279
279
|
|
|
280
280
|
// 批准不等于授权仍有效:复核绑定/认证/运行门/产线 grant(审批期间可能被撤销)
|
|
281
|
-
const stale = await revalidateApprovedAction(agentId, recipe, 'dispatch', 'recipe_propose', { recipe_id: recipeId })
|
|
281
|
+
const stale = await revalidateApprovedAction(agentId, recipe, 'dispatch', 'recipe_propose', { recipe_id: recipeId }, gate.activeContext)
|
|
282
282
|
if (stale) return stale
|
|
283
283
|
|
|
284
284
|
// ---------- ⑦b 批准(choice 已由 decide 链 fail-closed 归一):选定包整批下发 ----------
|
|
@@ -168,7 +168,16 @@ function chainDeny(faces: ToolRefFaces, toolName: string, args: Record<string, u
|
|
|
168
168
|
], faces, hint, { param, value: id, lineId })
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
function draftLineId(draftJson: string): string {
|
|
172
|
+
try {
|
|
173
|
+
return (JSON.parse(draftJson || '{}') as { lineId?: string }).lineId ?? ''
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return ''
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
type ChainKind = 'dataset' | 'job' | 'model' | 'plan' | 'scene' | 'binding' | 'run' | 'recommendation' | 'ontology_draft' | 'ontology_version'
|
|
172
181
|
|
|
173
182
|
/** 优化运行/建议 → 所属 Agent(经 binding 反查);不存在返回 null(交工具兜底)。 */
|
|
174
183
|
function optimizerOwnership(id: string, kind: 'run' | 'recommendation'): { agentId: string } | null {
|
|
@@ -209,6 +218,27 @@ function chainLineOf(kind: ChainKind, id: string, args: Record<string, unknown>)
|
|
|
209
218
|
const p = getTrainingPlan(id)
|
|
210
219
|
return p ? { lineId: p.lineId, createdBy: '' } : null
|
|
211
220
|
}
|
|
221
|
+
// 本体草稿:归属 = 草稿属主(agent 起草时 owner=agentId);取不到 → 交工具自身
|
|
222
|
+
if (kind === 'ontology_draft') {
|
|
223
|
+
const row = rt.db.prepare('SELECT owner_user_id AS ownerUserId, draft_json AS draftJson FROM ontology_drafts WHERE id = ?').get(id) as { ownerUserId?: string, draftJson?: string } | undefined
|
|
224
|
+
if (!row) return null
|
|
225
|
+
let lineId = draftLineId(row.draftJson ?? '')
|
|
226
|
+
if (!lineId) {
|
|
227
|
+
const v = rt.db.prepare('SELECT line_id AS lineId FROM ontology_versions WHERE id = (SELECT ontology_id FROM ontology_drafts WHERE id = ?) ORDER BY version DESC LIMIT 1').get(id) as { lineId?: string } | undefined
|
|
228
|
+
lineId = v?.lineId ?? ''
|
|
229
|
+
}
|
|
230
|
+
return { lineId, createdBy: row.ownerUserId ?? '' }
|
|
231
|
+
}
|
|
232
|
+
// 本体版本:id@version 或 (ontology_id, version);归属 = 版本产线
|
|
233
|
+
if (kind === 'ontology_version') {
|
|
234
|
+
const ontologyId = id
|
|
235
|
+
const wantsVersion = args.version !== undefined ? Number(args.version) : Number.NaN
|
|
236
|
+
const row = Number.isInteger(wantsVersion)
|
|
237
|
+
? rt.db.prepare('SELECT line_id AS lineId FROM ontology_versions WHERE id = ? AND version = ?').get(ontologyId, wantsVersion) as { lineId?: string } | undefined
|
|
238
|
+
: rt.db.prepare(`SELECT line_id AS lineId FROM ontology_versions WHERE id = ? AND status = 'published' ORDER BY version DESC LIMIT 1`).get(ontologyId) as { lineId?: string } | undefined
|
|
239
|
+
if (!row) return null
|
|
240
|
+
return { lineId: row.lineId ?? '', createdBy: '' }
|
|
241
|
+
}
|
|
212
242
|
// scene:需带版本(scene_id 多版本并存);取不到记录 → 交工具自身
|
|
213
243
|
const version = String(args.scene_version ?? '').trim()
|
|
214
244
|
if (!version) return null
|
|
@@ -372,7 +402,7 @@ export function verifyToolReferences(agentId: string, toolName: string, args: Re
|
|
|
372
402
|
const mine = row.createdBy === agentId
|
|
373
403
|
const readable = !!row.lineId && faces.readableLines.has(row.lineId)
|
|
374
404
|
if (!mine && !readable) {
|
|
375
|
-
const label = { dataset: '数据集', job: '训练作业', model: '模型', plan: '建模任务', scene: '场景' }[chain.kind]
|
|
405
|
+
const label = { dataset: '数据集', job: '训练作业', model: '模型', plan: '建模任务', scene: '场景', ontology_draft: '本体草稿', ontology_version: '本体版本' }[chain.kind]
|
|
376
406
|
return chainDeny(faces, toolName, args, chain.param, id, label, row.lineId)
|
|
377
407
|
}
|
|
378
408
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AgentWorkspace } from '../agent-interface'
|
|
2
|
+
import type { AgentSessionEvent } from '../adapters/omp-rpc-client'
|
|
3
|
+
import { toolArgsPreview } from '../prompt-builder'
|
|
4
|
+
|
|
5
|
+
/** Compact, history-compatible audit line for a host tool used during lead supervision. */
|
|
6
|
+
export function supervisionToolHistoryMessage(event: AgentSessionEvent): string | null {
|
|
7
|
+
const toolName = typeof event.toolName === 'string' && event.toolName ? event.toolName : 'tool'
|
|
8
|
+
if (event.type === 'tool_execution_start') {
|
|
9
|
+
return `🔧 ${toolName}${toolArgsPreview(event.args)}`
|
|
10
|
+
}
|
|
11
|
+
if (event.type !== 'tool_execution_end') return null
|
|
12
|
+
|
|
13
|
+
const rawResult = event.result ?? event.output ?? ''
|
|
14
|
+
let summary: string
|
|
15
|
+
if (typeof rawResult === 'string') {
|
|
16
|
+
summary = rawResult
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
try {
|
|
20
|
+
summary = JSON.stringify(rawResult) ?? ''
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
summary = '(不可序列化结果)'
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
summary = summary.slice(0, 300)
|
|
27
|
+
return `🔧 ${toolName} ${event.isError === true ? '❌ 失败' : '✅ 完成'}${summary ? `: ${summary}` : ''}`
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Persist a supervisor host-tool event against the active root task when it is still open. */
|
|
31
|
+
export async function recordSupervisionToolHistory(
|
|
32
|
+
workspace: Pick<AgentWorkspace, 'reportTask'>,
|
|
33
|
+
taskId: string,
|
|
34
|
+
event: AgentSessionEvent,
|
|
35
|
+
): Promise<void> {
|
|
36
|
+
const message = supervisionToolHistoryMessage(event)
|
|
37
|
+
if (message) await workspace.reportTask({ taskId, message })
|
|
38
|
+
}
|
|
@@ -7,6 +7,7 @@ import type { AgentEvent, AgentRunContext, AgentRunRequest, SupervisionDecision,
|
|
|
7
7
|
import type { HostToolCallRequest } from '../adapters/omp-rpc-client'
|
|
8
8
|
import { extractJsonArray, parseSteerBanner, peerPrompt, supervisePrompt, systemManual, workerPrompt } from '../prompt-builder'
|
|
9
9
|
import { log } from './helpers'
|
|
10
|
+
import { recordSupervisionToolHistory } from './supervision-history'
|
|
10
11
|
|
|
11
12
|
export abstract class OmpRpcAgentImplToolsSteer extends OmpRpcAgentImplLifecycle {
|
|
12
13
|
/** 引擎无关工具面:REST/MCP 桥直调与 omp 内部 host_tool_call 共用同一实现 */
|
|
@@ -97,6 +98,12 @@ export abstract class OmpRpcAgentImplToolsSteer extends OmpRpcAgentImplLifecycle
|
|
|
97
98
|
return new Promise<SupervisionDecision[]>((resolve) => {
|
|
98
99
|
let assistantText = ''
|
|
99
100
|
let resolved = false
|
|
101
|
+
const activeRootTask = snapshot.tasks.find(task =>
|
|
102
|
+
task.id === snapshot.activeRootId
|
|
103
|
+
&& task.assigneeId === this.selfAgentId
|
|
104
|
+
&& ['SUBMITTED', 'ASSIGNED', 'WORKING', 'WAITING'].includes(task.state),
|
|
105
|
+
)
|
|
106
|
+
let taskHistoryWrites = Promise.resolve()
|
|
100
107
|
|
|
101
108
|
const finish = (decisions: SupervisionDecision[]) => {
|
|
102
109
|
if (resolved) return
|
|
@@ -107,7 +114,7 @@ export abstract class OmpRpcAgentImplToolsSteer extends OmpRpcAgentImplLifecycle
|
|
|
107
114
|
unsub()
|
|
108
115
|
if (hardTimer) clearTimeout(hardTimer)
|
|
109
116
|
signalUnsub?.()
|
|
110
|
-
resolve(decisions)
|
|
117
|
+
void taskHistoryWrites.then(() => resolve(decisions), () => resolve(decisions))
|
|
111
118
|
}
|
|
112
119
|
|
|
113
120
|
const abortTurn = (reason: string): void => {
|
|
@@ -118,6 +125,16 @@ export abstract class OmpRpcAgentImplToolsSteer extends OmpRpcAgentImplLifecycle
|
|
|
118
125
|
}
|
|
119
126
|
|
|
120
127
|
const unsub = this.client!.onEvent((event) => {
|
|
128
|
+
if (activeRootTask && (event.type === 'tool_execution_start' || event.type === 'tool_execution_end')) {
|
|
129
|
+
// Lead supervision is not a workerTurn, so its host-tool events do not
|
|
130
|
+
// pass through promptAndStream's task event mapper. Persist them on the
|
|
131
|
+
// active root while it is open, preserving tool-call/result chronology.
|
|
132
|
+
taskHistoryWrites = taskHistoryWrites.then(async () => {
|
|
133
|
+
await recordSupervisionToolHistory(ctx.workspace, activeRootTask.id, event)
|
|
134
|
+
}).catch((err) => {
|
|
135
|
+
log.error(`[OmpRpcAgent:${this.selfAgentId}] supervise task-history write failed:`, err)
|
|
136
|
+
})
|
|
137
|
+
}
|
|
121
138
|
if (event.type === 'message_update' && event.assistantMessageEvent?.type === 'text_delta') {
|
|
122
139
|
this.streaming = true
|
|
123
140
|
assistantText += event.assistantMessageEvent.delta ?? ''
|
|
@@ -17,7 +17,7 @@ import type { ToolRefKind as _RefKind } from './tool-reference-kinds'
|
|
|
17
17
|
export type { ToolRefKind } from './tool-reference-kinds'
|
|
18
18
|
|
|
19
19
|
/** 链式引用类别(经谱系回溯判定归属) */
|
|
20
|
-
export type ToolChainKind = 'dataset' | 'job' | 'model' | 'plan' | 'scene' | 'binding' | 'run' | 'recommendation'
|
|
20
|
+
export type ToolChainKind = 'dataset' | 'job' | 'model' | 'plan' | 'scene' | 'binding' | 'run' | 'recommendation' | 'ontology_draft' | 'ontology_version'
|
|
21
21
|
|
|
22
22
|
export interface ToolRefRule {
|
|
23
23
|
param: string
|
|
@@ -460,6 +460,22 @@ export function createAmlRepo(db: DatabaseSync) {
|
|
|
460
460
|
updateNote(id: string, note: string): void {
|
|
461
461
|
db.prepare('UPDATE aml_models SET note = ? WHERE id = ?').run(note, id)
|
|
462
462
|
},
|
|
463
|
+
/** 人读身份维护(Agent/REST 共用):只改 label/description,不改阶段与工件 */
|
|
464
|
+
updateIdentity(id: string, patch: { label?: string, description?: string }): void {
|
|
465
|
+
const sets: string[] = []
|
|
466
|
+
const args: unknown[] = []
|
|
467
|
+
if (patch.label !== undefined) {
|
|
468
|
+
sets.push('label = ?')
|
|
469
|
+
args.push(patch.label.slice(0, 200))
|
|
470
|
+
}
|
|
471
|
+
if (patch.description !== undefined) {
|
|
472
|
+
sets.push('description = ?')
|
|
473
|
+
args.push(patch.description.slice(0, 500))
|
|
474
|
+
}
|
|
475
|
+
if (!sets.length) return
|
|
476
|
+
args.push(id)
|
|
477
|
+
db.prepare(`UPDATE aml_models SET ${sets.join(', ')} WHERE id = ?`).run(...(args as never[]))
|
|
478
|
+
},
|
|
463
479
|
},
|
|
464
480
|
}
|
|
465
481
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { dimensionsCompatible, dimensionOf } from '@/shared/dimensions'
|
|
2
|
+
|
|
1
3
|
export const PHYSICS_SPEC_VERSION = 'physics-spec.v1' as const
|
|
2
4
|
export const PHYSICS_OPERATORS = ['add', 'sub', 'mul', 'div', 'pow', 'exp', 'log', 'min', 'max', 'clamp'] as const
|
|
3
5
|
export type PhysicsOperator = typeof PHYSICS_OPERATORS[number]
|
|
@@ -67,15 +69,6 @@ export interface PhysicsSpecValidationResult {
|
|
|
67
69
|
const OPS = new Set<string>(PHYSICS_OPERATORS)
|
|
68
70
|
const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_.:-]*$/
|
|
69
71
|
const RESERVED = new Set(['__proto__', 'prototype', 'constructor'])
|
|
70
|
-
const DIMENSIONLESS = new Set(['', '1', 'ratio', 'fraction', 'percent', '%'])
|
|
71
|
-
const UNIT_DIMENSIONS: Record<string, string> = {
|
|
72
|
-
s: 'time', sec: 'time', ms: 'time', min: 'time', h: 'time',
|
|
73
|
-
degc: 'temperature', c: 'temperature', k: 'temperature', degf: 'temperature',
|
|
74
|
-
pa: 'pressure', kpa: 'pressure', mpa: 'pressure', bar: 'pressure', psi: 'pressure',
|
|
75
|
-
g: 'mass', kg: 'mass', mg: 'mass',
|
|
76
|
-
m: 'length', cm: 'length', mm: 'length', km: 'length',
|
|
77
|
-
a: 'current', v: 'voltage', w: 'power', j: 'energy', n: 'force',
|
|
78
|
-
}
|
|
79
72
|
|
|
80
73
|
function record(value: unknown): value is Record<string, unknown> {
|
|
81
74
|
return !!value && typeof value === 'object' && !Array.isArray(value)
|
|
@@ -89,19 +82,10 @@ function idOk(value: unknown): value is string {
|
|
|
89
82
|
function addIssue(issues: PhysicsSpecIssue[], path: string, code: string, message: string, severity: 'error' | 'warning' = 'error') {
|
|
90
83
|
issues.push({ path, code, message, severity })
|
|
91
84
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const key = unitKey(unit)
|
|
97
|
-
if (DIMENSIONLESS.has(key)) return 'dimensionless'
|
|
98
|
-
if (UNIT_DIMENSIONS[key]) return UNIT_DIMENSIONS[key]
|
|
99
|
-
if (key.includes('/') || key.includes('*') || key.includes('^')) return `compound:${key}`
|
|
100
|
-
return key ? `unit:${key}` : 'scalar'
|
|
101
|
-
}
|
|
102
|
-
function compatible(a: string, b: string): boolean {
|
|
103
|
-
return a === '*' || b === '*' || a === b || (a === 'dimensionless' && b === 'scalar') || (b === 'dimensionless' && a === 'scalar')
|
|
104
|
-
}
|
|
85
|
+
/** 量纲归一与相容判定复用 shared/dimensions(本体与 PhysicsSpec 共用一张表;℃ 缺口在此已修) */
|
|
86
|
+
const dimension = dimensionOf
|
|
87
|
+
const compatible = dimensionsCompatible
|
|
88
|
+
|
|
105
89
|
function normalizeExpr(value: unknown): PhysicsExpression | undefined {
|
|
106
90
|
if (finite(value)) return value
|
|
107
91
|
if (!record(value)) return undefined
|
|
@@ -22,16 +22,23 @@ export async function getDaqQueue(): Promise<DaqQueuePort> {
|
|
|
22
22
|
|
|
23
23
|
/** 重连/初始装配:按 infra 判定结果(重新)构建 MQTT 或进程内队列 */
|
|
24
24
|
export async function rebuildDaqQueue(online: boolean, url?: string | null): Promise<DaqQueuePort> {
|
|
25
|
-
// 换装前释放旧 adapter(mqtt 连接 / inproc 泵),防重建泄漏
|
|
26
|
-
await g.__daqQueue?.close?.()
|
|
27
25
|
if (!online || !url) {
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
// Reuse an in-process adapter without closing it. close() clears consumers and
|
|
27
|
+
// stops its pump; getDaqQueue() will not initialize an existing instance again.
|
|
28
|
+
if (g.__daqQueue?.backend === 'inproc') {
|
|
30
29
|
await g.__daqQueue.init()
|
|
31
|
-
|
|
30
|
+
return g.__daqQueue
|
|
32
31
|
}
|
|
32
|
+
// When falling back from MQTT, install a fresh adapter; the controller reattaches
|
|
33
|
+
// its consumer after this replacement.
|
|
34
|
+
await g.__daqQueue?.close?.()
|
|
35
|
+
g.__daqQueue = new InProcQueueAdapter()
|
|
36
|
+
await g.__daqQueue.init()
|
|
37
|
+
log.warn('[daq-queue] 降级进程内队列')
|
|
33
38
|
return g.__daqQueue
|
|
34
39
|
}
|
|
40
|
+
// Release the previous adapter before a transition to MQTT.
|
|
41
|
+
await g.__daqQueue?.close?.()
|
|
35
42
|
try {
|
|
36
43
|
const adapter = new MqttQueueAdapter(url)
|
|
37
44
|
await adapter.init()
|
|
@@ -2,19 +2,20 @@
|
|
|
2
2
|
* TsdbPort 工厂 —— 配置驱动(daqInfraUrls 提供真实 Timescale URL),降级 SQLite 仿真。
|
|
3
3
|
* 单例挂 globalThis;rebuildTsdb() 支持重连时从降级实例切回真实实例。
|
|
4
4
|
*/
|
|
5
|
-
import { createLogger } from '../../logger'
|
|
5
|
+
import { createLogger } from '../../logger'
|
|
6
6
|
import { SqliteTimeSeriesAdapter } from './sqlite.adapter'
|
|
7
7
|
import { TimescaleAdapter } from './timescale.adapter'
|
|
8
8
|
import type { TsdbPort } from './tsdb-port'
|
|
9
9
|
|
|
10
|
-
const log = createLogger('daq.tsdb')
|
|
11
|
-
|
|
10
|
+
const log = createLogger('daq.tsdb')
|
|
11
|
+
|
|
12
12
|
interface DaqTsdbState { current?: TsdbPort, initError?: unknown }
|
|
13
13
|
const g = globalThis as typeof globalThis & { __daqTsdbState?: DaqTsdbState }
|
|
14
14
|
|
|
15
15
|
function makeFallback(reason: string): TsdbPort {
|
|
16
16
|
const dev = new SqliteTimeSeriesAdapter()
|
|
17
|
-
|
|
17
|
+
// init 失败不再静默:读路径有 ensureDb 惰性自愈兜底,但这里必须留下证据
|
|
18
|
+
dev.init().catch(err => log.error(`[daq-tsdb] SQLite 降级实例初始化失败(读路径将自愈重试):`, err instanceof Error ? err.message : err))
|
|
18
19
|
log.warn(`[daq-tsdb] ${reason} → 已降级 SQLite 时序仿真`)
|
|
19
20
|
return dev
|
|
20
21
|
}
|
|
@@ -27,7 +28,7 @@ export const tsdbReady: Promise<void> = (() => {
|
|
|
27
28
|
if (!url) {
|
|
28
29
|
// 无配置(启动插件尚未装配):先占位仿真库;插件随后按 infra 状态 rebuild
|
|
29
30
|
const dev = new SqliteTimeSeriesAdapter()
|
|
30
|
-
dev.init()
|
|
31
|
+
dev.init().catch(err => log.error('[daq-tsdb] SQLite 占位实例初始化失败(读路径将自愈重试):', err instanceof Error ? err.message : err))
|
|
31
32
|
st.current = dev
|
|
32
33
|
}
|
|
33
34
|
else {
|