agentworkshop 0.8.0 → 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 +123 -0
- package/.output/.AgentWorkShop/prompts/host-tools.json +123 -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/{DIFkTkdS.js → BkEokGX5.js} +1 -1
- 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/{62J4vljm.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/{BH8RvpVy.js → DWy0AjON.js} +1 -1
- 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-JQE.js → DdyE0ylS.js} +1 -1
- package/.output/public/_nuxt/DhLlTxQh2.js +1 -0
- package/.output/public/_nuxt/{CxVhG0Xx.js → DhW7cFOa.js} +1 -1
- 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/{DlcA9Gxl.js → eePbiWEh.js} +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/{DGrrucbG.js → zy7efYKR.js} +1 -1
- package/.output/server/chunks/_/data-export.mjs +5 -5
- package/.output/server/chunks/_/data-query.mjs +2 -2
- package/.output/server/chunks/_/eda-run.repo.mjs +2 -2
- package/.output/server/chunks/_/features.mjs +4 -4
- package/.output/server/chunks/_/golden.mjs +2 -2
- package/.output/server/chunks/_/index.mjs +1 -1
- package/.output/server/chunks/_/mes-console.mjs +1 -1
- package/.output/server/chunks/_/nitro.mjs +2149 -1520
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/_/spc.mjs +1 -1
- 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/{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-CJkOcmrm.mjs → default-CNWS6NUw.mjs} +4 -4
- package/.output/server/chunks/build/{default-CJkOcmrm.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-C3HS5pMo.mjs → ontology-DK0Mf0zT.mjs} +510 -81
- 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 +1 -1
- 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/aml/models/_id_.patch.mjs +7 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs +6 -6
- package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index.put.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 +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs +1 -1
- 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 +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/index.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs +8 -1
- package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/capabilities.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/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/tools/sync.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +2 -2
- package/.output/server/chunks/virtual/entry.mjs +92 -18
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/README-zh.md +5 -4
- package/README.md +6 -5
- 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/index.vue +318 -35
- package/app/pages/ontology/types.ts +42 -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 +26 -0
- package/i18n/locales/zh-CN.ts +26 -0
- package/mcp/aw-mcp-server.mjs +20 -2
- package/package.json +1 -1
- 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 +58 -4
- package/scripts/e2e-ontology-live.mjs +138 -3
- package/scripts/e2e-ontology.mjs +393 -328
- 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/sdk/context.mjs +6 -0
- package/sdk/index.d.mts +2 -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]/subgraph.ts +24 -0
- package/server/api/workshop/ontology/scene.ts +14 -1
- 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/host-tool-bridge/tools/industrial.ts +6 -3
- package/server/services/workshop/agents/industrial/aml-job-tools.ts +602 -569
- package/server/services/workshop/agents/industrial/grant-guard.ts +15 -1
- package/server/services/workshop/agents/industrial/index.ts +2 -2
- package/server/services/workshop/agents/industrial/ontology-tools.ts +66 -6
- package/server/services/workshop/agents/industrial/ops-tools.ts +54 -16
- package/server/services/workshop/agents/industrial/optimizer-tools.ts +2 -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/omp-agent/supervision-history.ts +38 -0
- package/server/services/workshop/agents/omp-agent/tools-steer.ts +18 -1
- package/server/services/workshop/aml/aml.repo.ts +16 -0
- package/server/services/workshop/daq/bus/index.ts +12 -5
- package/server/services/workshop/db/database/open.ts +97 -97
- package/server/services/workshop/db/database/schema.ts +1 -0
- package/server/services/workshop/ontology/autofix.ts +198 -0
- package/server/services/workshop/ontology/contracts.ts +3 -1
- package/server/services/workshop/ontology/index.ts +2 -0
- package/server/services/workshop/ontology/ontology.service.ts +46 -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/optimization/contracts.ts +2 -0
- package/server/services/workshop/optimization/profile-adopt.service.ts +5 -0
- package/server/services/workshop/optimization/profile.repo.ts +6 -4
- package/.output/public/_nuxt/B3Y5bCrM.js +0 -1
- package/.output/public/_nuxt/B8N8nsad2.js +0 -2
- package/.output/public/_nuxt/BO0BJx3w2.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/Byf4IxU2.js +0 -14
- 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/D0mzKkZr.js +0 -1
- package/.output/public/_nuxt/D3buuIkE.js +0 -1
- package/.output/public/_nuxt/D4_INWgq.js +0 -1
- package/.output/public/_nuxt/D5kCimyw2.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/Nw_6OpQZ.js +0 -1
- package/.output/public/_nuxt/Y4sMSPrS2.js +0 -1
- package/.output/public/_nuxt/aml.CeLxRzvI.css +0 -1
- package/.output/public/_nuxt/builds/meta/7a79a7e4-d691-4cf5-ae3a-3b01814479fb.json +0 -1
- package/.output/public/_nuxt/goF_oZHF.js +0 -2
- package/.output/public/_nuxt/ontology.QMGeh66l.css +0 -1
- package/.output/public/_nuxt/optimizer.B8gCbU1b.css +0 -1
- package/.output/public/_nuxt/rJ7To74v2.js +0 -1
- package/.output/server/chunks/build/ontology-C3HS5pMo.mjs.map +0 -1
- package/.output/server/chunks/build/optimizer-BOtGWEtc.mjs +0 -200
- package/.output/server/chunks/build/optimizer-BOtGWEtc.mjs.map +0 -1
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 打开/初始化数据库(PRAGMA、建表、种子、sqlite-vec)
|
|
3
|
-
* (由 server/services/workshop/db/database.ts 按职责拆出;内容逐行原文搬运)
|
|
4
|
-
*/
|
|
5
|
-
import type * as sqliteVec from 'sqlite-vec'
|
|
6
|
-
import { DatabaseSync } from 'node:sqlite'
|
|
7
|
-
import { SCHEMA_SQL } from './schema'
|
|
8
|
-
import { createRequire } from 'node:module'
|
|
9
|
-
import { migrateAddColumn, migrateAgentTeamExecutionLeaseColumns, migrateAgentTeamTaskGuardrailColumns, migrateAgentTeamTaskGuardrails, migrateAgentTeamTaskQueueColumns, migrateAmlChannelOptimizationColumns, migrateAmlModelIdentityColumns, migrateAnalysisEditColumns, migrateApprovalPayloadColumns, migrateAuditQueryIndexes, migrateAuditScopeColumn, migrateDropOwnerFks, migrateDualDriveColumns, migrateGroupChatV17, migrateLegacySchema, migrateMissingForeignKeys, migrateAmlTwinProviderColumns, migrateOptimizerFoundationColumns, migrateAgentTokenGraceColumns } from './migrations'
|
|
10
|
-
import { seedDefaultWorkshopData } from './seed'
|
|
11
|
-
|
|
12
|
-
export const require = createRequire(import.meta.url)
|
|
13
|
-
export function openWorkshopDb(path: string): DatabaseSync {
|
|
14
|
-
// allowExtension + 尝试加载 sqlite-vec(向量检索);失败静默降级纯 FTS(受控环境可能禁扩展)
|
|
15
|
-
const db = new DatabaseSync(path, { allowExtension: true })
|
|
16
|
-
// busy_timeout:retention/backup 等第二连接持写锁时,主连接等待而非立即 SQLITE_BUSY
|
|
17
|
-
db.exec('PRAGMA busy_timeout = 5000')
|
|
18
|
-
try {
|
|
19
|
-
const { getLoadablePath } = require('sqlite-vec') as typeof sqliteVec
|
|
20
|
-
db.loadExtension(getLoadablePath())
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
// 扩展不可用:记忆系统自动退化为 FTS-only(vecInit 将失败并禁用向量)
|
|
24
|
-
}
|
|
25
|
-
initWorkshopDb(db)
|
|
26
|
-
return db
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** 对已打开的库执行初始化:WAL + 外键约束 + 建表 + 增量迁移 */
|
|
30
|
-
export function initWorkshopDb(db: DatabaseSync): void {
|
|
31
|
-
db.exec('PRAGMA journal_mode = WAL;')
|
|
32
|
-
// S6:synchronous=NORMAL(WAL 推荐档)——与 TSDB 仿真库对齐;断电最多丢最后一个事务,不损坏库
|
|
33
|
-
db.exec('PRAGMA synchronous = NORMAL;')
|
|
34
|
-
db.exec('PRAGMA foreign_keys = ON;')
|
|
35
|
-
db.exec(SCHEMA_SQL)
|
|
36
|
-
// Add guardrail metadata before any legacy tasks-table rebuild so values can be copied safely.
|
|
37
|
-
migrateAgentTeamTaskGuardrailColumns(db)
|
|
38
|
-
migrateAgentTeamTaskQueueColumns(db)
|
|
39
|
-
migrateLegacySchema(db)
|
|
40
|
-
migrateAddColumn(db, 'channels', 'scenario_prompt', 'TEXT NOT NULL DEFAULT \'\'')
|
|
41
|
-
// v11:channel 级默认 LLM(四引擎统一注入面;成员 config 显式指定时优先)
|
|
42
|
-
migrateAddColumn(db, 'channels', 'llm_json', 'TEXT NOT NULL DEFAULT \'\'')
|
|
43
|
-
// 派发路由理由(koda RouteDecision 借鉴):lead 派发留痕"为什么派给他",供审计与前端呈现
|
|
44
|
-
migrateAddColumn(db, 'tasks', 'route_reason', 'TEXT NOT NULL DEFAULT \'\'')
|
|
45
|
-
// v10:模板可见性列(既有库补列;默认 private,仅属主可见)
|
|
46
|
-
migrateAddColumn(db, 'agents', 'visibility', 'TEXT NOT NULL DEFAULT \'private\'')
|
|
47
|
-
migrateAddColumn(db, 'teams', 'visibility', 'TEXT NOT NULL DEFAULT \'private\'')
|
|
48
|
-
// 回填:内置/遗留公共模板(owner NULL)强制 public —— 升级后保持全员可读可用
|
|
49
|
-
db.exec('UPDATE agents SET visibility = \'public\' WHERE owner_user_id IS NULL')
|
|
50
|
-
db.exec('UPDATE teams SET visibility = \'public\' WHERE owner_user_id IS NULL')
|
|
51
|
-
// 运维日志(OpsLog)维度列:既有库补列(新库由上方 DDL 直建)
|
|
52
|
-
migrateAddColumn(db, 'audit_log', 'line_id', 'TEXT NOT NULL DEFAULT \'\'')
|
|
53
|
-
migrateAddColumn(db, 'audit_log', 'product_id', 'TEXT NOT NULL DEFAULT \'\'')
|
|
54
|
-
migrateAddColumn(db, 'audit_log', 'recipe_id', 'TEXT NOT NULL DEFAULT \'\'')
|
|
55
|
-
migrateAddColumn(db, 'audit_log', 'kind', 'TEXT NOT NULL DEFAULT \'\'')
|
|
56
|
-
migrateAddColumn(db, 'audit_log', 'summary', 'TEXT NOT NULL DEFAULT \'\'')
|
|
57
|
-
// 2026-10-08 写控 ACK 鉴定:严重级列(info/warn/error;既有库补列,历史行按 info 语义)
|
|
58
|
-
migrateAddColumn(db, 'audit_log', 'level', 'TEXT NOT NULL DEFAULT \'info\'')
|
|
59
|
-
// 2026-10-19 产线日志显式域标识(scope=line|system;老库按 line_id 回填并强制不变量)
|
|
60
|
-
migrateAuditScopeColumn(db)
|
|
61
|
-
// 2026-10-19 产线日志查询索引(必须在补列之后:老库缺列时建索引会中断初始化)
|
|
62
|
-
migrateAuditQueryIndexes(db)
|
|
63
|
-
migrateMissingForeignKeys(db)
|
|
64
|
-
// Run after legacy task-table rebuilds so guardrail metadata and its index survive upgrades.
|
|
65
|
-
migrateAgentTeamTaskQueueColumns(db)
|
|
66
|
-
migrateAgentTeamExecutionLeaseColumns(db)
|
|
67
|
-
migrateAgentTeamTaskGuardrails(db)
|
|
68
|
-
migrateDropOwnerFks(db)
|
|
69
|
-
migrateGroupChatV17(db)
|
|
70
|
-
migrateAmlTwinProviderColumns(db)
|
|
71
|
-
migrateAmlModelIdentityColumns(db)
|
|
72
|
-
migrateAmlChannelOptimizationColumns(db)
|
|
73
|
-
// 产线 Co-Pilot P2:审批历史结构化载荷列(payload_json/choice;既有库补列,新库 DDL 已含)
|
|
74
|
-
migrateApprovalPayloadColumns(db)
|
|
75
|
-
// v27:数据分析报告人工修订列(updated_*;既有库补列,新库 DDL 已含)
|
|
76
|
-
migrateAnalysisEditColumns(db)
|
|
77
|
-
// v29:Optimizer/Process Model 地基列(工件类型判别、谱系引用、legacy 标记)
|
|
78
|
-
migrateOptimizerFoundationColumns(db)
|
|
79
|
-
// v30:双驱动收敛列(下发状态机/谱系/多工况 hash/资格谱系;总计划 SW2–SW5)
|
|
80
|
-
migrateDualDriveColumns(db)
|
|
81
|
-
// v31(WP3):agent token 轮换宽限列(prev_token/prev_token_until;既有库补列)
|
|
82
|
-
migrateAgentTokenGraceColumns(db)
|
|
83
|
-
// v32(ONT):Profile 冻结本体引用摘要(缺省 [] = 无本体约束域;只前滚,不回填)
|
|
84
|
-
migrateAddColumn(db, 'optimizer_profiles', 'ontology_refs_json', 'TEXT NOT NULL DEFAULT \'[]\'')
|
|
85
|
-
seedDefaultWorkshopData(db)
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* v17 迁移:群聊/成员/HITL 相关列与不变量回填。
|
|
90
|
-
*
|
|
91
|
-
* 规则(主计划 §3.1 / §13.7):
|
|
92
|
-
* - 既有 owner 非 NULL 的 Channel 一律 private + owner_approve + owner_only + chat_enabled=0,
|
|
93
|
-
* 即**默认不改变任何既有可见性/权限行为**。
|
|
94
|
-
* - owner 为 NULL 的遗留 Channel 同样保持 private + chat_enabled=0:不能被自动变成公开群聊;
|
|
95
|
-
* 必须由 admin 显式认领(写 owner_user_id)后再由 owner 开启群聊。
|
|
96
|
-
* - 每个 owner 非 NULL 的 Channel 必须恰好一条 active owner 成员记录(缺失则补写)。
|
|
97
|
-
*/
|
|
1
|
+
/**
|
|
2
|
+
* 打开/初始化数据库(PRAGMA、建表、种子、sqlite-vec)
|
|
3
|
+
* (由 server/services/workshop/db/database.ts 按职责拆出;内容逐行原文搬运)
|
|
4
|
+
*/
|
|
5
|
+
import type * as sqliteVec from 'sqlite-vec'
|
|
6
|
+
import { DatabaseSync } from 'node:sqlite'
|
|
7
|
+
import { SCHEMA_SQL } from './schema'
|
|
8
|
+
import { createRequire } from 'node:module'
|
|
9
|
+
import { migrateAddColumn, migrateAgentTeamExecutionLeaseColumns, migrateAgentTeamTaskGuardrailColumns, migrateAgentTeamTaskGuardrails, migrateAgentTeamTaskQueueColumns, migrateAmlChannelOptimizationColumns, migrateAmlModelIdentityColumns, migrateAnalysisEditColumns, migrateApprovalPayloadColumns, migrateAuditQueryIndexes, migrateAuditScopeColumn, migrateDropOwnerFks, migrateDualDriveColumns, migrateGroupChatV17, migrateLegacySchema, migrateMissingForeignKeys, migrateAmlTwinProviderColumns, migrateOptimizerFoundationColumns, migrateAgentTokenGraceColumns } from './migrations'
|
|
10
|
+
import { seedDefaultWorkshopData } from './seed'
|
|
11
|
+
|
|
12
|
+
export const require = createRequire(import.meta.url)
|
|
13
|
+
export function openWorkshopDb(path: string): DatabaseSync {
|
|
14
|
+
// allowExtension + 尝试加载 sqlite-vec(向量检索);失败静默降级纯 FTS(受控环境可能禁扩展)
|
|
15
|
+
const db = new DatabaseSync(path, { allowExtension: true })
|
|
16
|
+
// busy_timeout:retention/backup 等第二连接持写锁时,主连接等待而非立即 SQLITE_BUSY
|
|
17
|
+
db.exec('PRAGMA busy_timeout = 5000')
|
|
18
|
+
try {
|
|
19
|
+
const { getLoadablePath } = require('sqlite-vec') as typeof sqliteVec
|
|
20
|
+
db.loadExtension(getLoadablePath())
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// 扩展不可用:记忆系统自动退化为 FTS-only(vecInit 将失败并禁用向量)
|
|
24
|
+
}
|
|
25
|
+
initWorkshopDb(db)
|
|
26
|
+
return db
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** 对已打开的库执行初始化:WAL + 外键约束 + 建表 + 增量迁移 */
|
|
30
|
+
export function initWorkshopDb(db: DatabaseSync): void {
|
|
31
|
+
db.exec('PRAGMA journal_mode = WAL;')
|
|
32
|
+
// S6:synchronous=NORMAL(WAL 推荐档)——与 TSDB 仿真库对齐;断电最多丢最后一个事务,不损坏库
|
|
33
|
+
db.exec('PRAGMA synchronous = NORMAL;')
|
|
34
|
+
db.exec('PRAGMA foreign_keys = ON;')
|
|
35
|
+
db.exec(SCHEMA_SQL)
|
|
36
|
+
// Add guardrail metadata before any legacy tasks-table rebuild so values can be copied safely.
|
|
37
|
+
migrateAgentTeamTaskGuardrailColumns(db)
|
|
38
|
+
migrateAgentTeamTaskQueueColumns(db)
|
|
39
|
+
migrateLegacySchema(db)
|
|
40
|
+
migrateAddColumn(db, 'channels', 'scenario_prompt', 'TEXT NOT NULL DEFAULT \'\'')
|
|
41
|
+
// v11:channel 级默认 LLM(四引擎统一注入面;成员 config 显式指定时优先)
|
|
42
|
+
migrateAddColumn(db, 'channels', 'llm_json', 'TEXT NOT NULL DEFAULT \'\'')
|
|
43
|
+
// 派发路由理由(koda RouteDecision 借鉴):lead 派发留痕"为什么派给他",供审计与前端呈现
|
|
44
|
+
migrateAddColumn(db, 'tasks', 'route_reason', 'TEXT NOT NULL DEFAULT \'\'')
|
|
45
|
+
// v10:模板可见性列(既有库补列;默认 private,仅属主可见)
|
|
46
|
+
migrateAddColumn(db, 'agents', 'visibility', 'TEXT NOT NULL DEFAULT \'private\'')
|
|
47
|
+
migrateAddColumn(db, 'teams', 'visibility', 'TEXT NOT NULL DEFAULT \'private\'')
|
|
48
|
+
// 回填:内置/遗留公共模板(owner NULL)强制 public —— 升级后保持全员可读可用
|
|
49
|
+
db.exec('UPDATE agents SET visibility = \'public\' WHERE owner_user_id IS NULL')
|
|
50
|
+
db.exec('UPDATE teams SET visibility = \'public\' WHERE owner_user_id IS NULL')
|
|
51
|
+
// 运维日志(OpsLog)维度列:既有库补列(新库由上方 DDL 直建)
|
|
52
|
+
migrateAddColumn(db, 'audit_log', 'line_id', 'TEXT NOT NULL DEFAULT \'\'')
|
|
53
|
+
migrateAddColumn(db, 'audit_log', 'product_id', 'TEXT NOT NULL DEFAULT \'\'')
|
|
54
|
+
migrateAddColumn(db, 'audit_log', 'recipe_id', 'TEXT NOT NULL DEFAULT \'\'')
|
|
55
|
+
migrateAddColumn(db, 'audit_log', 'kind', 'TEXT NOT NULL DEFAULT \'\'')
|
|
56
|
+
migrateAddColumn(db, 'audit_log', 'summary', 'TEXT NOT NULL DEFAULT \'\'')
|
|
57
|
+
// 2026-10-08 写控 ACK 鉴定:严重级列(info/warn/error;既有库补列,历史行按 info 语义)
|
|
58
|
+
migrateAddColumn(db, 'audit_log', 'level', 'TEXT NOT NULL DEFAULT \'info\'')
|
|
59
|
+
// 2026-10-19 产线日志显式域标识(scope=line|system;老库按 line_id 回填并强制不变量)
|
|
60
|
+
migrateAuditScopeColumn(db)
|
|
61
|
+
// 2026-10-19 产线日志查询索引(必须在补列之后:老库缺列时建索引会中断初始化)
|
|
62
|
+
migrateAuditQueryIndexes(db)
|
|
63
|
+
migrateMissingForeignKeys(db)
|
|
64
|
+
// Run after legacy task-table rebuilds so guardrail metadata and its index survive upgrades.
|
|
65
|
+
migrateAgentTeamTaskQueueColumns(db)
|
|
66
|
+
migrateAgentTeamExecutionLeaseColumns(db)
|
|
67
|
+
migrateAgentTeamTaskGuardrails(db)
|
|
68
|
+
migrateDropOwnerFks(db)
|
|
69
|
+
migrateGroupChatV17(db)
|
|
70
|
+
migrateAmlTwinProviderColumns(db)
|
|
71
|
+
migrateAmlModelIdentityColumns(db)
|
|
72
|
+
migrateAmlChannelOptimizationColumns(db)
|
|
73
|
+
// 产线 Co-Pilot P2:审批历史结构化载荷列(payload_json/choice;既有库补列,新库 DDL 已含)
|
|
74
|
+
migrateApprovalPayloadColumns(db)
|
|
75
|
+
// v27:数据分析报告人工修订列(updated_*;既有库补列,新库 DDL 已含)
|
|
76
|
+
migrateAnalysisEditColumns(db)
|
|
77
|
+
// v29:Optimizer/Process Model 地基列(工件类型判别、谱系引用、legacy 标记)
|
|
78
|
+
migrateOptimizerFoundationColumns(db)
|
|
79
|
+
// v30:双驱动收敛列(下发状态机/谱系/多工况 hash/资格谱系;总计划 SW2–SW5)
|
|
80
|
+
migrateDualDriveColumns(db)
|
|
81
|
+
// v31(WP3):agent token 轮换宽限列(prev_token/prev_token_until;既有库补列)
|
|
82
|
+
migrateAgentTokenGraceColumns(db)
|
|
83
|
+
// v32(ONT):Profile 冻结本体引用摘要(缺省 [] = 无本体约束域;只前滚,不回填)
|
|
84
|
+
migrateAddColumn(db, 'optimizer_profiles', 'ontology_refs_json', 'TEXT NOT NULL DEFAULT \'[]\'')
|
|
85
|
+
seedDefaultWorkshopData(db)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* v17 迁移:群聊/成员/HITL 相关列与不变量回填。
|
|
90
|
+
*
|
|
91
|
+
* 规则(主计划 §3.1 / §13.7):
|
|
92
|
+
* - 既有 owner 非 NULL 的 Channel 一律 private + owner_approve + owner_only + chat_enabled=0,
|
|
93
|
+
* 即**默认不改变任何既有可见性/权限行为**。
|
|
94
|
+
* - owner 为 NULL 的遗留 Channel 同样保持 private + chat_enabled=0:不能被自动变成公开群聊;
|
|
95
|
+
* 必须由 admin 显式认领(写 owner_user_id)后再由 owner 开启群聊。
|
|
96
|
+
* - 每个 owner 非 NULL 的 Channel 必须恰好一条 active owner 成员记录(缺失则补写)。
|
|
97
|
+
*/
|
|
@@ -896,6 +896,7 @@ CREATE TABLE IF NOT EXISTS optimizer_profiles (
|
|
|
896
896
|
id TEXT NOT NULL,
|
|
897
897
|
version INTEGER NOT NULL DEFAULT 1,
|
|
898
898
|
name TEXT NOT NULL DEFAULT '',
|
|
899
|
+
description TEXT NOT NULL DEFAULT '',
|
|
899
900
|
model_ref TEXT NOT NULL,
|
|
900
901
|
model_artifact_hash TEXT NOT NULL DEFAULT '',
|
|
901
902
|
model_artifact_kind TEXT NOT NULL DEFAULT '',
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本体草稿自动修复 —— 只做「安全、确定、幂等」的规范化,绝不伪造证据。
|
|
3
|
+
*
|
|
4
|
+
* 可自动修复(修复后有 fix 记录):
|
|
5
|
+
* 1. DOC_DESCRIPTION / ENTITY_DESCRIPTION / RULE_DESCRIPTION:补人读描述,
|
|
6
|
+
* 让 Agent 与用户一眼看出这个模型代表什么;
|
|
7
|
+
* 2. ENTITY_DIMENSION:量纲跟随单位(复合/未知单位不强行声明量纲,避免误配);
|
|
8
|
+
* 3. SCOPE_LINE:B 规则/绑定作用域回填文档产线;
|
|
9
|
+
* 4. BINDING_UNIT / BINDING_SCALE:绑定声明单位回填实体单位;scale=0 归一为 1;
|
|
10
|
+
* 5. ORPHAN_RELATION / ORPHAN_BINDING:悬空引用(实体不存在)确定性移除;
|
|
11
|
+
* 6. DUPLICATE_ID:完全重复的项去重;同 id 不同内容追加 `-dupN` 后缀保留两份;
|
|
12
|
+
* 7. RULE_STATUS_DOWNGRADE:证据未达 validated_control 的硬约束(bound/rate/nonlinear)
|
|
13
|
+
* 不允许停在 approved_for_control —— 回退到 validated(证据不可自动伪造)。
|
|
14
|
+
*
|
|
15
|
+
* 不作为自动修复(仍需人/Agent 补真实信息,由 validator 报告):
|
|
16
|
+
* - 证据缺失/级别不足(需真实数据或专家记录);
|
|
17
|
+
* - 未知实体引用之外的语义冲突(RULE_CONFLICT);
|
|
18
|
+
* - 平台侧绑定漂移(节点/配方不存在、单位与真实对象不符)。
|
|
19
|
+
*/
|
|
20
|
+
import { dimensionOf } from '@/shared/dimensions'
|
|
21
|
+
import { validateDraftDoc } from './validator'
|
|
22
|
+
import type { OntologyDraftDoc, OntologyEntity, OntologyRule } from './contracts'
|
|
23
|
+
|
|
24
|
+
export interface OntologyAutoFix {
|
|
25
|
+
code: string
|
|
26
|
+
path: string
|
|
27
|
+
message: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface AutoFixOutcome {
|
|
31
|
+
doc: OntologyDraftDoc
|
|
32
|
+
fixes: OntologyAutoFix[]
|
|
33
|
+
/** 修复后的校验结论(便于调用方一次看清还剩什么) */
|
|
34
|
+
validation: ReturnType<typeof validateDraftDoc>
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const EVIDENCE_RANK: Record<string, number> = {
|
|
38
|
+
candidate_influence: 0,
|
|
39
|
+
observed_correlation: 1,
|
|
40
|
+
validated_control: 2,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const CONTROL_HARD_KINDS = new Set(['bound', 'rate', 'nonlinear'])
|
|
44
|
+
|
|
45
|
+
function bestEvidenceLevel(rule: OntologyRule): string {
|
|
46
|
+
return rule.evidence.reduce((best, item) => (
|
|
47
|
+
(EVIDENCE_RANK[item.level] ?? 0) > (EVIDENCE_RANK[best] ?? 0) ? item.level : best
|
|
48
|
+
), 'candidate_influence')
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function ruleDescription(rule: OntologyRule): string {
|
|
52
|
+
const dsl = rule.dsl
|
|
53
|
+
switch (dsl.type) {
|
|
54
|
+
case 'bound': {
|
|
55
|
+
const range = [dsl.min != null ? `≥${dsl.min}` : '', dsl.max != null ? `≤${dsl.max}` : ''].filter(Boolean).join(' 且 ')
|
|
56
|
+
return `${dsl.variableKey} 界限${range ? `(${range}${dsl.unit ? ` ${dsl.unit}` : ''})` : ''}`
|
|
57
|
+
}
|
|
58
|
+
case 'rate':
|
|
59
|
+
return `${dsl.variableKey} 变化率上限 ${dsl.maxStep}${dsl.unit ? ` ${dsl.unit}` : ''}/步`
|
|
60
|
+
case 'state_condition':
|
|
61
|
+
return dsl.message?.trim() || `当 ${dsl.when.variableKey} ${dsl.when.op} ${dsl.when.value} 时禁止 ${dsl.forbid.variableKey} 增量`
|
|
62
|
+
case 'interlock':
|
|
63
|
+
return dsl.text
|
|
64
|
+
case 'linear_coupling':
|
|
65
|
+
return `${dsl.variableKey} 线性耦合于 ${dsl.ofKey}`
|
|
66
|
+
case 'nonlinear':
|
|
67
|
+
return `${dsl.variableKey} 非线性约束:${dsl.expression}`
|
|
68
|
+
default:
|
|
69
|
+
return dsl.text
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function entityDimension(entity: OntologyEntity): string {
|
|
74
|
+
const computed = dimensionOf(entity.unit)
|
|
75
|
+
// 复合/未知单位自成一域(如 mm/s),不强行声明量纲 —— 留空表示「不主张相容性」
|
|
76
|
+
if (computed.startsWith('compound:') || computed.startsWith('unit:')) return ''
|
|
77
|
+
return computed
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function scopeLineOf(doc: OntologyDraftDoc): string {
|
|
81
|
+
return String(doc.lineId ?? '').trim()
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** 修复本体草稿(纯函数;返回新对象,不修改入参) */
|
|
85
|
+
export function autoFixDraftDoc(input: OntologyDraftDoc): AutoFixOutcome {
|
|
86
|
+
const doc: OntologyDraftDoc = JSON.parse(JSON.stringify(input)) as OntologyDraftDoc
|
|
87
|
+
const fixes: OntologyAutoFix[] = []
|
|
88
|
+
const lineId = scopeLineOf(doc)
|
|
89
|
+
|
|
90
|
+
// ── 1. 文档描述 ──
|
|
91
|
+
if (!String(doc.description ?? '').trim()) {
|
|
92
|
+
doc.description = `${doc.name}${lineId ? `(产线 ${lineId})` : '(全局本体)'} —— 实体 ${doc.entities.length} / 关系 ${doc.relations.length} / 规则 ${doc.rules.length} / 绑定 ${doc.bindings.length}`
|
|
93
|
+
fixes.push({ code: 'DOC_DESCRIPTION', path: 'description', message: '补写文档描述(供 Agent 与用户理解模型含义)' })
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ── 2. 实体:描述 + 量纲 ──
|
|
97
|
+
doc.entities = doc.entities.map((entity, index) => {
|
|
98
|
+
const next = { ...entity }
|
|
99
|
+
if (!String(next.description ?? '').trim()) {
|
|
100
|
+
next.description = next.name
|
|
101
|
+
fixes.push({ code: 'ENTITY_DESCRIPTION', path: `entities[${index}]`, message: `实体「${next.key}」补描述为名称` })
|
|
102
|
+
}
|
|
103
|
+
const dimension = entityDimension(next)
|
|
104
|
+
if ((next.dimension ?? '') !== dimension) {
|
|
105
|
+
fixes.push({ code: 'ENTITY_DIMENSION', path: `entities[${entity.key}]`, message: `量纲「${next.dimension || '空'}」→「${dimension || '空'}」(跟随单位 ${next.unit || '无量纲'})` })
|
|
106
|
+
next.dimension = dimension
|
|
107
|
+
}
|
|
108
|
+
return next
|
|
109
|
+
})
|
|
110
|
+
const entityKeys = new Set(doc.entities.map(e => e.key))
|
|
111
|
+
const entityByKey = new Map(doc.entities.map(e => [e.key, e]))
|
|
112
|
+
|
|
113
|
+
// ── 3. 关系:悬空引用移除 + 去重 ──
|
|
114
|
+
const relationIds = new Map<string, number>()
|
|
115
|
+
doc.relations = doc.relations.filter((relation, index) => {
|
|
116
|
+
if (!entityKeys.has(relation.srcKey) || !entityKeys.has(relation.dstKey)) {
|
|
117
|
+
fixes.push({ code: 'ORPHAN_RELATION', path: `relations[${index}]`, message: `关系「${relation.id}」引用不存在的实体,已移除` })
|
|
118
|
+
return false
|
|
119
|
+
}
|
|
120
|
+
const seen = relationIds.get(relation.id)
|
|
121
|
+
if (seen != null) {
|
|
122
|
+
const first = doc.relations[seen]
|
|
123
|
+
if (JSON.stringify(first) === JSON.stringify(relation)) {
|
|
124
|
+
fixes.push({ code: 'DUPLICATE_ID', path: `relations[${index}]`, message: `关系「${relation.id}」完全重复,已去重` })
|
|
125
|
+
return false
|
|
126
|
+
}
|
|
127
|
+
relation.id = `${relation.id}-dup${index}`
|
|
128
|
+
fixes.push({ code: 'DUPLICATE_ID', path: `relations[${index}]`, message: `关系 id 冲突,已改为「${relation.id}」保留两份` })
|
|
129
|
+
}
|
|
130
|
+
relationIds.set(relation.id, index)
|
|
131
|
+
return true
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
// ── 4. 规则:描述/作用域/状态回退 ──
|
|
135
|
+
doc.rules = doc.rules.map((rule, index) => {
|
|
136
|
+
const next = { ...rule, scope: { ...rule.scope } }
|
|
137
|
+
if (!String(next.description ?? '').trim()) {
|
|
138
|
+
next.description = ruleDescription(next)
|
|
139
|
+
fixes.push({ code: 'RULE_DESCRIPTION', path: `rules[${index}]`, message: `规则「${next.id}」补描述` })
|
|
140
|
+
}
|
|
141
|
+
if (lineId && !String(next.scope.lineId ?? '').trim()) {
|
|
142
|
+
next.scope.lineId = lineId
|
|
143
|
+
fixes.push({ code: 'SCOPE_LINE', path: `rules[${index}]`, message: `规则「${next.id}」作用域回填产线 ${lineId}` })
|
|
144
|
+
}
|
|
145
|
+
if (next.status === 'approved_for_control' && CONTROL_HARD_KINDS.has(`${next.kind}`)) {
|
|
146
|
+
const level = bestEvidenceLevel(next)
|
|
147
|
+
if ((EVIDENCE_RANK[level] ?? 0) < (EVIDENCE_RANK.validated_control ?? 2)) {
|
|
148
|
+
next.status = 'validated'
|
|
149
|
+
fixes.push({ code: 'RULE_STATUS_DOWNGRADE', path: `rules[${index}]`, message: `规则「${next.id}」证据级别 ${level} 不足控制级,状态回退为 validated(证据不可自动伪造)` })
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return next
|
|
153
|
+
})
|
|
154
|
+
|
|
155
|
+
// ── 5. 绑定:悬空移除 / 单位回填 / scale 归一 / 作用域 ──
|
|
156
|
+
const bindingIds = new Map<string, number>()
|
|
157
|
+
doc.bindings = doc.bindings.filter((binding, index) => {
|
|
158
|
+
if (!entityKeys.has(binding.entityKey)) {
|
|
159
|
+
fixes.push({ code: 'ORPHAN_BINDING', path: `bindings[${index}]`, message: `绑定「${binding.id}」引用的实体不存在,已移除` })
|
|
160
|
+
return false
|
|
161
|
+
}
|
|
162
|
+
const seen = bindingIds.get(binding.id)
|
|
163
|
+
if (seen != null) {
|
|
164
|
+
const first = doc.bindings[seen]
|
|
165
|
+
if (JSON.stringify(first) === JSON.stringify(binding)) {
|
|
166
|
+
fixes.push({ code: 'DUPLICATE_ID', path: `bindings[${index}]`, message: `绑定「${binding.id}」完全重复,已去重` })
|
|
167
|
+
return false
|
|
168
|
+
}
|
|
169
|
+
binding.id = `${binding.id}-dup${index}`
|
|
170
|
+
fixes.push({ code: 'DUPLICATE_ID', path: `bindings[${index}]`, message: `绑定 id 冲突,已改为「${binding.id}」保留两份` })
|
|
171
|
+
}
|
|
172
|
+
bindingIds.set(binding.id, index)
|
|
173
|
+
return true
|
|
174
|
+
}).map((binding, index) => {
|
|
175
|
+
const next = { ...binding }
|
|
176
|
+
const entity = entityByKey.get(next.entityKey)
|
|
177
|
+
const unit = String(entity?.unit ?? '').trim()
|
|
178
|
+
if (unit && !String(next.unitDeclared ?? '').trim()) {
|
|
179
|
+
next.unitDeclared = unit
|
|
180
|
+
fixes.push({ code: 'BINDING_UNIT', path: `bindings[${index}]`, message: `绑定「${next.id}」声明单位回填 ${unit}` })
|
|
181
|
+
}
|
|
182
|
+
if (unit && !String(next.unitTarget ?? '').trim()) {
|
|
183
|
+
next.unitTarget = unit
|
|
184
|
+
fixes.push({ code: 'BINDING_UNIT', path: `bindings[${index}]`, message: `绑定「${next.id}」目标单位回填 ${unit}` })
|
|
185
|
+
}
|
|
186
|
+
if (!Number.isFinite(next.scale) || next.scale === 0) {
|
|
187
|
+
next.scale = 1
|
|
188
|
+
fixes.push({ code: 'BINDING_SCALE', path: `bindings[${index}]`, message: `绑定「${next.id}」scale 非法,归一为 1` })
|
|
189
|
+
}
|
|
190
|
+
if (lineId && (!String(next.scope ?? '').trim() || String(next.scope).trim() === 'global')) {
|
|
191
|
+
next.scope = `line:${lineId}`
|
|
192
|
+
fixes.push({ code: 'SCOPE_LINE', path: `bindings[${index}]`, message: `绑定「${next.id}」作用域回填 line:${lineId}` })
|
|
193
|
+
}
|
|
194
|
+
return next
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
return { doc, fixes, validation: validateDraftDoc(doc) }
|
|
198
|
+
}
|
|
@@ -252,6 +252,8 @@ export type BindingDraft = z.infer<typeof bindingDraftSchema>
|
|
|
252
252
|
export const ontologyDraftDocSchema = z.object({
|
|
253
253
|
schemaVersion: z.literal(ONTOLOGY_SCHEMA_VERSION),
|
|
254
254
|
name: z.string().min(1).max(200),
|
|
255
|
+
/** 人读描述:这个本体代表哪段工况、约束什么(Agent 可写,autofix 会补默认值) */
|
|
256
|
+
description: z.string().max(2000).default(''),
|
|
255
257
|
/** 授权锚;空 = 全局本体(仅 admin 可发布) */
|
|
256
258
|
lineId: z.string().max(120).default(''),
|
|
257
259
|
entities: z.array(ontologyEntitySchema).default([]),
|
|
@@ -263,7 +265,7 @@ export const ontologyDraftDocSchema = z.object({
|
|
|
263
265
|
export type OntologyDraftDoc = z.infer<typeof ontologyDraftDocSchema>
|
|
264
266
|
|
|
265
267
|
export function emptyDraftDoc(ontologyId: string, lineId = ''): OntologyDraftDoc {
|
|
266
|
-
return { schemaVersion: ONTOLOGY_SCHEMA_VERSION, name: ontologyId, lineId, entities: [], relations: [], rules: [], bindings: [], note: '' }
|
|
268
|
+
return { schemaVersion: ONTOLOGY_SCHEMA_VERSION, name: ontologyId, description: '', lineId, entities: [], relations: [], rules: [], bindings: [], note: '' }
|
|
267
269
|
}
|
|
268
270
|
|
|
269
271
|
export function parseDraftDoc(value: unknown): OntologyDraftDoc {
|
|
@@ -43,6 +43,7 @@ import {
|
|
|
43
43
|
} from './repo'
|
|
44
44
|
import { detectBindingDrift, validateDraftBindings } from './semantic-binding.service'
|
|
45
45
|
import { getDcwController } from '../dcw/dcw-controller'
|
|
46
|
+
import { autoFixDraftDoc, type OntologyAutoFix } from './autofix'
|
|
46
47
|
import { validateDraftDoc, type DraftValidationReport } from './validator'
|
|
47
48
|
|
|
48
49
|
export interface Actor {
|
|
@@ -185,6 +186,7 @@ function cloneVersionDoc(version: VersionRow): OntologyDraftDoc {
|
|
|
185
186
|
return {
|
|
186
187
|
schemaVersion: ONTOLOGY_SCHEMA_VERSION,
|
|
187
188
|
name: version.name || version.id,
|
|
189
|
+
description: '',
|
|
188
190
|
lineId: version.lineId,
|
|
189
191
|
entities,
|
|
190
192
|
relations,
|
|
@@ -272,6 +274,50 @@ export function deleteDraft(draftId: string, actor: Actor): void {
|
|
|
272
274
|
log({ ontologyId: draft.ontologyId, action: 'draft.delete', actor, detail: { draftId } })
|
|
273
275
|
}
|
|
274
276
|
|
|
277
|
+
/**
|
|
278
|
+
* 自动修复草稿(Agent 工具与 UI「自动修复」共用):
|
|
279
|
+
* 与 updateDraft 同一写路径(乐观锁 rev + 审计),区别有两点:
|
|
280
|
+
* - strictBindings=false:平台侧绑定漂移不阻塞文档内安全修复的落库;
|
|
281
|
+
* - 允许「部分修复」落库:自动修复后仍有不可自动修复的错误(如证据缺失)时,
|
|
282
|
+
* 已做的安全规范化照样保存,剩余错误随 validation 原样返回 —— 否则修复器
|
|
283
|
+
* 在历史/导入的脏草稿上会因残余错误整体回滚,等于不可用。
|
|
284
|
+
* 证据永不伪造:残余错误只能由人/Agent 补真实证据后再次校验。
|
|
285
|
+
*/
|
|
286
|
+
export function autoFixDraft(draftId: string, actor: Actor): {
|
|
287
|
+
draft: DraftRow
|
|
288
|
+
doc: OntologyDraftDoc
|
|
289
|
+
validation: DraftValidationReport
|
|
290
|
+
bindings: ReturnType<typeof validateDraftBindings>
|
|
291
|
+
fixes: OntologyAutoFix[]
|
|
292
|
+
} {
|
|
293
|
+
requireEditor(actor, '自动修复本体草稿')
|
|
294
|
+
const draft = getDraft(draftId)
|
|
295
|
+
requireDraftAccess(draft, actor, { write: true })
|
|
296
|
+
const { doc, fixes, validation } = autoFixDraftDoc(parseDraftRow(draft))
|
|
297
|
+
const bindings = validateDraftBindings(doc, { lineId: doc.lineId })
|
|
298
|
+
if (!fixes.length) {
|
|
299
|
+
return { draft, doc, validation, bindings, fixes }
|
|
300
|
+
}
|
|
301
|
+
let updated: DraftRow
|
|
302
|
+
if (validation.ok) {
|
|
303
|
+
// 修复后完全合法:走标准写路径(含活体绑定复核与审计)
|
|
304
|
+
const detail = updateDraft(draftId, actor, { doc, expectedRev: draft.rev, strictBindings: false })
|
|
305
|
+
updated = detail.draft
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
// 部分修复:直接落库(乐观锁 + 审计),残余错误由回执暴露,不静默掩盖
|
|
309
|
+
updated = getOntologyRepo().updateDraft(draftId, JSON.stringify(doc), draft.rev)
|
|
310
|
+
}
|
|
311
|
+
log({
|
|
312
|
+
ontologyId: updated.ontologyId,
|
|
313
|
+
version: updated.baseVersion ?? 0,
|
|
314
|
+
action: 'draft.autofix',
|
|
315
|
+
actor,
|
|
316
|
+
detail: { draftId, rev: updated.rev, fixes: fixes.length, residualErrors: validation.issues.filter(i => i.severity === 'error').length },
|
|
317
|
+
})
|
|
318
|
+
return { draft: updated, doc, validation, bindings, fixes }
|
|
319
|
+
}
|
|
320
|
+
|
|
275
321
|
// ===== 校验 / 编译预览 =====
|
|
276
322
|
|
|
277
323
|
export function validateDraft(draftId: string, actor: Actor): DraftValidationReport & { bindings: ReturnType<typeof validateDraftBindings> } {
|