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.
- package/.AgentWorkShop/prompts/host-tools.json +332 -0
- package/.output/.AgentWorkShop/prompts/host-tools.json +332 -0
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/BH8RvpVy.js +1 -0
- package/.output/public/_nuxt/Byf4IxU2.js +14 -0
- package/.output/public/_nuxt/CxVhG0Xx.js +1 -0
- package/.output/public/_nuxt/D0mzKkZr.js +1 -0
- package/.output/public/_nuxt/DIFkTkdS.js +1 -0
- package/.output/public/_nuxt/DgrK8UCQ.js +0 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/7a79a7e4-d691-4cf5-ae3a-3b01814479fb.json +1 -0
- package/.output/public/_nuxt/{default.BzOcvmSE.css → default.BEXGWZFQ.css} +1 -1
- package/.output/public/_nuxt/{entry.CL2i0F8o.css → entry.C7koBPom.css} +1 -1
- package/.output/public/_nuxt/ontology.QMGeh66l.css +1 -0
- package/.output/server/chunks/_/access.mjs +1 -1
- package/.output/server/chunks/_/binding-authz.mjs +1 -1
- package/.output/server/chunks/_/catalog-view.mjs +1 -1
- package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
- package/.output/server/chunks/_/chart-repo.mjs +1 -1
- package/.output/server/chunks/_/dashboard-repo.mjs +1 -1
- package/.output/server/chunks/_/data-export.mjs +6 -6
- package/.output/server/chunks/_/data-query.mjs +3 -3
- package/.output/server/chunks/_/eda-run.repo.mjs +2 -2
- package/.output/server/chunks/_/entity.mjs +1 -1
- package/.output/server/chunks/_/features.mjs +5 -5
- package/.output/server/chunks/_/golden.mjs +3 -3
- package/.output/server/chunks/_/host-bindings.mjs +1 -1
- package/.output/server/chunks/_/index.mjs +1 -1
- package/.output/server/chunks/_/mes-console.mjs +1 -1
- package/.output/server/chunks/_/nitro.mjs +5362 -2240
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/_/ocap.mjs +1 -1
- package/.output/server/chunks/_/rest-auth.mjs +1 -1
- package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
- package/.output/server/chunks/_/spc.mjs +2 -2
- package/.output/server/chunks/build/TownView-BWMDbosY.mjs +1 -1
- package/.output/server/chunks/build/api-BEW_ebY_.mjs +64 -0
- package/.output/server/chunks/build/api-BEW_ebY_.mjs.map +1 -0
- package/.output/server/chunks/build/daq-CdxcfY_G.mjs +1 -1
- package/.output/server/chunks/build/dcw-BlDQtS4q.mjs +1 -1
- package/.output/server/chunks/build/{default-BeB88U7y.mjs → default-CJkOcmrm.mjs} +14 -8
- package/.output/server/chunks/build/{default-BeB88U7y.mjs.map → default-CJkOcmrm.mjs.map} +1 -1
- package/.output/server/chunks/build/ontology-C3HS5pMo.mjs +977 -0
- package/.output/server/chunks/build/ontology-C3HS5pMo.mjs.map +1 -0
- package/.output/server/chunks/build/types-D6J7slEa.mjs +6 -2
- package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +1 -1
- package/.output/server/chunks/build/useDaqDetailNode-DeOsDxK5.mjs +1 -1
- package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +1 -1
- package/.output/server/chunks/build/useDaqFilters-CctmO03p.mjs +1 -1
- package/.output/server/chunks/build/useDaqStream-B9ZBVQrI.mjs +1 -1
- package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +1 -1
- package/.output/server/chunks/build/useDcwAddNode-DACVcEHs.mjs +1 -1
- package/.output/server/chunks/build/useDcwStream-Dir5ufAU.mjs +1 -1
- package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
- package/.output/server/chunks/routes/api/system/backup/run.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +17 -4
- package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/grant.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/revoke.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id/preview.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/env/recheck.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/env/uv.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/env/venv.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index3.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index4.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/index7.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/cancel.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/logs.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id/retry.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/jobs/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id/predict.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id/promote.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/models/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id/train.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/training-plans/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/twin/providers.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/members/join.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/tools/reset.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs +7 -7
- package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/bindings.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/ingest.post.mjs +2 -2
- package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/export/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/revert.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/versions.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/recipes/index.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/commonality.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/features/run.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index3.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index6.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/runs/_id/labels.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/runs.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/vm/predict.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index.mjs +62 -0
- package/.output/server/chunks/routes/api/workshop/index.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index11.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index12.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mes/datasets.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mes/preview.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs +54 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs +51 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs +67 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs +49 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs +35 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs +49 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs +35 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs +70 -0
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs +64 -0
- package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/index.mjs +44 -0
- package/.output/server/chunks/routes/api/workshop/ontology/index.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs +36 -0
- package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs +38 -0
- package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs +40 -0
- package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs +63 -0
- package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/optimization/capabilities.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/index.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/index2.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/profiles/_id/publish.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/crosscheck.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/recommendations/_id/dispatch.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/solve.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/process-model/datasets.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/process-model/eligibility.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/process-model/experiments.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/process-model/index.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/process-model/specs/_id/publish.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/process-model/train.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tools/_name_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tools/sync.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
- package/.output/server/chunks/routes/renderer.mjs +2 -2
- package/.output/server/chunks/virtual/entry.mjs +234 -3
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/README-zh.md +27 -6
- package/README.md +25 -4
- package/app/components/AppSidebar.vue +1 -0
- package/app/pages/ontology/api.ts +18 -0
- package/app/pages/ontology/index.vue +779 -0
- package/app/pages/ontology/types.ts +122 -0
- package/config.yml +1 -1
- package/docs/cli.en.md +2 -2
- package/docs/cli.md +2 -2
- package/docs/plugins.en.md +1 -1
- package/docs/plugins.md +1 -1
- package/docs/sdk.en.md +1 -1
- package/docs/sdk.md +1 -1
- package/i18n/locales/en.ts +58 -0
- package/i18n/locales/zh-CN.ts +58 -0
- package/mcp/aw-mcp-server.mjs +35 -1
- package/package.json +1 -1
- package/scripts/docs-shots.mjs +36 -0
- package/scripts/e2e-model-loop-live.mjs +731 -0
- package/scripts/e2e-ontology-live.mjs +774 -0
- package/scripts/e2e-ontology.mjs +328 -0
- package/scripts/ontology-idd-rag-e2e.mjs +449 -0
- package/server/api/workshop/agent-tools/approvals/[id]/decide.post.ts +16 -0
- package/server/api/workshop/ontology/drafts/[draftId]/compile.ts +39 -0
- package/server/api/workshop/ontology/drafts/[draftId]/evidence.ts +33 -0
- package/server/api/workshop/ontology/drafts/[draftId]/publish.ts +44 -0
- package/server/api/workshop/ontology/drafts/[draftId]/rules/[ruleId]/approval-decision.ts +28 -0
- package/server/api/workshop/ontology/drafts/[draftId]/rules/[ruleId]/approval.ts +17 -0
- package/server/api/workshop/ontology/drafts/[draftId]/rules/[ruleId]/transition.ts +32 -0
- package/server/api/workshop/ontology/drafts/[draftId]/validate.ts +16 -0
- package/server/api/workshop/ontology/drafts/[draftId].ts +52 -0
- package/server/api/workshop/ontology/drafts/index.ts +20 -0
- package/server/api/workshop/ontology/export/[ontologyId].ts +50 -0
- package/server/api/workshop/ontology/index.ts +38 -0
- package/server/api/workshop/ontology/scene.ts +21 -0
- package/server/api/workshop/ontology/traces/[ontologyId].ts +19 -0
- package/server/api/workshop/ontology/versions/[ontologyId]/compare.ts +21 -0
- package/server/api/workshop/ontology/versions/[ontologyId].ts +42 -0
- package/server/services/workshop/agents/hitl-decision/dispatcher.ts +15 -0
- package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +13 -1
- package/server/services/workshop/agents/industrial/grant-guard.ts +59 -0
- package/server/services/workshop/agents/industrial/index.ts +38 -32
- package/server/services/workshop/agents/industrial/ontology-tools.ts +320 -0
- package/server/services/workshop/agents/industrial/optimizer-tools.ts +79 -0
- package/server/services/workshop/agents/industrial/tool-verify.ts +32 -2
- package/server/services/workshop/agents/tool-reference-spec.ts +1 -1
- package/server/services/workshop/aml/twin/physics-spec.ts +6 -22
- package/server/services/workshop/daq/storage/index.ts +6 -5
- package/server/services/workshop/daq/storage/sqlite.adapter.ts +25 -13
- package/server/services/workshop/db/database/open.ts +2 -0
- package/server/services/workshop/db/database/schema.ts +155 -1
- package/server/services/workshop/ontology/compiler.ts +474 -0
- package/server/services/workshop/ontology/contracts.ts +441 -0
- package/server/services/workshop/ontology/guards.ts +139 -0
- package/server/services/workshop/ontology/index.ts +10 -0
- package/server/services/workshop/ontology/ontology.service.ts +892 -0
- package/server/services/workshop/ontology/repo.ts +449 -0
- package/server/services/workshop/ontology/semantic-binding.service.ts +226 -0
- package/server/services/workshop/ontology/validator.ts +218 -0
- package/server/services/workshop/optimization/binding.repo.ts +7 -0
- package/server/services/workshop/optimization/contracts.ts +14 -0
- package/server/services/workshop/optimization/dispatch.service.ts +16 -0
- package/server/services/workshop/optimization/profile-adopt.service.ts +256 -0
- package/server/services/workshop/optimization/profile.repo.ts +19 -3
- package/server/services/workshop/optimization/python/__pycache__/problems.cpython-312.pyc +0 -0
- package/shared/dimensions.ts +124 -0
- package/.output/public/_nuxt/B7s2qeyT.js +0 -14
- package/.output/public/_nuxt/LHIav-Kv.js +0 -1
- package/.output/public/_nuxt/RuMLNeQE.js +0 -1
- package/.output/public/_nuxt/builds/meta/0ae8cb0f-6ce5-4096-9692-9b1fc197b30d.json +0 -1
- /package/.output/public/_nuxt/{62J4vljm2.js → 62J4vljm.js} +0 -0
- /package/.output/public/_nuxt/{BO0BJx3w.js → BO0BJx3w2.js} +0 -0
- /package/.output/public/_nuxt/{C-MY-JQE2.js → C-MY-JQE.js} +0 -0
- /package/.output/public/_nuxt/{D5kCimyw.js → D5kCimyw2.js} +0 -0
- /package/.output/public/_nuxt/{DGrrucbG2.js → DGrrucbG.js} +0 -0
- /package/.output/public/_nuxt/{Y4sMSPrS.js → Y4sMSPrS2.js} +0 -0
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本体工具族(7 件)—— Agent 侧的「读 / 起草 / 校验 / 解释 / 编译预览 / 提议发布 / 版本比较」。
|
|
3
|
+
*
|
|
4
|
+
* 治理:本族由 grant-guard(WVO: publish_propose 属写族)与 tool-verify(引用面)复核;
|
|
5
|
+
* **没有**任何工具能直接发布版本或写设备 —— 发布仅 admin 在 REST 面执行,
|
|
6
|
+
* Agent 只能 draft_create 起草、publish_propose 提请第二人批准。
|
|
7
|
+
*
|
|
8
|
+
* 归属:Agent 起草的草稿 owner = agentId(审计可见 actorKind='agent');
|
|
9
|
+
* 读取面按 agentOpsScope 的产线/节点范围收窄。
|
|
10
|
+
*/
|
|
11
|
+
import type { HostToolResult } from '../host-tool-bridge/types'
|
|
12
|
+
import { AppError } from '../../../../utils/errors'
|
|
13
|
+
import { agentOpsScope } from './ops-tools'
|
|
14
|
+
import { getOntologyRepo, parseDraftRow } from '../../ontology/repo'
|
|
15
|
+
import type { Actor } from '../../ontology/ontology.service'
|
|
16
|
+
import {
|
|
17
|
+
compileDraft, createDraft, getDraft, requestRuleApproval, sceneSubgraph,
|
|
18
|
+
updateDraft, validateDraft, compareVersions, getVersion, listVersions,
|
|
19
|
+
} from '../../ontology/ontology.service'
|
|
20
|
+
|
|
21
|
+
import type { OntologyDraftDoc } from '../../ontology/contracts'
|
|
22
|
+
|
|
23
|
+
function agentActor(agentId: string): Actor {
|
|
24
|
+
return { userId: agentId, role: 'editor', actorKind: 'agent' }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function readableLines(agentId: string): string[] {
|
|
28
|
+
const scope = agentOpsScope(agentId)
|
|
29
|
+
if (!scope) return []
|
|
30
|
+
return [...new Set([...scope.lineIds, ...scope.boundLineIds])]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function assertLineInScope(agentId: string, lineId: string): void {
|
|
34
|
+
const lines = readableLines(agentId)
|
|
35
|
+
if (lines.length === 0) {
|
|
36
|
+
throw new AppError(403, 'ONTOLOGY_SCOPE_VIOLATION', '本 Agent 没有绑定任何产线/节点,无法读取本体语义面')
|
|
37
|
+
}
|
|
38
|
+
if (!lines.includes(lineId)) {
|
|
39
|
+
throw new AppError(403, 'ONTOLOGY_SCOPE_VIOLATION',
|
|
40
|
+
`产线 ${lineId} 不在本 Agent 的可读范围(${lines.join(', ')});如需跨线请让用户绑定该产线节点或绑定频道产线`)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function ok(text: string): HostToolResult {
|
|
45
|
+
return { text }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function fail(text: string): HostToolResult {
|
|
49
|
+
return { text, isError: true }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function json(value: unknown): string {
|
|
53
|
+
return JSON.stringify(value, null, 2)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function stringArg(args: Record<string, unknown>, key: string): string {
|
|
57
|
+
const value = args[key]
|
|
58
|
+
return typeof value === 'string' ? value.trim() : ''
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** 1) 场景语义子图(只读,分页) */
|
|
62
|
+
export async function toolOntologySceneInspect(agentId: string, args: Record<string, unknown>): Promise<HostToolResult> {
|
|
63
|
+
const lineId = stringArg(args, 'line_id')
|
|
64
|
+
if (!lineId) return fail('ontology_scene_inspect 需要 line_id(line_context 可看到当前产线 id)')
|
|
65
|
+
try {
|
|
66
|
+
assertLineInScope(agentId, lineId)
|
|
67
|
+
const limit = Math.min(200, Math.max(1, Number(args.limit ?? 50)))
|
|
68
|
+
const offset = Math.max(0, Number(args.offset ?? 0))
|
|
69
|
+
const graph = sceneSubgraph(lineId, { limit: limit + offset })
|
|
70
|
+
if (!graph) return ok(`产线 ${lineId} 尚未发布任何本体(0 实体/0 规则);可先用 ontology_draft_create 起草。`)
|
|
71
|
+
const page = graph.entities.slice(offset, offset + limit)
|
|
72
|
+
const query = stringArg(args, 'query').toLowerCase()
|
|
73
|
+
const filtered = query
|
|
74
|
+
? page.filter(e => `${e.key} ${e.name} ${e.kind}`.toLowerCase().includes(query))
|
|
75
|
+
: page
|
|
76
|
+
return ok([
|
|
77
|
+
`本体 ${graph.ontologyId}@${graph.version}(产线 ${lineId})`,
|
|
78
|
+
`实体 ${graph.entities.length} / 关系 ${graph.relations.length} / 规则 ${graph.rules.length} / 守卫 ${graph.guards.length}`,
|
|
79
|
+
`本页实体 ${filtered.length}(offset=${offset},limit=${limit})${query ? `;筛选"${query}"` : ''}:`,
|
|
80
|
+
...filtered.map(e => `- ${e.key} [${e.kind}/${e.role ?? '未定角色'}] ${e.name} ${e.unit ? `(${e.unit})` : ''}`
|
|
81
|
+
+ `${e.bindings.length ? ` ← ${e.bindings.map(b => `${b.platformKind}:${b.platformId}${b.targetSub ? `#${b.targetSub}` : ''}(${b.direction})`).join(', ')}` : '(未绑定)'}`),
|
|
82
|
+
graph.relations.length ? `关系:` : '',
|
|
83
|
+
...graph.relations.slice(0, 30).map(r => `- ${r.srcKey} -${r.kind}-> ${r.dstKey} [${r.evidenceTier}]`),
|
|
84
|
+
graph.rules.length ? '规则:' : '',
|
|
85
|
+
...graph.rules.slice(0, 30).map(r => `- ${r.id} ${r.kind} status=${r.status} decision=${r.decision}${r.message ? `:${r.message}` : ''}`),
|
|
86
|
+
graph.entities.length > offset + limit ? '还有更多实体:增大 offset 继续分页。' : '',
|
|
87
|
+
].filter(Boolean).join('\n'))
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
return fail((err as Error).message)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** 2) 创建草稿(可空白起点或克隆已发布版本) */
|
|
95
|
+
export async function toolOntologyDraftCreate(agentId: string, args: Record<string, unknown>): Promise<HostToolResult> {
|
|
96
|
+
const ontologyId = stringArg(args, 'ontology_id')
|
|
97
|
+
const lineId = stringArg(args, 'line_id')
|
|
98
|
+
if (!ontologyId) return fail('ontology_draft_create 需要 ontology_id(形如 ont-pva-line01)')
|
|
99
|
+
try {
|
|
100
|
+
if (lineId) assertLineInScope(agentId, lineId)
|
|
101
|
+
const draft = createDraft(agentActor(agentId), {
|
|
102
|
+
ontologyId,
|
|
103
|
+
lineId,
|
|
104
|
+
name: stringArg(args, 'name') || undefined,
|
|
105
|
+
cloneFromVersion: args.clone_from_version === true,
|
|
106
|
+
})
|
|
107
|
+
const doc = parseDraftRow(getDraft(draft.id))
|
|
108
|
+
return ok([
|
|
109
|
+
`已创建草稿 ${draft.id}(本体 ${ontologyId},rev=${draft.rev}${draft.baseVersion ? `,基线 v${draft.baseVersion}` : ''})`,
|
|
110
|
+
`当前内容:实体 ${doc.entities.length} / 关系 ${doc.relations.length} / 规则 ${doc.rules.length} / 绑定 ${doc.bindings.length}`,
|
|
111
|
+
'下一步:用 ontology_draft_validate 校验,或直接提交整份文档(update 由平台 REST 完成)。',
|
|
112
|
+
].join('\n'))
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
return fail((err as Error).message)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** 3) 校验草稿(结构 + 活体绑定) */
|
|
120
|
+
export async function toolOntologyDraftValidate(agentId: string, args: Record<string, unknown>): Promise<HostToolResult> {
|
|
121
|
+
const draftId = stringArg(args, 'draft_id')
|
|
122
|
+
if (!draftId) return fail('ontology_draft_validate 需要 draft_id')
|
|
123
|
+
try {
|
|
124
|
+
const report = validateDraft(draftId, agentActor(agentId))
|
|
125
|
+
const errors = report.issues.filter(i => i.severity === 'error')
|
|
126
|
+
const warnings = report.issues.filter(i => i.severity === 'warning')
|
|
127
|
+
const bindingFailures = report.bindings.failures
|
|
128
|
+
return ok([
|
|
129
|
+
`草稿 ${draftId}:${report.ok && report.bindings.ok ? '校验通过' : '校验未通过'}`,
|
|
130
|
+
`实体 ${report.stats.entities} / 关系 ${report.stats.relations} / 规则 ${report.stats.rules} / 绑定 ${report.stats.bindings}`,
|
|
131
|
+
`生命周期分布:${Object.entries(report.stats.byState).filter(([, n]) => n > 0).map(([k, n]) => `${k}=${n}`).join(', ') || '无'}`,
|
|
132
|
+
errors.length ? `错误 ${errors.length}:` : '无错误',
|
|
133
|
+
...errors.slice(0, 20).map(i => `- [${i.code}] ${i.path}: ${i.message}${i.hint ? ` → ${i.hint}` : ''}`),
|
|
134
|
+
warnings.length ? `警告 ${warnings.length}:` : '',
|
|
135
|
+
...warnings.slice(0, 10).map(i => `- [${i.code}] ${i.path}: ${i.message}`),
|
|
136
|
+
bindingFailures.length ? `绑定失败 ${bindingFailures.length}:` : '',
|
|
137
|
+
...bindingFailures.slice(0, 10).map(f => `- [${f.code}] ${f.message}`),
|
|
138
|
+
].filter(Boolean).join('\n'))
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
return fail((err as Error).message)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** 4) 规则解释(DSL + 决策 + 人读来源) */
|
|
146
|
+
export async function toolOntologyRuleExplain(agentId: string, args: Record<string, unknown>): Promise<HostToolResult> {
|
|
147
|
+
const ruleId = stringArg(args, 'rule_id')
|
|
148
|
+
const draftId = stringArg(args, 'draft_id')
|
|
149
|
+
const ontologyId = stringArg(args, 'ontology_id')
|
|
150
|
+
const versionArg = args.version !== undefined ? Number(args.version) : undefined
|
|
151
|
+
if (!ruleId) return fail('ontology_rule_explain 需要 rule_id')
|
|
152
|
+
try {
|
|
153
|
+
if (draftId) {
|
|
154
|
+
const detail = validateDraft(draftId, agentActor(agentId)) // 顺带确保归属可读
|
|
155
|
+
const doc: OntologyDraftDoc = parseDraftRow(getDraft(draftId))
|
|
156
|
+
const rule = doc.rules.find(r => r.id === ruleId || r.key === ruleId)
|
|
157
|
+
if (!rule) return fail(`草稿 ${draftId} 中没有规则 ${ruleId}`)
|
|
158
|
+
const preview = compileDraft(draftId, agentActor(agentId))
|
|
159
|
+
const trace = preview.result.traces.find(t => t.ruleId === rule.id)
|
|
160
|
+
return ok([
|
|
161
|
+
`规则 ${rule.id}(${rule.key})kind=${rule.kind} 约束级别=${rule.constraintLevel} 状态=${rule.status}`,
|
|
162
|
+
`DSL:${json(rule.dsl)}`,
|
|
163
|
+
`证据:${rule.evidence.map(e => `${e.level}(${e.source.type})`).join(', ') || '无'}`,
|
|
164
|
+
trace ? `编译决策:${trace.decision}${trace.decisionCode ? `[${trace.decisionCode}]` : ''} — ${trace.message}` : '尚未编译',
|
|
165
|
+
`规则修订 hash:${trace?.ruleRevision.slice(0, 16) ?? 'n/a'}`,
|
|
166
|
+
`文档告警:${detail.issues.length}`,
|
|
167
|
+
].join('\n'))
|
|
168
|
+
}
|
|
169
|
+
if (ontologyId) {
|
|
170
|
+
const traces = getOntologyRepo().listTraces(ontologyId, Number.isInteger(versionArg) ? versionArg : undefined)
|
|
171
|
+
const trace = traces.find(t => t.ruleId === ruleId)
|
|
172
|
+
if (!trace) return fail(`本体 ${ontologyId} 的已发布版本中没有规则 ${ruleId} 的溯源行`)
|
|
173
|
+
const repo = getOntologyRepo()
|
|
174
|
+
const version = getVersion(ontologyId, trace.version)
|
|
175
|
+
const rule = repo.listRules(version.id, version.version).find(r => r.id === ruleId)
|
|
176
|
+
return ok([
|
|
177
|
+
`规则 ${trace.ruleId}(本体 ${ontologyId}@${trace.version})`,
|
|
178
|
+
`DSL:${rule ? json(rule.dsl) : '快照缺失'}`,
|
|
179
|
+
`证据级别:${trace.evidenceLevel || '无'} 约束级别:${trace.constraintLevel}`,
|
|
180
|
+
`编译决策:${trace.decision}${trace.decisionCode ? `[${trace.decisionCode}]` : ''} — ${trace.message}`,
|
|
181
|
+
`产物:${trace.artifacts.map(a => `${a.kind}${a.ref ? `:${a.ref}` : ''}`).join(', ') || '无(仅解释)'}`,
|
|
182
|
+
`适用域:line=${trace.scope.lineId || '全局'} recipe=${trace.scope.recipeId || '-'} condition=${trace.scope.conditionId || '-'}`,
|
|
183
|
+
].join('\n'))
|
|
184
|
+
}
|
|
185
|
+
return fail('ontology_rule_explain 需要 draft_id 或 ontology_id 之一')
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
return fail((err as Error).message)
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** 5) 编译预览(四类产物 + 规则溯源;不落库) */
|
|
193
|
+
export async function toolOntologyCompilePreview(agentId: string, args: Record<string, unknown>): Promise<HostToolResult> {
|
|
194
|
+
const draftId = stringArg(args, 'draft_id')
|
|
195
|
+
if (!draftId) return fail('ontology_compile_preview 需要 draft_id')
|
|
196
|
+
try {
|
|
197
|
+
const preview = compileDraft(draftId, agentActor(agentId), { approvedOnly: args.approved_only === true })
|
|
198
|
+
const counts = {
|
|
199
|
+
compiled: preview.result.compiledCount, guard: preview.result.guardCount,
|
|
200
|
+
explained: preview.result.explainedCount, rejected: preview.result.rejectedCount,
|
|
201
|
+
}
|
|
202
|
+
const mv = preview.result.artifacts.problemIr.mvBounds
|
|
203
|
+
const cv = preview.result.artifacts.problemIr.cvBounds
|
|
204
|
+
const lines = [
|
|
205
|
+
`编译状态:${preview.result.status}(compiled=${counts.compiled} guard=${counts.guard} explained=${counts.explained} rejected=${counts.rejected})`,
|
|
206
|
+
`contentHash=${preview.contentHash.slice(0, 16)} packHash=${preview.packHash.slice(0, 16)} rulePackHash=${preview.result.rulePackHash.slice(0, 16)}`,
|
|
207
|
+
Object.keys(mv).length ? `mvBounds:${json(mv)}` : 'mvBounds:空',
|
|
208
|
+
Object.keys(cv).length ? `cvBounds:${json(cv)}` : 'cvBounds:空',
|
|
209
|
+
preview.result.artifacts.controlGuard.guards.length
|
|
210
|
+
? `运行时守卫 ${preview.result.artifacts.controlGuard.guards.length}:`
|
|
211
|
+
: '运行时守卫:无',
|
|
212
|
+
...preview.result.artifacts.controlGuard.guards.map(g => `- ${g.id} 当 ${g.when.variableKey} ${g.when.op} ${String(g.when.value)} 时禁止 ${g.forbid.kind}(${g.forbid.variableKey}) [${g.onViolate}]`),
|
|
213
|
+
preview.result.artifacts.processModel.featureCandidates.length
|
|
214
|
+
? `训练特征候选 ${preview.result.artifacts.processModel.featureCandidates.length},时滞先验 ${preview.result.artifacts.processModel.delayPriors.length}`
|
|
215
|
+
: '',
|
|
216
|
+
preview.result.issues.length ? `告警/拒绝 ${preview.result.issues.length}:` : '无告警',
|
|
217
|
+
...preview.result.issues.slice(0, 15).map(i => `- [${i.code}] ${i.ruleId ?? i.path}: ${i.message}`),
|
|
218
|
+
]
|
|
219
|
+
return ok(lines.filter(Boolean).join('\n'))
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
return fail((err as Error).message)
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** 6) 提议发布(只能申请第二人批准;不能自行发布) */
|
|
227
|
+
export async function toolOntologyPublishPropose(agentId: string, args: Record<string, unknown>): Promise<HostToolResult> {
|
|
228
|
+
const draftId = stringArg(args, 'draft_id')
|
|
229
|
+
if (!draftId) return fail('ontology_publish_propose 需要 draft_id')
|
|
230
|
+
try {
|
|
231
|
+
const actor = agentActor(agentId)
|
|
232
|
+
const draft = getDraft(draftId)
|
|
233
|
+
if (draft.ownerUserId && draft.ownerUserId !== actor.userId) {
|
|
234
|
+
throw new AppError(403, 'DRAFT_SCOPE_VIOLATION', `草稿 ${draftId} 不属于本 Agent`)
|
|
235
|
+
}
|
|
236
|
+
const doc = parseDraftRow(draft)
|
|
237
|
+
const validated = doc.rules.filter(r => r.status === 'validated')
|
|
238
|
+
const pending = doc.rules.filter(r => r.status === 'reviewed')
|
|
239
|
+
const proposed = doc.rules.filter(r => r.status === 'proposed')
|
|
240
|
+
if (validated.length === 0) {
|
|
241
|
+
return ok([
|
|
242
|
+
`草稿 ${draftId} 没有处于 validated 的规则可提请控制级批准。`,
|
|
243
|
+
`当前:proposed=${proposed.length} reviewed=${pending.length} validated=0 approved=${doc.rules.filter(r => r.status === 'approved_for_control').length}`,
|
|
244
|
+
'请先由人完成 proposed→reviewed→validated(需要 observed/validated 级证据)。',
|
|
245
|
+
].join('\n'))
|
|
246
|
+
}
|
|
247
|
+
const approvals = validated.map(rule => requestRuleApproval(draftId, rule.id, actor))
|
|
248
|
+
// 记一条「提请发布」提案(不改变规则状态;真正的发布需 admin 在 REST 面执行)
|
|
249
|
+
getOntologyRepo().appendPublishLog({
|
|
250
|
+
id: `opl-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`,
|
|
251
|
+
ontologyId: draft.ontologyId,
|
|
252
|
+
version: draft.baseVersion ?? 0,
|
|
253
|
+
action: 'publish.propose',
|
|
254
|
+
actor: agentId,
|
|
255
|
+
actorKind: 'agent',
|
|
256
|
+
soloOperator: 0,
|
|
257
|
+
approvalId: approvals[0]?.approvalId ?? null,
|
|
258
|
+
detailJson: JSON.stringify({ draftId, rules: approvals.map(a => a.ruleId) }),
|
|
259
|
+
createdAt: new Date().toISOString(),
|
|
260
|
+
})
|
|
261
|
+
return ok([
|
|
262
|
+
`已为 ${approvals.length} 条 validated 规则提请第二人批准(草稿 ${draftId},本体 ${draft.ontologyId}):`,
|
|
263
|
+
...approvals.map(a => `- 规则 ${a.ruleId} → approvalId=${a.approvalId}`),
|
|
264
|
+
'注意:批准由人类在 /ontology 审批面裁决;批准后仍需 admin 执行 publish 才会冻结为不可变版本。',
|
|
265
|
+
'本工具不会写设备,也不会绕过 HITL/D13。',
|
|
266
|
+
].join('\n'))
|
|
267
|
+
}
|
|
268
|
+
catch (err) {
|
|
269
|
+
return fail((err as Error).message)
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/** 7) 版本比较(只读) */
|
|
274
|
+
export async function toolOntologyVersionCompare(agentId: string, args: Record<string, unknown>): Promise<HostToolResult> {
|
|
275
|
+
const ontologyId = stringArg(args, 'ontology_id')
|
|
276
|
+
const from = Number(args.from ?? args.from_version)
|
|
277
|
+
const to = Number(args.to ?? args.to_version)
|
|
278
|
+
if (!ontologyId) return fail('ontology_version_compare 需要 ontology_id')
|
|
279
|
+
try {
|
|
280
|
+
void readableLines(agentId)
|
|
281
|
+
if (!Number.isInteger(from) || !Number.isInteger(to)) {
|
|
282
|
+
const versions = listVersions(ontologyId)
|
|
283
|
+
if (versions.length === 0) return ok(`本体 ${ontologyId} 还没有版本`)
|
|
284
|
+
return ok([
|
|
285
|
+
`本体 ${ontologyId} 版本:${versions.map(v => `v${v.version}(${v.status})`).join(', ')}`,
|
|
286
|
+
'给出 from 与 to 可查看四段差异(实体/关系/规则/绑定)。',
|
|
287
|
+
].join('\n'))
|
|
288
|
+
}
|
|
289
|
+
const diff = compareVersions(ontologyId, from, to)
|
|
290
|
+
const section = (name: string, part: { added: string[], removed: string[], changed: string[] }) =>
|
|
291
|
+
`${name}:+${part.added.length}/-${part.removed.length}/±${part.changed.length}`
|
|
292
|
+
+ (part.added.length ? ` 新增[${part.added.slice(0, 8).join(',')}]` : '')
|
|
293
|
+
+ (part.removed.length ? ` 删除[${part.removed.slice(0, 8).join(',')}]` : '')
|
|
294
|
+
+ (part.changed.length ? ` 变更[${part.changed.slice(0, 8).join(',')}]` : '')
|
|
295
|
+
return ok([
|
|
296
|
+
`本体 ${ontologyId}:v${from} → v${to}`,
|
|
297
|
+
section('实体', diff.entities),
|
|
298
|
+
section('关系', diff.relations),
|
|
299
|
+
section('规则', diff.rules),
|
|
300
|
+
section('绑定', diff.bindings),
|
|
301
|
+
].join('\n'))
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
return fail((err as Error).message)
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/** 内部:更新草稿(供后续工具扩展;当前 7 工具中无直接暴露) */
|
|
309
|
+
export async function toolOntologyDraftUpdate(agentId: string, args: Record<string, unknown>): Promise<HostToolResult> {
|
|
310
|
+
const draftId = stringArg(args, 'draft_id')
|
|
311
|
+
const expectedRev = Number(args.expected_rev)
|
|
312
|
+
if (!draftId || !Number.isInteger(expectedRev)) return fail('ontology_draft_update 需要 draft_id 与 expected_rev')
|
|
313
|
+
try {
|
|
314
|
+
const detail = updateDraft(draftId, agentActor(agentId), { doc: args.doc, expectedRev })
|
|
315
|
+
return ok(`草稿 ${draftId} 已保存(rev=${detail.draft.rev});校验:${detail.validation.ok ? '通过' : '未通过'}`)
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
return fail((err as Error).message)
|
|
319
|
+
}
|
|
320
|
+
}
|
|
@@ -17,6 +17,7 @@ import { getEligibilityRepo } from '../../process-model/eligibility'
|
|
|
17
17
|
import { getProcessModelSpecRepo } from '../../process-model/spec.repo'
|
|
18
18
|
import { cancel, getRunStatus, solve } from '../../optimization/manager'
|
|
19
19
|
import { assertRecommendationUsable } from '../../optimization/recommendation.service'
|
|
20
|
+
import { proposeProfileAdoption } from '../../optimization/profile-adopt.service'
|
|
20
21
|
import { deriveDualState } from '../../optimization/crosscheck.service'
|
|
21
22
|
|
|
22
23
|
function ok(payload: unknown): HostToolResult {
|
|
@@ -191,3 +192,81 @@ export function hasOptimizerBinding(agentId: string): boolean {
|
|
|
191
192
|
return false
|
|
192
193
|
}
|
|
193
194
|
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* 模型采纳提议(OW-adopt):把 AML 新训练登记的模型采纳为指定 Profile 的新版本。
|
|
198
|
+
*
|
|
199
|
+
* AI-first 闭环的"采纳"环节:复制当前已发布 Profile 的全部求解配置 → 换新模型工件 →
|
|
200
|
+
* 草稿新版本 → 挂 HITL 卡等待人类裁决。批准(单一咽喉)= 冻结发布 + 自动重绑所有
|
|
201
|
+
* 绑定在旧版本的 Agent(revision+1,在飞求解 BINDING_STALE 收敛);拒绝/超时 = 零写。
|
|
202
|
+
*
|
|
203
|
+
* 治理:工具属写族(grant-guard operate);Agent 必须已绑定该 Profile(防越权提议);
|
|
204
|
+
* 兼容性(D21 矩阵)在服务层提议时校验;发布仅发生在人类批准后。
|
|
205
|
+
*/
|
|
206
|
+
export async function toolOptimizerProfilePropose(agentId: string, args: Record<string, unknown>): Promise<HostToolResult> {
|
|
207
|
+
try {
|
|
208
|
+
const bindings = listBindingsForAgent(agentId)
|
|
209
|
+
if (bindings.length === 0) {
|
|
210
|
+
return { text: '本 Agent 没有优化器绑定;模型采纳必须由已绑定该 Profile 的 Agent 发起(先在 Channel 设置里绑定)。', isError: true }
|
|
211
|
+
}
|
|
212
|
+
const modelId = String(args.model_id ?? '').trim()
|
|
213
|
+
if (!modelId) return { text: 'model_id 必填(aml_job_submit 训练完成登记的模型 id;aml_leaderboard/aml_model_find 可查)。', isError: true }
|
|
214
|
+
const profileId = String(args.profile_id ?? '').trim() || (() => {
|
|
215
|
+
const bound = bindings.map(b => b.profileId)
|
|
216
|
+
return new Set(bound).size === 1 ? bound[0]! : ''
|
|
217
|
+
})()
|
|
218
|
+
if (!profileId) {
|
|
219
|
+
return { text: `本 Agent 绑定了多个 Profile(${bindings.map(b => b.profileId).join(', ')});必须显式传 profile_id。`, isError: true }
|
|
220
|
+
}
|
|
221
|
+
if (!bindings.some(b => b.profileId === profileId)) {
|
|
222
|
+
return { text: `Profile ${profileId} 不在本 Agent 的绑定面内,不能代为提议采纳(越权拒绝)。`, isError: true }
|
|
223
|
+
}
|
|
224
|
+
const reason = String(args.reason ?? '').trim()
|
|
225
|
+
if (!reason) return { text: 'reason 必填:为什么采纳新模型(证据:训练指标对比/互校结论/业务动因)。', isError: true }
|
|
226
|
+
|
|
227
|
+
const result = await proposeProfileAdoption({
|
|
228
|
+
agentInstanceId: agentId,
|
|
229
|
+
initiatorId: agentId,
|
|
230
|
+
initiatorKind: 'agent',
|
|
231
|
+
profileId,
|
|
232
|
+
modelId,
|
|
233
|
+
templateRef: args.template_ref as Parameters<typeof proposeProfileAdoption>[0]['templateRef'],
|
|
234
|
+
solverRef: args.solver_ref as Parameters<typeof proposeProfileAdoption>[0]['solverRef'],
|
|
235
|
+
reason,
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
if (!result.decision.approved) {
|
|
239
|
+
return {
|
|
240
|
+
text: [
|
|
241
|
+
`采纳提议未被批准(卡 ${result.cardId}):`,
|
|
242
|
+
`${result.profileId} v${result.priorVersion} → v${result.version}(模型 ${result.modelId})`,
|
|
243
|
+
`裁决:${result.decision.comment || '拒绝/超时'}`,
|
|
244
|
+
'草稿已保留(零写);可修订理由后重新提议,或由管理员经 REST 发布。',
|
|
245
|
+
].join('\n'),
|
|
246
|
+
isError: true,
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (!result.published) {
|
|
250
|
+
return {
|
|
251
|
+
text: [
|
|
252
|
+
`⚠️ 采纳提议获批准,但发布未由裁决咽喉完成(卡 ${result.cardId}):`,
|
|
253
|
+
`${result.profileId} v${result.priorVersion} → v${result.version} 仍为草稿;请管理员经 REST/管理面发布,或重新发起采纳。`,
|
|
254
|
+
].join('\n'),
|
|
255
|
+
isError: true,
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
text: [
|
|
260
|
+
'✅ 模型采纳完成(HITL 批准):',
|
|
261
|
+
`${result.profileId} v${result.priorVersion} → v${result.version}(published)`,
|
|
262
|
+
`模型:${result.modelId};重绑绑定 ${result.rebindCount} 个(revision+1,在飞求解 BINDING_STALE 收敛)`,
|
|
263
|
+
`裁决意见:${result.decision.comment || '(无)'}`,
|
|
264
|
+
'下一次 optimizer_solve 即使用新模型;旧版本保留可回退(retire/rebind 走管理面)。',
|
|
265
|
+
].join('\n'),
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
catch (err) {
|
|
269
|
+
const message = err instanceof AppError ? `${err.code}: ${err.message}` : String(err)
|
|
270
|
+
return { text: `模型采纳提议失败:${message}`, isError: true }
|
|
271
|
+
}
|
|
272
|
+
}
|
|
@@ -168,7 +168,16 @@ function chainDeny(faces: ToolRefFaces, toolName: string, args: Record<string, u
|
|
|
168
168
|
], faces, hint, { param, value: id, lineId })
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
function draftLineId(draftJson: string): string {
|
|
172
|
+
try {
|
|
173
|
+
return (JSON.parse(draftJson || '{}') as { lineId?: string }).lineId ?? ''
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return ''
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
type ChainKind = 'dataset' | 'job' | 'model' | 'plan' | 'scene' | 'binding' | 'run' | 'recommendation' | 'ontology_draft' | 'ontology_version'
|
|
172
181
|
|
|
173
182
|
/** 优化运行/建议 → 所属 Agent(经 binding 反查);不存在返回 null(交工具兜底)。 */
|
|
174
183
|
function optimizerOwnership(id: string, kind: 'run' | 'recommendation'): { agentId: string } | null {
|
|
@@ -209,6 +218,27 @@ function chainLineOf(kind: ChainKind, id: string, args: Record<string, unknown>)
|
|
|
209
218
|
const p = getTrainingPlan(id)
|
|
210
219
|
return p ? { lineId: p.lineId, createdBy: '' } : null
|
|
211
220
|
}
|
|
221
|
+
// 本体草稿:归属 = 草稿属主(agent 起草时 owner=agentId);取不到 → 交工具自身
|
|
222
|
+
if (kind === 'ontology_draft') {
|
|
223
|
+
const row = rt.db.prepare('SELECT owner_user_id AS ownerUserId, draft_json AS draftJson FROM ontology_drafts WHERE id = ?').get(id) as { ownerUserId?: string, draftJson?: string } | undefined
|
|
224
|
+
if (!row) return null
|
|
225
|
+
let lineId = draftLineId(row.draftJson ?? '')
|
|
226
|
+
if (!lineId) {
|
|
227
|
+
const v = rt.db.prepare('SELECT line_id AS lineId FROM ontology_versions WHERE id = (SELECT ontology_id FROM ontology_drafts WHERE id = ?) ORDER BY version DESC LIMIT 1').get(id) as { lineId?: string } | undefined
|
|
228
|
+
lineId = v?.lineId ?? ''
|
|
229
|
+
}
|
|
230
|
+
return { lineId, createdBy: row.ownerUserId ?? '' }
|
|
231
|
+
}
|
|
232
|
+
// 本体版本:id@version 或 (ontology_id, version);归属 = 版本产线
|
|
233
|
+
if (kind === 'ontology_version') {
|
|
234
|
+
const ontologyId = id
|
|
235
|
+
const wantsVersion = args.version !== undefined ? Number(args.version) : Number.NaN
|
|
236
|
+
const row = Number.isInteger(wantsVersion)
|
|
237
|
+
? rt.db.prepare('SELECT line_id AS lineId FROM ontology_versions WHERE id = ? AND version = ?').get(ontologyId, wantsVersion) as { lineId?: string } | undefined
|
|
238
|
+
: rt.db.prepare(`SELECT line_id AS lineId FROM ontology_versions WHERE id = ? AND status = 'published' ORDER BY version DESC LIMIT 1`).get(ontologyId) as { lineId?: string } | undefined
|
|
239
|
+
if (!row) return null
|
|
240
|
+
return { lineId: row.lineId ?? '', createdBy: '' }
|
|
241
|
+
}
|
|
212
242
|
// scene:需带版本(scene_id 多版本并存);取不到记录 → 交工具自身
|
|
213
243
|
const version = String(args.scene_version ?? '').trim()
|
|
214
244
|
if (!version) return null
|
|
@@ -372,7 +402,7 @@ export function verifyToolReferences(agentId: string, toolName: string, args: Re
|
|
|
372
402
|
const mine = row.createdBy === agentId
|
|
373
403
|
const readable = !!row.lineId && faces.readableLines.has(row.lineId)
|
|
374
404
|
if (!mine && !readable) {
|
|
375
|
-
const label = { dataset: '数据集', job: '训练作业', model: '模型', plan: '建模任务', scene: '场景' }[chain.kind]
|
|
405
|
+
const label = { dataset: '数据集', job: '训练作业', model: '模型', plan: '建模任务', scene: '场景', ontology_draft: '本体草稿', ontology_version: '本体版本' }[chain.kind]
|
|
376
406
|
return chainDeny(faces, toolName, args, chain.param, id, label, row.lineId)
|
|
377
407
|
}
|
|
378
408
|
}
|
|
@@ -17,7 +17,7 @@ import type { ToolRefKind as _RefKind } from './tool-reference-kinds'
|
|
|
17
17
|
export type { ToolRefKind } from './tool-reference-kinds'
|
|
18
18
|
|
|
19
19
|
/** 链式引用类别(经谱系回溯判定归属) */
|
|
20
|
-
export type ToolChainKind = 'dataset' | 'job' | 'model' | 'plan' | 'scene' | 'binding' | 'run' | 'recommendation'
|
|
20
|
+
export type ToolChainKind = 'dataset' | 'job' | 'model' | 'plan' | 'scene' | 'binding' | 'run' | 'recommendation' | 'ontology_draft' | 'ontology_version'
|
|
21
21
|
|
|
22
22
|
export interface ToolRefRule {
|
|
23
23
|
param: string
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { dimensionsCompatible, dimensionOf } from '@/shared/dimensions'
|
|
2
|
+
|
|
1
3
|
export const PHYSICS_SPEC_VERSION = 'physics-spec.v1' as const
|
|
2
4
|
export const PHYSICS_OPERATORS = ['add', 'sub', 'mul', 'div', 'pow', 'exp', 'log', 'min', 'max', 'clamp'] as const
|
|
3
5
|
export type PhysicsOperator = typeof PHYSICS_OPERATORS[number]
|
|
@@ -67,15 +69,6 @@ export interface PhysicsSpecValidationResult {
|
|
|
67
69
|
const OPS = new Set<string>(PHYSICS_OPERATORS)
|
|
68
70
|
const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_.:-]*$/
|
|
69
71
|
const RESERVED = new Set(['__proto__', 'prototype', 'constructor'])
|
|
70
|
-
const DIMENSIONLESS = new Set(['', '1', 'ratio', 'fraction', 'percent', '%'])
|
|
71
|
-
const UNIT_DIMENSIONS: Record<string, string> = {
|
|
72
|
-
s: 'time', sec: 'time', ms: 'time', min: 'time', h: 'time',
|
|
73
|
-
degc: 'temperature', c: 'temperature', k: 'temperature', degf: 'temperature',
|
|
74
|
-
pa: 'pressure', kpa: 'pressure', mpa: 'pressure', bar: 'pressure', psi: 'pressure',
|
|
75
|
-
g: 'mass', kg: 'mass', mg: 'mass',
|
|
76
|
-
m: 'length', cm: 'length', mm: 'length', km: 'length',
|
|
77
|
-
a: 'current', v: 'voltage', w: 'power', j: 'energy', n: 'force',
|
|
78
|
-
}
|
|
79
72
|
|
|
80
73
|
function record(value: unknown): value is Record<string, unknown> {
|
|
81
74
|
return !!value && typeof value === 'object' && !Array.isArray(value)
|
|
@@ -89,19 +82,10 @@ function idOk(value: unknown): value is string {
|
|
|
89
82
|
function addIssue(issues: PhysicsSpecIssue[], path: string, code: string, message: string, severity: 'error' | 'warning' = 'error') {
|
|
90
83
|
issues.push({ path, code, message, severity })
|
|
91
84
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const key = unitKey(unit)
|
|
97
|
-
if (DIMENSIONLESS.has(key)) return 'dimensionless'
|
|
98
|
-
if (UNIT_DIMENSIONS[key]) return UNIT_DIMENSIONS[key]
|
|
99
|
-
if (key.includes('/') || key.includes('*') || key.includes('^')) return `compound:${key}`
|
|
100
|
-
return key ? `unit:${key}` : 'scalar'
|
|
101
|
-
}
|
|
102
|
-
function compatible(a: string, b: string): boolean {
|
|
103
|
-
return a === '*' || b === '*' || a === b || (a === 'dimensionless' && b === 'scalar') || (b === 'dimensionless' && a === 'scalar')
|
|
104
|
-
}
|
|
85
|
+
/** 量纲归一与相容判定复用 shared/dimensions(本体与 PhysicsSpec 共用一张表;℃ 缺口在此已修) */
|
|
86
|
+
const dimension = dimensionOf
|
|
87
|
+
const compatible = dimensionsCompatible
|
|
88
|
+
|
|
105
89
|
function normalizeExpr(value: unknown): PhysicsExpression | undefined {
|
|
106
90
|
if (finite(value)) return value
|
|
107
91
|
if (!record(value)) return undefined
|
|
@@ -2,19 +2,20 @@
|
|
|
2
2
|
* TsdbPort 工厂 —— 配置驱动(daqInfraUrls 提供真实 Timescale URL),降级 SQLite 仿真。
|
|
3
3
|
* 单例挂 globalThis;rebuildTsdb() 支持重连时从降级实例切回真实实例。
|
|
4
4
|
*/
|
|
5
|
-
import { createLogger } from '../../logger'
|
|
5
|
+
import { createLogger } from '../../logger'
|
|
6
6
|
import { SqliteTimeSeriesAdapter } from './sqlite.adapter'
|
|
7
7
|
import { TimescaleAdapter } from './timescale.adapter'
|
|
8
8
|
import type { TsdbPort } from './tsdb-port'
|
|
9
9
|
|
|
10
|
-
const log = createLogger('daq.tsdb')
|
|
11
|
-
|
|
10
|
+
const log = createLogger('daq.tsdb')
|
|
11
|
+
|
|
12
12
|
interface DaqTsdbState { current?: TsdbPort, initError?: unknown }
|
|
13
13
|
const g = globalThis as typeof globalThis & { __daqTsdbState?: DaqTsdbState }
|
|
14
14
|
|
|
15
15
|
function makeFallback(reason: string): TsdbPort {
|
|
16
16
|
const dev = new SqliteTimeSeriesAdapter()
|
|
17
|
-
|
|
17
|
+
// init 失败不再静默:读路径有 ensureDb 惰性自愈兜底,但这里必须留下证据
|
|
18
|
+
dev.init().catch(err => log.error(`[daq-tsdb] SQLite 降级实例初始化失败(读路径将自愈重试):`, err instanceof Error ? err.message : err))
|
|
18
19
|
log.warn(`[daq-tsdb] ${reason} → 已降级 SQLite 时序仿真`)
|
|
19
20
|
return dev
|
|
20
21
|
}
|
|
@@ -27,7 +28,7 @@ export const tsdbReady: Promise<void> = (() => {
|
|
|
27
28
|
if (!url) {
|
|
28
29
|
// 无配置(启动插件尚未装配):先占位仿真库;插件随后按 infra 状态 rebuild
|
|
29
30
|
const dev = new SqliteTimeSeriesAdapter()
|
|
30
|
-
dev.init()
|
|
31
|
+
dev.init().catch(err => log.error('[daq-tsdb] SQLite 占位实例初始化失败(读路径将自愈重试):', err instanceof Error ? err.message : err))
|
|
31
32
|
st.current = dev
|
|
32
33
|
}
|
|
33
34
|
else {
|