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,441 @@
1
+ /**
2
+ * 本体契约(单一类型真相)。
3
+ *
4
+ * 三层模型:
5
+ * 1) Core/Scenario 本体 = 一份「草稿文档」→ 发布时快照为不可变版本;
6
+ * 2) 语义绑定把本体实体锚到现有平台对象(daq_node/dcw_node/recipe_param),不建影子表;
7
+ * 3) Runtime Semantic Context 按请求组装,不落库。
8
+ *
9
+ * 证据三级(candidate_influence < observed_correlation < validated_control)与生命周期
10
+ * 五态(proposed→reviewed→validated→approved_for_control→deprecated)分离「可读 / 可参考 /
11
+ * 可编译为控制侧产物」三种能力。硬约束只接受 validated_control。
12
+ */
13
+ import { z } from 'zod'
14
+ import { dimensionOf, dimensionsCompatible, unitsCompatible } from '@/shared/dimensions'
15
+ import { canonicalJson, sha256 } from '../aml/twin/contracts'
16
+
17
+ export const ONTOLOGY_SCHEMA_VERSION = 1 as const
18
+
19
+ export const ONTOLOGY_ENTITY_KINDS = [
20
+ 'production_line', 'process_unit', 'equipment', 'sensor', 'actuator',
21
+ 'process_variable', 'quality_variable', 'process_model', 'optimization_task', 'operating_condition',
22
+ ] as const
23
+ export type OntologyEntityKind = typeof ONTOLOGY_ENTITY_KINDS[number]
24
+
25
+ /** 关系封闭枚举(禁止宽泛 relatedTo) */
26
+ export const ONTOLOGY_RELATION_KINDS = [
27
+ 'influences', 'measures', 'actuates', 'hasPart', 'precedes', 'observedBy', 'constrainedBy', 'basedOn',
28
+ ] as const
29
+ export type OntologyRelationKind = typeof ONTOLOGY_RELATION_KINDS[number]
30
+
31
+ /** 实体在控制问题中的角色(与 ProcessModelSpec/SceneContract 词表显式对齐) */
32
+ export const ONTOLOGY_ROLES = ['control', 'target', 'disturbance', 'feature', 'state', 'guard', 'observation'] as const
33
+ export type OntologyRole = typeof ONTOLOGY_ROLES[number]
34
+
35
+ export const ONTOLOGY_STATES = ['proposed', 'reviewed', 'validated', 'approved_for_control', 'deprecated'] as const
36
+ export type OntologyState = typeof ONTOLOGY_STATES[number]
37
+
38
+ export const EVIDENCE_LEVELS = ['candidate_influence', 'observed_correlation', 'validated_control'] as const
39
+ export type EvidenceLevel = typeof EVIDENCE_LEVELS[number]
40
+
41
+ export const RULE_KINDS = ['bound', 'rate', 'linear_coupling', 'nonlinear', 'state_condition', 'interlock', 'informal'] as const
42
+ export type RuleKind = typeof RULE_KINDS[number]
43
+
44
+ export const PLATFORM_KINDS = ['daq_node', 'dcw_node', 'recipe_param', 'device', 'spec_variable', 'scene_variable', 'condition'] as const
45
+ export type PlatformKind = typeof PLATFORM_KINDS[number]
46
+
47
+ export const BINDING_DIRECTIONS = ['read', 'write', 'read_write'] as const
48
+
49
+ export type OntologyTarget = 'process_model' | 'problem_ir' | 'scene_contract' | 'control_guard'
50
+ export type CompileStatus = 'success' | 'warning' | 'rejected'
51
+ export type RuleDecision = 'compiled' | 'guard' | 'explained' | 'rejected'
52
+
53
+ /** 生命周期合法迁移(唯一真相;服务层与前端按钮共用) */
54
+ export const RULE_TRANSITIONS: Readonly<Record<OntologyState, readonly OntologyState[]>> = {
55
+ proposed: ['reviewed', 'deprecated'],
56
+ reviewed: ['validated', 'deprecated'],
57
+ validated: ['approved_for_control', 'deprecated'],
58
+ approved_for_control: ['deprecated'],
59
+ deprecated: [],
60
+ }
61
+
62
+ export function evidenceLevelRank(level: EvidenceLevel | '' | undefined): number {
63
+ const idx = EVIDENCE_LEVELS.indexOf((level ?? '') as EvidenceLevel)
64
+ return idx < 0 ? -1 : idx
65
+ }
66
+
67
+ export function maxEvidenceLevel(levels: Array<EvidenceLevel | '' | undefined>): EvidenceLevel | '' {
68
+ let best: EvidenceLevel | '' = ''
69
+ for (const level of levels) if (evidenceLevelRank(level) > evidenceLevelRank(best)) best = level as EvidenceLevel
70
+ return best
71
+ }
72
+
73
+ export const RULE_ERROR_CODES = {
74
+ EVIDENCE_INSUFFICIENT: 'ONTOLOGY_EVIDENCE_INSUFFICIENT',
75
+ UNKNOWN_ENTITY: 'ONTOLOGY_UNKNOWN_ENTITY',
76
+ UNIT_MISMATCH: 'ONTOLOGY_UNIT_MISMATCH',
77
+ RULE_CONFLICT: 'ONTOLOGY_RULE_CONFLICT',
78
+ EVIDENCE_STALE: 'ONTOLOGY_EVIDENCE_STALE',
79
+ SCOPE_MISMATCH: 'ONTOLOGY_SCOPE_MISMATCH',
80
+ TIGHTEN_ONLY: 'TIGHTEN_ONLY_VIOLATED',
81
+ UNSUPPORTED_FORM: 'REJECTED_UNSUPPORTED_FORM',
82
+ PLC_LAYER: 'PLC_LAYER_REQUIRED',
83
+ INVALID: 'ONTOLOGY_INVALID',
84
+ ROLE_UNRESOLVED: 'ONTOLOGY_ROLE_UNRESOLVED',
85
+ OBSERVABLE_UNRESOLVED: 'ONTOLOGY_OBSERVABLE_UNRESOLVED',
86
+ NOT_APPROVED: 'ONTOLOGY_NOT_APPROVED',
87
+ } as const
88
+
89
+ // ===== 证据 =====
90
+
91
+ export const evidenceSourceSchema = z.discriminatedUnion('type', [
92
+ z.object({ type: z.literal('expert_note'), author: z.string().min(1), noteId: z.string().min(1) }),
93
+ z.object({ type: z.literal('template_semantics'), templateKey: z.string().min(1) }),
94
+ z.object({ type: z.literal('physics_spec_monotonicity'), modelId: z.string().min(1) }),
95
+ z.object({ type: z.literal('dataset_stats'), datasetId: z.string().min(1), sha256: z.string().min(1) }),
96
+ z.object({ type: z.literal('optimizer_run'), runId: z.string().min(1), problemIrHash: z.string().min(1), modelArtifactHash: z.string().min(1) }),
97
+ z.object({ type: z.literal('manual'), author: z.string().default('') }),
98
+ ])
99
+ export type EvidenceSource = z.infer<typeof evidenceSourceSchema>
100
+
101
+ export const evidenceRecordSchema = z.object({
102
+ id: z.string().min(1),
103
+ level: z.enum(EVIDENCE_LEVELS),
104
+ source: evidenceSourceSchema,
105
+ /** 只存引用与引用快照 hash,不复制证据内容(D5/D11 证据单源) */
106
+ sourceRefHash: z.string().default(''),
107
+ createdAt: z.string().min(1),
108
+ note: z.string().max(500).optional(),
109
+ })
110
+ export type EvidenceRecord = z.infer<typeof evidenceRecordSchema>
111
+
112
+ // ===== 实体 / 关系 =====
113
+
114
+ const ENTITY_KEY = /^[a-z][a-z0-9_]*(?:\.[a-z0-9_]+)*$/
115
+
116
+ export const ontologyEntitySchema = z.object({
117
+ key: z.string().min(1).max(120).regex(ENTITY_KEY, '实体 key 必须形如 pv.melt_pressure(小写、点分)'),
118
+ kind: z.enum(ONTOLOGY_ENTITY_KINDS),
119
+ name: z.string().min(1).max(200),
120
+ description: z.string().max(2000).default(''),
121
+ unit: z.string().max(32).default(''),
122
+ dimension: z.string().max(64).default(''),
123
+ role: z.enum(ONTOLOGY_ROLES).optional(),
124
+ attrs: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).default({}),
125
+ })
126
+ export type OntologyEntity = z.infer<typeof ontologyEntitySchema>
127
+
128
+ export const relationPropertiesSchema = z.object({
129
+ sign: z.enum(['positive', 'negative']).optional(),
130
+ /** 增益只接受模型单位(展示层经 shared/units 换算);仅 validated_control 允许填 */
131
+ gainPerUnit: z.number().finite().optional(),
132
+ lagMs: z.number().int().min(0).optional(),
133
+ /** 关系证据档:不得超过其所附 evidence 的最高级别 */
134
+ evidenceTier: z.enum(EVIDENCE_LEVELS).default('candidate_influence'),
135
+ /** 变速工况下 τ=D/v 是否已校验;未校验时时滞只能作软先验 */
136
+ variabilityChecked: z.boolean().default(false),
137
+ /** 物料输运距离与标称线速(用于 τ=D/v 时滞先验;两者都给才计算) */
138
+ transportDistanceM: z.number().finite().positive().optional(),
139
+ nominalSpeedMps: z.number().finite().positive().optional(),
140
+ controlApplicability: z.object({
141
+ lineId: z.string().default(''),
142
+ recipeIds: z.array(z.string()).default([]),
143
+ conditionIds: z.array(z.string()).default([]),
144
+ }).optional(),
145
+ })
146
+ export type RelationProperties = z.infer<typeof relationPropertiesSchema>
147
+
148
+ export const ontologyRelationSchema = z.object({
149
+ id: z.string().min(1).max(120),
150
+ kind: z.enum(ONTOLOGY_RELATION_KINDS),
151
+ srcKey: z.string().min(1),
152
+ dstKey: z.string().min(1),
153
+ status: z.enum(ONTOLOGY_STATES).default('proposed'),
154
+ evidence: z.array(evidenceRecordSchema).default([]),
155
+ properties: relationPropertiesSchema.default({ evidenceTier: 'candidate_influence', variabilityChecked: false }),
156
+ })
157
+ export type OntologyRelation = z.infer<typeof ontologyRelationSchema>
158
+
159
+ // ===== 规则 DSL =====
160
+
161
+ const comparisonSchema = z.object({
162
+ variableKey: z.string().min(1),
163
+ op: z.enum(['eq', 'neq', 'lt', 'lte', 'gt', 'gte']),
164
+ value: z.union([z.number(), z.string(), z.boolean()]),
165
+ })
166
+
167
+ export const ruleDslSchema = z.discriminatedUnion('type', [
168
+ z.object({
169
+ type: z.literal('bound'),
170
+ variableKey: z.string().min(1),
171
+ min: z.number().finite().optional(),
172
+ max: z.number().finite().optional(),
173
+ unit: z.string().max(32).optional(),
174
+ }),
175
+ z.object({
176
+ type: z.literal('rate'),
177
+ variableKey: z.string().min(1),
178
+ maxStep: z.number().finite().positive(),
179
+ unit: z.string().max(32).optional(),
180
+ }),
181
+ z.object({
182
+ type: z.literal('linear_coupling'),
183
+ variableKey: z.string().min(1),
184
+ ofKey: z.string().min(1),
185
+ factor: z.number().finite(),
186
+ note: z.string().max(500).optional(),
187
+ }),
188
+ z.object({
189
+ type: z.literal('nonlinear'),
190
+ variableKey: z.string().min(1),
191
+ /** 简单阈值形态可由运行时守卫执行(如 'cv.thickness <= 52');复杂表达式需后端支持 */
192
+ expression: z.string().min(1).max(300),
193
+ }),
194
+ z.object({
195
+ type: z.literal('state_condition'),
196
+ when: comparisonSchema,
197
+ forbid: z.object({
198
+ kind: z.enum(['positive_increment', 'nonzero_increment']),
199
+ variableKey: z.string().min(1),
200
+ }),
201
+ message: z.string().max(500).optional(),
202
+ }),
203
+ z.object({
204
+ type: z.literal('interlock'),
205
+ variableKey: z.string().min(1).optional(),
206
+ text: z.string().min(1).max(500),
207
+ }),
208
+ z.object({
209
+ type: z.literal('informal'),
210
+ text: z.string().min(1).max(500),
211
+ }),
212
+ ])
213
+ export type RuleDsl = z.infer<typeof ruleDslSchema>
214
+
215
+ export const ontologyRuleSchema = z.object({
216
+ id: z.string().min(1).max(120),
217
+ key: z.string().min(1).max(120),
218
+ kind: z.enum(RULE_KINDS),
219
+ dsl: ruleDslSchema,
220
+ constraintLevel: z.enum(['hard', 'soft']).default('soft'),
221
+ severity: z.enum(['error', 'warn']).default('error'),
222
+ status: z.enum(ONTOLOGY_STATES).default('proposed'),
223
+ evidence: z.array(evidenceRecordSchema).default([]),
224
+ description: z.string().max(500).default(''),
225
+ scope: z.object({
226
+ lineId: z.string().default(''),
227
+ recipeId: z.string().default(''),
228
+ conditionId: z.string().default(''),
229
+ }).default({ lineId: '', recipeId: '', conditionId: '' }),
230
+ })
231
+ export type OntologyRule = z.infer<typeof ontologyRuleSchema>
232
+
233
+ // ===== 语义绑定(草稿期) =====
234
+
235
+ export const bindingDraftSchema = z.object({
236
+ id: z.string().min(1).max(120),
237
+ entityKey: z.string().min(1),
238
+ platformKind: z.enum(PLATFORM_KINDS),
239
+ platformId: z.string().min(1).max(200),
240
+ targetSub: z.string().max(200).default(''),
241
+ scope: z.string().max(200).default('global'),
242
+ direction: z.enum(BINDING_DIRECTIONS).default('read'),
243
+ unitDeclared: z.string().max(32).default(''),
244
+ unitTarget: z.string().max(32).default(''),
245
+ scale: z.number().finite().default(1),
246
+ offset: z.number().finite().default(0),
247
+ })
248
+ export type BindingDraft = z.infer<typeof bindingDraftSchema>
249
+
250
+ // ===== 草稿文档 =====
251
+
252
+ export const ontologyDraftDocSchema = z.object({
253
+ schemaVersion: z.literal(ONTOLOGY_SCHEMA_VERSION),
254
+ name: z.string().min(1).max(200),
255
+ /** 授权锚;空 = 全局本体(仅 admin 可发布) */
256
+ lineId: z.string().max(120).default(''),
257
+ entities: z.array(ontologyEntitySchema).default([]),
258
+ relations: z.array(ontologyRelationSchema).default([]),
259
+ rules: z.array(ontologyRuleSchema).default([]),
260
+ bindings: z.array(bindingDraftSchema).default([]),
261
+ note: z.string().max(2000).default(''),
262
+ })
263
+ export type OntologyDraftDoc = z.infer<typeof ontologyDraftDocSchema>
264
+
265
+ export function emptyDraftDoc(ontologyId: string, lineId = ''): OntologyDraftDoc {
266
+ return { schemaVersion: ONTOLOGY_SCHEMA_VERSION, name: ontologyId, lineId, entities: [], relations: [], rules: [], bindings: [], note: '' }
267
+ }
268
+
269
+ export function parseDraftDoc(value: unknown): OntologyDraftDoc {
270
+ return ontologyDraftDocSchema.parse(value) as OntologyDraftDoc
271
+ }
272
+
273
+ /** 草稿内容 hash(与版本 content_hash 同口径:整份规范化文档) */
274
+ export function draftContentHash(doc: OntologyDraftDoc): string {
275
+ return sha256(canonicalJson(doc))
276
+ }
277
+
278
+ // ===== 编译产物 =====
279
+
280
+ export interface BoundsEntry { min?: number, max?: number, maxStep?: number }
281
+
282
+ export interface ProblemIrDelta {
283
+ templateRef: 'linear_mpc_quadratic@1' | 'steady_response@1'
284
+ mvBounds: Record<string, BoundsEntry>
285
+ cvBounds: Record<string, BoundsEntry>
286
+ softRegularization: Array<{ ruleId: string, note: string }>
287
+ }
288
+
289
+ export interface FeatureCandidate {
290
+ entityKey: string
291
+ role: 'feature' | 'disturbance'
292
+ relation: string
293
+ evidenceLevel: EvidenceLevel
294
+ priorDelayMs?: number
295
+ variabilityChecked: boolean
296
+ }
297
+
298
+ export interface DelayPrior {
299
+ entityKey: string
300
+ delayMs: number
301
+ basis: 'relation_lag' | 'tau_eq_D_over_v'
302
+ variabilityChecked: boolean
303
+ }
304
+
305
+ export interface ProcessModelDelta {
306
+ featureCandidates: FeatureCandidate[]
307
+ delayPriors: DelayPrior[]
308
+ monotonicity: Array<{ output: string, input: string, direction: 'increasing' | 'decreasing' }>
309
+ }
310
+
311
+ export interface SceneContractPatch {
312
+ variables: Array<{ id: string, role: string, unit: string, min?: number, max?: number, maxStep?: number }>
313
+ constraints: Array<{ id: string, kind: 'hard_range' | 'rate' | 'max_delta' | 'custom', min?: number, max?: number, unit?: string }>
314
+ inferredRelations: Array<{ srcKey: string, dstKey: string, predicate: string, evidenceTier: EvidenceLevel }>
315
+ }
316
+
317
+ /** 运行时守卫:白名单算子 + 单条件阈值;可被 evaluateGuards 真正执行 */
318
+ export interface ControlGuard {
319
+ id: string
320
+ ruleId: string
321
+ when: { variableKey: string, op: 'eq' | 'neq' | 'lt' | 'lte' | 'gt' | 'gte', value: number | string | boolean }
322
+ forbid: { kind: 'positive_increment' | 'nonzero_increment', variableKey: string }
323
+ scope: { lineId: string, recipeId: string, conditionId: string }
324
+ onViolate: 'block_recommendation' | 'annotate'
325
+ message: string
326
+ }
327
+
328
+ export interface ControlGuardSet {
329
+ guards: ControlGuard[]
330
+ }
331
+
332
+ export interface CompiledArtifacts {
333
+ processModel: ProcessModelDelta
334
+ problemIr: ProblemIrDelta
335
+ sceneContract: SceneContractPatch
336
+ controlGuard: ControlGuardSet
337
+ }
338
+
339
+ export function emptyArtifacts(): CompiledArtifacts {
340
+ return {
341
+ processModel: { featureCandidates: [], delayPriors: [], monotonicity: [] },
342
+ problemIr: { templateRef: 'linear_mpc_quadratic@1', mvBounds: {}, cvBounds: {}, softRegularization: [] },
343
+ sceneContract: { variables: [], constraints: [], inferredRelations: [] },
344
+ controlGuard: { guards: [] },
345
+ }
346
+ }
347
+
348
+ export interface OntologyRuleTrace {
349
+ id: string
350
+ ontologyId: string
351
+ version: number
352
+ rulePackHash: string
353
+ ruleId: string
354
+ ruleKey: string
355
+ ruleRevision: string
356
+ ruleKind: RuleKind
357
+ evidenceLevel: EvidenceLevel | ''
358
+ constraintLevel: 'hard' | 'soft'
359
+ decision: RuleDecision
360
+ decisionCode: string
361
+ message: string
362
+ bindings: Array<{ entityKey: string, platformKind?: string, platformId?: string }>
363
+ artifacts: Array<{ kind: OntologyTarget, ref?: string, artifactHash?: string }>
364
+ scope: { lineId: string, recipeId: string, conditionId: string }
365
+ rowHash: string
366
+ createdAt: string
367
+ }
368
+
369
+ export interface CompileIssue {
370
+ code: string
371
+ path: string
372
+ message: string
373
+ severity: 'error' | 'warning'
374
+ ruleId?: string
375
+ hint?: string
376
+ }
377
+
378
+ export interface OntologyCompileResult {
379
+ status: CompileStatus
380
+ ontologyId: string
381
+ ontologyVersion: number
382
+ contentHash: string
383
+ rulePackHash: string
384
+ artifacts: CompiledArtifacts
385
+ traces: OntologyRuleTrace[]
386
+ issues: CompileIssue[]
387
+ compiledCount: number
388
+ guardCount: number
389
+ explainedCount: number
390
+ rejectedCount: number
391
+ }
392
+
393
+ export interface CompileOptions {
394
+ ontologyId: string
395
+ version: number
396
+ /** 现行权威界(来自 ProblemConfig/effectiveDomain);提供时强制「只收紧」 */
397
+ currentBounds?: { mv?: Record<string, BoundsEntry>, cv?: Record<string, BoundsEntry> }
398
+ scope?: { lineId?: string, recipeId?: string, conditionId?: string }
399
+ createdAt?: string
400
+ /**
401
+ * 只接受 approved_for_control 的规则产出控制侧产物(发布路径必开;预览可关)。
402
+ * 未获批的硬约束/阻断级守卫 → rejected ONTOLOGY_NOT_APPROVED。
403
+ */
404
+ approvedOnly?: boolean
405
+ }
406
+
407
+ /** 供 Profile 冻结的引用摘要(进 profileContentHash,绝不进 problemIrHash) */
408
+ export interface OntologyRef {
409
+ ontologyId: string
410
+ ontologyVersion: number
411
+ contentHash: string
412
+ rulePackHash: string
413
+ guardCount: number
414
+ }
415
+
416
+ export function ontologyRefOf(result: { ontologyId: string, ontologyVersion: number, contentHash: string, rulePackHash: string, artifacts: CompiledArtifacts }): OntologyRef {
417
+ return {
418
+ ontologyId: result.ontologyId,
419
+ ontologyVersion: result.ontologyVersion,
420
+ contentHash: result.contentHash,
421
+ rulePackHash: result.rulePackHash,
422
+ guardCount: result.artifacts.controlGuard.guards.length,
423
+ }
424
+ }
425
+
426
+ /** 单位一致性:实体声明单位与其量纲注记;绑定期再比对目标单位 */
427
+ export function entityUnitIssue(entity: OntologyEntity): CompileIssue | null {
428
+ if (!entity.unit) return null
429
+ if (!entity.dimension) return null
430
+ const actual = dimensionOf(entity.unit)
431
+ if (dimensionsCompatible(actual, entity.dimension)) return null
432
+ return {
433
+ code: RULE_ERROR_CODES.UNIT_MISMATCH,
434
+ path: `entities[${entity.key}]`,
435
+ message: `实体 ${entity.key} 声明量纲「${entity.dimension}」与单位「${entity.unit}」归一出「${actual}」不相容`,
436
+ severity: 'error',
437
+ hint: '改正 dimension 或 unit;换算请走 shared/units.ts,本体不做数值换算',
438
+ }
439
+ }
440
+
441
+ export { unitsCompatible }
@@ -0,0 +1,139 @@
1
+ /**
2
+ * 运行时守卫求值器(纯函数)。
3
+ *
4
+ * 守卫是本体检出「状态条件」类规则后的**可执行**形态:
5
+ * 当 when 成立(或状态未知且打算提速)时,禁止对目标变量的增量动作。
6
+ *
7
+ * fail-closed 语义(计划 §5.2):设备状态未知时不得默认认为可以提速 ——
8
+ * 若 when 的观测变量缺失且调用方打算做正向增量,判为违规(仅在 onViolate=
9
+ * 'block_recommendation' 时阻断)。
10
+ */
11
+ import type { ControlGuard } from './contracts'
12
+
13
+ export type GuardValue = number | string | boolean
14
+
15
+ export interface GuardEvaluationInput {
16
+ /** 当前观测/状态快照(变量 key → 值) */
17
+ values: Record<string, GuardValue>
18
+ /** 本次候选动作的增量(变量 key → 增量;缺省视为无动作) */
19
+ deltas?: Record<string, number>
20
+ /** 作用域(与守卫 scope 比对;任一侧缺省则不约束该维) */
21
+ scope?: { lineId?: string, recipeId?: string, conditionId?: string }
22
+ }
23
+
24
+ export interface GuardViolation {
25
+ guardId: string
26
+ ruleId: string
27
+ variableKey: string
28
+ onViolate: 'block_recommendation' | 'annotate'
29
+ message: string
30
+ reason: 'condition_met' | 'state_unknown'
31
+ }
32
+
33
+ export interface GuardEvaluationResult {
34
+ ok: boolean
35
+ /** 是否存在 block_recommendation 级违规 */
36
+ blocked: boolean
37
+ violations: GuardViolation[]
38
+ evaluated: number
39
+ skipped: number
40
+ }
41
+
42
+ function scopeMatches(guard: ControlGuard, scope: GuardEvaluationInput['scope']): boolean {
43
+ if (!scope) return true
44
+ const pairs: Array<[string, string | undefined]> = [
45
+ [guard.scope.lineId, scope.lineId],
46
+ [guard.scope.recipeId, scope.recipeId],
47
+ [guard.scope.conditionId, scope.conditionId],
48
+ ]
49
+ for (const [guardValue, inputValue] of pairs) {
50
+ if (guardValue && inputValue && guardValue !== inputValue) return false
51
+ }
52
+ return true
53
+ }
54
+
55
+ function compare(actual: GuardValue, op: ControlGuard['when']['op'], expected: GuardValue): boolean | null {
56
+ if (op === 'eq') return actual === expected
57
+ if (op === 'neq') return actual !== expected
58
+ if (typeof actual !== 'number' || typeof expected !== 'number') return null
59
+ switch (op) {
60
+ case 'lt': return actual < expected
61
+ case 'lte': return actual <= expected
62
+ case 'gt': return actual > expected
63
+ case 'gte': return actual >= expected
64
+ default: return null
65
+ }
66
+ }
67
+
68
+ function deltaOf(input: GuardEvaluationInput, variableKey: string): number {
69
+ const delta = input.deltas?.[variableKey]
70
+ return typeof delta === 'number' && Number.isFinite(delta) ? delta : 0
71
+ }
72
+
73
+ function isForbiddenDelta(kind: ControlGuard['forbid']['kind'], delta: number): boolean {
74
+ return kind === 'positive_increment' ? delta > 0 : delta !== 0
75
+ }
76
+
77
+ /** 求值一组守卫(纯函数;无 IO、无时钟依赖) */
78
+ export function evaluateGuards(guards: ControlGuard[], input: GuardEvaluationInput): GuardEvaluationResult {
79
+ const violations: GuardViolation[] = []
80
+ let evaluated = 0
81
+ let skipped = 0
82
+
83
+ for (const guard of guards) {
84
+ if (!scopeMatches(guard, input.scope)) {
85
+ skipped += 1
86
+ continue
87
+ }
88
+ const forbidKey = guard.forbid.variableKey
89
+ const delta = deltaOf(input, forbidKey)
90
+ const observed = input.values[guard.when.variableKey]
91
+
92
+ if (observed === undefined) {
93
+ // 状态未知:只有打算做被禁动作时才按 fail-closed 判违规(否则这条守卫无从触发)
94
+ if (isForbiddenDelta(guard.forbid.kind, delta)) {
95
+ violations.push({
96
+ guardId: guard.id, ruleId: guard.ruleId, variableKey: forbidKey, onViolate: guard.onViolate,
97
+ reason: 'state_unknown',
98
+ message: `${guard.message}(状态变量「${guard.when.variableKey}」未知,拒绝本次增量)`,
99
+ })
100
+ evaluated += 1
101
+ }
102
+ else { skipped += 1 }
103
+ continue
104
+ }
105
+
106
+ const met = compare(observed, guard.when.op, guard.when.value)
107
+ if (met === null) {
108
+ skipped += 1
109
+ continue
110
+ }
111
+ evaluated += 1
112
+ if (!met) continue
113
+ if (!isForbiddenDelta(guard.forbid.kind, delta)) continue
114
+ violations.push({
115
+ guardId: guard.id, ruleId: guard.ruleId, variableKey: forbidKey, onViolate: guard.onViolate,
116
+ reason: 'condition_met',
117
+ message: guard.message,
118
+ })
119
+ }
120
+
121
+ return {
122
+ ok: violations.length === 0,
123
+ blocked: violations.some(v => v.onViolate === 'block_recommendation'),
124
+ violations,
125
+ evaluated,
126
+ skipped,
127
+ }
128
+ }
129
+
130
+ /** 从已发布版本的 compiled_json 里取守卫集(缺省空集) */
131
+ export function extractGuardSet(compiled: unknown): ControlGuard[] {
132
+ const value = compiled as { artifacts?: { controlGuard?: { guards?: unknown } }, controlGuard?: { guards?: unknown } } | undefined
133
+ const guards = value?.artifacts?.controlGuard?.guards ?? value?.controlGuard?.guards
134
+ if (!Array.isArray(guards)) return []
135
+ return guards.filter((g): g is ControlGuard => !!g && typeof g === 'object'
136
+ && typeof (g as ControlGuard).id === 'string'
137
+ && typeof (g as ControlGuard).ruleId === 'string'
138
+ && !!(g as ControlGuard).when && !!(g as ControlGuard).forbid)
139
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Ontology 服务门面(外部 import 路径稳定)。
3
+ */
4
+ export * from './contracts'
5
+ export * from './validator'
6
+ export * from './compiler'
7
+ export * from './guards'
8
+ export * from './repo'
9
+ export * from './semantic-binding.service'
10
+ export * from './ontology.service'