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
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本体子图 BFS 纯核心 —— 零 DB / 零框架依赖,供 REST、Agent 工具与单测共用。
|
|
3
|
+
*
|
|
4
|
+
* 语义(与 docs/plans/2026-10-25-ontology-graph-visualization.md §2 一致):
|
|
5
|
+
* - nodes 含 center(hop=0);limit 统计含 center
|
|
6
|
+
* - edge.hop = max(hop(src), hop(dst));direction 由两端 hop 差决定(自环=loop)
|
|
7
|
+
* - direction=both 返回已访问节点之间的全部诱导边(含 lateral);out/in 只保留不倒走该方向的边
|
|
8
|
+
* - kinds 同时过滤遍历与输出;truncated 仅表示因 limit 未纳入可达节点
|
|
9
|
+
* - 输出排序确定:nodes 按 (hop, key),edges 按 (hop, id)
|
|
10
|
+
*/
|
|
11
|
+
import { AppError } from '../../../utils/errors'
|
|
12
|
+
import { ONTOLOGY_RELATION_KINDS, type OntologyRelationKind } from './contracts'
|
|
13
|
+
|
|
14
|
+
export const SUBGRAPH_DEFAULT_HOPS = 1
|
|
15
|
+
export const SUBGRAPH_MAX_HOPS = 3
|
|
16
|
+
export const SUBGRAPH_DEFAULT_LIMIT = 50
|
|
17
|
+
export const SUBGRAPH_MAX_LIMIT = 200
|
|
18
|
+
|
|
19
|
+
export type SubgraphDirection = 'both' | 'out' | 'in'
|
|
20
|
+
export type SubgraphEdgeDirection = 'out' | 'in' | 'lateral' | 'loop'
|
|
21
|
+
|
|
22
|
+
export interface SubgraphBindingView {
|
|
23
|
+
platformKind: string
|
|
24
|
+
platformId: string
|
|
25
|
+
targetSub: string
|
|
26
|
+
direction: string
|
|
27
|
+
status: string
|
|
28
|
+
unitDeclared: string
|
|
29
|
+
unitTarget: string
|
|
30
|
+
scale: number
|
|
31
|
+
offset: number
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface SubgraphEntityView {
|
|
35
|
+
key: string
|
|
36
|
+
kind: string
|
|
37
|
+
name: string
|
|
38
|
+
description: string
|
|
39
|
+
unit: string
|
|
40
|
+
role?: string
|
|
41
|
+
hop: number
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface SubgraphEdgeView {
|
|
45
|
+
id: string
|
|
46
|
+
kind: string
|
|
47
|
+
srcKey: string
|
|
48
|
+
dstKey: string
|
|
49
|
+
evidenceTier: string
|
|
50
|
+
hop: number
|
|
51
|
+
direction: SubgraphEdgeDirection
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface SubgraphAround {
|
|
55
|
+
ontologyId: string
|
|
56
|
+
version: number
|
|
57
|
+
lineId: string
|
|
58
|
+
center: SubgraphEntityView & { hop: 0, bindings: SubgraphBindingView[] }
|
|
59
|
+
nodes: SubgraphEntityView[]
|
|
60
|
+
edges: SubgraphEdgeView[]
|
|
61
|
+
truncated: boolean
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface SubgraphEntityInput {
|
|
65
|
+
key: string
|
|
66
|
+
kind: string
|
|
67
|
+
name: string
|
|
68
|
+
description?: string
|
|
69
|
+
unit: string
|
|
70
|
+
role?: string
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface SubgraphRelationInput {
|
|
74
|
+
id: string
|
|
75
|
+
kind: string
|
|
76
|
+
srcKey: string
|
|
77
|
+
dstKey: string
|
|
78
|
+
evidenceTier: string
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface SubgraphBindingInput {
|
|
82
|
+
entityKey: string
|
|
83
|
+
platformKind: string
|
|
84
|
+
platformId: string
|
|
85
|
+
targetSub?: string
|
|
86
|
+
direction: string
|
|
87
|
+
status?: string
|
|
88
|
+
unitDeclared?: string
|
|
89
|
+
unitTarget?: string
|
|
90
|
+
scale?: number
|
|
91
|
+
offset?: number
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface SubgraphGraphData {
|
|
95
|
+
entities: SubgraphEntityInput[]
|
|
96
|
+
relations: SubgraphRelationInput[]
|
|
97
|
+
bindings: SubgraphBindingInput[]
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface SubgraphMeta {
|
|
101
|
+
ontologyId: string
|
|
102
|
+
version: number
|
|
103
|
+
lineId: string
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface SubgraphOptions {
|
|
107
|
+
hops?: number
|
|
108
|
+
direction?: SubgraphDirection
|
|
109
|
+
/** null = 不过滤(与 parseSubgraphOptions 的解析结果可直接互传) */
|
|
110
|
+
kinds?: OntologyRelationKind[] | null
|
|
111
|
+
limit?: number
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** 已解析、已校验的选项(缺省值已落地) */
|
|
115
|
+
export interface ResolvedSubgraphOptions {
|
|
116
|
+
hops: number
|
|
117
|
+
direction: SubgraphDirection
|
|
118
|
+
kinds: OntologyRelationKind[] | null
|
|
119
|
+
limit: number
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const RELATION_KIND_SET = new Set<string>(ONTOLOGY_RELATION_KINDS)
|
|
123
|
+
|
|
124
|
+
function isDirection(value: string): value is SubgraphDirection {
|
|
125
|
+
return value === 'both' || value === 'out' || value === 'in'
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function parseInteger(value: unknown, fallback: number): number {
|
|
129
|
+
if (value === undefined || value === null || value === '') return fallback
|
|
130
|
+
const n = typeof value === 'number' ? value : Number(String(value))
|
|
131
|
+
if (!Number.isInteger(n)) return Number.NaN
|
|
132
|
+
return n
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** 解析并校验查询参数(未给则取缺省);kinds 支持逗号分隔或数组 */
|
|
136
|
+
export function parseSubgraphOptions(raw: {
|
|
137
|
+
hops?: unknown
|
|
138
|
+
direction?: unknown
|
|
139
|
+
kinds?: unknown
|
|
140
|
+
limit?: unknown
|
|
141
|
+
} = {}): ResolvedSubgraphOptions {
|
|
142
|
+
const hops = parseInteger(raw.hops, SUBGRAPH_DEFAULT_HOPS)
|
|
143
|
+
if (!Number.isInteger(hops) || hops < 1 || hops > SUBGRAPH_MAX_HOPS) {
|
|
144
|
+
throw new AppError(422, 'ONTOLOGY_SUBGRAPH_HOPS_INVALID', `hops 必须是 1-${SUBGRAPH_MAX_HOPS} 的整数`)
|
|
145
|
+
}
|
|
146
|
+
const directionRaw = typeof raw.direction === 'string' && raw.direction.trim() ? raw.direction.trim() : 'both'
|
|
147
|
+
if (!isDirection(directionRaw)) {
|
|
148
|
+
throw new AppError(422, 'ONTOLOGY_SUBGRAPH_DIRECTION_INVALID', 'direction 必须是 both/out/in')
|
|
149
|
+
}
|
|
150
|
+
const limit = parseInteger(raw.limit, SUBGRAPH_DEFAULT_LIMIT)
|
|
151
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > SUBGRAPH_MAX_LIMIT) {
|
|
152
|
+
throw new AppError(422, 'ONTOLOGY_SUBGRAPH_LIMIT_INVALID', `limit 必须是 1-${SUBGRAPH_MAX_LIMIT} 的整数`)
|
|
153
|
+
}
|
|
154
|
+
let kinds: OntologyRelationKind[] | null = null
|
|
155
|
+
if (raw.kinds !== undefined && raw.kinds !== null) {
|
|
156
|
+
const list = (Array.isArray(raw.kinds) ? raw.kinds : String(raw.kinds).split(','))
|
|
157
|
+
.map(k => String(k).trim())
|
|
158
|
+
.filter(Boolean)
|
|
159
|
+
if (!list.length) {
|
|
160
|
+
throw new AppError(422, 'ONTOLOGY_SUBGRAPH_KIND_INVALID', 'kinds 不能为空(缺省表示全部)')
|
|
161
|
+
}
|
|
162
|
+
for (const kind of list) {
|
|
163
|
+
if (!RELATION_KIND_SET.has(kind)) {
|
|
164
|
+
throw new AppError(422, 'ONTOLOGY_SUBGRAPH_KIND_INVALID',
|
|
165
|
+
`未知关系类型「${kind}」;可选:${ONTOLOGY_RELATION_KINDS.join(', ')}`)
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
kinds = [...new Set(list)] as OntologyRelationKind[]
|
|
169
|
+
}
|
|
170
|
+
return { hops, direction: directionRaw, kinds, limit }
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function bindingOf(bindings: SubgraphBindingInput[], entityKey: string): SubgraphBindingView[] {
|
|
174
|
+
return bindings
|
|
175
|
+
.filter(b => b.entityKey === entityKey)
|
|
176
|
+
.map(b => ({
|
|
177
|
+
platformKind: b.platformKind,
|
|
178
|
+
platformId: b.platformId,
|
|
179
|
+
targetSub: b.targetSub ?? '',
|
|
180
|
+
direction: b.direction,
|
|
181
|
+
status: b.status ?? 'active',
|
|
182
|
+
unitDeclared: b.unitDeclared ?? '',
|
|
183
|
+
unitTarget: b.unitTarget ?? '',
|
|
184
|
+
scale: typeof b.scale === 'number' ? b.scale : 1,
|
|
185
|
+
offset: typeof b.offset === 'number' ? b.offset : 0,
|
|
186
|
+
}))
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function nodeOf(entity: SubgraphEntityInput, hop: number): SubgraphEntityView {
|
|
190
|
+
return {
|
|
191
|
+
key: entity.key,
|
|
192
|
+
kind: entity.kind,
|
|
193
|
+
name: entity.name,
|
|
194
|
+
description: entity.description ?? '',
|
|
195
|
+
unit: entity.unit,
|
|
196
|
+
role: entity.role,
|
|
197
|
+
hop,
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* 以 entityKey 为中心做 BFS,返回诱导子图。
|
|
203
|
+
* 中心实体不存在 → 404 ONTOLOGY_SUBGRAPH_ENTITY_NOT_FOUND。
|
|
204
|
+
*/
|
|
205
|
+
export function buildSubgraphAround(
|
|
206
|
+
entityKey: string,
|
|
207
|
+
data: SubgraphGraphData,
|
|
208
|
+
meta: SubgraphMeta,
|
|
209
|
+
options: SubgraphOptions = {},
|
|
210
|
+
): SubgraphAround {
|
|
211
|
+
// 校验与缺省只有一处实现:服务层/路由/工具都不需要各自复制边界规则
|
|
212
|
+
const opts: ResolvedSubgraphOptions = parseSubgraphOptions(options)
|
|
213
|
+
const entityOf = new Map(data.entities.map(e => [e.key, e]))
|
|
214
|
+
const center = entityOf.get(entityKey)
|
|
215
|
+
if (!center) {
|
|
216
|
+
throw new AppError(404, 'ONTOLOGY_SUBGRAPH_ENTITY_NOT_FOUND',
|
|
217
|
+
`本体 ${meta.ontologyId}@${meta.version} 中不存在实体「${entityKey}」`)
|
|
218
|
+
}
|
|
219
|
+
const kindSet = opts.kinds ? new Set<string>(opts.kinds) : null
|
|
220
|
+
const relations = data.relations.filter(r => !kindSet || kindSet.has(r.kind))
|
|
221
|
+
const outAdj = new Map<string, string[]>()
|
|
222
|
+
const inAdj = new Map<string, string[]>()
|
|
223
|
+
for (const rel of relations) {
|
|
224
|
+
if (rel.srcKey === rel.dstKey) continue
|
|
225
|
+
if (!entityOf.has(rel.srcKey) || !entityOf.has(rel.dstKey)) continue
|
|
226
|
+
const outs = outAdj.get(rel.srcKey) ?? []
|
|
227
|
+
outs.push(rel.dstKey)
|
|
228
|
+
outAdj.set(rel.srcKey, outs)
|
|
229
|
+
const ins = inAdj.get(rel.dstKey) ?? []
|
|
230
|
+
ins.push(rel.srcKey)
|
|
231
|
+
inAdj.set(rel.dstKey, ins)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const hopOf = new Map<string, number>([[entityKey, 0]])
|
|
235
|
+
let truncated = false
|
|
236
|
+
let frontier = [entityKey]
|
|
237
|
+
let hop = 0
|
|
238
|
+
while (frontier.length && hop < opts.hops) {
|
|
239
|
+
hop += 1
|
|
240
|
+
const next: string[] = []
|
|
241
|
+
for (const key of frontier) {
|
|
242
|
+
const neighbours = opts.direction === 'in'
|
|
243
|
+
? (inAdj.get(key) ?? [])
|
|
244
|
+
: opts.direction === 'out'
|
|
245
|
+
? (outAdj.get(key) ?? [])
|
|
246
|
+
: [...(outAdj.get(key) ?? []), ...(inAdj.get(key) ?? [])]
|
|
247
|
+
for (const neighbour of neighbours) {
|
|
248
|
+
if (hopOf.has(neighbour)) continue
|
|
249
|
+
if (hopOf.size >= opts.limit) {
|
|
250
|
+
truncated = true
|
|
251
|
+
continue
|
|
252
|
+
}
|
|
253
|
+
hopOf.set(neighbour, hop)
|
|
254
|
+
next.push(neighbour)
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
frontier = next
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const nodes = [...hopOf.entries()]
|
|
261
|
+
.map(([key, h]) => nodeOf(entityOf.get(key)!, h))
|
|
262
|
+
.sort((a, b) => (a.hop - b.hop) || a.key.localeCompare(b.key))
|
|
263
|
+
|
|
264
|
+
const edges: SubgraphEdgeView[] = []
|
|
265
|
+
for (const rel of relations) {
|
|
266
|
+
const srcHop = hopOf.get(rel.srcKey)
|
|
267
|
+
const dstHop = hopOf.get(rel.dstKey)
|
|
268
|
+
if (srcHop === undefined || dstHop === undefined) continue
|
|
269
|
+
// 单向模式只保留真正沿该方向跨了一跳的边;同跳横边(lateral)只在 both 模式展示
|
|
270
|
+
if (opts.direction === 'out' && dstHop !== srcHop + 1) continue
|
|
271
|
+
if (opts.direction === 'in' && srcHop !== dstHop + 1) continue
|
|
272
|
+
const direction: SubgraphEdgeDirection = rel.srcKey === rel.dstKey
|
|
273
|
+
? 'loop'
|
|
274
|
+
: dstHop === srcHop + 1
|
|
275
|
+
? 'out'
|
|
276
|
+
: srcHop === dstHop + 1
|
|
277
|
+
? 'in'
|
|
278
|
+
: 'lateral'
|
|
279
|
+
edges.push({
|
|
280
|
+
id: rel.id,
|
|
281
|
+
kind: rel.kind,
|
|
282
|
+
srcKey: rel.srcKey,
|
|
283
|
+
dstKey: rel.dstKey,
|
|
284
|
+
evidenceTier: rel.evidenceTier,
|
|
285
|
+
hop: Math.max(srcHop, dstHop),
|
|
286
|
+
direction,
|
|
287
|
+
})
|
|
288
|
+
}
|
|
289
|
+
edges.sort((a, b) => (a.hop - b.hop) || a.id.localeCompare(b.id))
|
|
290
|
+
|
|
291
|
+
return {
|
|
292
|
+
ontologyId: meta.ontologyId,
|
|
293
|
+
version: meta.version,
|
|
294
|
+
lineId: meta.lineId,
|
|
295
|
+
center: { ...nodeOf(center, 0), hop: 0, bindings: bindingOf(data.bindings, entityKey) },
|
|
296
|
+
nodes,
|
|
297
|
+
edges,
|
|
298
|
+
truncated,
|
|
299
|
+
}
|
|
300
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本体子图服务层 —— 把仓储/草稿文档适配成纯核心需要的输入。
|
|
3
|
+
*
|
|
4
|
+
* 两条数据路径,语义必须分清:
|
|
5
|
+
* - subgraphAroundForLine:只读**已发布**活跃版本(与 sceneSubgraph 同口径,供 Agent/MCP)
|
|
6
|
+
* - subgraphAroundDoc:读**草稿**(供 /ontology 页面,画图与抽屉必须与表格同源)
|
|
7
|
+
*/
|
|
8
|
+
import { AppError } from '../../../utils/errors'
|
|
9
|
+
import type { OntologyDraftDoc } from './contracts'
|
|
10
|
+
import { getOntologyRepo } from './repo'
|
|
11
|
+
import { resolveActiveOntology } from './ontology.service'
|
|
12
|
+
import {
|
|
13
|
+
buildSubgraphAround, type SubgraphAround, type SubgraphGraphData, type SubgraphOptions,
|
|
14
|
+
} from './subgraph.core'
|
|
15
|
+
|
|
16
|
+
export interface OntologyVersionRef {
|
|
17
|
+
id: string
|
|
18
|
+
version: number
|
|
19
|
+
lineId: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function versionRefOf(active: NonNullable<ReturnType<typeof resolveActiveOntology>>, lineId: string): OntologyVersionRef {
|
|
23
|
+
return { id: active.version.id, version: active.version.version, lineId }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** 从已发布版本快照读取图数据 */
|
|
27
|
+
export function loadVersionGraph(ref: OntologyVersionRef): SubgraphGraphData {
|
|
28
|
+
const repo = getOntologyRepo()
|
|
29
|
+
const entities = repo.listEntities(ref.id, ref.version)
|
|
30
|
+
const relations = repo.listRelations(ref.id, ref.version)
|
|
31
|
+
const bindings = repo.listBindings(ref.id, ref.version)
|
|
32
|
+
return {
|
|
33
|
+
entities: entities.map(e => ({
|
|
34
|
+
key: e.key, kind: e.kind, name: e.name, description: e.description, unit: e.unit, role: e.role,
|
|
35
|
+
})),
|
|
36
|
+
relations: relations.map(r => ({
|
|
37
|
+
id: r.id, kind: r.kind, srcKey: r.srcKey, dstKey: r.dstKey, evidenceTier: r.properties.evidenceTier,
|
|
38
|
+
})),
|
|
39
|
+
bindings: bindings.map(b => ({
|
|
40
|
+
entityKey: b.entityKey,
|
|
41
|
+
platformKind: b.platformKind,
|
|
42
|
+
platformId: b.platformId,
|
|
43
|
+
targetSub: b.targetSub,
|
|
44
|
+
direction: b.direction,
|
|
45
|
+
status: b.status,
|
|
46
|
+
unitDeclared: b.unitDeclared,
|
|
47
|
+
unitTarget: b.unitTarget,
|
|
48
|
+
scale: b.scale,
|
|
49
|
+
offset: b.offset,
|
|
50
|
+
})),
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** 指定已发布版本(调用方需自行校验归属) */
|
|
55
|
+
export function subgraphAroundForVersion(
|
|
56
|
+
ref: OntologyVersionRef,
|
|
57
|
+
entityKey: string,
|
|
58
|
+
opts: SubgraphOptions = {},
|
|
59
|
+
): SubgraphAround {
|
|
60
|
+
const meta = { ontologyId: ref.id, version: ref.version, lineId: ref.lineId }
|
|
61
|
+
return buildSubgraphAround(entityKey, loadVersionGraph(ref), meta, opts)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 产线活跃已发布版本的邻接子图;该产线无已发布本体 → null(与 scene 的 active:false 同语义)。
|
|
66
|
+
*/
|
|
67
|
+
export function subgraphAroundForLine(
|
|
68
|
+
lineId: string,
|
|
69
|
+
entityKey: string,
|
|
70
|
+
opts: SubgraphOptions = {},
|
|
71
|
+
): SubgraphAround | null {
|
|
72
|
+
const active = resolveActiveOntology(lineId)
|
|
73
|
+
if (!active) return null
|
|
74
|
+
return subgraphAroundForVersion(versionRefOf(active, lineId), entityKey, opts)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** 草稿文档的邻接子图(供 UI:图与抽屉同源) */
|
|
78
|
+
export function subgraphAroundDoc(
|
|
79
|
+
doc: OntologyDraftDoc,
|
|
80
|
+
entityKey: string,
|
|
81
|
+
opts: SubgraphOptions = {},
|
|
82
|
+
): SubgraphAround {
|
|
83
|
+
const ontologyId = typeof (doc as { ontologyId?: unknown }).ontologyId === 'string'
|
|
84
|
+
? String((doc as { ontologyId?: unknown }).ontologyId)
|
|
85
|
+
: doc.name
|
|
86
|
+
const data: SubgraphGraphData = {
|
|
87
|
+
entities: doc.entities.map(e => ({
|
|
88
|
+
key: e.key, kind: e.kind, name: e.name, description: e.description, unit: e.unit, role: e.role,
|
|
89
|
+
})),
|
|
90
|
+
relations: doc.relations.map(r => ({
|
|
91
|
+
id: r.id, kind: r.kind, srcKey: r.srcKey, dstKey: r.dstKey, evidenceTier: r.properties.evidenceTier,
|
|
92
|
+
})),
|
|
93
|
+
bindings: doc.bindings.map(b => ({
|
|
94
|
+
entityKey: b.entityKey,
|
|
95
|
+
platformKind: b.platformKind,
|
|
96
|
+
platformId: b.platformId,
|
|
97
|
+
targetSub: b.targetSub,
|
|
98
|
+
direction: b.direction,
|
|
99
|
+
unitDeclared: b.unitDeclared,
|
|
100
|
+
unitTarget: b.unitTarget,
|
|
101
|
+
scale: b.scale,
|
|
102
|
+
offset: b.offset,
|
|
103
|
+
})),
|
|
104
|
+
}
|
|
105
|
+
return buildSubgraphAround(entityKey, data, { ontologyId, version: 0, lineId: doc.lineId }, opts)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** 供路由复用的实体必填校验 */
|
|
109
|
+
export function requireEntityKey(raw: unknown): string {
|
|
110
|
+
const value = typeof raw === 'string' ? raw.trim() : ''
|
|
111
|
+
if (!value) throw new AppError(422, 'ONTOLOGY_ENTITY_REQUIRED', 'entity 必填(实体 key,如 mv.hold_pressure)')
|
|
112
|
+
return value
|
|
113
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本体文档校验(零 DB 纯函数,可单测)。
|
|
3
|
+
*
|
|
4
|
+
* 只做结构/语义自洽判定;存在性、归属、读写能力等「活体」判定在
|
|
5
|
+
* semantic-binding.service(需要查 daq/dcw/recipe 真实对象)。
|
|
6
|
+
*
|
|
7
|
+
* fail-closed 原则:每条问题都带可行动 hint,禁止静默降级。
|
|
8
|
+
*/
|
|
9
|
+
import type { CompileIssue, EvidenceLevel, OntologyDraftDoc, OntologyEntity, OntologyRule } from './contracts'
|
|
10
|
+
import {
|
|
11
|
+
ONTOLOGY_STATES,
|
|
12
|
+
RULE_ERROR_CODES,
|
|
13
|
+
entityUnitIssue,
|
|
14
|
+
evidenceLevelRank,
|
|
15
|
+
maxEvidenceLevel,
|
|
16
|
+
unitsCompatible,
|
|
17
|
+
} from './contracts'
|
|
18
|
+
|
|
19
|
+
export interface DraftStats {
|
|
20
|
+
entities: number
|
|
21
|
+
relations: number
|
|
22
|
+
rules: number
|
|
23
|
+
bindings: number
|
|
24
|
+
byState: Record<string, number>
|
|
25
|
+
byEvidence: Record<string, number>
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface DraftValidationReport {
|
|
29
|
+
ok: boolean
|
|
30
|
+
issues: CompileIssue[]
|
|
31
|
+
stats: DraftStats
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function issue(code: string, path: string, message: string, severity: 'error' | 'warning' = 'error', hint?: string, ruleId?: string): CompileIssue {
|
|
35
|
+
return { code, path, message, severity, hint, ruleId }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** 规则 DSL 里出现的全部变量引用 */
|
|
39
|
+
export function ruleVariableRefs(rule: OntologyRule): string[] {
|
|
40
|
+
const dsl = rule.dsl
|
|
41
|
+
switch (dsl.type) {
|
|
42
|
+
case 'bound': return [dsl.variableKey]
|
|
43
|
+
case 'rate': return [dsl.variableKey]
|
|
44
|
+
case 'linear_coupling': return [dsl.variableKey, dsl.ofKey]
|
|
45
|
+
case 'nonlinear': return [dsl.variableKey]
|
|
46
|
+
case 'state_condition': return [dsl.when.variableKey, dsl.forbid.variableKey]
|
|
47
|
+
case 'interlock': return dsl.variableKey ? [dsl.variableKey] : []
|
|
48
|
+
case 'informal': return []
|
|
49
|
+
default: return []
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** 规则证据能支持的最强级别 */
|
|
54
|
+
export function ruleEvidenceLevel(rule: OntologyRule): EvidenceLevel | '' {
|
|
55
|
+
return maxEvidenceLevel(rule.evidence.map(e => e.level))
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function validateDraftDoc(doc: OntologyDraftDoc): DraftValidationReport {
|
|
59
|
+
const issues: CompileIssue[] = []
|
|
60
|
+
const entityByKey = new Map<string, OntologyEntity>()
|
|
61
|
+
|
|
62
|
+
// ---- 实体 ----
|
|
63
|
+
const seenKeys = new Set<string>()
|
|
64
|
+
doc.entities.forEach((entity, index) => {
|
|
65
|
+
if (seenKeys.has(entity.key)) {
|
|
66
|
+
issues.push(issue(RULE_ERROR_CODES.INVALID, `entities[${index}]`, `实体 key「${entity.key}」重复`, 'error', '实体 key 必须在单份本体文档内唯一'))
|
|
67
|
+
}
|
|
68
|
+
seenKeys.add(entity.key)
|
|
69
|
+
entityByKey.set(entity.key, entity)
|
|
70
|
+
if (entity.unit) {
|
|
71
|
+
const unitIssue = entityUnitIssue(entity)
|
|
72
|
+
if (unitIssue) issues.push(unitIssue)
|
|
73
|
+
}
|
|
74
|
+
if (entity.kind === 'process_variable' || entity.kind === 'quality_variable') {
|
|
75
|
+
if (!entity.role) {
|
|
76
|
+
issues.push(issue(RULE_ERROR_CODES.ROLE_UNRESOLVED, `entities[${entity.key}]`,
|
|
77
|
+
`变量实体「${entity.key}」缺少 role`, 'warning',
|
|
78
|
+
'缺 role 时无法参与 bound/rate 规则编译(编译器会拒绝);建议补 control/target/disturbance/feature/state/guard/observation'))
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
// ---- 关系 ----
|
|
84
|
+
const relationIds = new Set<string>()
|
|
85
|
+
const relationTriples = new Set<string>()
|
|
86
|
+
doc.relations.forEach((rel, index) => {
|
|
87
|
+
const path = `relations[${index}]`
|
|
88
|
+
if (relationIds.has(rel.id)) issues.push(issue(RULE_ERROR_CODES.INVALID, path, `关系 id「${rel.id}」重复`))
|
|
89
|
+
relationIds.add(rel.id)
|
|
90
|
+
const triple = `${rel.srcKey}|${rel.dstKey}|${rel.kind}`
|
|
91
|
+
if (relationTriples.has(triple)) {
|
|
92
|
+
issues.push(issue(RULE_ERROR_CODES.INVALID, path, `关系重复(${rel.srcKey} -${rel.kind}-> ${rel.dstKey})`))
|
|
93
|
+
}
|
|
94
|
+
relationTriples.add(triple)
|
|
95
|
+
if (rel.srcKey === rel.dstKey) {
|
|
96
|
+
issues.push(issue(RULE_ERROR_CODES.INVALID, path, `关系 ${rel.id} 自引用(src 与 dst 相同)`, 'warning'))
|
|
97
|
+
}
|
|
98
|
+
if (!entityByKey.has(rel.srcKey)) {
|
|
99
|
+
issues.push(issue(RULE_ERROR_CODES.UNKNOWN_ENTITY, path, `关系 ${rel.id} 的 srcKey「${rel.srcKey}」不存在`, 'error', '先在 entities 里定义该实体'))
|
|
100
|
+
}
|
|
101
|
+
if (!entityByKey.has(rel.dstKey)) {
|
|
102
|
+
issues.push(issue(RULE_ERROR_CODES.UNKNOWN_ENTITY, path, `关系 ${rel.id} 的 dstKey「${rel.dstKey}」不存在`, 'error', '先在 entities 里定义该实体'))
|
|
103
|
+
}
|
|
104
|
+
const tier = rel.properties.evidenceTier
|
|
105
|
+
const declaredMax = maxEvidenceLevel(rel.evidence.map(e => e.level))
|
|
106
|
+
if (rel.evidence.length > 0 && evidenceLevelRank(tier) > evidenceLevelRank(declaredMax)) {
|
|
107
|
+
issues.push(issue(RULE_ERROR_CODES.EVIDENCE_INSUFFICIENT, path,
|
|
108
|
+
`关系 ${rel.id} 声明证据档 ${tier} 高于其证据最高级别 ${declaredMax || '无'}`,
|
|
109
|
+
'error', '补足对应级别证据,或下调 evidenceTier'))
|
|
110
|
+
}
|
|
111
|
+
if ((rel.properties.gainPerUnit !== undefined || rel.properties.lagMs !== undefined) && tier !== 'validated_control') {
|
|
112
|
+
issues.push(issue(RULE_ERROR_CODES.EVIDENCE_INSUFFICIENT, path,
|
|
113
|
+
`关系 ${rel.id} 携带增益/时滞,但证据档为 ${tier}`,
|
|
114
|
+
'error', '增益与时滞只能来自受控验证(validated_control:run+crosscheck+outcome);否则请留空,仅作候选影响'))
|
|
115
|
+
}
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
// ---- 规则 ----
|
|
119
|
+
const ruleIds = new Set<string>()
|
|
120
|
+
const ruleKeys = new Set<string>()
|
|
121
|
+
doc.rules.forEach((rule, index) => {
|
|
122
|
+
const path = `rules[${index}]`
|
|
123
|
+
if (ruleIds.has(rule.id)) issues.push(issue(RULE_ERROR_CODES.INVALID, path, `规则 id「${rule.id}」重复`))
|
|
124
|
+
ruleIds.add(rule.id)
|
|
125
|
+
if (ruleKeys.has(rule.key)) issues.push(issue(RULE_ERROR_CODES.INVALID, path, `规则 key「${rule.key}」重复`))
|
|
126
|
+
ruleKeys.add(rule.key)
|
|
127
|
+
if (rule.kind !== rule.dsl.type) {
|
|
128
|
+
issues.push(issue(RULE_ERROR_CODES.INVALID, path,
|
|
129
|
+
`规则 ${rule.id} 的 kind(${rule.kind}) 与 dsl.type(${rule.dsl.type}) 不一致`,
|
|
130
|
+
'error', 'kind 决定编译形态,必须与 DSL 形态一致'))
|
|
131
|
+
}
|
|
132
|
+
for (const ref of ruleVariableRefs(rule)) {
|
|
133
|
+
if (!entityByKey.has(ref)) {
|
|
134
|
+
issues.push(issue(RULE_ERROR_CODES.UNKNOWN_ENTITY, path,
|
|
135
|
+
`规则 ${rule.id} 引用的实体「${ref}」不存在`, 'error', '先定义实体,或改用语义绑定后的平台变量', rule.id))
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const level = ruleEvidenceLevel(rule)
|
|
139
|
+
// 硬约束只约束「数值强制」形态(bound/rate/nonlinear);state_condition 与 interlock
|
|
140
|
+
// 分别落运行时守卫 / PLC 解释层,不改变数值可行域,因此不要求 validated_control。
|
|
141
|
+
const numericHard = rule.constraintLevel === 'hard' && (rule.dsl.type === 'bound' || rule.dsl.type === 'rate' || rule.dsl.type === 'nonlinear')
|
|
142
|
+
if (numericHard && level !== 'validated_control') {
|
|
143
|
+
issues.push(issue(RULE_ERROR_CODES.EVIDENCE_INSUFFICIENT, path,
|
|
144
|
+
`规则 ${rule.id} 要求硬约束,但证据最高级别为 ${level || '无'}`,
|
|
145
|
+
'error', '硬约束只接受 validated_control(run+crosscheck+outcome);否则降为 soft 或改为 guard', rule.id))
|
|
146
|
+
}
|
|
147
|
+
if (rule.dsl.type === 'bound' && rule.dsl.min !== undefined && rule.dsl.max !== undefined && rule.dsl.min > rule.dsl.max) {
|
|
148
|
+
issues.push(issue(RULE_ERROR_CODES.RULE_CONFLICT, path,
|
|
149
|
+
`规则 ${rule.id} 的界区间为空(min ${rule.dsl.min} > max ${rule.dsl.max})`, 'error', '检查上下限是否写反', rule.id))
|
|
150
|
+
}
|
|
151
|
+
if (rule.dsl.type === 'nonlinear') {
|
|
152
|
+
// 简单阈值形态可由运行时守卫执行;复杂表达式需后端支持
|
|
153
|
+
const simple = /^\s*[a-z][a-z0-9_.]*\s*(<=|>=|<|>|==|!=)\s*-?\d+(?:\.\d+)?\s*$/.test(rule.dsl.expression)
|
|
154
|
+
if (!simple) {
|
|
155
|
+
issues.push(issue(RULE_ERROR_CODES.UNSUPPORTED_FORM, path,
|
|
156
|
+
`规则 ${rule.id} 的非线性表达式无法由运行时守卫执行`,
|
|
157
|
+
'warning', '建议改写为「变量 比较 阈值」形式,或落到 PhysicsSpec 由求解器/孪生后端支持', rule.id))
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
// ---- 语义绑定(草稿期) ----
|
|
163
|
+
const bindingIds = new Set<string>()
|
|
164
|
+
const bindingTriples = new Set<string>()
|
|
165
|
+
doc.bindings.forEach((binding, index) => {
|
|
166
|
+
const path = `bindings[${index}]`
|
|
167
|
+
if (bindingIds.has(binding.id)) issues.push(issue(RULE_ERROR_CODES.INVALID, path, `绑定 id「${binding.id}」重复`))
|
|
168
|
+
bindingIds.add(binding.id)
|
|
169
|
+
const triple = `${binding.entityKey}|${binding.platformKind}|${binding.platformId}`
|
|
170
|
+
if (bindingTriples.has(triple)) {
|
|
171
|
+
issues.push(issue(RULE_ERROR_CODES.INVALID, path, `绑定重复(实体 ${binding.entityKey} → ${binding.platformKind}:${binding.platformId})`))
|
|
172
|
+
}
|
|
173
|
+
bindingTriples.add(triple)
|
|
174
|
+
const entity = entityByKey.get(binding.entityKey)
|
|
175
|
+
if (!entity) {
|
|
176
|
+
issues.push(issue(RULE_ERROR_CODES.UNKNOWN_ENTITY, path, `绑定 ${binding.id} 的实体「${binding.entityKey}」不存在`))
|
|
177
|
+
return
|
|
178
|
+
}
|
|
179
|
+
if (entity.unit && binding.unitDeclared && !unitsCompatible(entity.unit, binding.unitDeclared)) {
|
|
180
|
+
issues.push(issue(RULE_ERROR_CODES.UNIT_MISMATCH, path,
|
|
181
|
+
`绑定 ${binding.id} 的声明单位「${binding.unitDeclared}」与实体「${entity.key}」单位「${entity.unit}」量纲不相容`))
|
|
182
|
+
}
|
|
183
|
+
if (binding.unitDeclared && binding.unitTarget && !unitsCompatible(binding.unitDeclared, binding.unitTarget)) {
|
|
184
|
+
issues.push(issue(RULE_ERROR_CODES.UNIT_MISMATCH, path,
|
|
185
|
+
`绑定 ${binding.id} 的单位「${binding.unitDeclared}」与目标单位「${binding.unitTarget}」量纲不相容`))
|
|
186
|
+
}
|
|
187
|
+
if (!Number.isFinite(binding.scale) || binding.scale === 0) {
|
|
188
|
+
issues.push(issue(RULE_ERROR_CODES.INVALID, path, `绑定 ${binding.id} 的 scale 必须为非零有限数(禁止兜底)`))
|
|
189
|
+
}
|
|
190
|
+
if (binding.platformKind === 'daq_node' && binding.direction !== 'read') {
|
|
191
|
+
issues.push(issue(RULE_ERROR_CODES.INVALID, path,
|
|
192
|
+
`绑定 ${binding.id} 把数采节点声明为 ${binding.direction}`, 'warning',
|
|
193
|
+
'平台数采节点通常是只读通道;写入应绑定 dcw_node 或 recipe_param(活体校验会拒绝)'))
|
|
194
|
+
}
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
const byState: Record<string, number> = {}
|
|
198
|
+
for (const state of ONTOLOGY_STATES) byState[state] = 0
|
|
199
|
+
for (const rule of doc.rules) byState[rule.status] = (byState[rule.status] ?? 0) + 1
|
|
200
|
+
const byEvidence: Record<string, number> = { candidate_influence: 0, observed_correlation: 0, validated_control: 0 }
|
|
201
|
+
for (const rule of doc.rules) {
|
|
202
|
+
const level = ruleEvidenceLevel(rule)
|
|
203
|
+
if (level) byEvidence[level] = (byEvidence[level] ?? 0) + 1
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
ok: !issues.some(i => i.severity === 'error'),
|
|
208
|
+
issues,
|
|
209
|
+
stats: {
|
|
210
|
+
entities: doc.entities.length,
|
|
211
|
+
relations: doc.relations.length,
|
|
212
|
+
rules: doc.rules.length,
|
|
213
|
+
bindings: doc.bindings.length,
|
|
214
|
+
byState,
|
|
215
|
+
byEvidence,
|
|
216
|
+
},
|
|
217
|
+
}
|
|
218
|
+
}
|
|
@@ -111,6 +111,13 @@ export function createBindingRepo(db: DatabaseSync) {
|
|
|
111
111
|
return row?.revision ?? 0
|
|
112
112
|
},
|
|
113
113
|
|
|
114
|
+
/** 模型采纳重绑:绑定升到新 Profile 版本并 bump revision(在飞求解 BINDING_STALE 收敛)。 */
|
|
115
|
+
rebindVersion(id: string, toVersion: number): number {
|
|
116
|
+
const r = db.prepare('UPDATE optimizer_bindings SET profile_version = ?, revision = revision + 1, valid_from = ?, updated_at = ? WHERE id = ?')
|
|
117
|
+
.run(toVersion, new Date().toISOString(), new Date().toISOString(), id)
|
|
118
|
+
return Number(r.changes)
|
|
119
|
+
},
|
|
120
|
+
|
|
114
121
|
removeByAgent(channelAgentId: string): number {
|
|
115
122
|
const r = db.prepare('DELETE FROM optimizer_bindings WHERE channel_agent_id = ?').run(channelAgentId)
|
|
116
123
|
return Number(r.changes)
|
|
@@ -59,6 +59,8 @@ export interface OptimizationProfile {
|
|
|
59
59
|
id: string
|
|
60
60
|
version: number
|
|
61
61
|
name?: string
|
|
62
|
+
/** 人读描述:这个求解器配置代表什么工况/目标(Agent 可写,UI 展示) */
|
|
63
|
+
description?: string
|
|
62
64
|
modelRef: ModelRef
|
|
63
65
|
problemTemplateRef: ProblemTemplateRef
|
|
64
66
|
problemConfig: ProblemConfig
|
|
@@ -72,9 +74,23 @@ export interface OptimizationProfile {
|
|
|
72
74
|
ownerUserId?: string
|
|
73
75
|
/** 发布时冻结的问题结构 hash */
|
|
74
76
|
problemIrHash?: string
|
|
77
|
+
/**
|
|
78
|
+
* 本体引用摘要(发布时冻结):**进 profileContentHash,绝不进 problemIrHash**。
|
|
79
|
+
* 漂移比对走独立校验(ONTOLOGY_PACK_DRIFTED),避免本体演化把旧 Profile
|
|
80
|
+
* 全部打成 PROBLEM_IR_CHANGED(与 D1/D12 同因)。
|
|
81
|
+
*/
|
|
82
|
+
ontologyRefs?: OntologyRefSummary[]
|
|
75
83
|
createdAt?: string
|
|
76
84
|
}
|
|
77
85
|
|
|
86
|
+
export interface OntologyRefSummary {
|
|
87
|
+
ontologyId: string
|
|
88
|
+
ontologyVersion: number
|
|
89
|
+
contentHash?: string
|
|
90
|
+
rulePackHash?: string
|
|
91
|
+
guardCount?: number
|
|
92
|
+
}
|
|
93
|
+
|
|
78
94
|
export function assertProfileSolverCompatible(profile: Pick<OptimizationProfile, 'solverRef' | 'modelRef' | 'problemTemplateRef'>): void {
|
|
79
95
|
assertSolverSupportsArtifact(profile.solverRef, profile.modelRef.artifactKind, `profile model=${profile.modelRef.modelId}`)
|
|
80
96
|
if (profile.solverRef === 'osqp_mpc@1' && profile.problemTemplateRef !== 'linear_mpc_quadratic@1') {
|