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.
Files changed (396) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +123 -0
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +123 -0
  3. package/.output/nitro.json +1 -1
  4. package/.output/public/_nuxt/{DJJDigim2.js → -FhgRqJl2.js} +1 -1
  5. package/.output/public/_nuxt/{CGk_VUhO2.js → 0qvcO_KM2.js} +1 -1
  6. package/.output/public/_nuxt/26OL4Ao82.js +1 -0
  7. package/.output/public/_nuxt/{sBDZymdy2.js → 2Kwo_j9G2.js} +1 -1
  8. package/.output/public/_nuxt/{BqYVLAcm.js → 2v5GdspM.js} +1 -1
  9. package/.output/public/_nuxt/{DkQBMVTs2.js → 8M7wFbEN2.js} +1 -1
  10. package/.output/public/_nuxt/{DtiY69xi2.js → 8SZLbrI42.js} +1 -1
  11. package/.output/public/_nuxt/{DF32f5EL2.js → B2NbzUau2.js} +1 -1
  12. package/.output/public/_nuxt/{CwZW1ZCe2.js → B4JlRHBB2.js} +1 -1
  13. package/.output/public/_nuxt/{BQOn0q6Y.js → B6C4WofF.js} +1 -1
  14. package/.output/public/_nuxt/{BC7W6lNm.js → B6UwtJ1a.js} +1 -1
  15. package/.output/public/_nuxt/{BfQ-ptH0.js → B8HFUsMH.js} +1 -1
  16. package/.output/public/_nuxt/{DzBbYWrw2.js → BBB_j2LU2.js} +1 -1
  17. package/.output/public/_nuxt/BCLUwdP52.js +1 -0
  18. package/.output/public/_nuxt/{CLxmY3Rh.js → BK4wbfGS.js} +1 -1
  19. package/.output/public/_nuxt/{BRMVDfPl2.js → BKidykmV2.js} +1 -1
  20. package/.output/public/_nuxt/BPUQZ9Lq2.js +8 -0
  21. package/.output/public/_nuxt/BRYBzVMJ.js +1 -0
  22. package/.output/public/_nuxt/{Bj5sjA5O.js → BRci9D_l.js} +1 -1
  23. package/.output/public/_nuxt/{Dmgqz2np2.js → BVGzwAxr2.js} +1 -1
  24. package/.output/public/_nuxt/BVg2R2VB2.js +1 -0
  25. package/.output/public/_nuxt/{C3aUN4Vp2.js → BW2uTUx52.js} +1 -1
  26. package/.output/public/_nuxt/{B5FKaMM02.js → BY3Lbz3h2.js} +1 -1
  27. package/.output/public/_nuxt/{DIwmMa_7.js → BYzim_Bn.js} +1 -1
  28. package/.output/public/_nuxt/{D8xUsQGt.js → B_Obcbiu.js} +1 -1
  29. package/.output/public/_nuxt/BaYDgyaR.js +3 -0
  30. package/.output/public/_nuxt/{DZJ11BTI.js → BbACaREb.js} +1 -1
  31. package/.output/public/_nuxt/{BJrj5JVe2.js → BcosvNXb2.js} +1 -1
  32. package/.output/public/_nuxt/{B_-vAvzb.js → BfeXib9G.js} +1 -1
  33. package/.output/public/_nuxt/{CeLqojCJ.js → BfgTar9L.js} +1 -1
  34. package/.output/public/_nuxt/BfvuWqSa.js +1 -0
  35. package/.output/public/_nuxt/{D8r8PNQa2.js → BiZWwdcD2.js} +1 -1
  36. package/.output/public/_nuxt/{DIFkTkdS.js → BkEokGX5.js} +1 -1
  37. package/.output/public/_nuxt/{CJSohaqk2.js → BklGqEto2.js} +2 -2
  38. package/.output/public/_nuxt/{DkpmSnHX.js → Bko5adbu.js} +1 -1
  39. package/.output/public/_nuxt/{DTQTGA6v2.js → BmBlIIJo2.js} +1 -1
  40. package/.output/public/_nuxt/{D_NjL-Hz.js → Bmvt9ydE.js} +1 -1
  41. package/.output/public/_nuxt/{Cp4r6Eiz.js → BoyuIoSm.js} +1 -1
  42. package/.output/public/_nuxt/{62J4vljm.js → Bq-tmkst.js} +1 -1
  43. package/.output/public/_nuxt/{BMMoqi94.js → BqFaZ4kS.js} +1 -1
  44. package/.output/public/_nuxt/BsJYieAL2.js +1 -0
  45. package/.output/public/_nuxt/{DD4J2Otc.js → BtZKe9ZV.js} +1 -1
  46. package/.output/public/_nuxt/{BnpY_zNx.js → BtumQhZK.js} +1 -1
  47. package/.output/public/_nuxt/{BjLzqWJH2.js → BwWs9EdO2.js} +1 -1
  48. package/.output/public/_nuxt/{Bx2a9cuY2.js → BxxpJxZf2.js} +1 -1
  49. package/.output/public/_nuxt/{qRXa-PM22.js → ByTnUqFw2.js} +1 -1
  50. package/.output/public/_nuxt/{DvOETuoT2.js → Byiiiwc72.js} +1 -1
  51. package/.output/public/_nuxt/{Car2lkbb.js → C1-SuwUN.js} +1 -1
  52. package/.output/public/_nuxt/{Dg81dOEO.js → C14pM5G4.js} +1 -1
  53. package/.output/public/_nuxt/{MDhaRQq_.js → C2Yp-B8m.js} +1 -1
  54. package/.output/public/_nuxt/{BJ2nJNlK2.js → C4e6_nom2.js} +1 -1
  55. package/.output/public/_nuxt/{CiCEprsp2.js → C5OStZJ62.js} +1 -1
  56. package/.output/public/_nuxt/{ByMj6e7s.js → C6lssmvl.js} +2 -2
  57. package/.output/public/_nuxt/{C6uBP0Xa.js → CC-GEjfN.js} +1 -1
  58. package/.output/public/_nuxt/CC2Pv8VL2.js +1 -0
  59. package/.output/public/_nuxt/{DKiqdYnj.js → CCcMgxV9.js} +1 -1
  60. package/.output/public/_nuxt/{5S26I34j2.js → CDL30A2z2.js} +1 -1
  61. package/.output/public/_nuxt/{B8C-QJB5.js → CDYLasP8.js} +1 -1
  62. package/.output/public/_nuxt/CElzwyXQ.js +1 -0
  63. package/.output/public/_nuxt/{2KE8xGVm.js → CEvJu-xI.js} +1 -1
  64. package/.output/public/_nuxt/{CR612R752.js → CFQRFctQ2.js} +1 -1
  65. package/.output/public/_nuxt/{DnzjxC0u.js → CHk9XxNi.js} +2 -2
  66. package/.output/public/_nuxt/{Bx4MR0jd.js → CLFmtXU7.js} +1 -1
  67. package/.output/public/_nuxt/{DW8k_0dQ.js → CMJi6yYS.js} +1 -1
  68. package/.output/public/_nuxt/{DD-r0S1p.js → CPvFGbr8.js} +1 -1
  69. package/.output/public/_nuxt/{CCgbgkid.js → CQSxS_Ek.js} +2 -2
  70. package/.output/public/_nuxt/{jGxHnjW6.js → CQuo31jF.js} +1 -1
  71. package/.output/public/_nuxt/{SoO2K-di.js → CRCrWy-6.js} +1 -1
  72. package/.output/public/_nuxt/CUCFFL9m.js +84 -0
  73. package/.output/public/_nuxt/CZYNy60j2.js +1 -0
  74. package/.output/public/_nuxt/{WPwdj9pg.js → CZsFf7ck.js} +1 -1
  75. package/.output/public/_nuxt/CfFUK6932.js +2 -0
  76. package/.output/public/_nuxt/{DAsjfdZD.js → CfIbFnJz.js} +1 -1
  77. package/.output/public/_nuxt/{Tk6TQZjU.js → CjF4QY9h.js} +1 -1
  78. package/.output/public/_nuxt/{DlUQa0wn.js → Cjo1t2IF.js} +1 -1
  79. package/.output/public/_nuxt/{CDn0eDn8.js → CmuGMxDP.js} +1 -1
  80. package/.output/public/_nuxt/Cn6EojFe.js +1 -0
  81. package/.output/public/_nuxt/{DLqSQbGv.js → CnYazk8d.js} +1 -1
  82. package/.output/public/_nuxt/{DQfy6R_2.js → CnrGVJIr.js} +1 -1
  83. package/.output/public/_nuxt/{C0YL0HKK.js → CtcBhkci.js} +1 -1
  84. package/.output/public/_nuxt/{h5gsh8E92.js → Cv-Mv7_h2.js} +1 -1
  85. package/.output/public/_nuxt/{vPcnBJsa2.js → CzlZrfq82.js} +1 -1
  86. package/.output/public/_nuxt/{C2YYOgMe.js → CznnUTZx.js} +2 -2
  87. package/.output/public/_nuxt/{csitHKnE2.js → D-80EfyA2.js} +1 -1
  88. package/.output/public/_nuxt/{BRdoISnJ2.js → D1C6qtS12.js} +1 -1
  89. package/.output/public/_nuxt/{Cnrmlixo.js → D1MkndMZ.js} +2 -2
  90. package/.output/public/_nuxt/{BLwDhlaa.js → D37gODe0.js} +1 -1
  91. package/.output/public/_nuxt/{NXY37IO62.js → D6FhDrYe2.js} +1 -1
  92. package/.output/public/_nuxt/{Btx8wL4-.js → D7TZLu4F.js} +1 -1
  93. package/.output/public/_nuxt/{qoUdVDnC.js → D7tEwf-o.js} +3 -3
  94. package/.output/public/_nuxt/D8HQPtm62.js +1 -0
  95. package/.output/public/_nuxt/D9O4L4jK.js +1 -0
  96. package/.output/public/_nuxt/{aQ1B7BZa2.js → D9lL3fJM2.js} +2 -2
  97. package/.output/public/_nuxt/{CT-vTjcG2.js → DC-2eKo62.js} +1 -1
  98. package/.output/public/_nuxt/DF9ETYJ32.js +1 -0
  99. package/.output/public/_nuxt/DGGBrc0q2.js +1 -0
  100. package/.output/public/_nuxt/DGu_fna7.js +1 -0
  101. package/.output/public/_nuxt/{BupBjt6B.js → DKOvbitt.js} +1 -1
  102. package/.output/public/_nuxt/{B1PzYsqN.js → DNxudyND.js} +1 -1
  103. package/.output/public/_nuxt/{BfX6_AjY.js → DOT-XQyi.js} +1 -1
  104. package/.output/public/_nuxt/{BsTZnkVK.js → DPPC9Teq.js} +1 -1
  105. package/.output/public/_nuxt/{HxohXQ_r.js → DRskyE7l.js} +1 -1
  106. package/.output/public/_nuxt/{B-U7E_Mc2.js → DW4ZgInh2.js} +1 -1
  107. package/.output/public/_nuxt/{BErG4kzc2.js → DWe6BMlp2.js} +1 -1
  108. package/.output/public/_nuxt/{BH8RvpVy.js → DWy0AjON.js} +1 -1
  109. package/.output/public/_nuxt/{Bc_k6AVA.js → DXgw1dVL.js} +4 -4
  110. package/.output/public/_nuxt/{C3sWJ8SD2.js → DZsKIzKD2.js} +1 -1
  111. package/.output/public/_nuxt/D_59BNP1.js +14 -0
  112. package/.output/public/_nuxt/{BQIO4MkA2.js → D_FZ3KZI2.js} +1 -1
  113. package/.output/public/_nuxt/{n_Njdwii2.js → D__vJGHF2.js} +1 -1
  114. package/.output/public/_nuxt/{C9gErLQc2.js → DaizNGUm2.js} +1 -1
  115. package/.output/public/_nuxt/{C-MY-JQE.js → DdyE0ylS.js} +1 -1
  116. package/.output/public/_nuxt/DhLlTxQh2.js +1 -0
  117. package/.output/public/_nuxt/{CxVhG0Xx.js → DhW7cFOa.js} +1 -1
  118. package/.output/public/_nuxt/{Rt2i6k7C2.js → DhjgWrB62.js} +1 -1
  119. package/.output/public/_nuxt/{KwT4sN_d.js → DiWcX4gj.js} +1 -1
  120. package/.output/public/_nuxt/DiloA8vK.js +1 -0
  121. package/.output/public/_nuxt/{DX-c5laM2.js → DlS-SkQ42.js} +1 -1
  122. package/.output/public/_nuxt/{D_Zspo1y.js → DmHp9yQ3.js} +1 -1
  123. package/.output/public/_nuxt/{dq1HKoGD.js → DoL9u6wu.js} +1 -1
  124. package/.output/public/_nuxt/{CIvMT5Ic.js → DqxBCeDe.js} +1 -1
  125. package/.output/public/_nuxt/{BnNmkGJS2.js → DrlnrdvY2.js} +3 -3
  126. package/.output/public/_nuxt/{BAcjVcku2.js → Dt8TL8_X2.js} +1 -1
  127. package/.output/public/_nuxt/{BtfwbNC0.js → Du7gS8RU.js} +1 -1
  128. package/.output/public/_nuxt/DuUc4bbY2.js +1 -0
  129. package/.output/public/_nuxt/{DPUXbTg9.js → DudoisLM.js} +1 -1
  130. package/.output/public/_nuxt/{Ce5R-ZGf2.js → DwgVlehj2.js} +1 -1
  131. package/.output/public/_nuxt/Dyxf2xZw.js +1 -0
  132. package/.output/public/_nuxt/Dz9C2pTa.js +1 -0
  133. package/.output/public/_nuxt/{BYxG9Hb2.js → EMbqTHfT.js} +1 -1
  134. package/.output/public/_nuxt/{B1SzppY12.js → FsRVXpyF2.js} +1 -1
  135. package/.output/public/_nuxt/{0MLy6ogg2.js → GQrEW8nk2.js} +1 -1
  136. package/.output/public/_nuxt/{Tuz5LcLM.js → IXR1BWP5.js} +1 -1
  137. package/.output/public/_nuxt/{-jpUnM1I2.js → Iub61dX92.js} +1 -1
  138. package/.output/public/_nuxt/{CQgOzpvI.js → JegDslce.js} +2 -2
  139. package/.output/public/_nuxt/{DrF3TWoj.js → KzK37yIr.js} +1 -1
  140. package/.output/public/_nuxt/{Br3MggOL.js → N-CCmCsX.js} +1 -1
  141. package/.output/public/_nuxt/{DHhmq7s_.js → NfvZ5Lzv.js} +1 -1
  142. package/.output/public/_nuxt/{CzX_kaPL.js → POTcePF_.js} +1 -1
  143. package/.output/public/_nuxt/{D7s96J3r2.js → Q-JpBT032.js} +1 -1
  144. package/.output/public/_nuxt/{DzwIZ81f2.js → R1g64DNi2.js} +1 -1
  145. package/.output/public/_nuxt/{JgheoP3e.js → R5Pz7BqB.js} +1 -1
  146. package/.output/public/_nuxt/{yLyz0-Yz.js → SvjzWbn8.js} +1 -1
  147. package/.output/public/_nuxt/{Dd7MZc_Q.js → XqXoaoDs.js} +1 -1
  148. package/.output/public/_nuxt/{B6jtLy6z.js → YAA98rWJ.js} +11 -11
  149. package/.output/public/_nuxt/{HX4_xnak2.js → YLYSczSq2.js} +1 -1
  150. package/.output/public/_nuxt/{BBw9ylUY2.js → YNhAoK-R2.js} +1 -1
  151. package/.output/public/_nuxt/Zkbt8Uk5.js +1 -0
  152. package/.output/public/_nuxt/aml.PalMp-5n.css +1 -0
  153. package/.output/public/_nuxt/{C41CcsiD.js → b7UcqLKi.js} +1 -1
  154. package/.output/public/_nuxt/builds/latest.json +1 -1
  155. package/.output/public/_nuxt/builds/meta/fa0af8b5-3929-428d-a6de-3b5cc6b8248f.json +1 -0
  156. package/.output/public/_nuxt/{DVkFSOZi.js → cKj4vSo5.js} +1 -1
  157. package/.output/public/_nuxt/{r1CpGsFp.js → dHwWyr6b.js} +1 -1
  158. package/.output/public/_nuxt/{DlcA9Gxl.js → eePbiWEh.js} +1 -1
  159. package/.output/public/_nuxt/{cjRzSvAg2.js → eymRov9Y2.js} +1 -1
  160. package/.output/public/_nuxt/{B8cViLJT.js → geMze5qw.js} +1 -1
  161. package/.output/public/_nuxt/{uu1wfdfR2.js → gh-WMxV_2.js} +1 -1
  162. package/.output/public/_nuxt/{Ce6e1mPk2.js → hCN555XP2.js} +1 -1
  163. package/.output/public/_nuxt/{rdUE8Khf.js → hZG5MLjK.js} +3 -3
  164. package/.output/public/_nuxt/{CcX_jP-d.js → hlfahYxK.js} +1 -1
  165. package/.output/public/_nuxt/{cGSl2GZp2.js → ilJHF1nA2.js} +1 -1
  166. package/.output/public/_nuxt/{D6ZcgHPz.js → jDuiDtGb.js} +1 -1
  167. package/.output/public/_nuxt/{DbeNMehP.js → k9b520K-.js} +1 -1
  168. package/.output/public/_nuxt/ontology.B_3Wn907.css +1 -0
  169. package/.output/public/_nuxt/optimizer.CLA8I1sy.css +1 -0
  170. package/.output/public/_nuxt/{DSORcpTJ.js → rDvMijKA.js} +2 -2
  171. package/.output/public/_nuxt/{CAiHhX8P2.js → rF7mggl72.js} +2 -2
  172. package/.output/public/_nuxt/ri9UF8rk.js +2 -0
  173. package/.output/public/_nuxt/{KgnxOsMr.js → toG_qAMH.js} +1 -1
  174. package/.output/public/_nuxt/{KQZmHR_K.js → u3h4pGpm.js} +2 -2
  175. package/.output/public/_nuxt/{dJ7gK7C2.js → uomnHjhM.js} +1 -1
  176. package/.output/public/_nuxt/{BUTg4W_x2.js → v77qozuJ2.js} +1 -1
  177. package/.output/public/_nuxt/{BcEr7tIB.js → v7cV7hJa.js} +1 -1
  178. package/.output/public/_nuxt/{D25dVZ822.js → vkQoYNQR2.js} +2 -2
  179. package/.output/public/_nuxt/{wR_w07322.js → vp3LtnTz2.js} +1 -1
  180. package/.output/public/_nuxt/{Bnc8HELj2.js → we7-sMSo2.js} +1 -1
  181. package/.output/public/_nuxt/{kN3ZzR1-.js → wxISMS1i.js} +1 -1
  182. package/.output/public/_nuxt/{DGrrucbG.js → zy7efYKR.js} +1 -1
  183. package/.output/server/chunks/_/data-export.mjs +5 -5
  184. package/.output/server/chunks/_/data-query.mjs +2 -2
  185. package/.output/server/chunks/_/eda-run.repo.mjs +2 -2
  186. package/.output/server/chunks/_/features.mjs +4 -4
  187. package/.output/server/chunks/_/golden.mjs +2 -2
  188. package/.output/server/chunks/_/index.mjs +1 -1
  189. package/.output/server/chunks/_/mes-console.mjs +1 -1
  190. package/.output/server/chunks/_/nitro.mjs +2149 -1520
  191. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  192. package/.output/server/chunks/_/spc.mjs +1 -1
  193. package/.output/server/chunks/build/TownView-BWMDbosY.mjs +1 -1
  194. package/.output/server/chunks/build/{_wsId_-BNKrrV1H.mjs → _wsId_-BPy-Aj9L.mjs} +3 -3
  195. package/.output/server/chunks/build/{_wsId_-BNKrrV1H.mjs.map → _wsId_-BPy-Aj9L.mjs.map} +1 -1
  196. package/.output/server/chunks/build/{agents-8tV9xL97.mjs → agents-CpNLdI8E.mjs} +6 -6
  197. package/.output/server/chunks/build/{agents-8tV9xL97.mjs.map → agents-CpNLdI8E.mjs.map} +1 -1
  198. package/.output/server/chunks/build/{aml-BNTEDOsl.mjs → aml-DRAFRcGU.mjs} +15 -12
  199. package/.output/server/chunks/build/{aml-BNTEDOsl.mjs.map → aml-DRAFRcGU.mjs.map} +1 -1
  200. package/.output/server/chunks/build/{channel-templates-Iot9Y3vV.mjs → channel-templates-ByHOQQkO.mjs} +2 -2
  201. package/.output/server/chunks/build/{channel-templates-Iot9Y3vV.mjs.map → channel-templates-ByHOQQkO.mjs.map} +1 -1
  202. package/.output/server/chunks/build/daq-CdxcfY_G.mjs +1 -1
  203. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +1 -1
  204. package/.output/server/chunks/build/{default-CJkOcmrm.mjs → default-CNWS6NUw.mjs} +4 -4
  205. package/.output/server/chunks/build/{default-CJkOcmrm.mjs.map → default-CNWS6NUw.mjs.map} +1 -1
  206. package/.output/server/chunks/build/{dropdown-CjwsxU39.mjs → dropdown-BNwTVGde.mjs} +2 -2
  207. package/.output/server/chunks/build/{dropdown-CjwsxU39.mjs.map → dropdown-BNwTVGde.mjs.map} +1 -1
  208. package/.output/server/chunks/build/{dropdown-C6YH_kSO.mjs → dropdown-Cd-xPhR6.mjs} +2 -2
  209. package/.output/server/chunks/build/{dropdown-C6YH_kSO.mjs.map → dropdown-Cd-xPhR6.mjs.map} +1 -1
  210. package/.output/server/chunks/build/input-number-BNlNDK7H.mjs +1 -1
  211. package/.output/server/chunks/build/{logs-BTfJQ6vQ.mjs → logs-pRb-TMWa.mjs} +3 -3
  212. package/.output/server/chunks/build/{logs-BTfJQ6vQ.mjs.map → logs-pRb-TMWa.mjs.map} +1 -1
  213. package/.output/server/chunks/build/{monitor-DvaR3yo8.mjs → monitor-Cq6hRFeQ.mjs} +6 -6
  214. package/.output/server/chunks/build/{monitor-DvaR3yo8.mjs.map → monitor-Cq6hRFeQ.mjs.map} +1 -1
  215. package/.output/server/chunks/build/{ontology-C3HS5pMo.mjs → ontology-DK0Mf0zT.mjs} +510 -81
  216. package/.output/server/chunks/build/ontology-DK0Mf0zT.mjs.map +1 -0
  217. package/.output/server/chunks/build/{operations-Cl8nVm9D.mjs → operations-SMQrRAcr.mjs} +3 -3
  218. package/.output/server/chunks/build/{operations-Cl8nVm9D.mjs.map → operations-SMQrRAcr.mjs.map} +1 -1
  219. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +202 -0
  220. package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs.map +1 -0
  221. package/.output/server/chunks/build/{pagination-KaIvHBzi.mjs → pagination-DTAconUo.mjs} +2 -2
  222. package/.output/server/chunks/build/{pagination-KaIvHBzi.mjs.map → pagination-DTAconUo.mjs.map} +1 -1
  223. package/.output/server/chunks/build/{permissions-CVTfixZj.mjs → permissions-DgXQZSyx.mjs} +6 -6
  224. package/.output/server/chunks/build/{permissions-CVTfixZj.mjs.map → permissions-DgXQZSyx.mjs.map} +1 -1
  225. package/.output/server/chunks/build/{schedules-BLhn2CLn.mjs → schedules-dSnr8url.mjs} +6 -6
  226. package/.output/server/chunks/build/{schedules-BLhn2CLn.mjs.map → schedules-dSnr8url.mjs.map} +1 -1
  227. package/.output/server/chunks/build/{select--XFl7CtY.mjs → select-B3Dsb9yq.mjs} +3 -3
  228. package/.output/server/chunks/build/{select--XFl7CtY.mjs.map → select-B3Dsb9yq.mjs.map} +1 -1
  229. package/.output/server/chunks/build/{settings-DIf_iYdu.mjs → settings-BrIhnS2Z.mjs} +2 -2
  230. package/.output/server/chunks/build/{settings-DIf_iYdu.mjs.map → settings-BrIhnS2Z.mjs.map} +1 -1
  231. package/.output/server/chunks/build/{table-DIu_YCJN.mjs → table-CmVD-cA9.mjs} +4 -4
  232. package/.output/server/chunks/build/{table-DIu_YCJN.mjs.map → table-CmVD-cA9.mjs.map} +1 -1
  233. package/.output/server/chunks/build/{teams-B2J6ouRY.mjs → teams-B1d32eHK.mjs} +4 -4
  234. package/.output/server/chunks/build/{teams-B2J6ouRY.mjs.map → teams-B1d32eHK.mjs.map} +1 -1
  235. package/.output/server/chunks/build/{tokens-DFQGaN2n.mjs → tokens-GYaGJ35Z.mjs} +6 -6
  236. package/.output/server/chunks/build/{tokens-DFQGaN2n.mjs.map → tokens-GYaGJ35Z.mjs.map} +1 -1
  237. package/.output/server/chunks/build/{tools-DWJFnU_t.mjs → tools-s_9U1Djj.mjs} +6 -6
  238. package/.output/server/chunks/build/{tools-DWJFnU_t.mjs.map → tools-s_9U1Djj.mjs.map} +1 -1
  239. package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
  240. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +1 -1
  241. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +1 -1
  242. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +1 -1
  243. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +1 -1
  244. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +1 -1
  245. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +1 -1
  246. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +1 -1
  247. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +1 -1
  248. package/.output/server/chunks/build/{users-BWw0VCr9.mjs → users-DjiVC_tS.mjs} +6 -6
  249. package/.output/server/chunks/build/{users-BWw0VCr9.mjs.map → users-DjiVC_tS.mjs.map} +1 -1
  250. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  251. package/.output/server/chunks/routes/api/system/backup/run.post.mjs +2 -2
  252. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +7 -1
  253. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs.map +1 -1
  254. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
  255. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +6 -6
  256. package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs +2 -2
  257. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  258. package/.output/server/chunks/routes/api/workshop/index.mjs +1 -1
  259. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  260. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/autofix.mjs +52 -0
  261. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/autofix.mjs.map +1 -0
  262. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs +1 -1
  263. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs +1 -1
  265. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/subgraph.mjs +38 -0
  269. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/subgraph.mjs.map +1 -0
  270. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs +1 -1
  272. package/.output/server/chunks/routes/api/workshop/ontology/index.mjs +1 -1
  273. package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs +8 -1
  274. package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs.map +1 -1
  275. package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs +1 -1
  276. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs +1 -1
  277. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs +1 -1
  278. package/.output/server/chunks/routes/api/workshop/optimization/capabilities.get.mjs +1 -1
  279. package/.output/server/chunks/routes/api/workshop/optimization/index.mjs +1 -1
  280. package/.output/server/chunks/routes/api/workshop/optimization/index2.mjs +1 -1
  281. package/.output/server/chunks/routes/api/workshop/optimization/profiles/_id/publish.post.mjs +1 -1
  282. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/crosscheck.post.mjs +1 -1
  283. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/dispatch.post.mjs +1 -1
  284. package/.output/server/chunks/routes/api/workshop/optimization/solve.post.mjs +1 -1
  285. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  286. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  287. package/.output/server/chunks/routes/api/workshop/process-model/datasets.post.mjs +1 -1
  288. package/.output/server/chunks/routes/api/workshop/process-model/eligibility.mjs +1 -1
  289. package/.output/server/chunks/routes/api/workshop/process-model/index.mjs +1 -1
  290. package/.output/server/chunks/routes/api/workshop/process-model/specs/_id/publish.post.mjs +1 -1
  291. package/.output/server/chunks/routes/api/workshop/process-model/train.post.mjs +1 -1
  292. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  293. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  294. package/.output/server/chunks/routes/api/workshop/tools/sync.post.mjs +1 -1
  295. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
  296. package/.output/server/chunks/routes/renderer.mjs +2 -2
  297. package/.output/server/chunks/virtual/entry.mjs +92 -18
  298. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  299. package/.output/server/package.json +1 -1
  300. package/README-zh.md +5 -4
  301. package/README.md +6 -5
  302. package/app/components/aml/AmlModelsTable.vue +5 -0
  303. package/app/components/ontology/OntologyGraph.vue +356 -0
  304. package/app/pages/aml/styles.css +1 -0
  305. package/app/pages/ontology/index.vue +318 -35
  306. package/app/pages/ontology/types.ts +42 -0
  307. package/app/pages/optimizer/index.vue +21 -4
  308. package/config.yml +1 -1
  309. package/docs/cli.en.md +2 -2
  310. package/docs/cli.md +2 -2
  311. package/docs/plugins.en.md +1 -1
  312. package/docs/plugins.md +1 -1
  313. package/docs/sdk.en.md +1 -1
  314. package/docs/sdk.md +1 -1
  315. package/i18n/locales/en.ts +26 -0
  316. package/i18n/locales/zh-CN.ts +26 -0
  317. package/mcp/aw-mcp-server.mjs +20 -2
  318. package/package.json +1 -1
  319. package/scripts/e2e-direct-rest-simulator-paper.mjs +624 -0
  320. package/scripts/e2e-idd-results.mjs +177 -0
  321. package/scripts/e2e-model-loop-live.mjs +58 -4
  322. package/scripts/e2e-ontology-live.mjs +138 -3
  323. package/scripts/e2e-ontology.mjs +393 -328
  324. package/scripts/e2e-pi-simulator-paper.mjs +2316 -0
  325. package/scripts/e2e-registered-harness-simulator-paper.mjs +1926 -0
  326. package/scripts/e2e-simulator-optimizer-paper.mjs +264 -0
  327. package/scripts/fixtures/omp-paper-harness.mjs +163 -0
  328. package/sdk/context.mjs +6 -0
  329. package/sdk/index.d.mts +2 -0
  330. package/server/api/workshop/aml/models/[id].patch.ts +36 -30
  331. package/server/api/workshop/ontology/drafts/[draftId]/autofix.ts +31 -0
  332. package/server/api/workshop/ontology/drafts/[draftId]/subgraph.ts +24 -0
  333. package/server/api/workshop/ontology/scene.ts +14 -1
  334. package/server/plugins-builtin/diag-bridge/client.mjs +390 -239
  335. package/server/plugins-builtin/diag-bridge/host/helpers.mjs +80 -0
  336. package/server/plugins-builtin/diag-bridge/host/plugin.mjs +264 -2
  337. package/server/plugins-builtin/diag-bridge/i18n.json +84 -4
  338. package/server/services/workshop/agents/adapters/omp-rpc-client/frames.ts +129 -111
  339. package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +6 -3
  340. package/server/services/workshop/agents/industrial/aml-job-tools.ts +602 -569
  341. package/server/services/workshop/agents/industrial/grant-guard.ts +15 -1
  342. package/server/services/workshop/agents/industrial/index.ts +2 -2
  343. package/server/services/workshop/agents/industrial/ontology-tools.ts +66 -6
  344. package/server/services/workshop/agents/industrial/ops-tools.ts +54 -16
  345. package/server/services/workshop/agents/industrial/optimizer-tools.ts +2 -0
  346. package/server/services/workshop/agents/industrial/recipe-gate.ts +19 -6
  347. package/server/services/workshop/agents/industrial/recipe-propose-tools.ts +1 -1
  348. package/server/services/workshop/agents/omp-agent/supervision-history.ts +38 -0
  349. package/server/services/workshop/agents/omp-agent/tools-steer.ts +18 -1
  350. package/server/services/workshop/aml/aml.repo.ts +16 -0
  351. package/server/services/workshop/daq/bus/index.ts +12 -5
  352. package/server/services/workshop/db/database/open.ts +97 -97
  353. package/server/services/workshop/db/database/schema.ts +1 -0
  354. package/server/services/workshop/ontology/autofix.ts +198 -0
  355. package/server/services/workshop/ontology/contracts.ts +3 -1
  356. package/server/services/workshop/ontology/index.ts +2 -0
  357. package/server/services/workshop/ontology/ontology.service.ts +46 -0
  358. package/server/services/workshop/ontology/subgraph.core.ts +300 -0
  359. package/server/services/workshop/ontology/subgraph.service.ts +113 -0
  360. package/server/services/workshop/optimization/contracts.ts +2 -0
  361. package/server/services/workshop/optimization/profile-adopt.service.ts +5 -0
  362. package/server/services/workshop/optimization/profile.repo.ts +6 -4
  363. package/.output/public/_nuxt/B3Y5bCrM.js +0 -1
  364. package/.output/public/_nuxt/B8N8nsad2.js +0 -2
  365. package/.output/public/_nuxt/BO0BJx3w2.js +0 -8
  366. package/.output/public/_nuxt/BWn-lfCp2.js +0 -1
  367. package/.output/public/_nuxt/Bcs9zzO62.js +0 -1
  368. package/.output/public/_nuxt/BwO2Y5FH2.js +0 -1
  369. package/.output/public/_nuxt/Byf4IxU2.js +0 -14
  370. package/.output/public/_nuxt/C-LU6xv_.js +0 -1
  371. package/.output/public/_nuxt/CJ0bjZ6v2.js +0 -1
  372. package/.output/public/_nuxt/CJ3Vul2u.js +0 -1
  373. package/.output/public/_nuxt/CNwx04ln.js +0 -84
  374. package/.output/public/_nuxt/CVCscYzb2.js +0 -1
  375. package/.output/public/_nuxt/C_A0MCol2.js +0 -1
  376. package/.output/public/_nuxt/CnP6snIz.js +0 -3
  377. package/.output/public/_nuxt/D0mzKkZr.js +0 -1
  378. package/.output/public/_nuxt/D3buuIkE.js +0 -1
  379. package/.output/public/_nuxt/D4_INWgq.js +0 -1
  380. package/.output/public/_nuxt/D5kCimyw2.js +0 -1
  381. package/.output/public/_nuxt/DBtXLkyA.js +0 -1
  382. package/.output/public/_nuxt/DHURbGkn2.js +0 -1
  383. package/.output/public/_nuxt/DaBzS-iu.js +0 -1
  384. package/.output/public/_nuxt/DnlhV7Xe.js +0 -1
  385. package/.output/public/_nuxt/GtI6PUI32.js +0 -1
  386. package/.output/public/_nuxt/Nw_6OpQZ.js +0 -1
  387. package/.output/public/_nuxt/Y4sMSPrS2.js +0 -1
  388. package/.output/public/_nuxt/aml.CeLxRzvI.css +0 -1
  389. package/.output/public/_nuxt/builds/meta/7a79a7e4-d691-4cf5-ae3a-3b01814479fb.json +0 -1
  390. package/.output/public/_nuxt/goF_oZHF.js +0 -2
  391. package/.output/public/_nuxt/ontology.QMGeh66l.css +0 -1
  392. package/.output/public/_nuxt/optimizer.B8gCbU1b.css +0 -1
  393. package/.output/public/_nuxt/rJ7To74v2.js +0 -1
  394. package/.output/server/chunks/build/ontology-C3HS5pMo.mjs.map +0 -1
  395. package/.output/server/chunks/build/optimizer-BOtGWEtc.mjs +0 -200
  396. package/.output/server/chunks/build/optimizer-BOtGWEtc.mjs.map +0 -1
@@ -15,10 +15,11 @@ import { computed, onMounted, ref } from 'vue'
15
15
  import { message } from 'ant-design-vue'
16
16
  import { apiErrorMessage } from '@/app/utils/api-error'
17
17
  import { useUserStore } from '@/app/stores/workshop/user'
18
+ import OntologyGraph from '@/app/components/ontology/OntologyGraph.vue'
18
19
  import { ontologyApi } from './api'
19
20
  import type {
20
21
  CompileDto, DraftDetailDto, DraftSummary, IssueDto, OverviewDto,
21
- VersionDiffDto, VersionDto,
22
+ SubgraphAroundDto, VersionDiffDto, VersionDto,
22
23
  } from './types'
23
24
 
24
25
  const { t } = useI18n()
@@ -44,6 +45,28 @@ const doc = computed(() => detail.value?.doc ?? null)
44
45
  const issues = computed<IssueDto[]>(() => detail.value?.validation.issues ?? [])
45
46
  const errors = computed(() => issues.value.filter(i => i.severity === 'error'))
46
47
  const bindingFailures = computed(() => detail.value?.bindings.failures ?? [])
48
+ const lastFixes = ref<Array<{ code: string, path: string, message: string }>>([])
49
+
50
+ // 图/表视图与节点邻接抽屉(图与抽屉都读当前草稿,避免「图画草稿、抽屉查已发布」错位)
51
+ type GraphView = 'graph' | 'table'
52
+ const graphView = ref<GraphView>('graph')
53
+ const selectedKey = ref('')
54
+ const hops = ref<1 | 2>(1)
55
+ const neighbors = ref<SubgraphAroundDto | null>(null)
56
+ const neighborsLoading = ref(false)
57
+ const neighborsError = ref('')
58
+ let neighborReq = 0
59
+
60
+ const graphViewOptions = computed(() => [
61
+ { value: 'graph', label: t('ontology.graph.viewGraph') },
62
+ { value: 'table', label: t('ontology.graph.viewTable') },
63
+ ])
64
+ const selectedEntity = computed(() => (doc.value?.entities ?? []).find(e => e.key === selectedKey.value) ?? null)
65
+ const selectedBindings = computed(() => (doc.value?.bindings ?? []).filter(b => b.entityKey === selectedKey.value))
66
+ const drawerOpen = computed(() => Boolean(selectedEntity.value))
67
+ const neighborNodes = computed(() => (neighbors.value?.nodes ?? []).filter(n => n.hop > 0))
68
+ const entityOptions = computed(() => (doc.value?.entities ?? []).map(e => ({ value: e.key, label: `${e.key} · ${e.name}` })))
69
+ const largeGraph = computed(() => (doc.value?.entities.length ?? 0) > 60)
47
70
  const draftOptions = computed(() => overview.value.drafts.map(d => ({
48
71
  value: d.id,
49
72
  label: `${d.ontologyId} · rev ${d.rev}${d.baseVersion ? ` · 基线 v${d.baseVersion}` : ''}`,
@@ -135,6 +158,54 @@ async function loadDraft(): Promise<void> {
135
158
  }
136
159
  }
137
160
 
161
+ async function loadNeighbors(): Promise<void> {
162
+ if (!selectedKey.value || !draftId.value) return
163
+ const req = ++neighborReq
164
+ neighborsLoading.value = true
165
+ neighborsError.value = ''
166
+ try {
167
+ const qs = new URLSearchParams({ entity: selectedKey.value, hops: String(hops.value), limit: '100' })
168
+ const res = await ontologyApi<{ subgraph: SubgraphAroundDto }>(
169
+ `/drafts/${encodeURIComponent(draftId.value)}/subgraph?${qs.toString()}`,
170
+ )
171
+ if (req === neighborReq) neighbors.value = res.subgraph
172
+ }
173
+ catch (e) {
174
+ if (req === neighborReq) {
175
+ neighbors.value = null
176
+ neighborsError.value = apiErrorMessage(e, t('ontology.graph.loadNeighborsFail'))
177
+ }
178
+ }
179
+ finally {
180
+ if (req === neighborReq) neighborsLoading.value = false
181
+ }
182
+ }
183
+
184
+ function openNode(key: string): void {
185
+ selectedKey.value = key
186
+ hops.value = 1
187
+ neighbors.value = null
188
+ void loadNeighbors()
189
+ }
190
+
191
+ function setHops(next: 1 | 2): void {
192
+ hops.value = next
193
+ void loadNeighbors()
194
+ }
195
+
196
+ function closeDrawer(): void {
197
+ neighborReq += 1
198
+ selectedKey.value = ''
199
+ neighbors.value = null
200
+ neighborsError.value = ''
201
+ neighborsLoading.value = false
202
+ }
203
+
204
+ function switchTab(key: TabKey): void {
205
+ tab.value = key
206
+ if (key !== 'graph') closeDrawer()
207
+ }
208
+
138
209
  async function loadVersions(ontologyId: string): Promise<void> {
139
210
  if (!ontologyId) {
140
211
  versions.value = []
@@ -189,6 +260,34 @@ async function runValidate(): Promise<void> {
189
260
  }
190
261
  }
191
262
 
263
+ /** 自动修复:补描述/量纲跟随单位/作用域回填/悬空与重复确定性修复(证据不伪造) */
264
+ async function runAutofix(): Promise<void> {
265
+ if (!draftId.value) return
266
+ busy.value = true
267
+ try {
268
+ const res = await ontologyApi<{ fixedCount: number, fixes: Array<{ code: string, path: string, message: string }>, validation: { ok: boolean }, bindings: { ok: boolean } }>(
269
+ `/drafts/${encodeURIComponent(draftId.value)}/autofix`, { method: 'POST', body: {} },
270
+ )
271
+ lastFixes.value = res.fixes ?? []
272
+ if (res.fixedCount > 0) {
273
+ message.success(t('ontology.autofixDone', { n: res.fixedCount }))
274
+ }
275
+ else {
276
+ message.info(t('ontology.autofixNothing'))
277
+ }
278
+ if (!res.validation.ok || !res.bindings.ok) {
279
+ message.warning(t('ontology.autofixPartial'))
280
+ }
281
+ await loadDraft()
282
+ }
283
+ catch (e) {
284
+ message.error(apiErrorMessage(e, t('ontology.autofixFail')))
285
+ }
286
+ finally {
287
+ busy.value = false
288
+ }
289
+ }
290
+
192
291
  async function runCompile(): Promise<void> {
193
292
  if (!draftId.value) return
194
293
  busy.value = true
@@ -302,6 +401,7 @@ onMounted(async () => {
302
401
  })
303
402
 
304
403
  function onDraftChange(): void {
404
+ closeDrawer()
305
405
  void loadDraft()
306
406
  void loadVersions(currentOntologyId())
307
407
  }
@@ -326,6 +426,13 @@ function diffLabel(part: { added: string[], removed: string[], changed: string[]
326
426
  <p class="sub">
327
427
  {{ t('ontology.subtitle') }}
328
428
  </p>
429
+ <p
430
+ v-if="doc?.description"
431
+ class="model-desc"
432
+ >
433
+ <span class="model-desc-tag">{{ doc.name }}</span>
434
+ {{ doc.description }}
435
+ </p>
329
436
  </div>
330
437
  <div class="head-actions">
331
438
  <a-button
@@ -360,6 +467,13 @@ function diffLabel(part: { added: string[], removed: string[], changed: string[]
360
467
  >
361
468
  {{ t('ontology.validate') }}
362
469
  </a-button>
470
+ <a-button
471
+ :disabled="!draftId || (issues.length === 0 && bindingFailures.length === 0)"
472
+ :loading="busy"
473
+ @click="runAutofix"
474
+ >
475
+ {{ t('ontology.autofix') }}
476
+ </a-button>
363
477
  <a-button
364
478
  :disabled="!draftId"
365
479
  :loading="busy"
@@ -385,7 +499,7 @@ function diffLabel(part: { added: string[], removed: string[], changed: string[]
385
499
  :key="key"
386
500
  class="pill-btn"
387
501
  :class="{ active: tab === key }"
388
- @click="tab = key"
502
+ @click="switchTab(key)"
389
503
  >
390
504
  {{ t(`ontology.tab.${key}`) }}
391
505
  </button>
@@ -458,6 +572,23 @@ function diffLabel(part: { added: string[], removed: string[], changed: string[]
458
572
  {{ t('ontology.empty.issues') }}
459
573
  </li>
460
574
  </ul>
575
+ <div
576
+ v-if="lastFixes.length"
577
+ class="autofix-log"
578
+ >
579
+ <h3>{{ t('ontology.autofixLog', { n: lastFixes.length }) }}</h3>
580
+ <ul class="plain">
581
+ <li
582
+ v-for="(f, i) in lastFixes"
583
+ :key="`${f.code}-${i}`"
584
+ >
585
+ <a-tag color="green">
586
+ {{ f.code }}
587
+ </a-tag>
588
+ <span>{{ f.message }}</span>
589
+ </li>
590
+ </ul>
591
+ </div>
461
592
  </div>
462
593
  </div>
463
594
  </section>
@@ -467,37 +598,178 @@ function diffLabel(part: { added: string[], removed: string[], changed: string[]
467
598
  v-else-if="tab === 'graph'"
468
599
  class="panel"
469
600
  >
470
- <h2>{{ t('ontology.section.entities') }}</h2>
471
- <a-table
472
- :columns="entityColumns"
473
- :data-source="doc?.entities ?? []"
474
- row-key="key"
475
- size="small"
476
- :pagination="{ pageSize: 12 }"
477
- />
478
- <h2>{{ t('ontology.section.relations') }}</h2>
479
- <a-table
480
- :columns="relationColumns"
481
- :data-source="doc?.relations ?? []"
482
- row-key="id"
483
- size="small"
484
- :pagination="{ pageSize: 12 }"
485
- >
486
- <template #bodyCell="{ column, record }">
487
- <template v-if="column.key === 'edge'">
488
- <code>{{ record.srcKey }}</code> → <code>{{ record.dstKey }}</code>
601
+ <div class="graph-toolbar">
602
+ <a-segmented
603
+ v-model:value="graphView"
604
+ size="small"
605
+ :options="graphViewOptions"
606
+ />
607
+ <span class="hint">{{ t('ontology.graph.hint') }}</span>
608
+ <a-select
609
+ :value="selectedKey || undefined"
610
+ :options="entityOptions"
611
+ show-search
612
+ allow-clear
613
+ :placeholder="t('ontology.graph.searchEntity')"
614
+ class="node-search"
615
+ @change="(v: unknown) => { const key = String(v ?? ''); if (key) openNode(key); else closeDrawer() }"
616
+ />
617
+ </div>
618
+
619
+ <template v-if="graphView === 'graph'">
620
+ <p
621
+ v-if="largeGraph"
622
+ class="muted"
623
+ >
624
+ {{ t('ontology.graph.largeGraph', { n: doc?.entities.length ?? 0 }) }}
625
+ </p>
626
+ <OntologyGraph
627
+ v-else
628
+ :entities="doc?.entities ?? []"
629
+ :relations="doc?.relations ?? []"
630
+ :selected-key="selectedKey"
631
+ @select="openNode"
632
+ />
633
+ </template>
634
+
635
+ <template v-else>
636
+ <h2>{{ t('ontology.section.entities') }}</h2>
637
+ <a-table
638
+ data-testid="entity-table"
639
+ :columns="entityColumns"
640
+ :data-source="doc?.entities ?? []"
641
+ row-key="key"
642
+ size="small"
643
+ :pagination="{ pageSize: 12 }"
644
+ />
645
+ <h2>{{ t('ontology.section.relations') }}</h2>
646
+ <a-table
647
+ data-testid="relation-table"
648
+ :columns="relationColumns"
649
+ :data-source="doc?.relations ?? []"
650
+ row-key="id"
651
+ size="small"
652
+ :pagination="{ pageSize: 12 }"
653
+ >
654
+ <template #bodyCell="{ column, record }">
655
+ <template v-if="column.key === 'edge'">
656
+ <code>{{ record.srcKey }}</code> → <code>{{ record.dstKey }}</code>
657
+ </template>
658
+ <template v-else-if="column.key === 'tier'">
659
+ <a-tag :color="tierColor(record.properties?.evidenceTier)">
660
+ {{ record.properties?.evidenceTier }}
661
+ </a-tag>
662
+ <span
663
+ v-if="record.properties?.lagMs !== undefined"
664
+ class="muted"
665
+ >lag {{ record.properties.lagMs }}ms</span>
666
+ </template>
489
667
  </template>
490
- <template v-else-if="column.key === 'tier'">
491
- <a-tag :color="tierColor(record.properties?.evidenceTier)">
492
- {{ record.properties?.evidenceTier }}
493
- </a-tag>
494
- <span
495
- v-if="record.properties?.lagMs !== undefined"
668
+ </a-table>
669
+ </template>
670
+
671
+ <a-drawer
672
+ :open="drawerOpen"
673
+ width="560"
674
+ :title="selectedEntity ? `${selectedEntity.name} · ${selectedEntity.key}` : ''"
675
+ @close="closeDrawer"
676
+ >
677
+ <template v-if="selectedEntity">
678
+ <div data-testid="node-drawer">
679
+ <dl class="node-detail">
680
+ <dt>kind</dt><dd>{{ selectedEntity.kind }}</dd>
681
+ <dt>role</dt><dd>{{ selectedEntity.role || '—' }}</dd>
682
+ <dt>unit</dt><dd>{{ selectedEntity.unit || '—' }}</dd>
683
+ <dt>description</dt><dd>{{ selectedEntity.description || '—' }}</dd>
684
+ </dl>
685
+
686
+ <h4>{{ t('ontology.drawer.bindings') }}</h4>
687
+ <p
688
+ v-if="selectedBindings.length === 0"
496
689
  class="muted"
497
- >lag {{ record.properties.lagMs }}ms</span>
498
- </template>
690
+ >
691
+ {{ t('ontology.drawer.noBindings') }}
692
+ </p>
693
+ <ul
694
+ v-else
695
+ class="plain"
696
+ >
697
+ <li
698
+ v-for="b in selectedBindings"
699
+ :key="b.id"
700
+ >
701
+ <code>{{ b.platformKind }}:{{ b.platformId }}{{ b.targetSub ? `#${b.targetSub}` : '' }}</code>
702
+ <span>{{ b.direction }} · {{ b.unitDeclared || '—' }} → {{ b.unitTarget || '—' }}</span>
703
+ </li>
704
+ </ul>
705
+
706
+ <h4>{{ t('ontology.graph.neighbors') }}</h4>
707
+ <a-segmented
708
+ :value="hops"
709
+ size="small"
710
+ :options="[
711
+ { value: 1, label: t('ontology.graph.direct') },
712
+ { value: 2, label: t('ontology.graph.indirect') },
713
+ ]"
714
+ @change="(v: unknown) => setHops(Number(v) === 2 ? 2 : 1)"
715
+ />
716
+
717
+ <p
718
+ v-if="neighborsLoading"
719
+ class="muted"
720
+ >
721
+ {{ t('ontology.graph.loading') }}
722
+ </p>
723
+ <p
724
+ v-else-if="neighborsError"
725
+ class="muted"
726
+ >
727
+ {{ neighborsError }}
728
+ </p>
729
+ <template v-else-if="neighbors">
730
+ <p
731
+ v-if="neighbors.truncated"
732
+ class="muted"
733
+ >
734
+ {{ t('ontology.graph.truncated') }}
735
+ </p>
736
+ <p
737
+ v-if="neighborNodes.length === 0"
738
+ class="muted"
739
+ >
740
+ {{ t('ontology.graph.noNeighbors') }}
741
+ </p>
742
+ <ul
743
+ v-else
744
+ class="plain"
745
+ >
746
+ <li
747
+ v-for="n in neighborNodes"
748
+ :key="n.key"
749
+ :data-neighbor-key="n.key"
750
+ :data-hop="n.hop"
751
+ >
752
+ <strong>{{ n.key }}</strong>
753
+ <span>{{ n.kind }} · {{ n.role || '—' }} · hop {{ n.hop }}</span>
754
+ </li>
755
+ </ul>
756
+ <ul
757
+ v-if="neighbors.edges.length"
758
+ class="plain edges"
759
+ >
760
+ <li
761
+ v-for="e in neighbors.edges"
762
+ :key="e.id"
763
+ :data-edge-id="e.id"
764
+ >
765
+ <code>{{ e.srcKey }} -{{ e.kind }}-> {{ e.dstKey }}</code>
766
+ <span>hop {{ e.hop }} · {{ e.direction }} · {{ e.evidenceTier }}</span>
767
+ </li>
768
+ </ul>
769
+ </template>
770
+ </div>
499
771
  </template>
500
- </a-table>
772
+ </a-drawer>
501
773
  </section>
502
774
 
503
775
  <!-- 约束规则 -->
@@ -752,6 +1024,10 @@ function diffLabel(part: { added: string[], removed: string[], changed: string[]
752
1024
  .aw-page-head { display: flex; justify-content: space-between; gap: 16px; align-items: flex-start; }
753
1025
  .aw-page-head h1 { margin: 2px 0 6px; font-size: 22px; }
754
1026
  .sub { margin: 0; color: var(--ink-soft); max-width: 72ch; }
1027
+ .model-desc { margin: 8px 0 0; color: var(--ink-soft); max-width: 84ch; font-size: 13px; display: flex; gap: 8px; align-items: baseline; }
1028
+ .model-desc-tag { flex: none; border: 1px solid var(--line, #2a3542); border-radius: 999px; padding: 1px 8px; font-size: 11px; color: var(--ink-faint); }
1029
+ .autofix-log { margin-top: 14px; border-top: 1px dashed var(--line, #2a3542); padding-top: 10px; }
1030
+ .autofix-log h3 { margin: 0 0 6px; font-size: 13px; color: var(--ink-soft); }
755
1031
  .head-actions { display: flex; gap: 8px; }
756
1032
  .toolbar { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
757
1033
  .hint { color: var(--ink-faint); font-size: 12px; }
@@ -759,21 +1035,28 @@ function diffLabel(part: { added: string[], removed: string[], changed: string[]
759
1035
  .panel { display: flex; flex-direction: column; gap: 14px; }
760
1036
  .panel h2 { font-size: 14px; margin: 8px 0 0; color: var(--ink-soft); text-transform: uppercase; letter-spacing: .04em; }
761
1037
  .stats { display: flex; gap: 10px; flex-wrap: wrap; }
762
- .stat { border: 1px solid var(--border); border-radius: 10px; padding: 10px 14px; min-width: 120px; display: flex; flex-direction: column; gap: 4px; }
1038
+ .stat { border: 1px solid var(--line); border-radius: 10px; padding: 10px 14px; min-width: 120px; display: flex; flex-direction: column; gap: 4px; }
763
1039
  .stat span { font-size: 12px; color: var(--ink-faint); }
764
1040
  .stat strong { font-size: 20px; }
765
1041
  .two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
766
1042
  .plain { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
767
- .plain li { display: flex; flex-direction: column; gap: 3px; padding: 8px 10px; border: 1px solid var(--border); border-radius: 8px; }
1043
+ .plain li { display: flex; flex-direction: column; gap: 3px; padding: 8px 10px; border: 1px solid var(--line); border-radius: 8px; }
768
1044
  .plain li span { color: var(--ink-soft); font-size: 12px; }
769
1045
  .plain li em { color: var(--ink-faint); font-size: 12px; font-style: normal; }
770
1046
  .muted { color: var(--ink-faint); }
771
- .failures { border: 1px solid var(--border); border-radius: 10px; padding: 12px; }
1047
+ .failures { border: 1px solid var(--line); border-radius: 10px; padding: 12px; }
772
1048
  .artifacts { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
773
1049
  .artifacts h3 { margin: 0 0 6px; font-size: 12px; color: var(--ink-faint); }
774
- .artifacts pre { margin: 0; background: var(--surface-2, rgba(255,255,255,.03)); border: 1px solid var(--border); border-radius: 8px; padding: 10px; font-size: 11px; max-height: 260px; overflow: auto; }
1050
+ .artifacts pre { margin: 0; background: var(--surface-2, rgba(255,255,255,.03)); border: 1px solid var(--line); border-radius: 8px; padding: 10px; font-size: 11px; max-height: 260px; overflow: auto; }
775
1051
  .compare { display: flex; gap: 8px; align-items: center; }
776
- .diff { border: 1px solid var(--border); border-radius: 10px; padding: 12px; display: flex; flex-direction: column; gap: 4px; }
1052
+ .diff { border: 1px solid var(--line); border-radius: 10px; padding: 12px; display: flex; flex-direction: column; gap: 4px; }
777
1053
  .chip { margin-right: 6px; }
778
1054
  .retire { margin-left: 8px; }
1055
+ .graph-toolbar { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
1056
+ .node-search { min-width: 300px; }
1057
+ .node-detail { display: grid; grid-template-columns: 96px 1fr; gap: 6px 12px; margin: 0 0 14px; }
1058
+ .node-detail dt { color: var(--ink-faint); font-size: 12px; }
1059
+ .node-detail dd { margin: 0; font-size: 13px; }
1060
+ .panel h4 { margin: 16px 0 8px; font-size: 13px; color: var(--ink-soft); }
1061
+ .plain.edges li { border-color: var(--line); background: transparent; }
779
1062
  </style>
@@ -63,6 +63,7 @@ export interface OntologyDocDto {
63
63
  schemaVersion: number
64
64
  name: string
65
65
  lineId: string
66
+ description?: string
66
67
  entities: OntologyEntityDto[]
67
68
  relations: OntologyRelationDto[]
68
69
  rules: OntologyRuleDto[]
@@ -120,3 +121,44 @@ export interface OverviewDto {
120
121
  ontologies: OntologySummary[]
121
122
  drafts: DraftSummary[]
122
123
  }
124
+
125
+ /** 服务端 subgraph.core 的视图镜像(只取前端用到的字段) */
126
+ export interface SubgraphBindingDto {
127
+ platformKind: string
128
+ platformId: string
129
+ targetSub: string
130
+ direction: string
131
+ status: string
132
+ unitDeclared: string
133
+ unitTarget: string
134
+ }
135
+
136
+ export interface SubgraphNodeDto {
137
+ key: string
138
+ kind: string
139
+ name: string
140
+ description: string
141
+ unit: string
142
+ role?: string
143
+ hop: number
144
+ }
145
+
146
+ export interface SubgraphEdgeDto {
147
+ id: string
148
+ kind: string
149
+ srcKey: string
150
+ dstKey: string
151
+ evidenceTier: string
152
+ hop: number
153
+ direction: 'out' | 'in' | 'lateral' | 'loop'
154
+ }
155
+
156
+ export interface SubgraphAroundDto {
157
+ ontologyId: string
158
+ version: number
159
+ lineId: string
160
+ center: SubgraphNodeDto & { hop: 0, bindings: SubgraphBindingDto[] }
161
+ nodes: SubgraphNodeDto[]
162
+ edges: SubgraphEdgeDto[]
163
+ truncated: boolean
164
+ }
@@ -18,7 +18,7 @@ const notice = ref('')
18
18
  const busy = ref(false)
19
19
 
20
20
  interface SpecRow { id: string, version: number, status: string, lineId: string, recipeId: string, contentHash: string, spec?: Record<string, unknown> }
21
- interface ProfileRow { id: string, version: number, status: string, modelRef: string, solverRef: string, profile?: Record<string, unknown> }
21
+ interface ProfileRow { id: string, version: number, name?: string, description?: string, status: string, modelRef: string, solverRef: string, profile?: Record<string, unknown> }
22
22
  interface BindingRow { id: string, channelId: string, channelAgentId: string, profileVersion: string, mode: string, revision: number }
23
23
  interface RunRow { id: string, status: string, profileId: string, problemIrHash: string, startedAt: string, recommendation?: { status: string, statusLabel: string, validUntil: string } | null }
24
24
 
@@ -39,7 +39,7 @@ const specForm = reactive({
39
39
  runIds: '', conditionId: 'default', purpose: 'mpc_surrogate' as 'mpc_surrogate' | 'quality_predict',
40
40
  })
41
41
 
42
- const profileForm = reactive({ id: 'optp-demo', version: 1, modelId: '', template: 'linear_mpc_quadratic@1', solver: 'osqp_mpc@1', processSpecRef: '', configJson: '{\n "linear_mpc_quadratic": {\n "cvWeights": {"cv1": 1},\n "duWeights": {"mv1": 0.1},\n "terminalWeight": 2,\n "targets": {"cv1": 50}\n }\n}' })
42
+ const profileForm = reactive({ id: 'optp-demo', version: 1, name: '', description: '', modelId: '', template: 'linear_mpc_quadratic@1', solver: 'osqp_mpc@1', processSpecRef: '', configJson: '{\n "linear_mpc_quadratic": {\n "cvWeights": {"cv1": 1},\n "duWeights": {"mv1": 0.1},\n "terminalWeight": 2,\n "targets": {"cv1": 50}\n }\n}' })
43
43
  const bindingForm = reactive({ workspaceId: '', channelId: '', agentInstanceId: '', profileId: '', profileVersion: 1, mode: 'recommendation' as 'recommendation' | 'shadow' })
44
44
  const datasetId = ref('')
45
45
  const solveAgent = ref('')
@@ -151,6 +151,7 @@ async function saveProfile() {
151
151
  try {
152
152
  const profile = {
153
153
  schemaVersion: 1, id: profileForm.id, version: profileForm.version,
154
+ name: profileForm.name || undefined, description: profileForm.description || undefined,
154
155
  modelRef: { modelId: profileForm.modelId, artifactKind: 'linear_state_space@1', artifactHash: '', modelInterface: 'linear_state_space', stage: 'candidate' },
155
156
  problemTemplateRef: profileForm.template, problemConfig: JSON.parse(profileForm.configJson),
156
157
  solverRef: profileForm.solver, solverVersion: '1', processSpecRef: profileForm.processSpecRef || `${specForm.id}@${specForm.version}`,
@@ -493,6 +494,14 @@ onMounted(loadAll)
493
494
  type="number"
494
495
  min="1"
495
496
  ></label>
497
+ <label>{{ t('optimizer.fields.name') }}<input
498
+ v-model="profileForm.name"
499
+ placeholder="膜厚闭环-MPC 配置"
500
+ ></label>
501
+ <label class="block">{{ t('optimizer.fields.description') }}<input
502
+ v-model="profileForm.description"
503
+ placeholder="这个求解配置代表什么工况/目标/约束(用户与 Agent 都看这段)"
504
+ ></label>
496
505
  <label>{{ t('optimizer.fields.model') }}<input
497
506
  v-model="profileForm.modelId"
498
507
  placeholder="mdl-..."
@@ -521,13 +530,20 @@ onMounted(loadAll)
521
530
  </button>
522
531
  </div>
523
532
  <table class="tbl">
524
- <thead><tr><th>profile</th><th>status</th><th>model</th><th>solver</th><th /></tr></thead>
533
+ <thead><tr><th>profile</th><th>{{ t('optimizer.fields.name') }}</th><th>{{ t('optimizer.fields.description') }}</th><th>status</th><th>model</th><th>solver</th><th /></tr></thead>
525
534
  <tbody>
526
535
  <tr
527
536
  v-for="p in profiles"
528
537
  :key="`${p.id}@${p.version}`"
529
538
  >
530
- <td>{{ p.id }}@{{ p.version }}</td><td>{{ p.status }}</td><td>{{ p.modelRef }}</td><td>{{ p.solverRef }}</td>
539
+ <td>{{ p.id }}@{{ p.version }}</td>
540
+ <td>{{ p.profile?.name || p.name || '--' }}</td>
541
+ <td class="desc-cell">
542
+ {{ p.profile?.description || p.description || '--' }}
543
+ </td>
544
+ <td>{{ p.status }}</td>
545
+ <td>{{ p.modelRef }}</td>
546
+ <td>{{ p.solverRef }}</td>
531
547
  <td>
532
548
  <button
533
549
  v-if="p.status !== 'published'"
@@ -662,6 +678,7 @@ pre.json { background: #0d1117; border: 1px solid rgba(255,255,255,0.08); border
662
678
  .tbl { width: 100%; border-collapse: collapse; font-size: 12.5px; }
663
679
  .tbl th, .tbl td { text-align: left; padding: 7px 8px; border-bottom: 1px solid rgba(255,255,255,0.06); }
664
680
  .tbl th { color: #8b98a5; font-weight: 500; }
681
+ .desc-cell { color: #aab6c2; max-width: 360px; }
665
682
  .list { list-style: none; padding: 0; margin: 10px 0; display: flex; flex-direction: column; gap: 6px; font-size: 12.5px; }
666
683
  .list .gap { color: #ffb86b; }
667
684
  .hint { color: #8b98a5; font-size: 12.5px; }
package/config.yml CHANGED
@@ -12,7 +12,7 @@
12
12
  app:
13
13
  name: AgentWorkShop
14
14
  title: AgentWorkShop
15
- version: 0.8.0
15
+ version: 0.8.1
16
16
  description: 基于 Nuxt 4 的配置驱动运行范式
17
17
 
18
18
  # 运行模式(dev/prod 实际由启动命令决定,此处仅作运行时展示)
package/docs/cli.en.md CHANGED
@@ -62,7 +62,7 @@ pnpm tui # the terminal workbench
62
62
  ### 3. Quick use via npx (no global install)
63
63
 
64
64
  ```bash
65
- npx agentworkshop start # fetch and start (pin a version with: npx agentworkshop@0.8.0 start)
65
+ npx agentworkshop start # fetch and start (pin a version with: npx agentworkshop@0.8.1 start)
66
66
  npx agentworkshop doctor # subcommands work as usual
67
67
  npx -p agentworkshop aw doctor # use -p when you want the name aw
68
68
  ```
@@ -79,7 +79,7 @@ npx -p agentworkshop aw doctor # use -p when you want the name aw
79
79
  | Package manager | `pnpm@11.9.0` (`packageManager`, needed only for source development) |
80
80
  | Module format | ESM (`type: module`) |
81
81
  | License | `Apache-2.0` |
82
- | Current version | `0.8.0` (`package.json`) |
82
+ | Current version | `0.8.1` (`package.json`) |
83
83
 
84
84
  ## 2. First start (the Claude Code experience)
85
85
 
package/docs/cli.md CHANGED
@@ -60,7 +60,7 @@ pnpm tui # 终端工作台
60
60
  ### 3. npx 快速使用(免全局安装)
61
61
 
62
62
  ```bash
63
- npx agentworkshop start # 拉取并启动(可锁定版本: npx agentworkshop@0.8.0 start)
63
+ npx agentworkshop start # 拉取并启动(可锁定版本: npx agentworkshop@0.8.1 start)
64
64
  npx agentworkshop doctor # 子命令照常可用
65
65
  npx -p agentworkshop aw doctor # 需要 aw 这个名字时用 -p 指定包
66
66
  ```
@@ -76,7 +76,7 @@ npx -p agentworkshop aw doctor # 需要 aw 这个名字时用 -p 指定包
76
76
  | 包管理器 | `pnpm@11.9.0`(`packageManager`,仅源码开发需要) |
77
77
  | 模块形态 | ESM(`type: module`) |
78
78
  | 许可证 | `Apache-2.0` |
79
- | 当前版本 | `0.8.0`(`package.json`) |
79
+ | 当前版本 | `0.8.1`(`package.json`) |
80
80
 
81
81
  ## 二、首次启动(Claude Code 式)
82
82
 
@@ -9,7 +9,7 @@
9
9
  >
10
10
  > Applies to: plugin system v2 has been available since **v0.7.29** (frontend component
11
11
  > injection / plugin settings / plugin i18n / runtime services surface); this document
12
- > describes **v0.8.0**. `ctx.sdkVersion` is currently `0.3.0`.
12
+ > describes **v0.8.1**. `ctx.sdkVersion` is currently `0.3.0`.
13
13
 
14
14
  ## 1. Folder layout & quick start
15
15
 
package/docs/plugins.md CHANGED
@@ -6,7 +6,7 @@
6
6
  > 本文是唯一权威参考;`docs/site/plugins/` 的分页文档与本文同源。
7
7
  >
8
8
  > 适用版本:插件系统 v2 自 **v0.7.29** 起可用(前端组件注入 / 插件设置 / 插件 i18n /
9
- > 运行时服务面);本文档对应当前版本 **v0.8.0**。`ctx.sdkVersion` 当前为 `0.3.0`。
9
+ > 运行时服务面);本文档对应当前版本 **v0.8.1**。`ctx.sdkVersion` 当前为 `0.3.0`。
10
10
 
11
11
  ## 一、目录结构与快速开始
12
12
 
package/docs/sdk.en.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  **SDK version constants**: server-side `SDK_VERSION = '0.3.0'`, browser-side `CLIENT_SDK_VERSION = '0.3.0'`.
9
9
  These two constants are the **interface version of the SDK itself** and evolve **independently**
10
- from the npm package version (the `version` field in `package.json`, currently 0.8.0) —
10
+ from the npm package version (the `version` field in `package.json`, currently 0.8.1) —
11
11
  them being out of sync is expected. Never use `SDK_VERSION` to infer the package version, or the reverse.
12
12
  **Module format**: ESM only (only `import` / `export`; there is no CJS entry).
13
13
  **Types**: `sdk/index.d.mts` and `sdk/client.d.mts` ship with the package, so TypeScript projects
package/docs/sdk.md CHANGED
@@ -5,7 +5,7 @@
5
5
  > 零第三方运行时依赖,Node ≥ 23.4 与现代浏览器双端可用。
6
6
 
7
7
  **SDK 版本常量**:服务端 `SDK_VERSION = '0.3.0'`,浏览器端 `CLIENT_SDK_VERSION = '0.3.0'`。
8
- 这两个常量是 **SDK 自身接口的版本号**,与 npm 包版本(`package.json` 的 `version`,当前 0.8.0)
8
+ 这两个常量是 **SDK 自身接口的版本号**,与 npm 包版本(`package.json` 的 `version`,当前 0.8.1)
9
9
  **各自独立演进** —— 常数不同步是预期行为,不要拿 `SDK_VERSION` 去推断包版本,反之亦然。
10
10
  **模块形态**:ESM only(只有 `import` / `export`,没有 CJS 入口)。
11
11
  **类型**:`sdk/index.d.mts`、`sdk/client.d.mts` 随包发布,TS 项目零配置获得提示(覆盖范围见 §7)。