agentworkshop 0.7.71 → 0.8.0

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 (358) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +332 -0
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +332 -0
  3. package/.output/nitro.json +1 -1
  4. package/.output/public/_nuxt/BH8RvpVy.js +1 -0
  5. package/.output/public/_nuxt/Byf4IxU2.js +14 -0
  6. package/.output/public/_nuxt/CxVhG0Xx.js +1 -0
  7. package/.output/public/_nuxt/D0mzKkZr.js +1 -0
  8. package/.output/public/_nuxt/DIFkTkdS.js +1 -0
  9. package/.output/public/_nuxt/DgrK8UCQ.js +0 -0
  10. package/.output/public/_nuxt/builds/latest.json +1 -1
  11. package/.output/public/_nuxt/builds/meta/7a79a7e4-d691-4cf5-ae3a-3b01814479fb.json +1 -0
  12. package/.output/public/_nuxt/{default.BzOcvmSE.css → default.BEXGWZFQ.css} +1 -1
  13. package/.output/public/_nuxt/{entry.CL2i0F8o.css → entry.C7koBPom.css} +1 -1
  14. package/.output/public/_nuxt/ontology.QMGeh66l.css +1 -0
  15. package/.output/server/chunks/_/access.mjs +1 -1
  16. package/.output/server/chunks/_/binding-authz.mjs +1 -1
  17. package/.output/server/chunks/_/catalog-view.mjs +1 -1
  18. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  19. package/.output/server/chunks/_/chart-repo.mjs +1 -1
  20. package/.output/server/chunks/_/dashboard-repo.mjs +1 -1
  21. package/.output/server/chunks/_/data-export.mjs +6 -6
  22. package/.output/server/chunks/_/data-query.mjs +3 -3
  23. package/.output/server/chunks/_/eda-run.repo.mjs +2 -2
  24. package/.output/server/chunks/_/entity.mjs +1 -1
  25. package/.output/server/chunks/_/features.mjs +5 -5
  26. package/.output/server/chunks/_/golden.mjs +3 -3
  27. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  28. package/.output/server/chunks/_/index.mjs +1 -1
  29. package/.output/server/chunks/_/mes-console.mjs +1 -1
  30. package/.output/server/chunks/_/nitro.mjs +5362 -2240
  31. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  32. package/.output/server/chunks/_/ocap.mjs +1 -1
  33. package/.output/server/chunks/_/rest-auth.mjs +1 -1
  34. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  35. package/.output/server/chunks/_/spc.mjs +2 -2
  36. package/.output/server/chunks/build/TownView-BWMDbosY.mjs +1 -1
  37. package/.output/server/chunks/build/api-BEW_ebY_.mjs +64 -0
  38. package/.output/server/chunks/build/api-BEW_ebY_.mjs.map +1 -0
  39. package/.output/server/chunks/build/daq-CdxcfY_G.mjs +1 -1
  40. package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +1 -1
  41. package/.output/server/chunks/build/{default-BeB88U7y.mjs → default-CJkOcmrm.mjs} +14 -8
  42. package/.output/server/chunks/build/{default-BeB88U7y.mjs.map → default-CJkOcmrm.mjs.map} +1 -1
  43. package/.output/server/chunks/build/ontology-C3HS5pMo.mjs +977 -0
  44. package/.output/server/chunks/build/ontology-C3HS5pMo.mjs.map +1 -0
  45. package/.output/server/chunks/build/types-D6J7slEa.mjs +6 -2
  46. package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +1 -1
  47. package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +1 -1
  48. package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +1 -1
  49. package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +1 -1
  50. package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +1 -1
  51. package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +1 -1
  52. package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +1 -1
  53. package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +1 -1
  54. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  55. package/.output/server/chunks/routes/api/system/backup/run.post.mjs +2 -2
  56. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +17 -4
  57. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
  58. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
  59. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  60. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +1 -1
  61. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +1 -1
  62. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  63. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -1
  64. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  65. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
  66. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
  67. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
  68. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
  69. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
  70. package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
  71. package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
  72. package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
  73. package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
  74. package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
  75. package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
  76. package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
  77. package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
  78. package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
  79. package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
  80. package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
  81. package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
  82. package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
  83. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
  84. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
  85. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
  86. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
  87. package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
  88. package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
  89. package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
  90. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
  91. package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +1 -1
  92. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
  93. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
  94. package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
  95. package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
  96. package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +1 -1
  97. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +1 -1
  98. package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs +1 -1
  99. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
  100. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  101. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  102. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  103. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  104. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
  105. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  106. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  107. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.put.mjs +1 -1
  108. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  109. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  110. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -1
  111. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
  112. package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs +1 -1
  113. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  114. package/.output/server/chunks/routes/api/workshop/channels/_id/tools/reset.post.mjs +1 -1
  115. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
  116. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +1 -1
  117. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  118. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +7 -7
  119. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
  120. package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
  121. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
  122. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
  123. package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs +2 -2
  124. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  125. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
  126. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
  127. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
  128. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
  129. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -1
  130. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
  131. package/.output/server/chunks/routes/api/workshop/daq/export/_id_.get.mjs +1 -1
  132. package/.output/server/chunks/routes/api/workshop/daq/index2.post.mjs +1 -1
  133. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  134. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  135. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  136. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  137. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  138. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  139. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  140. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  141. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  142. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  143. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  144. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  145. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  146. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  147. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  148. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  149. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  150. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  151. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  152. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  153. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  154. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  155. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  156. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
  157. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  158. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
  159. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  160. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  161. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  162. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  163. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  164. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -1
  165. package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs +1 -1
  166. package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs +1 -1
  167. package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.mjs +1 -1
  168. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  169. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  170. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  171. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  172. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
  173. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
  174. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
  175. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
  176. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  177. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  178. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  179. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  180. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +1 -1
  181. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  184. package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +1 -1
  185. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  186. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  187. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  190. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  193. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  194. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/eda/commonality.get.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/eda/features/run.post.mjs +1 -1
  197. package/.output/server/chunks/routes/api/workshop/eda/index3.get.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/eda/index6.get.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/eda/index6.post.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/eda/runs/_id/labels.patch.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/eda/runs.get.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/eda/vm/predict.post.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +1 -1
  205. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/index.mjs +62 -0
  211. package/.output/server/chunks/routes/api/workshop/index.mjs.map +1 -0
  212. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  213. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/mes/datasets.get.mjs +1 -1
  226. package/.output/server/chunks/routes/api/workshop/mes/preview.post.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs +54 -0
  228. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs.map +1 -0
  229. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs +51 -0
  230. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs.map +1 -0
  231. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs +67 -0
  232. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs.map +1 -0
  233. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs +49 -0
  234. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs.map +1 -0
  235. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs +35 -0
  236. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs.map +1 -0
  237. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs +49 -0
  238. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs.map +1 -0
  239. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs +35 -0
  240. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs.map +1 -0
  241. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs +70 -0
  242. package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs.map +1 -0
  243. package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs +64 -0
  244. package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs.map +1 -0
  245. package/.output/server/chunks/routes/api/workshop/ontology/index.mjs +44 -0
  246. package/.output/server/chunks/routes/api/workshop/ontology/index.mjs.map +1 -0
  247. package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs +36 -0
  248. package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs.map +1 -0
  249. package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs +38 -0
  250. package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs.map +1 -0
  251. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs +40 -0
  252. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs.map +1 -0
  253. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs +63 -0
  254. package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs.map +1 -0
  255. package/.output/server/chunks/routes/api/workshop/optimization/capabilities.get.mjs +1 -1
  256. package/.output/server/chunks/routes/api/workshop/optimization/index.get.mjs +1 -1
  257. package/.output/server/chunks/routes/api/workshop/optimization/index.mjs +1 -1
  258. package/.output/server/chunks/routes/api/workshop/optimization/index2.mjs +1 -1
  259. package/.output/server/chunks/routes/api/workshop/optimization/profiles/_id/publish.post.mjs +1 -1
  260. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/crosscheck.post.mjs +1 -1
  261. package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/dispatch.post.mjs +1 -1
  262. package/.output/server/chunks/routes/api/workshop/optimization/solve.post.mjs +1 -1
  263. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  265. package/.output/server/chunks/routes/api/workshop/process-model/datasets.post.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/process-model/eligibility.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/process-model/experiments.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/process-model/index.mjs +1 -1
  269. package/.output/server/chunks/routes/api/workshop/process-model/specs/_id/publish.post.mjs +1 -1
  270. package/.output/server/chunks/routes/api/workshop/process-model/train.post.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  272. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  273. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  274. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  275. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  276. package/.output/server/chunks/routes/api/workshop/tools/_name_.get.mjs +1 -1
  277. package/.output/server/chunks/routes/api/workshop/tools/sync.post.mjs +1 -1
  278. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  279. package/.output/server/chunks/routes/renderer.mjs +2 -2
  280. package/.output/server/chunks/virtual/entry.mjs +234 -3
  281. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  282. package/.output/server/package.json +1 -1
  283. package/README-zh.md +27 -6
  284. package/README.md +25 -4
  285. package/app/components/AppSidebar.vue +1 -0
  286. package/app/pages/ontology/api.ts +18 -0
  287. package/app/pages/ontology/index.vue +779 -0
  288. package/app/pages/ontology/types.ts +122 -0
  289. package/config.yml +1 -1
  290. package/docs/cli.en.md +2 -2
  291. package/docs/cli.md +2 -2
  292. package/docs/plugins.en.md +1 -1
  293. package/docs/plugins.md +1 -1
  294. package/docs/sdk.en.md +1 -1
  295. package/docs/sdk.md +1 -1
  296. package/i18n/locales/en.ts +58 -0
  297. package/i18n/locales/zh-CN.ts +58 -0
  298. package/mcp/aw-mcp-server.mjs +35 -1
  299. package/package.json +1 -1
  300. package/scripts/docs-shots.mjs +36 -0
  301. package/scripts/e2e-model-loop-live.mjs +731 -0
  302. package/scripts/e2e-ontology-live.mjs +774 -0
  303. package/scripts/e2e-ontology.mjs +328 -0
  304. package/scripts/ontology-idd-rag-e2e.mjs +449 -0
  305. package/server/api/workshop/agent-tools/approvals/[id]/decide.post.ts +16 -0
  306. package/server/api/workshop/ontology/drafts/[draftId]/compile.ts +39 -0
  307. package/server/api/workshop/ontology/drafts/[draftId]/evidence.ts +33 -0
  308. package/server/api/workshop/ontology/drafts/[draftId]/publish.ts +44 -0
  309. package/server/api/workshop/ontology/drafts/[draftId]/rules/[ruleId]/approval-decision.ts +28 -0
  310. package/server/api/workshop/ontology/drafts/[draftId]/rules/[ruleId]/approval.ts +17 -0
  311. package/server/api/workshop/ontology/drafts/[draftId]/rules/[ruleId]/transition.ts +32 -0
  312. package/server/api/workshop/ontology/drafts/[draftId]/validate.ts +16 -0
  313. package/server/api/workshop/ontology/drafts/[draftId].ts +52 -0
  314. package/server/api/workshop/ontology/drafts/index.ts +20 -0
  315. package/server/api/workshop/ontology/export/[ontologyId].ts +50 -0
  316. package/server/api/workshop/ontology/index.ts +38 -0
  317. package/server/api/workshop/ontology/scene.ts +21 -0
  318. package/server/api/workshop/ontology/traces/[ontologyId].ts +19 -0
  319. package/server/api/workshop/ontology/versions/[ontologyId]/compare.ts +21 -0
  320. package/server/api/workshop/ontology/versions/[ontologyId].ts +42 -0
  321. package/server/services/workshop/agents/hitl-decision/dispatcher.ts +15 -0
  322. package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +13 -1
  323. package/server/services/workshop/agents/industrial/grant-guard.ts +59 -0
  324. package/server/services/workshop/agents/industrial/index.ts +38 -32
  325. package/server/services/workshop/agents/industrial/ontology-tools.ts +320 -0
  326. package/server/services/workshop/agents/industrial/optimizer-tools.ts +79 -0
  327. package/server/services/workshop/agents/industrial/tool-verify.ts +32 -2
  328. package/server/services/workshop/agents/tool-reference-spec.ts +1 -1
  329. package/server/services/workshop/aml/twin/physics-spec.ts +6 -22
  330. package/server/services/workshop/daq/storage/index.ts +6 -5
  331. package/server/services/workshop/daq/storage/sqlite.adapter.ts +25 -13
  332. package/server/services/workshop/db/database/open.ts +2 -0
  333. package/server/services/workshop/db/database/schema.ts +155 -1
  334. package/server/services/workshop/ontology/compiler.ts +474 -0
  335. package/server/services/workshop/ontology/contracts.ts +441 -0
  336. package/server/services/workshop/ontology/guards.ts +139 -0
  337. package/server/services/workshop/ontology/index.ts +10 -0
  338. package/server/services/workshop/ontology/ontology.service.ts +892 -0
  339. package/server/services/workshop/ontology/repo.ts +449 -0
  340. package/server/services/workshop/ontology/semantic-binding.service.ts +226 -0
  341. package/server/services/workshop/ontology/validator.ts +218 -0
  342. package/server/services/workshop/optimization/binding.repo.ts +7 -0
  343. package/server/services/workshop/optimization/contracts.ts +14 -0
  344. package/server/services/workshop/optimization/dispatch.service.ts +16 -0
  345. package/server/services/workshop/optimization/profile-adopt.service.ts +256 -0
  346. package/server/services/workshop/optimization/profile.repo.ts +19 -3
  347. package/server/services/workshop/optimization/python/__pycache__/problems.cpython-312.pyc +0 -0
  348. package/shared/dimensions.ts +124 -0
  349. package/.output/public/_nuxt/B7s2qeyT.js +0 -14
  350. package/.output/public/_nuxt/LHIav-Kv.js +0 -1
  351. package/.output/public/_nuxt/RuMLNeQE.js +0 -1
  352. package/.output/public/_nuxt/builds/meta/0ae8cb0f-6ce5-4096-9692-9b1fc197b30d.json +0 -1
  353. /package/.output/public/_nuxt/{62J4vljm2.js → 62J4vljm.js} +0 -0
  354. /package/.output/public/_nuxt/{BO0BJx3w.js → BO0BJx3w2.js} +0 -0
  355. /package/.output/public/_nuxt/{C-MY-JQE2.js → C-MY-JQE.js} +0 -0
  356. /package/.output/public/_nuxt/{D5kCimyw.js → D5kCimyw2.js} +0 -0
  357. /package/.output/public/_nuxt/{DGrrucbG2.js → DGrrucbG.js} +0 -0
  358. /package/.output/public/_nuxt/{Y4sMSPrS.js → Y4sMSPrS2.js} +0 -0
@@ -0,0 +1,779 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * 本体模型管理台(/ontology)—— 工业本体与语义资产的构建、审核、发布与编译预览。
4
+ *
5
+ * 三块职责:
6
+ * 1) 资产面:实体/关系/约束规则/语义绑定(本体 ↔ 数采/数控/配方参数)的可读可编辑视图;
7
+ * 2) 治理面:规则生命周期推进(proposed→reviewed→validated→approved_for_control)、
8
+ * 第二人批准、版本冻结与退役(发布仅 admin);
9
+ * 3) 解释面:编译预览四类产物 + Rule Trace,回答「这条建议为什么受此限制」。
10
+ *
11
+ * 设计纪律:页面不自己发明约束语义 —— 所有校验/编译/审批判定由服务端裁决,
12
+ * 前端只呈现结果与可行动原因(409/422 原样展示)。
13
+ */
14
+ import { computed, onMounted, ref } from 'vue'
15
+ import { message } from 'ant-design-vue'
16
+ import { apiErrorMessage } from '@/app/utils/api-error'
17
+ import { useUserStore } from '@/app/stores/workshop/user'
18
+ import { ontologyApi } from './api'
19
+ import type {
20
+ CompileDto, DraftDetailDto, DraftSummary, IssueDto, OverviewDto,
21
+ VersionDiffDto, VersionDto,
22
+ } from './types'
23
+
24
+ const { t } = useI18n()
25
+ const userStore = useUserStore()
26
+
27
+ type TabKey = 'overview' | 'graph' | 'rules' | 'bindings' | 'versions' | 'compile'
28
+ const tab = ref<TabKey>('overview')
29
+ const tabs: TabKey[] = ['overview', 'graph', 'rules', 'bindings', 'versions', 'compile']
30
+
31
+ const loading = ref(false)
32
+ const busy = ref(false)
33
+ const overview = ref<OverviewDto>({ ontologies: [], drafts: [] })
34
+ const draftId = ref('')
35
+ const detail = ref<DraftDetailDto | null>(null)
36
+ const versions = ref<VersionDto[]>([])
37
+ const diff = ref<VersionDiffDto | null>(null)
38
+ const preview = ref<CompileDto | null>(null)
39
+ const diffFrom = ref<number | undefined>(undefined)
40
+ const diffTo = ref<number | undefined>(undefined)
41
+
42
+ const isAdmin = computed(() => userStore.isAdmin)
43
+ const doc = computed(() => detail.value?.doc ?? null)
44
+ const issues = computed<IssueDto[]>(() => detail.value?.validation.issues ?? [])
45
+ const errors = computed(() => issues.value.filter(i => i.severity === 'error'))
46
+ const bindingFailures = computed(() => detail.value?.bindings.failures ?? [])
47
+ const draftOptions = computed(() => overview.value.drafts.map(d => ({
48
+ value: d.id,
49
+ label: `${d.ontologyId} · rev ${d.rev}${d.baseVersion ? ` · 基线 v${d.baseVersion}` : ''}`,
50
+ })))
51
+ const versionOptions = computed(() => versions.value.map(v => ({ value: v.version, label: `v${v.version}(${v.status})` })))
52
+
53
+ const entityColumns = [
54
+ { title: 'key', dataIndex: 'key', key: 'key', width: 180 },
55
+ { title: t('ontology.col.kind'), dataIndex: 'kind', key: 'kind', width: 140 },
56
+ { title: t('ontology.col.name'), dataIndex: 'name', key: 'name' },
57
+ { title: t('ontology.col.role'), dataIndex: 'role', key: 'role', width: 110 },
58
+ { title: t('ontology.col.unit'), dataIndex: 'unit', key: 'unit', width: 90 },
59
+ ]
60
+ const relationColumns = [
61
+ { title: 'id', dataIndex: 'id', key: 'id', width: 180 },
62
+ { title: t('ontology.col.predicate'), dataIndex: 'kind', key: 'kind', width: 130 },
63
+ { title: 'src → dst', key: 'edge', width: 300 },
64
+ { title: t('ontology.col.evidenceTier'), key: 'tier', width: 170 },
65
+ ]
66
+ const ruleColumns = [
67
+ { title: 'id', dataIndex: 'id', key: 'id', width: 160 },
68
+ { title: t('ontology.col.ruleKind'), dataIndex: 'kind', key: 'kind', width: 140 },
69
+ { title: t('ontology.col.level'), dataIndex: 'constraintLevel', key: 'level', width: 90 },
70
+ { title: t('ontology.col.status'), dataIndex: 'status', key: 'status', width: 170 },
71
+ { title: t('ontology.col.evidence'), key: 'evidence', width: 200 },
72
+ { title: t('ontology.col.action'), key: 'action', width: 260 },
73
+ ]
74
+ const bindingColumns = [
75
+ { title: 'id', dataIndex: 'id', key: 'id', width: 150 },
76
+ { title: t('ontology.col.entity'), dataIndex: 'entityKey', key: 'entityKey', width: 180 },
77
+ { title: t('ontology.col.target'), key: 'target' },
78
+ { title: t('ontology.col.direction'), dataIndex: 'direction', key: 'direction', width: 110 },
79
+ { title: t('ontology.col.unitPair'), key: 'unitPair', width: 160 },
80
+ ]
81
+ const versionColumns = [
82
+ { title: t('ontology.col.version'), dataIndex: 'version', key: 'version', width: 90 },
83
+ { title: t('ontology.col.status'), dataIndex: 'status', key: 'status', width: 110 },
84
+ { title: 'hash', dataIndex: 'contentHash', key: 'contentHash', width: 220 },
85
+ { title: t('ontology.col.line'), dataIndex: 'lineId', key: 'lineId', width: 140 },
86
+ { title: t('ontology.col.parent'), dataIndex: 'parentVersion', key: 'parentVersion', width: 90 },
87
+ { title: t('ontology.col.createdAt'), dataIndex: 'createdAt', key: 'createdAt' },
88
+ ]
89
+ const traceColumns = [
90
+ { title: 'ruleId', dataIndex: 'ruleId', key: 'ruleId', width: 150 },
91
+ { title: t('ontology.col.decision'), dataIndex: 'decision', key: 'decision', width: 110 },
92
+ { title: t('ontology.col.code'), dataIndex: 'decisionCode', key: 'decisionCode', width: 220 },
93
+ { title: t('ontology.col.evidence'), dataIndex: 'evidenceLevel', key: 'evidenceLevel', width: 160 },
94
+ { title: t('ontology.col.message'), dataIndex: 'message', key: 'message' },
95
+ ]
96
+
97
+ function statusColor(status: string): string {
98
+ if (status === 'approved_for_control') return 'green'
99
+ if (status === 'validated') return 'blue'
100
+ if (status === 'reviewed') return 'cyan'
101
+ if (status === 'deprecated') return 'red'
102
+ return 'default'
103
+ }
104
+
105
+ function tierColor(tier: string): string {
106
+ if (tier === 'validated_control') return 'green'
107
+ if (tier === 'observed_correlation') return 'blue'
108
+ return 'default'
109
+ }
110
+
111
+ async function loadOverview(): Promise<void> {
112
+ loading.value = true
113
+ try {
114
+ overview.value = await ontologyApi<OverviewDto>('')
115
+ if (!draftId.value && overview.value.drafts.length > 0) draftId.value = overview.value.drafts[0]!.id
116
+ }
117
+ catch (e) {
118
+ message.error(apiErrorMessage(e, t('ontology.loadFail')))
119
+ }
120
+ finally {
121
+ loading.value = false
122
+ }
123
+ }
124
+
125
+ async function loadDraft(): Promise<void> {
126
+ if (!draftId.value) {
127
+ detail.value = null
128
+ return
129
+ }
130
+ try {
131
+ detail.value = await ontologyApi<DraftDetailDto>(`/drafts/${encodeURIComponent(draftId.value)}`)
132
+ }
133
+ catch (e) {
134
+ message.error(apiErrorMessage(e, t('ontology.loadDraftFail')))
135
+ }
136
+ }
137
+
138
+ async function loadVersions(ontologyId: string): Promise<void> {
139
+ if (!ontologyId) {
140
+ versions.value = []
141
+ return
142
+ }
143
+ try {
144
+ const res = await ontologyApi<{ versions: VersionDto[] }>(`/versions/${encodeURIComponent(ontologyId)}`)
145
+ versions.value = res.versions
146
+ if (versions.value.length >= 2) {
147
+ diffTo.value = versions.value[0]!.version
148
+ diffFrom.value = versions.value[1]!.version
149
+ }
150
+ }
151
+ catch (e) {
152
+ message.error(apiErrorMessage(e, t('ontology.loadVersionsFail')))
153
+ }
154
+ }
155
+
156
+ async function createDraft(): Promise<void> {
157
+ const ontologyId = window.prompt(t('ontology.prompt.ontologyId'))
158
+ if (!ontologyId) return
159
+ const lineId = window.prompt(t('ontology.prompt.lineId')) ?? ''
160
+ busy.value = true
161
+ try {
162
+ const res = await ontologyApi<{ draft: DraftSummary }>('', { method: 'POST', body: { ontologyId, lineId } })
163
+ message.success(t('ontology.draftCreated', { id: res.draft.id }))
164
+ draftId.value = res.draft.id
165
+ await loadOverview()
166
+ await loadDraft()
167
+ }
168
+ catch (e) {
169
+ message.error(apiErrorMessage(e, t('ontology.draftCreateFail')))
170
+ }
171
+ finally {
172
+ busy.value = false
173
+ }
174
+ }
175
+
176
+ async function runValidate(): Promise<void> {
177
+ if (!draftId.value) return
178
+ busy.value = true
179
+ try {
180
+ const res = await ontologyApi<{ ok: boolean }>(`/drafts/${encodeURIComponent(draftId.value)}/validate`, { method: 'POST', body: {} })
181
+ message[res.ok ? 'success' : 'warning'](res.ok ? t('ontology.validateOk') : t('ontology.validateFail'))
182
+ await loadDraft()
183
+ }
184
+ catch (e) {
185
+ message.error(apiErrorMessage(e, t('ontology.validateFail')))
186
+ }
187
+ finally {
188
+ busy.value = false
189
+ }
190
+ }
191
+
192
+ async function runCompile(): Promise<void> {
193
+ if (!draftId.value) return
194
+ busy.value = true
195
+ try {
196
+ preview.value = await ontologyApi<CompileDto>(`/drafts/${encodeURIComponent(draftId.value)}/compile`, { method: 'POST', body: {} })
197
+ tab.value = 'compile'
198
+ message.success(t('ontology.compileOk', { status: preview.value.status }))
199
+ }
200
+ catch (e) {
201
+ message.error(apiErrorMessage(e, t('ontology.compileFail')))
202
+ }
203
+ finally {
204
+ busy.value = false
205
+ }
206
+ }
207
+
208
+ async function runPublish(): Promise<void> {
209
+ if (!draftId.value) return
210
+ busy.value = true
211
+ try {
212
+ const res = await ontologyApi<{ version: { version: number }, packHash: string }>(`/drafts/${encodeURIComponent(draftId.value)}/publish`, { method: 'POST', body: {} })
213
+ message.success(t('ontology.publishOk', { version: res.version.version }))
214
+ if (doc.value) await loadVersions(doc.value.name ? (overview.value.drafts.find(d => d.id === draftId.value)?.ontologyId ?? '') : '')
215
+ await loadDraft()
216
+ }
217
+ catch (e) {
218
+ message.error(apiErrorMessage(e, t('ontology.publishFail')))
219
+ }
220
+ finally {
221
+ busy.value = false
222
+ }
223
+ }
224
+
225
+ async function transitionRule(ruleId: string, to: string): Promise<void> {
226
+ if (!draftId.value) return
227
+ busy.value = true
228
+ try {
229
+ await ontologyApi(`/drafts/${encodeURIComponent(draftId.value)}/rules/${encodeURIComponent(ruleId)}/transition`, {
230
+ method: 'POST', body: { to },
231
+ })
232
+ message.success(t('ontology.ruleTransitionOk', { rule: ruleId, to }))
233
+ await loadDraft()
234
+ }
235
+ catch (e) {
236
+ message.error(apiErrorMessage(e, t('ontology.ruleTransitionFail')))
237
+ }
238
+ finally {
239
+ busy.value = false
240
+ }
241
+ }
242
+
243
+ async function requestApproval(ruleId: string): Promise<void> {
244
+ if (!draftId.value) return
245
+ busy.value = true
246
+ try {
247
+ const res = await ontologyApi<{ approvalId: string }>(`/drafts/${encodeURIComponent(draftId.value)}/rules/${encodeURIComponent(ruleId)}/approval`, { method: 'POST', body: {} })
248
+ message.success(t('ontology.approvalRequested', { id: res.approvalId }))
249
+ const approvalId = window.prompt(t('ontology.prompt.approvalId'), res.approvalId)
250
+ if (approvalId) {
251
+ await ontologyApi(`/drafts/${encodeURIComponent(draftId.value)}/rules/${encodeURIComponent(ruleId)}/approval-decision`, {
252
+ method: 'POST', body: { approvalId, approved: true },
253
+ })
254
+ message.success(t('ontology.approvalDecided'))
255
+ await loadDraft()
256
+ }
257
+ }
258
+ catch (e) {
259
+ message.error(apiErrorMessage(e, t('ontology.approvalFail')))
260
+ }
261
+ finally {
262
+ busy.value = false
263
+ }
264
+ }
265
+
266
+ async function runCompare(): Promise<void> {
267
+ const ontologyId = overview.value.drafts.find(d => d.id === draftId.value)?.ontologyId ?? overview.value.ontologies[0]?.id ?? ''
268
+ if (!ontologyId || diffFrom.value === undefined || diffTo.value === undefined) return
269
+ try {
270
+ diff.value = await ontologyApi<VersionDiffDto>(`/versions/${encodeURIComponent(ontologyId)}/compare?from=${diffFrom.value}&to=${diffTo.value}`)
271
+ }
272
+ catch (e) {
273
+ message.error(apiErrorMessage(e, t('ontology.compareFail')))
274
+ }
275
+ }
276
+
277
+ async function retire(version: number): Promise<void> {
278
+ const ontologyId = overview.value.drafts.find(d => d.id === draftId.value)?.ontologyId ?? overview.value.ontologies[0]?.id ?? ''
279
+ if (!ontologyId) return
280
+ busy.value = true
281
+ try {
282
+ await ontologyApi(`/versions/${encodeURIComponent(ontologyId)}`, { method: 'POST', body: { version } })
283
+ message.success(t('ontology.retireOk', { version }))
284
+ await loadVersions(ontologyId)
285
+ }
286
+ catch (e) {
287
+ message.error(apiErrorMessage(e, t('ontology.retireFail')))
288
+ }
289
+ finally {
290
+ busy.value = false
291
+ }
292
+ }
293
+
294
+ function currentOntologyId(): string {
295
+ return overview.value.drafts.find(d => d.id === draftId.value)?.ontologyId ?? overview.value.ontologies[0]?.id ?? ''
296
+ }
297
+
298
+ onMounted(async () => {
299
+ await loadOverview()
300
+ await loadDraft()
301
+ await loadVersions(currentOntologyId())
302
+ })
303
+
304
+ function onDraftChange(): void {
305
+ void loadDraft()
306
+ void loadVersions(currentOntologyId())
307
+ }
308
+
309
+ function issueColor(severity: string): string {
310
+ return severity === 'error' ? 'red' : 'orange'
311
+ }
312
+
313
+ function diffLabel(part: { added: string[], removed: string[], changed: string[] }): string {
314
+ return `+${part.added.length} / −${part.removed.length} / ±${part.changed.length}`
315
+ }
316
+ </script>
317
+
318
+ <template>
319
+ <div class="ontology-page">
320
+ <header class="aw-page-head">
321
+ <div>
322
+ <p class="aw-kicker">
323
+ {{ t('ontology.kicker') }}
324
+ </p>
325
+ <h1>{{ t('ontology.title') }}</h1>
326
+ <p class="sub">
327
+ {{ t('ontology.subtitle') }}
328
+ </p>
329
+ </div>
330
+ <div class="head-actions">
331
+ <a-button
332
+ :loading="loading"
333
+ @click="loadOverview"
334
+ >
335
+ {{ t('ontology.refresh') }}
336
+ </a-button>
337
+ <a-button
338
+ type="primary"
339
+ :loading="busy"
340
+ @click="createDraft"
341
+ >
342
+ {{ t('ontology.newDraft') }}
343
+ </a-button>
344
+ </div>
345
+ </header>
346
+
347
+ <section class="toolbar">
348
+ <a-select
349
+ :value="draftId"
350
+ style="min-width: 320px"
351
+ :options="draftOptions"
352
+ :placeholder="t('ontology.pickDraft')"
353
+ show-search
354
+ @change="(v: unknown) => { draftId = String(v ?? ''); onDraftChange() }"
355
+ />
356
+ <a-button
357
+ :disabled="!draftId"
358
+ :loading="busy"
359
+ @click="runValidate"
360
+ >
361
+ {{ t('ontology.validate') }}
362
+ </a-button>
363
+ <a-button
364
+ :disabled="!draftId"
365
+ :loading="busy"
366
+ @click="runCompile"
367
+ >
368
+ {{ t('ontology.compile') }}
369
+ </a-button>
370
+ <a-button
371
+ v-if="isAdmin"
372
+ :disabled="!draftId || errors.length > 0 || bindingFailures.length > 0"
373
+ type="primary"
374
+ :loading="busy"
375
+ @click="runPublish"
376
+ >
377
+ {{ t('ontology.publish') }}
378
+ </a-button>
379
+ <span class="hint">{{ t('ontology.publishHint') }}</span>
380
+ </section>
381
+
382
+ <div class="tabs">
383
+ <button
384
+ v-for="key in tabs"
385
+ :key="key"
386
+ class="pill-btn"
387
+ :class="{ active: tab === key }"
388
+ @click="tab = key"
389
+ >
390
+ {{ t(`ontology.tab.${key}`) }}
391
+ </button>
392
+ </div>
393
+
394
+ <!-- 总览 -->
395
+ <section
396
+ v-if="tab === 'overview'"
397
+ class="panel"
398
+ >
399
+ <div class="stats">
400
+ <div class="stat">
401
+ <span>{{ t('ontology.stat.ontologies') }}</span>
402
+ <strong>{{ overview.ontologies.length }}</strong>
403
+ </div>
404
+ <div class="stat">
405
+ <span>{{ t('ontology.stat.drafts') }}</span>
406
+ <strong>{{ overview.drafts.length }}</strong>
407
+ </div>
408
+ <div class="stat">
409
+ <span>{{ t('ontology.stat.entities') }}</span>
410
+ <strong>{{ doc?.entities.length ?? 0 }}</strong>
411
+ </div>
412
+ <div class="stat">
413
+ <span>{{ t('ontology.stat.rules') }}</span>
414
+ <strong>{{ doc?.rules.length ?? 0 }}</strong>
415
+ </div>
416
+ <div class="stat">
417
+ <span>{{ t('ontology.stat.bindings') }}</span>
418
+ <strong>{{ doc?.bindings.length ?? 0 }}</strong>
419
+ </div>
420
+ </div>
421
+ <div class="two-col">
422
+ <div>
423
+ <h2>{{ t('ontology.section.ontologies') }}</h2>
424
+ <ul class="plain">
425
+ <li
426
+ v-for="o in overview.ontologies"
427
+ :key="o.id"
428
+ >
429
+ <strong>{{ o.id }}</strong>
430
+ <span>{{ o.lineId || t('ontology.global') }} · v{{ o.latest }} · {{ o.status }}</span>
431
+ </li>
432
+ <li
433
+ v-if="overview.ontologies.length === 0"
434
+ class="muted"
435
+ >
436
+ {{ t('ontology.empty.ontologies') }}
437
+ </li>
438
+ </ul>
439
+ </div>
440
+ <div>
441
+ <h2>{{ t('ontology.section.issues') }}</h2>
442
+ <ul class="plain">
443
+ <li
444
+ v-for="(issue, index) in issues.slice(0, 20)"
445
+ :key="`${issue.code}-${index}`"
446
+ >
447
+ <a-tag :color="issueColor(issue.severity)">
448
+ {{ issue.severity }}
449
+ </a-tag>
450
+ <strong>{{ issue.code }}</strong>
451
+ <span>{{ issue.message }}</span>
452
+ <em v-if="issue.hint">{{ issue.hint }}</em>
453
+ </li>
454
+ <li
455
+ v-if="issues.length === 0"
456
+ class="muted"
457
+ >
458
+ {{ t('ontology.empty.issues') }}
459
+ </li>
460
+ </ul>
461
+ </div>
462
+ </div>
463
+ </section>
464
+
465
+ <!-- 实体与关系 -->
466
+ <section
467
+ v-else-if="tab === 'graph'"
468
+ class="panel"
469
+ >
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>
489
+ </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"
496
+ class="muted"
497
+ >lag {{ record.properties.lagMs }}ms</span>
498
+ </template>
499
+ </template>
500
+ </a-table>
501
+ </section>
502
+
503
+ <!-- 约束规则 -->
504
+ <section
505
+ v-else-if="tab === 'rules'"
506
+ class="panel"
507
+ >
508
+ <a-table
509
+ :columns="ruleColumns"
510
+ :data-source="doc?.rules ?? []"
511
+ row-key="id"
512
+ size="small"
513
+ :pagination="{ pageSize: 10 }"
514
+ >
515
+ <template #bodyCell="{ column, record }">
516
+ <template v-if="column.key === 'status'">
517
+ <a-tag :color="statusColor(record.status)">
518
+ {{ record.status }}
519
+ </a-tag>
520
+ </template>
521
+ <template v-else-if="column.key === 'evidence'">
522
+ <span
523
+ v-for="(e, i) in record.evidence"
524
+ :key="i"
525
+ >
526
+ <a-tag :color="tierColor(e.level)">{{ e.level }}</a-tag>
527
+ </span>
528
+ <span
529
+ v-if="record.evidence.length === 0"
530
+ class="muted"
531
+ >{{ t('ontology.noEvidence') }}</span>
532
+ </template>
533
+ <template v-else-if="column.key === 'action'">
534
+ <a-button
535
+ v-if="record.status === 'proposed'"
536
+ size="small"
537
+ :loading="busy"
538
+ @click="transitionRule(record.id, 'reviewed')"
539
+ >
540
+ {{ t('ontology.action.review') }}
541
+ </a-button>
542
+ <a-button
543
+ v-if="record.status === 'reviewed'"
544
+ size="small"
545
+ :loading="busy"
546
+ @click="transitionRule(record.id, 'validated')"
547
+ >
548
+ {{ t('ontology.action.validate') }}
549
+ </a-button>
550
+ <a-button
551
+ v-if="record.status === 'validated'"
552
+ size="small"
553
+ type="primary"
554
+ :loading="busy"
555
+ @click="requestApproval(record.id)"
556
+ >
557
+ {{ t('ontology.action.approve') }}
558
+ </a-button>
559
+ </template>
560
+ </template>
561
+ </a-table>
562
+ </section>
563
+
564
+ <!-- 语义绑定 -->
565
+ <section
566
+ v-else-if="tab === 'bindings'"
567
+ class="panel"
568
+ >
569
+ <a-table
570
+ :columns="bindingColumns"
571
+ :data-source="doc?.bindings ?? []"
572
+ row-key="id"
573
+ size="small"
574
+ :pagination="{ pageSize: 12 }"
575
+ >
576
+ <template #bodyCell="{ column, record }">
577
+ <template v-if="column.key === 'target'">
578
+ <code>{{ record.platformKind }}:{{ record.platformId }}{{ record.targetSub ? `#${record.targetSub}` : '' }}</code>
579
+ </template>
580
+ <template v-else-if="column.key === 'unitPair'">
581
+ <span>{{ record.unitDeclared || '—' }} → {{ record.unitTarget || '—' }}</span>
582
+ </template>
583
+ </template>
584
+ </a-table>
585
+ <div
586
+ v-if="bindingFailures.length"
587
+ class="failures"
588
+ >
589
+ <h3>{{ t('ontology.section.bindingFailures') }}</h3>
590
+ <p
591
+ v-for="f in bindingFailures"
592
+ :key="f.bindingId"
593
+ >
594
+ <a-tag color="red">
595
+ {{ f.code }}
596
+ </a-tag>{{ f.message }}
597
+ </p>
598
+ </div>
599
+ </section>
600
+
601
+ <!-- 版本与发布 -->
602
+ <section
603
+ v-else-if="tab === 'versions'"
604
+ class="panel"
605
+ >
606
+ <a-table
607
+ :columns="versionColumns"
608
+ :data-source="versions"
609
+ row-key="version"
610
+ size="small"
611
+ :pagination="{ pageSize: 10 }"
612
+ >
613
+ <template #bodyCell="{ column, record }">
614
+ <template v-if="column.key === 'status'">
615
+ <a-tag :color="record.status === 'published' ? 'green' : (record.status === 'retired' ? 'red' : 'default')">
616
+ {{ record.status }}
617
+ </a-tag>
618
+ </template>
619
+ <template v-else-if="column.key === 'contentHash'">
620
+ <code>{{ String(record.contentHash).slice(0, 16) }}…</code>
621
+ </template>
622
+ <template v-else-if="column.key === 'createdAt'">
623
+ <span>{{ record.createdAt }}</span>
624
+ <a-button
625
+ v-if="isAdmin && record.status === 'published'"
626
+ size="small"
627
+ danger
628
+ class="retire"
629
+ :loading="busy"
630
+ @click="retire(record.version)"
631
+ >
632
+ {{ t('ontology.action.retire') }}
633
+ </a-button>
634
+ </template>
635
+ </template>
636
+ </a-table>
637
+ <div class="compare">
638
+ <a-select
639
+ v-model:value="diffFrom"
640
+ :options="versionOptions"
641
+ style="width: 140px"
642
+ :placeholder="t('ontology.from')"
643
+ />
644
+ <span>→</span>
645
+ <a-select
646
+ v-model:value="diffTo"
647
+ :options="versionOptions"
648
+ style="width: 140px"
649
+ :placeholder="t('ontology.to')"
650
+ />
651
+ <a-button
652
+ :loading="busy"
653
+ @click="runCompare"
654
+ >
655
+ {{ t('ontology.compare') }}
656
+ </a-button>
657
+ </div>
658
+ <div
659
+ v-if="diff"
660
+ class="diff"
661
+ >
662
+ <p><strong>v{{ diff.from }} → v{{ diff.to }}</strong></p>
663
+ <p>{{ t('ontology.diff.entities') }}: {{ diffLabel(diff.entities) }}</p>
664
+ <p>{{ t('ontology.diff.relations') }}: {{ diffLabel(diff.relations) }}</p>
665
+ <p>{{ t('ontology.diff.rules') }}: {{ diffLabel(diff.rules) }}</p>
666
+ <p>{{ t('ontology.diff.bindings') }}: {{ diffLabel(diff.bindings) }}</p>
667
+ <p v-if="diff.rules.changed.length">
668
+ <strong>{{ t('ontology.diff.rulesChanged') }}:</strong>
669
+ <code
670
+ v-for="id in diff.rules.changed"
671
+ :key="id"
672
+ class="chip"
673
+ >{{ id }}</code>
674
+ </p>
675
+ </div>
676
+ </section>
677
+
678
+ <!-- 编译预览 -->
679
+ <section
680
+ v-else
681
+ class="panel"
682
+ >
683
+ <div
684
+ v-if="!preview"
685
+ class="muted"
686
+ >
687
+ {{ t('ontology.compileEmpty') }}
688
+ </div>
689
+ <template v-else>
690
+ <div class="stats">
691
+ <div class="stat">
692
+ <span>{{ t('ontology.col.status') }}</span><strong>{{ preview.status }}</strong>
693
+ </div>
694
+ <div class="stat">
695
+ <span>compiled</span><strong>{{ preview.counts.compiled }}</strong>
696
+ </div>
697
+ <div class="stat">
698
+ <span>guard</span><strong>{{ preview.counts.guard }}</strong>
699
+ </div>
700
+ <div class="stat">
701
+ <span>explained</span><strong>{{ preview.counts.explained }}</strong>
702
+ </div>
703
+ <div class="stat">
704
+ <span>rejected</span><strong>{{ preview.counts.rejected }}</strong>
705
+ </div>
706
+ </div>
707
+ <p class="muted">
708
+ packHash <code>{{ preview.packHash.slice(0, 24) }}…</code>
709
+ </p>
710
+ <h2>{{ t('ontology.section.artifacts') }}</h2>
711
+ <div class="artifacts">
712
+ <div>
713
+ <h3>problem_ir</h3>
714
+ <pre>{{ JSON.stringify({ mvBounds: preview.artifacts.problemIr.mvBounds, cvBounds: preview.artifacts.problemIr.cvBounds }, null, 2) }}</pre>
715
+ </div>
716
+ <div>
717
+ <h3>control_guard</h3>
718
+ <pre>{{ JSON.stringify(preview.artifacts.controlGuard, null, 2) }}</pre>
719
+ </div>
720
+ <div>
721
+ <h3>process_model</h3>
722
+ <pre>{{ JSON.stringify({ featureCandidates: preview.artifacts.processModel.featureCandidates.length, delayPriors: preview.artifacts.processModel.delayPriors.length }, null, 2) }}</pre>
723
+ </div>
724
+ <div>
725
+ <h3>scene_contract</h3>
726
+ <pre>{{ JSON.stringify({ variables: preview.artifacts.sceneContract.variables.length, constraints: preview.artifacts.sceneContract.constraints.length, relations: preview.artifacts.sceneContract.inferredRelations.length }, null, 2) }}</pre>
727
+ </div>
728
+ </div>
729
+ <h2>{{ t('ontology.section.ruleTrace') }}</h2>
730
+ <a-table
731
+ :columns="traceColumns"
732
+ :data-source="preview.traces"
733
+ row-key="ruleId"
734
+ size="small"
735
+ :pagination="{ pageSize: 10 }"
736
+ >
737
+ <template #bodyCell="{ column, record }">
738
+ <template v-if="column.key === 'decision'">
739
+ <a-tag :color="record.decision === 'compiled' ? 'green' : (record.decision === 'guard' ? 'blue' : (record.decision === 'rejected' ? 'red' : 'default'))">
740
+ {{ record.decision }}
741
+ </a-tag>
742
+ </template>
743
+ </template>
744
+ </a-table>
745
+ </template>
746
+ </section>
747
+ </div>
748
+ </template>
749
+
750
+ <style scoped>
751
+ .ontology-page { padding: 20px 24px 48px; display: flex; flex-direction: column; gap: 16px; }
752
+ .aw-page-head { display: flex; justify-content: space-between; gap: 16px; align-items: flex-start; }
753
+ .aw-page-head h1 { margin: 2px 0 6px; font-size: 22px; }
754
+ .sub { margin: 0; color: var(--ink-soft); max-width: 72ch; }
755
+ .head-actions { display: flex; gap: 8px; }
756
+ .toolbar { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
757
+ .hint { color: var(--ink-faint); font-size: 12px; }
758
+ .tabs { display: flex; gap: 6px; flex-wrap: wrap; }
759
+ .panel { display: flex; flex-direction: column; gap: 14px; }
760
+ .panel h2 { font-size: 14px; margin: 8px 0 0; color: var(--ink-soft); text-transform: uppercase; letter-spacing: .04em; }
761
+ .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; }
763
+ .stat span { font-size: 12px; color: var(--ink-faint); }
764
+ .stat strong { font-size: 20px; }
765
+ .two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
766
+ .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; }
768
+ .plain li span { color: var(--ink-soft); font-size: 12px; }
769
+ .plain li em { color: var(--ink-faint); font-size: 12px; font-style: normal; }
770
+ .muted { color: var(--ink-faint); }
771
+ .failures { border: 1px solid var(--border); border-radius: 10px; padding: 12px; }
772
+ .artifacts { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
773
+ .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; }
775
+ .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; }
777
+ .chip { margin-right: 6px; }
778
+ .retire { margin-left: 8px; }
779
+ </style>