agentworkshop 0.8.8 → 0.9.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 +68 -0
- package/.output/.AgentWorkShop/prompts/host-tools.json +68 -0
- package/.output/.AgentWorkShop/schema.json +2 -0
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{Cdi9qfTr.js → CDO7Zey1.js} +2 -2
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/f507c33b-4ecc-4e32-af88-2e3736b443e9.json +1 -0
- package/.output/server/chunks/_/access.mjs +1 -1
- package/.output/server/chunks/_/data-export.mjs +5 -5
- package/.output/server/chunks/_/data-query.mjs +2 -2
- package/.output/server/chunks/_/eda-run.repo.mjs +3 -3
- package/.output/server/chunks/_/features.mjs +5 -5
- package/.output/server/chunks/_/golden.mjs +2 -2
- package/.output/server/chunks/_/host-bindings.mjs +1 -1
- package/.output/server/chunks/_/index.mjs +2 -2
- package/.output/server/chunks/_/mes-secrets.repo.mjs +1 -1
- package/.output/server/chunks/_/nitro.mjs +2556 -1314
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/_/spc.mjs +2 -2
- package/.output/server/chunks/build/_id_-CsCtnbwe.mjs +1 -1
- package/.output/server/chunks/build/_id_-P1W47Gqq.mjs +1 -1
- package/.output/server/chunks/build/_wsId_-DpOErFj6.mjs +1 -1
- package/.output/server/chunks/build/agents-D7CdEUTv.mjs +1 -1
- package/.output/server/chunks/build/aml-DRAFRcGU.mjs +1 -1
- package/.output/server/chunks/build/analysis-J9axLuRt.mjs +1 -1
- package/.output/server/chunks/build/api-B4Om0mEc.mjs +1 -1
- package/.output/server/chunks/build/api-BEW_ebY_.mjs +1 -1
- package/.output/server/chunks/build/api-BsAgXWxi.mjs +1 -1
- package/.output/server/chunks/build/board-CJUc032b.mjs +1 -1
- package/.output/server/chunks/build/channel-templates-ggsBacZF.mjs +1 -1
- package/.output/server/chunks/build/constants-HPHJvjne.mjs +1 -1
- package/.output/server/chunks/build/daq-B_dRMDw4.mjs +1 -1
- package/.output/server/chunks/build/data-D8uX1dnm.mjs +1 -1
- package/.output/server/chunks/build/dcw-D_HD_H_2.mjs +1 -1
- package/.output/server/chunks/build/default-CNWS6NUw.mjs +1 -1
- package/.output/server/chunks/build/es-Bxu10NJ2.mjs +1 -1
- package/.output/server/chunks/build/logs-BnYSMRXM.mjs +1 -1
- package/.output/server/chunks/build/monitor-Cq6hRFeQ.mjs +1 -1
- package/.output/server/chunks/build/ontology-ohICfVVb.mjs +1 -1
- package/.output/server/chunks/build/operations-4zOVhW7o.mjs +1 -1
- package/.output/server/chunks/build/optimizer-BlWTsM-W.mjs +1 -1
- package/.output/server/chunks/build/pages-DEv4ProW.mjs +1 -1
- package/.output/server/chunks/build/permissions-DgXQZSyx.mjs +1 -1
- package/.output/server/chunks/build/pipeline-CkavMBhk.mjs +1 -1
- package/.output/server/chunks/build/plugins-LRjaSEZy.mjs +1 -1
- package/.output/server/chunks/build/schedules-Hz2DJUE2.mjs +1 -1
- package/.output/server/chunks/build/settings-DXLJPq7d.mjs +1 -1
- package/.output/server/chunks/build/studio-hSqH9TYS.mjs +1 -1
- package/.output/server/chunks/build/teams-BbwYJyzv.mjs +1 -1
- package/.output/server/chunks/build/tokens-GYaGJ35Z.mjs +1 -1
- package/.output/server/chunks/build/tools-CnYi9cou.mjs +1 -1
- package/.output/server/chunks/build/town-BV-hbwb5.mjs +1 -1
- package/.output/server/chunks/build/town-CcoQKjMj.mjs +1 -1
- package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
- package/.output/server/chunks/build/types-DWqIeMRP.mjs +1 -1
- package/.output/server/chunks/build/useAgentHarnessOptions-Dq0l0Z6d.mjs +1 -1
- package/.output/server/chunks/build/useAgentTemplateActions-BFOHb5-L.mjs +1 -1
- package/.output/server/chunks/build/useAgentTemplateDialogState-CZzpu5og.mjs +1 -1
- package/.output/server/chunks/build/useAgentTemplateForm-CuJPOPcK.mjs +1 -1
- package/.output/server/chunks/build/useAgentTemplatesCatalog-B2bIhZLA.mjs +1 -1
- package/.output/server/chunks/build/useAmlDatasets-DeoE1idn.mjs +1 -1
- package/.output/server/chunks/build/useAmlEntities-BJhvdqHJ.mjs +1 -1
- package/.output/server/chunks/build/useAmlEnv-CDIZ6xTe.mjs +1 -1
- package/.output/server/chunks/build/useAmlExperiments-Dloi834i.mjs +1 -1
- package/.output/server/chunks/build/useAmlFormat-C2sl3MGB.mjs +1 -1
- package/.output/server/chunks/build/useAmlJobs-BF9LpwXz.mjs +1 -1
- package/.output/server/chunks/build/useAmlModels-_bweOr3R.mjs +1 -1
- package/.output/server/chunks/build/useAmlNotes-DQj980iX.mjs +1 -1
- package/.output/server/chunks/build/useAmlPredict-DHNgDSJn.mjs +1 -1
- package/.output/server/chunks/build/useAnalysisFeed-BrEGV_9x.mjs +1 -1
- package/.output/server/chunks/build/useDaqAddNode-D_Rkju0f.mjs +1 -1
- package/.output/server/chunks/build/useDaqDetailBinding-DCWaLKXT.mjs +1 -1
- package/.output/server/chunks/build/useDaqDetailFrames-BOIcOJRB.mjs +1 -1
- package/.output/server/chunks/build/useDaqDetailHistory-D6WulPVs.mjs +1 -1
- package/.output/server/chunks/build/useDaqDetailNode-BGMRUIXN.mjs +1 -1
- package/.output/server/chunks/build/useDaqDetailParams-Cm9a9r5G.mjs +1 -1
- package/.output/server/chunks/build/useDaqFilters-zAAVlzJQ.mjs +1 -1
- package/.output/server/chunks/build/useDaqNodeWindow-1DWj2H5G.mjs +1 -1
- package/.output/server/chunks/build/useDaqOptimizations-BE_9Z2s_.mjs +1 -1
- package/.output/server/chunks/build/useDaqTemplates-CK37sMfi.mjs +1 -1
- package/.output/server/chunks/build/useDashboardCharts-D45083s_.mjs +1 -1
- package/.output/server/chunks/build/useDashboardData-Cw8lrPo5.mjs +1 -1
- package/.output/server/chunks/build/useDcwAddNode-KnocMk1m.mjs +1 -1
- package/.output/server/chunks/build/useDcwCards-C53IiOcg.mjs +1 -1
- package/.output/server/chunks/build/useDcwDetailScope-D6qXrfZu.mjs +1 -1
- package/.output/server/chunks/build/useDcwDetailTemplates-DPOXu1o_.mjs +1 -1
- package/.output/server/chunks/build/useDcwFilter-DNQ6Ivwd.mjs +1 -1
- package/.output/server/chunks/build/useDcwLedger-BhbUBCbi.mjs +1 -1
- package/.output/server/chunks/build/useDcwLineMutations-KA7VnggO.mjs +1 -1
- package/.output/server/chunks/build/useDcwLineRun-3zx_UCxi.mjs +1 -1
- package/.output/server/chunks/build/useDcwParamApprovals-DzyY6Tmi.mjs +1 -1
- package/.output/server/chunks/build/useDcwProducts-B05ymt3k.mjs +1 -1
- package/.output/server/chunks/build/useDcwQuery-vWpgpSmJ.mjs +1 -1
- package/.output/server/chunks/build/useDcwQuickActions-DUkLy34S.mjs +1 -1
- package/.output/server/chunks/build/useDcwRecipes-BAb4Yg3d.mjs +1 -1
- package/.output/server/chunks/build/useDcwTemplates-D2aoejps.mjs +1 -1
- package/.output/server/chunks/build/useDcwWrites-7w8txksD.mjs +1 -1
- package/.output/server/chunks/build/useExpConfirmations-BM626N4p.mjs +1 -1
- package/.output/server/chunks/build/useLogsFormat-B-o4MHy7.mjs +1 -1
- package/.output/server/chunks/build/useLogsManual-D0dvgCsP.mjs +1 -1
- package/.output/server/chunks/build/useLogsQuery-D7hrJ3yn.mjs +1 -1
- package/.output/server/chunks/build/useLogsScope-DEUyq-My.mjs +1 -1
- package/.output/server/chunks/build/useMonitorColumns-vVnt3r5Q.mjs +1 -1
- package/.output/server/chunks/build/useMonitorData-DIkiLr_h.mjs +1 -1
- package/.output/server/chunks/build/useMonitorFormat-CyURtH8N.mjs +1 -1
- package/.output/server/chunks/build/useMonitorTerminal-Dj4QwRNW.mjs +1 -1
- package/.output/server/chunks/build/useOperationsFeed-Ci4mZAn_.mjs +1 -1
- package/.output/server/chunks/build/useRecipeDispatchApprovals-BYtiqfeb.mjs +1 -1
- package/.output/server/chunks/build/useTeamActions-BDjU06LP.mjs +1 -1
- package/.output/server/chunks/build/useTeamAddMemberDialog-J3oFn3FI.mjs +1 -1
- package/.output/server/chunks/build/useTeamCreateDialog-fbn4ixYu.mjs +1 -1
- package/.output/server/chunks/build/useTeamDeployDialog-BNezMD2k.mjs +1 -1
- package/.output/server/chunks/build/useTeamDialogState-CFRUQxAf.mjs +1 -1
- package/.output/server/chunks/build/useTeamPluginDialog-BZznrOVe.mjs +1 -1
- package/.output/server/chunks/build/useTeamsCatalog-DuZFP3oG.mjs +1 -1
- package/.output/server/chunks/build/useTokenClipboard-CwQpoFeP.mjs +1 -1
- package/.output/server/chunks/build/useTokenCreate-Ctl0YGhL.mjs +1 -1
- package/.output/server/chunks/build/useTokenRename-Cm3ypSfN.mjs +1 -1
- package/.output/server/chunks/build/useTokenReveal-CeoWL5Mt.mjs +1 -1
- package/.output/server/chunks/build/useTokensList-CNIzON3u.mjs +1 -1
- package/.output/server/chunks/build/useWorkbenchAuth-CY-bVFMu.mjs +1 -1
- package/.output/server/chunks/build/useWorkbenchWorkspaces-DhZQFss9.mjs +1 -1
- package/.output/server/chunks/build/useWorkspaceAuth-Dlvj9csD.mjs +1 -1
- package/.output/server/chunks/build/useWorkspaceChannels-CPFepxTN.mjs +1 -1
- package/.output/server/chunks/build/useWorkspacePanels-CTwREmq0.mjs +1 -1
- package/.output/server/chunks/build/useWorkspaceShell-BCypjjjE.mjs +1 -1
- package/.output/server/chunks/build/users-DjiVC_tS.mjs +1 -1
- package/.output/server/chunks/build/workshop-1gKeDASV.mjs +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
- package/.output/server/chunks/routes/api/metrics.mjs +1 -1
- package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -1
- package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/plugins/i18n.get.mjs +1 -1
- package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -1
- package/.output/server/chunks/routes/api/system/backup/list.get.mjs +1 -1
- package/.output/server/chunks/routes/api/system/backup/run.post.mjs +3 -3
- package/.output/server/chunks/routes/api/system/config-groups/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/system/config.get.mjs +1 -1
- package/.output/server/chunks/routes/api/system/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/system/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/system/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -1
- package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -1
- package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -1
- package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -1
- package/.output/server/chunks/routes/api/system/timezone.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/users/change-password.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/me.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/setup-status.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +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 +2 -2
- 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/agents/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.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/entities/prune.post.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.get.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/character/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index.get.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.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/caller.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/channel-templates/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/rotate-token.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.get.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/chat/messages/_messageId/read.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/chat/permissions.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/execution-mode.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.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.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.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.get.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.get.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/index6.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index7.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/_userId/approve.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/members/_userId_.delete.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/members/leave.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.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/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.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/export-file.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/index.post.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/query.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/storage/retention.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/storage/rollup.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/storage.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 +2 -2
- 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/charts/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/charts/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/charts/_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/dashboards/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/dashboards/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/dashboards/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/features/jobs.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/golden/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/golden/deviation.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/golden/single.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index2.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/index3.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index4.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index5.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index5.post.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/index7.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index7.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index8.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/index8.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/ocap/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/ocap/_id_.patch.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/spc/_id/recompute.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/spc/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/spc/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/eda/templates/_id_.patch.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.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
- 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/index10.post.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/index13.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index14.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index15.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index16.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index2.post.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.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.get.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/index7.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index9.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index9.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mes/datasets.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mes/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mes/index.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mes/points.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mes/preview.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/mes/secrets/_ref_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/notifications/read.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/autofix.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/compile.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/evidence.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/publish.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval-decision.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/approval.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/rules/_ruleId/transition.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/subgraph.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId/validate.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/drafts/_draftId_.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/export/_ontologyId_.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/index.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/scene.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/traces/_ontologyId_.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId/compare.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/ontology/versions/_ontologyId_.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/bindings/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/capabilities.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/optimization/index.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/plugins/index.get.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 +305 -20
- package/.output/server/chunks/routes/api/workshop/process-model/experiments.mjs.map +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/runtime.get.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/scene/layouts.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/schedules/_id/run.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/schedules/_id/runs.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/schedules/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/schedules/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/schedules/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/reassign.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/reopen.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/supersede.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id/update.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/tasks.get.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.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id/index.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/teams/_id/members/_agentId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.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/users/me.get.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/users/register.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/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +2 -2
- package/.output/server/chunks/virtual/entry.mjs +5 -1
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/index.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/README-zh.md +3 -3
- package/README.md +3 -3
- package/config.yml +1 -1
- package/docs/aml.md +112 -112
- package/docs/cli.en.md +4 -4
- package/docs/cli.md +3 -3
- 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 +2 -0
- package/i18n/locales/zh-CN.ts +2 -0
- package/package.json +1 -1
- package/scripts/_audit/demo-shot-studio.mjs +37 -0
- package/scripts/_audit/demo-shots.mjs +38 -0
- package/scripts/_audit/gen-demo-report.py +69 -0
- package/scripts/_audit/mqtt-pub.mjs +13 -0
- package/scripts/_audit/mqtt-topic-probe.mjs +15 -0
- package/scripts/_audit/proto-b3-device-4021.mjs +90 -0
- package/scripts/_audit/proto-doc-device-4120.mjs +53 -0
- package/scripts/acceptance-scientific-loop.ts +224 -0
- package/scripts/generate-identifiability-fixtures.ts +98 -0
- package/server/api/workshop/process-model/experiments.ts +28 -2
- package/server/plugins-builtin/diag-bridge/host/plugin.mjs +759 -753
- package/server/plugins-builtin/rag-bridge/index.mjs +490 -484
- package/server/repositories/user.repository.ts +24 -1
- package/server/services/user.service.ts +8 -6
- package/server/services/workshop/agents/host-tool-bridge/catalog.ts +2 -0
- package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +4 -1
- package/server/services/workshop/agents/host-tool-bridge/tools/messaging.ts +5 -1
- package/server/services/workshop/agents/industrial/aml-dataset-tools.ts +3 -0
- package/server/services/workshop/agents/industrial/bench-approval-only.ts +335 -58
- package/server/services/workshop/agents/industrial/dcw-tools.ts +7 -1
- package/server/services/workshop/agents/industrial/identifiability-tools.ts +247 -0
- package/server/services/workshop/agents/industrial/index.ts +1 -0
- package/server/services/workshop/agents/industrial/manual-approval.ts +3 -1
- package/server/services/workshop/agents/industrial/ops-tools.ts +58 -15
- package/server/services/workshop/agents/industrial/optimization-tools.ts +33 -19
- package/server/services/workshop/agents/plugin-governance.ts +22 -2
- package/server/services/workshop/aml/action-coverage.ts +253 -0
- package/server/services/workshop/aml/causal-claim.ts +68 -0
- package/server/services/workshop/aml/dataset-builder.ts +19 -0
- package/server/services/workshop/aml/gates.ts +45 -1
- package/server/services/workshop/aml/identifiability.ts +335 -0
- package/server/services/workshop/aml/intervention-ledger.ts +281 -0
- package/server/services/workshop/aml/ontology-learning.ts +143 -0
- package/server/services/workshop/aml/twin/cross-check.ts +176 -0
- package/server/services/workshop/daq/daq-controller/contracts.ts +3 -0
- package/server/services/workshop/daq/daq-controller/crud.ts +12 -2
- package/server/services/workshop/daq/daq-controller/push.ts +22 -0
- package/server/services/workshop/daq/drivers/mqtt.ts +28 -0
- package/server/services/workshop/daq/drivers/shared.ts +6 -0
- package/server/services/workshop/db/database/open.ts +2 -0
- package/server/services/workshop/db/database/rows.ts +4 -1
- package/server/services/workshop/db/database/schema.ts +38 -2
- package/server/services/workshop/db/message.repo.ts +10 -3
- package/server/services/workshop/dcw/dcw-controller/write-audit.ts +21 -1
- package/server/services/workshop/process-model/experiment-runner.ts +393 -0
- package/server/services/workshop/process-model/experiment.ts +25 -10
- package/server/services/workshop/runtime/agent-runtime/lifecycle.ts +34 -11
- package/server/services/workshop/runtime/agent-runtime/state.ts +6 -1
- package/server/services/workshop/settings.ts +4 -1
- package/server/services/workshop/types/a2a.ts +16 -1
- package/shared/config/schema.json +2 -0
- package/shared/dcw-protocol/closed-loop.ts +2 -0
- package/.output/public/_nuxt/builds/meta/1231252d-2864-43c0-83b2-4e70d3b86dea.json +0 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""DEMO2 报告 HTML 生成器:读取 REPORT.md 结构 + shots/*.png 内嵌为单文件 report.html。"""
|
|
2
|
+
import base64
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
ROOT = Path(r'D:/codes/ABO/AgentWorkShop/docs/audit/evidence/2026-10-31-demo2')
|
|
7
|
+
SHOTS = ROOT / 'shots'
|
|
8
|
+
|
|
9
|
+
images = {}
|
|
10
|
+
for f in sorted(SHOTS.glob('*.png')):
|
|
11
|
+
images[f.stem] = base64.b64encode(f.read_bytes()).decode()
|
|
12
|
+
|
|
13
|
+
def img(stem, caption):
|
|
14
|
+
if stem not in images:
|
|
15
|
+
return ''
|
|
16
|
+
return '<figure><img src="data:image/png;base64,{b}" alt="{a}"/><figcaption>{c}</figcaption></figure>'.format(
|
|
17
|
+
b=images[stem], a=html_escape(caption), c=html_escape(caption))
|
|
18
|
+
|
|
19
|
+
def html_escape(text):
|
|
20
|
+
return (text.replace('&', '&').replace('<', '<').replace('>', '>'))
|
|
21
|
+
|
|
22
|
+
sections = []
|
|
23
|
+
sections.append(('0. 结论', '<p class="lead">干净重启后,六大业务面(数采/数控/配方/日志/分析/EDA)在<b>真实 UI + 真实 API</b> 上全部走通并截图存证;harness 以 <code>ustc/deepseek-flash</code> 下发保压时间单变量寻优任务,<b>多 Agent 编排、HITL 审批、5 次写全部 ACK、负结果如实判定、complete_task 正常闭合</b>,KB 经验真实落库(7 chunks+向量索引,检索命中 0.772)。</p>'))
|
|
24
|
+
sections.append(('1. G1 干净重启', '<p>杀 40+ 进程树,15 端口全部释放后按依赖序重启;7 端点健康矩阵全 200(3300/3210/5180/8771/6789/4010/15160),admin token 验真通过。</p>'))
|
|
25
|
+
sections.append(('2. G2 数采管理业务', '<p>REST 创建面新建节点 <b>DEMO-缺陷率</b>(dn-46f0c0dd,http 驱动指向 sim 缺陷率信号,2s 周期)→ 控制器 startAll → <b>15/15 节点在线</b> → 2.7s 新鲜度采样 → 批量导出。实时事件流可见节点创建留痕。</p>' + img('02-daq-page', '数采中心:15/15 在线,发布 4123 · 消费 4114 · 入库 4110;实时事件含「创建数采节点 DEMO-缺陷率」')))
|
|
26
|
+
sections.append(('3. G3 数控下发', '<p>cool-water-sp 24→24.5℃(MQTT 平面 <code>transport-ack</code>);三条负向全中:+1℃ 撞单步限幅 0.7℃、999℃ 撞安全量程 10~45℃、60s 内重写撞频控。与 OPC UA 平面 <code>readback-verified</code> 构成<b>分级 ack 双类别</b>实证。</p>' + img('01-dcw-page', '产线运营:注塑线卡片(运行中,节点11/产品1/配方1)')))
|
|
27
|
+
sections.append(('4. G4 Recipe 管理', '<p>rc-923da07b <b>v2</b>(goal 阶梯固化产物),11 参数全带窗口值;操作流水完整呈现 recipe 语义链:trial 整批下发 → ACK 鉴定(证实 1/1)→ judge(keep)→ update_agent(v2)。</p>' + img('03-operations-page', '产线操作流水:39 写控 / 18 数采 / 13 配方 / 20 回退 / 5 告警全分类留痕')))
|
|
28
|
+
sections.append(('5. G5 日志 / 分析 / EDA', '<p><b>产线日志</b>(append-only):本轮每笔操作——节点创建、三次写拒绝、导出、下发——全部带归属(产线/产品/RECIPE)入账。<b>分析台账</b>:Agent 侧 + 用户侧双来源。<b>EDA 工坊</b>:趋势图渲染真实数据,新建节点曲线恰从创建时刻出现。</p>'
|
|
29
|
+
+ img('06-logs-page', '产线日志:三次写拒绝 / 节点创建 / 导出全部留痕')
|
|
30
|
+
+ img('05-analysis-page', '数据分析台账:Agent 侧分析 + 用户侧验收分析,append-only')
|
|
31
|
+
+ img('04-eda-studio', 'EDA 工坊:六种图型 + Golden 参考轨迹面板')
|
|
32
|
+
+ img('04b-eda-chart-rendered', 'EDA 渲染:part-weight 带 + 熔温 + DEMO-缺陷率(自 17:22 创建时刻起)')))
|
|
33
|
+
sections.append(('6. G6 Harness 优化任务(ustc/deepseek-flash)', '<p>任务「DEMO2-保压时间单变量寻优(6→7.8s)」goal 下发 → 根 <code>5dc07bf8</code> <b>COMPLETED 100%</b>。执行链:①稳定性诊断重跑 82.6/B(独立 1Hz 导出自校验);②知识检索命中历史经验 → <b>主动取消九步阶梯</b>(诚实的负结果处理);③闭环经验<b>真实入库</b>(7 chunks+向量+图索引,检索命中 0.772);④保压时间 5 次写全部 ACK 1/1,<b>陈旧指令重放被 Agent 自查发现并标注</b>;⑤收口:负结果成立、配方保持 v2、窗口 0 越限、残留交人工、complete_task 正常闭合。</p>'
|
|
34
|
+
+ img('09-channel-chat', '工作区实时观测:产线作业计数器(DCW 25/DAQ 43/AML 1/SAFE 12)+ Agent 取数事件流 + 生产主管执行中')
|
|
35
|
+
+ img('11-channel-tasks', '任务观测:goal 任务与生产主管状态')))
|
|
36
|
+
sections.append(('7. 终态 KPI(最后一窗 5 分钟)',
|
|
37
|
+
'<table><tr><th>指标</th><th>n</th><th>均值</th><th>区间</th><th>规格</th></tr>'
|
|
38
|
+
'<tr><td>part-weight</td><td>289</td><td><b>32.201 g</b></td><td>32.09~32.33</td><td>32.5±0.35 达标</td></tr>'
|
|
39
|
+
'<tr><td>flash-rate</td><td>289</td><td>0.011 %</td><td>0~0.068</td><td>≤0.4 达标</td></tr>'
|
|
40
|
+
'<tr><td>sink-mark</td><td>289</td><td>1.302 %</td><td>1.098~1.604</td><td>≤1.5 达标</td></tr>'
|
|
41
|
+
'<tr><td>melt-temp-pv</td><td>288</td><td>246.7 ℃</td><td>245.8~247.6</td><td>235~262 达标</td></tr></table>'
|
|
42
|
+
'<p>hold-time-sp 终态:PLC <b>6.2 s</b>(配方 v2 目标 6.0;0.2s 偏移已如实标注交人工)。</p>'))
|
|
43
|
+
sections.append(('8. 结论', '<p class="lead">六大业务面全通且可追溯(UI+API+台账三向印证);harness 优化闭环在弱模型上表现出<b>超出预期的治理素养</b>(取消无谓阶梯、自查陈旧重放、负结果如实、正确 complete_task)。系统维持<b>受控试点 GO</b> 判定;演示全过程零平台缺陷、零静默失败。</p>'))
|
|
44
|
+
|
|
45
|
+
parts = []
|
|
46
|
+
for title, content in sections:
|
|
47
|
+
parts.append('<section><h2>' + html_escape(title) + '</h2>' + content + '</section>')
|
|
48
|
+
body = ''.join(parts)
|
|
49
|
+
doc = ('<!doctype html><html lang="zh"><head><meta charset="utf-8"><title>AgentWorkShop 实机演示报告 DEMO2 · 2026-10-31</title>'
|
|
50
|
+
'<style>'
|
|
51
|
+
'body{background:#0d1117;color:#d8dee6;font-family:"Segoe UI","Microsoft YaHei",sans-serif;max-width:1180px;margin:0 auto;padding:28px;line-height:1.65}'
|
|
52
|
+
'h1{color:#3fe0a8;font-size:26px;border-bottom:1px solid #1f2a37;padding-bottom:10px}'
|
|
53
|
+
'h2{color:#7fd8ff;font-size:19px;margin-top:10px}'
|
|
54
|
+
'code{background:#161f2c;color:#9fe8c0;padding:1px 6px;border-radius:4px;font-size:.92em}'
|
|
55
|
+
'.lead{font-size:15.5px;color:#eef3f8}.meta{color:#8aa0b4;font-size:13px}'
|
|
56
|
+
'table{border-collapse:collapse;width:100%;margin:12px 0}'
|
|
57
|
+
'th,td{border:1px solid #24303f;padding:7px 12px;text-align:left;font-size:14px}'
|
|
58
|
+
'th{background:#16202e;color:#a8c7e0}'
|
|
59
|
+
'figure{margin:16px 0;text-align:center}'
|
|
60
|
+
'img{max-width:100%;border:1px solid #24303f;border-radius:8px;box-shadow:0 4px 18px rgba(0,0,0,.4)}'
|
|
61
|
+
'figcaption{color:#8aa0b4;font-size:12.5px;margin-top:6px}'
|
|
62
|
+
'section{background:#101823;border:1px solid #1c2735;border-radius:10px;padding:18px 24px;margin-bottom:18px}'
|
|
63
|
+
'</style></head><body>'
|
|
64
|
+
'<h1>AgentWorkShop 实机演示报告(第二轮 · DEMO2)</h1>'
|
|
65
|
+
'<p class="meta">2026-10-31 17:00~18:45 · v0.8.8 · 平台 3300(home=D:/tmp/aw-prod-1031)· 模型 ustc/deepseek-flash(omp)· 账本 .omc/ultragoal 7/7 · 截图 shots 目录 ×10</p>'
|
|
66
|
+
+ body + '</body></html>')
|
|
67
|
+
out = ROOT / 'report.html'
|
|
68
|
+
out.write_text(doc, encoding='utf-8')
|
|
69
|
+
print('report.html written:', round(out.stat().st_size / 1024), 'KB')
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// MQTT 一次性发布器:node mqtt-pub.mjs <url> <topic> <json>
|
|
2
|
+
import mqtt from 'mqtt'
|
|
3
|
+
|
|
4
|
+
const [, , url = 'mqtt://127.0.0.1:18830', topic = 'aw/blow/b3/cmd/pressure', json = '{"sp":2.6}'] = process.argv
|
|
5
|
+
const c = mqtt.connect(url, { connectTimeout: 3000, reconnectPeriod: 0 })
|
|
6
|
+
c.on('connect', () => {
|
|
7
|
+
c.publish(topic, json, { qos: 1 }, (err) => {
|
|
8
|
+
console.log(err ? `pub err: ${err.message}` : `published → ${topic} ${json}`)
|
|
9
|
+
c.end(true, () => process.exit(err ? 1 : 0))
|
|
10
|
+
})
|
|
11
|
+
})
|
|
12
|
+
c.on('error', (e) => { console.log(`conn err: ${String(e).slice(0, 120)}`); process.exit(1) })
|
|
13
|
+
setTimeout(() => { console.log('timeout'); process.exit(1) }, 8000).unref()
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// MQTT 主题探针:订阅指定 broker/topic 6s,打印报文数与首条(验证设备端发布活性)
|
|
2
|
+
import mqtt from 'mqtt'
|
|
3
|
+
|
|
4
|
+
const [, , url = 'mqtt://127.0.0.1:1883', topic = 'aw/proto/doc/env'] = process.argv
|
|
5
|
+
const c = mqtt.connect(url, { connectTimeout: 3000 })
|
|
6
|
+
const got = []
|
|
7
|
+
c.on('connect', () => { c.subscribe(topic, { qos: 0 }) })
|
|
8
|
+
c.on('error', (e) => { console.log('conn err:', String(e).slice(0, 120)) })
|
|
9
|
+
c.on('message', (t, p) => got.push(p.toString().slice(0, 160)))
|
|
10
|
+
setTimeout(() => {
|
|
11
|
+
console.log(`topic=${topic} messages in 6s: ${got.length}`)
|
|
12
|
+
if (got[0]) console.log('first:', got[0])
|
|
13
|
+
c.end(true)
|
|
14
|
+
process.exit(0)
|
|
15
|
+
}, 6000)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// 3# 吹瓶产线(BC-3)设备模拟器 —— 严格按 docs/audit/2026-10-31-b3-blowline-protocol-manual.md v1.4 合同实现
|
|
2
|
+
// HTTP 4021: GET /api/v1/melt/pressure | GET /api/v1/preform/temp | GET /api/v1/wall/profile | PUT+GET /api/v1/head/temp/sp
|
|
3
|
+
// MQTT 18830: publish aw/blow/b3/env(2s, temp+humidity 同报文) | subscribe aw/blow/b3/cmd/pressure → 应用后 publish aw/blow/b3/sp/pressure
|
|
4
|
+
import http from 'node:http'
|
|
5
|
+
import mqtt from 'mqtt'
|
|
6
|
+
import { appendFileSync } from 'node:fs'
|
|
7
|
+
|
|
8
|
+
const LOG = 'D:/tmp/proto-b3-device-4021.log'
|
|
9
|
+
const log = (s) => { try { appendFileSync(LOG, `${new Date().toISOString()} ${s}\n`) } catch {} }
|
|
10
|
+
const PORT = 4021
|
|
11
|
+
const MQTT_URL = 'mqtt://127.0.0.1:18830'
|
|
12
|
+
|
|
13
|
+
const state = { headSp: 210.0, blowSp: 2.6 }
|
|
14
|
+
const noise = a => (Math.random() - 0.5) * 2 * a
|
|
15
|
+
const now = () => Date.now()
|
|
16
|
+
|
|
17
|
+
// 工况曲线(文档 §2/§6 期望带内)
|
|
18
|
+
const meltPressure = () => +(23.5 + 1.5 * Math.sin(Date.now() / 60000) + noise(0.05)).toFixed(2)
|
|
19
|
+
const preformTemp = () => +(105 + 2 * Math.sin(Date.now() / 120000) + noise(0.2)).toFixed(1)
|
|
20
|
+
const envTemp = () => +(22.3 + 0.5 * Math.sin(Date.now() / 300000) + noise(0.05)).toFixed(1)
|
|
21
|
+
const envHumidity = () => +(52 + 1.5 * Math.sin(Date.now() / 240000) + noise(0.1)).toFixed(1)
|
|
22
|
+
const wallProfile = () => Array.from({ length: 16 }, (_, i) =>
|
|
23
|
+
+(1.4 + 0.3 * Math.sin((i / 16) * Math.PI * 2) + 0.05 * Math.sin(Date.now() / 45000) + noise(0.005)).toFixed(3))
|
|
24
|
+
|
|
25
|
+
// ── HTTP 面 ──
|
|
26
|
+
const server = http.createServer((req, res) => {
|
|
27
|
+
const url = (req.url ?? '').split('?')[0]
|
|
28
|
+
const send = (code, body) => { res.writeHead(code, { 'content-type': 'application/json' }); res.end(JSON.stringify(body)) }
|
|
29
|
+
if (req.method === 'GET' && url === '/api/v1/melt/pressure')
|
|
30
|
+
return send(200, { code: 0, data: { pressure: meltPressure(), ts: now() } })
|
|
31
|
+
if (req.method === 'GET' && url === '/api/v1/preform/temp')
|
|
32
|
+
return send(200, { code: 0, data: { temp: preformTemp(), ts: now() } })
|
|
33
|
+
if (req.method === 'GET' && url === '/api/v1/wall/profile')
|
|
34
|
+
return send(200, { code: 0, data: { points: wallProfile(), ts: now() } })
|
|
35
|
+
if (req.method === 'GET' && url === '/api/v1/head/temp/sp')
|
|
36
|
+
return send(200, { code: 0, data: { sp: state.headSp, applied: true } })
|
|
37
|
+
// 集成注记 v1.4.1:平台 http 写驱动仅发 POST(硬编码,dcw/drivers/http.ts:47);网关为集成兼容
|
|
38
|
+
// 同时接受 POST 别名(合同原生语义仍为 PUT,厂家设备不变)
|
|
39
|
+
if ((req.method === 'PUT' || req.method === 'POST') && url === '/api/v1/head/temp/sp') {
|
|
40
|
+
let raw = ''
|
|
41
|
+
req.on('data', (c) => { raw += c })
|
|
42
|
+
req.on('end', () => {
|
|
43
|
+
try {
|
|
44
|
+
const body = JSON.parse(raw || '{}')
|
|
45
|
+
const sp = Number(body.sp)
|
|
46
|
+
if (!Number.isFinite(sp)) return send(400, { code: 4001, message: 'BAD_PAYLOAD: sp 非数值' })
|
|
47
|
+
if (sp < 150 || sp > 260) return send(400, { code: 4002, message: `OUT_OF_RANGE: ${sp} 超出 150~260` })
|
|
48
|
+
state.headSp = +sp.toFixed(1)
|
|
49
|
+
log(`HTTP SP head-temp → ${state.headSp}`)
|
|
50
|
+
// 集成注记 v1.4.1(续):写应答按平台 http 写驱动合同平铺设定值字段(顶层 bodyKey);
|
|
51
|
+
// 合同原文的嵌套信封保留在 GET 读取面。两点均为网关别名,厂家设备原生不变。
|
|
52
|
+
send(200, { sp: state.headSp, applied: true })
|
|
53
|
+
} catch (e) { send(400, { code: 4003, message: `BAD_JSON: ${String(e).slice(0, 60)}` }) }
|
|
54
|
+
})
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
if (req.method === 'GET' && url === '/health') return send(200, { ok: true, port: PORT, blowSp: state.blowSp, headSp: state.headSp })
|
|
58
|
+
send(404, { code: 404, message: `NOT_FOUND: ${url}` })
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
// ── MQTT 面 ──
|
|
62
|
+
const client = mqtt.connect(MQTT_URL, { connectTimeout: 4000, reconnectPeriod: 2000 })
|
|
63
|
+
client.on('connect', () => {
|
|
64
|
+
log(`mqtt connected ${MQTT_URL}`)
|
|
65
|
+
client.subscribe('aw/blow/b3/cmd/pressure', { qos: 1 })
|
|
66
|
+
setInterval(() => {
|
|
67
|
+
const payload = JSON.stringify({ temp: envTemp(), humidity: envHumidity(), ts: now() })
|
|
68
|
+
client.publish('aw/blow/b3/env', payload, { qos: 0 })
|
|
69
|
+
}, 2000)
|
|
70
|
+
})
|
|
71
|
+
client.on('message', (_topic, payload) => {
|
|
72
|
+
try {
|
|
73
|
+
const body = JSON.parse(payload.toString())
|
|
74
|
+
const sp = Number(body.sp)
|
|
75
|
+
if (!Number.isFinite(sp) || sp < 0 || sp > 3.0) {
|
|
76
|
+
log(`MQTT cmd REJECT sp=${sp}(量程 0~3.0 预警线)`)
|
|
77
|
+
return
|
|
78
|
+
}
|
|
79
|
+
// 文档 §3.2:设备应用后(延迟 <1s)发布确认报文
|
|
80
|
+
setTimeout(() => {
|
|
81
|
+
state.blowSp = +sp.toFixed(2)
|
|
82
|
+
const confirm = JSON.stringify({ sp: state.blowSp, applied: true, ts: now() })
|
|
83
|
+
client.publish('aw/blow/b3/sp/pressure', confirm, { qos: 1 })
|
|
84
|
+
log(`MQTT cmd APPLIED sp=${state.blowSp} → confirm published`)
|
|
85
|
+
}, 250)
|
|
86
|
+
} catch (e) { log(`MQTT cmd parse err: ${String(e).slice(0, 80)}`) }
|
|
87
|
+
})
|
|
88
|
+
client.on('error', e => log(`mqtt err: ${String(e).slice(0, 100)}`))
|
|
89
|
+
|
|
90
|
+
server.listen(PORT, () => log(`HTTP listening :${PORT} (合同=2026-10-31-b3-blowline-protocol-manual.md v1.4)`))
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* 2026-10-31 文档驱动虚拟验证用设备端(HTTP)。
|
|
4
|
+
* 端点:
|
|
5
|
+
* GET /health → {ok}
|
|
6
|
+
* GET /pv → {value, ts} 箱体温度 PV(24.5~25.5 正弦)
|
|
7
|
+
* GET /sp → {setpoint, ts} 当前设定值(供 DAQ 回读)
|
|
8
|
+
* POST /sp → {setpoint} 写入设定值(供 DCW HTTP 驱动下发)
|
|
9
|
+
* GET /profile → {points[64], ts} 壁厚轮廓(2.5mm 附近)
|
|
10
|
+
* 仅监听 127.0.0.1:4120;无认证(虚拟验证专用)。
|
|
11
|
+
*/
|
|
12
|
+
import http from 'node:http'
|
|
13
|
+
|
|
14
|
+
const PORT = Number(process.env.DOC_DEVICE_PORT ?? 4120)
|
|
15
|
+
const started = Date.now()
|
|
16
|
+
let setpoint = 25
|
|
17
|
+
|
|
18
|
+
const send = (res, code, body) => {
|
|
19
|
+
res.writeHead(code, { 'content-type': 'application/json; charset=utf-8' })
|
|
20
|
+
res.end(JSON.stringify(body))
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const server = http.createServer(async (req, res) => {
|
|
24
|
+
const url = new URL(req.url ?? '/', `http://127.0.0.1:${PORT}`)
|
|
25
|
+
if (req.method === 'GET' && url.pathname === '/health') return send(res, 200, { ok: true, ts: Date.now() })
|
|
26
|
+
if (req.method === 'GET' && url.pathname === '/pv') {
|
|
27
|
+
const t = (Date.now() - started) / 1000
|
|
28
|
+
return send(res, 200, { value: Number((25 + Math.sin(t * 0.2) * 0.5).toFixed(3)), ts: Date.now() })
|
|
29
|
+
}
|
|
30
|
+
if (req.method === 'GET' && url.pathname === '/sp') return send(res, 200, { setpoint, ts: Date.now() })
|
|
31
|
+
if (req.method === 'POST' && url.pathname === '/sp') {
|
|
32
|
+
let raw = ''
|
|
33
|
+
for await (const chunk of req) raw += chunk
|
|
34
|
+
try {
|
|
35
|
+
const j = JSON.parse(raw || '{}')
|
|
36
|
+
const v = Number(j.setpoint)
|
|
37
|
+
if (Number.isFinite(v)) setpoint = v
|
|
38
|
+
}
|
|
39
|
+
catch { /* 非法 JSON:保持原值,仍返回当前值供排查 */ }
|
|
40
|
+
return send(res, 200, { ok: true, setpoint, ts: Date.now() })
|
|
41
|
+
}
|
|
42
|
+
if (req.method === 'GET' && url.pathname === '/profile') {
|
|
43
|
+
const t = (Date.now() - started) / 1000
|
|
44
|
+
const points = Array.from({ length: 64 }, (_, i) =>
|
|
45
|
+
Number((2.5 + Math.sin(i / 8 + t * 0.1) * 0.02 + Math.sin(i / 3) * 0.005).toFixed(4)))
|
|
46
|
+
return send(res, 200, { points, ts: Date.now() })
|
|
47
|
+
}
|
|
48
|
+
return send(res, 404, { error: 'not found' })
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
server.listen(PORT, '127.0.0.1', () => {
|
|
52
|
+
console.log(`[proto-doc-device] ready http://127.0.0.1:${PORT}`)
|
|
53
|
+
})
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 科学探索闭环验收(E2E-1..4,docs/plans/2026-11-02-scientific-exploration-acceptance.md):
|
|
3
|
+
*
|
|
4
|
+
* 正交 DoE 计划(真实线分级 → HITL 批准 → 随机化步序)
|
|
5
|
+
* → 每步经 DCW 写咽喉真实落 intervention_events
|
|
6
|
+
* → 引擎判读(UNDERPOWERED/负结论/有效应)回填台账
|
|
7
|
+
* → 判定回灌 ontology_evidence(support/refute 计数)
|
|
8
|
+
* → 通道 B 解析"明确无耦合" + 模型通道"有效应" → 互审拒绝
|
|
9
|
+
* → G6:事故型数据集 FAIL / 正交型 PASS
|
|
10
|
+
*
|
|
11
|
+
* 隔离:临时 AW_HOME + 临时 sqlite;AW_BENCH_MODE=1 旁路 60s 在线写间隔(仅验收加速,
|
|
12
|
+
* 生产模式恒不旁路);所有副作用在临时目录,进程退出即丢弃。
|
|
13
|
+
* 运行:npx tsx --tsconfig .nuxt/tsconfig.server.json scripts/acceptance-scientific-loop.ts
|
|
14
|
+
*/
|
|
15
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'
|
|
16
|
+
import { tmpdir } from 'node:os'
|
|
17
|
+
import { join } from 'node:path'
|
|
18
|
+
|
|
19
|
+
const home = mkdtempSync(join(tmpdir(), 'aw-sci-e2e-'))
|
|
20
|
+
process.env.AGENTWORKSHOP_TEST = '1'
|
|
21
|
+
process.env.AW_MODE = 'home'
|
|
22
|
+
process.env.AW_HOME = home
|
|
23
|
+
process.env.AW_BENCH_MODE = '1'
|
|
24
|
+
process.env.AW_BENCH_ACK = '1'
|
|
25
|
+
delete process.env.AW_IDENT_GATE
|
|
26
|
+
|
|
27
|
+
let pass = 0
|
|
28
|
+
let fail = 0
|
|
29
|
+
const failures: string[] = []
|
|
30
|
+
function check(id: string, name: string, cond: boolean, detail: string): void {
|
|
31
|
+
if (cond) {
|
|
32
|
+
pass++
|
|
33
|
+
console.log(` PASS ${id} ${name}${detail ? ` — ${detail}` : ''}`)
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
fail++
|
|
37
|
+
failures.push(`${id} ${name}: ${detail}`)
|
|
38
|
+
console.log(` FAIL ${id} ${name} — ${detail}`)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const { openWorkshopDb } = await import('../server/services/workshop/db/database/open')
|
|
43
|
+
const { configureAmlRuntime } = await import('../server/services/workshop/aml/runtime')
|
|
44
|
+
const { bindOpsRepos } = await import('../server/services/workshop/ops/ops')
|
|
45
|
+
const { createAlarmEventRepo, createApprovalHistoryRepo, createApprovalRequestRepo, createAuditRepo } = await import('../server/services/workshop/db/ops.repo')
|
|
46
|
+
const { getDcwLineRepo } = await import('../server/services/workshop/dcw/dcw-line.repo')
|
|
47
|
+
const { getDcwController } = await import('../server/services/workshop/dcw/dcw-controller')
|
|
48
|
+
const { createExperimentPlan } = await import('../server/services/workshop/process-model/experiment')
|
|
49
|
+
const { approveExperimentPlan, runExperimentPlan, parsePlan } = await import('../server/services/workshop/process-model/experiment-runner')
|
|
50
|
+
const ledger = await import('../server/services/workshop/aml/intervention-ledger')
|
|
51
|
+
const learning = await import('../server/services/workshop/aml/ontology-learning')
|
|
52
|
+
const { evaluateCrossCheck } = await import('../server/services/workshop/aml/twin/cross-check')
|
|
53
|
+
const { computeActionCoverage, assessDatasetActionCoverage } = await import('../server/services/workshop/aml/action-coverage')
|
|
54
|
+
const { getOntologyRepo } = await import('../server/services/workshop/ontology/repo')
|
|
55
|
+
|
|
56
|
+
console.log(`\n[科学探索闭环验收] AW_HOME=${home}`)
|
|
57
|
+
const db = openWorkshopDb(join(home, 'sci-loop.sqlite'))
|
|
58
|
+
configureAmlRuntime(db)
|
|
59
|
+
bindOpsRepos({
|
|
60
|
+
approvalHistory: createApprovalHistoryRepo(db),
|
|
61
|
+
alarmEvents: createAlarmEventRepo(db),
|
|
62
|
+
audit: createAuditRepo(db),
|
|
63
|
+
approvalRequests: createApprovalRequestRepo(db),
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
// ---------- 夹具:真实线 + 两个 mock 数控节点 + 已发布本体 ----------
|
|
67
|
+
const line = getDcwLineRepo().create({ name: '科学闭环验收线', simulated: false })
|
|
68
|
+
const controller = getDcwController()
|
|
69
|
+
const sp = controller.create({ name: '验收·熔体压力SP', templateRef: 'pressure-sp', driver: 'mock', driverConfig: { key: 'sci-sp' }, min: 0.6, max: 1.2, unit: 'MPa', decimals: 2, lineId: line.id, maxStep: 0.2 } as Parameters<typeof controller.create>[0])
|
|
70
|
+
const sp2 = controller.create({ name: '验收·熔体温度SP', templateRef: 'temp-sp', driver: 'mock', driverConfig: { key: 'sci-hold' }, min: 150, max: 200, unit: '℃', decimals: 1, lineId: line.id, maxStep: 10 } as Parameters<typeof controller.create>[0])
|
|
71
|
+
const nowIso = new Date().toISOString()
|
|
72
|
+
db.prepare(`INSERT INTO ontology_versions (id, version, name, line_id, parent_version, content_hash, compiled_json, changelog_json, status, owner_user_id, published_by, created_at, updated_at)
|
|
73
|
+
VALUES ('ont-sci', 1, '科学闭环本体', ?, NULL, '', '{}', '{}', 'published', 'u1', 'u1', ?, ?)`).run(line.id, nowIso, nowIso)
|
|
74
|
+
|
|
75
|
+
// 目标响应:壁厚 = 0.28 + 4.71min 振荡 + 噪声(与控制量无耦合 —— 事故形态的"真无耦合"世界)
|
|
76
|
+
const periodBeats = 4.71 * 60
|
|
77
|
+
let tick = 0
|
|
78
|
+
function series(beats: number): number[] {
|
|
79
|
+
const out: number[] = []
|
|
80
|
+
for (let i = 0; i < beats; i++) {
|
|
81
|
+
tick++
|
|
82
|
+
// 单一主导振荡 + 微噪声(与事故一致;不加高频纹波,避免把"局部纹波 vs 全局周期"混进来)
|
|
83
|
+
out.push(0.28 + 0.05 * Math.sin((2 * Math.PI * tick) / periodBeats) + 0.0008 * Math.sin(tick * 2.3))
|
|
84
|
+
}
|
|
85
|
+
return out
|
|
86
|
+
}
|
|
87
|
+
const targetId = 'daq-sci-thickness'
|
|
88
|
+
/** 按请求窗长生成拍数(生产语义:读多长窗就得多少拍) */
|
|
89
|
+
const beatsOf = (from: number, to: number): number => Math.max(60, Math.ceil((to - from) / 1000))
|
|
90
|
+
/** Leg A(事故形态):按窗长生成 282 拍周期振荡 —— 长历史能估出周期,短窗只能判欠功效 */
|
|
91
|
+
const readSeriesShort = async (_node: string, from: number, to: number) => series(beatsOf(from, to))
|
|
92
|
+
/** Leg B(充分窗负结论):恒定目标无效应 → 应判"无可分辨效应"并产生 refute 证据 */
|
|
93
|
+
const readSeriesLong = async (_node: string, from: number, to: number) => new Array<number>(beatsOf(from, to)).fill(0.28)
|
|
94
|
+
|
|
95
|
+
// ---------- E2E-1 真实线计划:创建 → 成本 → 批准 → 正交执行 ----------
|
|
96
|
+
console.log('\nE2E-1 真实线 DoE 分级与执行')
|
|
97
|
+
const plan = createExperimentPlan({
|
|
98
|
+
lineId: line.id,
|
|
99
|
+
levels: { [sp.id]: [1.2, 1.1, 1.0], [sp2.id]: [170, 180] },
|
|
100
|
+
repeats: 2,
|
|
101
|
+
settleMs: 1000,
|
|
102
|
+
observeMs: 1000,
|
|
103
|
+
targets: { [sp.id]: targetId, [sp2.id]: targetId },
|
|
104
|
+
dominantPeriodMs: 4.71 * 60_000,
|
|
105
|
+
})
|
|
106
|
+
const body = parsePlan(plan)
|
|
107
|
+
check('E2E-1a', '真实线计划创建即待批准', plan.status === 'awaiting_approval', `status=${plan.status}`)
|
|
108
|
+
check('E2E-1b', '成本核算含 3×主导周期与预计总时长', !!body.cost?.suggestedWindowMs && /3×主导周期/.test(body.cost!.summary), body.cost?.summary ?? '(无)')
|
|
109
|
+
check('E2E-1c', '步数 = (3+2)×2 = 10', body.cost?.steps === 10, `steps=${body.cost?.steps}`)
|
|
110
|
+
|
|
111
|
+
let rejected = false
|
|
112
|
+
try {
|
|
113
|
+
await runExperimentPlan(plan.id)
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
rejected = /批准/.test(err instanceof Error ? err.message : String(err))
|
|
117
|
+
}
|
|
118
|
+
check('E2E-1d', '未批准执行被拒(HITL 是硬门)', rejected)
|
|
119
|
+
|
|
120
|
+
const approved = approveExperimentPlan(plan.id, 'rest:u-accept:1', 'u-accept')
|
|
121
|
+
check('E2E-1e', '人工批准后转 planned 并留痕', approved.status === 'planned' && parsePlan(approved).approvalId === 'rest:u-accept:1')
|
|
122
|
+
|
|
123
|
+
const result = await runExperimentPlan(plan.id, { readTargetSeries: readSeriesShort, readTargetMean: async () => 0.28, sleep: async () => {} })
|
|
124
|
+
check('E2E-1f', '计划执行完成(10/10 步)', result.status === 'done' && result.executedSteps === 10 && result.totalSteps === 10, `${result.status} ${result.executedSteps}/${result.totalSteps} ${result.failedReason ?? ''}`)
|
|
125
|
+
|
|
126
|
+
// 充分窗负结论(leg B):900 拍窗 + 恒定目标 → no_resolvable_effect → refute 证据
|
|
127
|
+
const planB = createExperimentPlan({
|
|
128
|
+
lineId: line.id,
|
|
129
|
+
levels: { [sp.id]: [1.2, 1.1] },
|
|
130
|
+
repeats: 1,
|
|
131
|
+
settleMs: 900_000,
|
|
132
|
+
observeMs: 1,
|
|
133
|
+
targets: { [sp.id]: targetId },
|
|
134
|
+
})
|
|
135
|
+
approveExperimentPlan(planB.id, 'rest:u-accept:2', 'u-accept')
|
|
136
|
+
const resultB = await runExperimentPlan(planB.id, { readTargetSeries: readSeriesLong, readTargetMean: async () => 0.28, sleep: async () => {} })
|
|
137
|
+
check('E2E-1g', '充分窗计划执行完成', resultB.status === 'done' && resultB.executedSteps === 2, `${resultB.status} ${resultB.executedSteps}/2 ${resultB.failedReason ?? ''}`)
|
|
138
|
+
for (const r of ledger.listInterventions({ nodeId: sp.id, limit: 50 }).filter(x => x.verdict === 'identifiable_effect')) {
|
|
139
|
+
console.log(` [诊断] ${r.hypothesis.slice(0, 40)} verdict=${r.verdict} effect=${r.effect} mde=${r.mde} detail=${JSON.stringify(r.verdictDetail?.reasons ?? [])}`)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// ---------- E2E-2 台账逐步落行 + 判定回填 + 证据回灌 ----------
|
|
143
|
+
console.log('\nE2E-2 台账 → 判定 → 本体证据')
|
|
144
|
+
for (const nodeId of [sp.id, sp2.id]) {
|
|
145
|
+
const rows = ledger.listInterventions({ nodeId, limit: 50 }).filter(r => r.hypothesis.startsWith(`[pexp:${plan.id}]`))
|
|
146
|
+
check('E2E-2a', `${nodeId} 台账逐步落行`, rows.length >= 2, `${rows.length} 行`)
|
|
147
|
+
check('E2E-2b', `${nodeId} 判定已回填(非 pending)`, rows.every(r => r.verdict !== 'pending'), rows.map(r => r.verdict).join(','))
|
|
148
|
+
}
|
|
149
|
+
const evidence = getOntologyRepo().listEvidence('ont-sci', { targetKind: 'relation', limit: 200 })
|
|
150
|
+
check('E2E-2c', '判定回灌 ontology_evidence(sourceType=intervention)', evidence.length > 0 && evidence.every(e => e.sourceType === 'intervention'), `${evidence.length} 条`)
|
|
151
|
+
const verdictOf = (detailJson: string): string | undefined => {
|
|
152
|
+
try {
|
|
153
|
+
return (JSON.parse(detailJson) as { verdict?: string }).verdict
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return undefined
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const verdicts = evidence.map(e => verdictOf(e.detailJson))
|
|
160
|
+
const spurious = verdicts.filter(v => v === 'identifiable_effect').length
|
|
161
|
+
const refutes = verdicts.filter(v => v === 'no_resolvable_effect').length
|
|
162
|
+
const underpowered = verdicts.filter(v => v === 'underpowered').length
|
|
163
|
+
// 事故形态(短窗)下正确结论是"欠功效";声称有效应 = 假阳性,必须为 0
|
|
164
|
+
check('E2E-2d', '短窗步骤不得声称有效应(假阳性=0)', spurious === 0, `identifiable_effect=${spurious}, underpowered=${underpowered}`)
|
|
165
|
+
// 充分窗负结论必须落成 refute 证据(可证伪的一等事实)
|
|
166
|
+
check('E2E-2e', '充分窗负结论计 refute(无耦合可断言)', refutes > 0, `refute=${refutes}`)
|
|
167
|
+
|
|
168
|
+
// ---------- E2E-3 通道 B 用回灌证据 + 模型通道冲突 → 拒绝 ----------
|
|
169
|
+
console.log('\nE2E-3 互审:本体明确无耦合 vs 模型有效应')
|
|
170
|
+
const coupling = learning.resolveCouplingFromOntology(line.id, sp.id, targetId)
|
|
171
|
+
check('E2E-3a', '本体无该耦合边 → 明确无路径(false)', coupling.hasCouplingPath === false, JSON.stringify({ has: coupling.hasCouplingPath, refute: coupling.refuteCount }))
|
|
172
|
+
const withEffect = { A: [[0.5, 0.3], [0, 0]], B: [[0], [1]], C: [[1, 0]], D: [[0]], mvOrder: [sp.id], cvOrder: [targetId] }
|
|
173
|
+
const cross = evaluateCrossCheck({
|
|
174
|
+
controlNodeId: sp.id, targetNodeId: targetId, proposedDelta: -0.2, auto: true,
|
|
175
|
+
model: { artifact: withEffect, targetNodeId: targetId },
|
|
176
|
+
ontology: { hasCouplingPath: coupling.hasCouplingPath, evidence: coupling.evidence },
|
|
177
|
+
identifiability: { verdict: 'UNDERPOWERED', mde: 0.003 },
|
|
178
|
+
})
|
|
179
|
+
check('E2E-3b', '自动模式拒绝且理由含"模型有效应"+"无耦合路径"', cross.decision === 'reject' && cross.conflicts.some(c => /模型预测有效应/.test(c) && /无耦合路径/.test(c)), cross.conflicts.join(' | '))
|
|
180
|
+
check('E2E-3c', '科学载荷带 MDE 与可证伪方式', cross.payload.mde === 0.003 && cross.payload.falsificationMethod.length > 20)
|
|
181
|
+
|
|
182
|
+
// ---------- E2E-4 G6 动作覆盖门 ----------
|
|
183
|
+
console.log('\nE2E-4 G6:事故型数据集 vs 正交数据集')
|
|
184
|
+
const incident = computeActionCoverage(sp.id, Array.from({ length: 600 }, (_, i) => (i < 300 ? 2.6 : 2.4)))
|
|
185
|
+
const orthogonal = computeActionCoverage(sp.id, [2.6, 2.5, 2.4, 2.5, 2.6, 2.5, 2.4].flatMap(v => new Array<number>(80).fill(v)))
|
|
186
|
+
const t = { minControlLevels: 3, maxCollinearity: 0.9 }
|
|
187
|
+
check('E2E-4a', '事故型(2 水平纯阶梯)G6 不通过', assessDatasetActionCoverage([incident], t).pass === false, incident.monolithicSequence ? 'monolithic' : '')
|
|
188
|
+
check('E2E-4b', '正交 ABAB(3 档往返)G6 通过', assessDatasetActionCoverage([orthogonal], t).pass === true, `levels=${orthogonal.distinctLevels} blocks=${orthogonal.levelBlocks.join('/')}`)
|
|
189
|
+
|
|
190
|
+
// ---------- 汇总 ----------
|
|
191
|
+
const outDir = join(home, 'evidence')
|
|
192
|
+
mkdirSync(outDir, { recursive: true })
|
|
193
|
+
const summary = {
|
|
194
|
+
at: new Date().toISOString(),
|
|
195
|
+
planId: plan.id,
|
|
196
|
+
lineId: line.id,
|
|
197
|
+
pass,
|
|
198
|
+
fail,
|
|
199
|
+
failures,
|
|
200
|
+
run: result,
|
|
201
|
+
evidenceRows: evidence.length,
|
|
202
|
+
refutes,
|
|
203
|
+
coupling: { hasCouplingPath: coupling.hasCouplingPath, refuteCount: coupling.refuteCount },
|
|
204
|
+
crossCheck: { decision: cross.decision, conflicts: cross.conflicts },
|
|
205
|
+
g6: { incident: assessDatasetActionCoverage([incident], t).pass, orthogonal: assessDatasetActionCoverage([orthogonal], t).pass },
|
|
206
|
+
}
|
|
207
|
+
writeFileSync(join(outDir, 'scientific-loop-report.json'), JSON.stringify(summary, null, 2))
|
|
208
|
+
console.log(`\n[结果] pass=${pass} fail=${fail}`)
|
|
209
|
+
console.log(`[证据] ${join(outDir, 'scientific-loop-report.json')}`)
|
|
210
|
+
if (fail > 0) {
|
|
211
|
+
console.error('失败项:')
|
|
212
|
+
for (const f of failures) console.error(` - ${f}`)
|
|
213
|
+
// Windows 下 sqlite 句柄未释放时删目录会 EPERM:清理失败不影响验收结论
|
|
214
|
+
try {
|
|
215
|
+
rmSync(home, { recursive: true, force: true })
|
|
216
|
+
}
|
|
217
|
+
catch { console.error(`[提示] 临时目录未清理:${home}`) }
|
|
218
|
+
process.exit(1)
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
rmSync(home, { recursive: true, force: true })
|
|
222
|
+
}
|
|
223
|
+
catch { console.log(`[提示] 临时目录未清理:${home}`) }
|
|
224
|
+
console.log('[科学探索闭环] ALL PASS\n')
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 可辨识性事故回放夹具生成器(P0,docs/plans/2026-11-02-scientific-exploration-plan.md)。
|
|
3
|
+
*
|
|
4
|
+
* 真实帧库随实例清场不可复取时,按事故参数确定性重构(种子固定,输出逐字节可复现):
|
|
5
|
+
* - 吹压 SP 2.6 → 2.4 bar(单步干预,与作业后半段完全共线的原始形态)
|
|
6
|
+
* - 目标(壁厚)含 4.71 min 主导振荡 + 高斯噪声
|
|
7
|
+
* - 预窗 35 min(参照事故 06:19–06:54 写前段),响应窗 47 s(参照探索 settle 45–47s)
|
|
8
|
+
* 验收口径(tests/identifiability.test.ts):引擎对该夹具必须输出 UNDERPOWERED +
|
|
9
|
+
* suggestedWindowMs ≈ 3×周期 ≈ 14.1 min —— 即"这次事故 100% 会被门禁挡住"的可执行断言。
|
|
10
|
+
*
|
|
11
|
+
* 运行:npx tsx --tsconfig .nuxt/tsconfig.server.json scripts/generate-identifiability-fixtures.ts
|
|
12
|
+
*/
|
|
13
|
+
import { mkdirSync, writeFileSync } from 'node:fs'
|
|
14
|
+
import { dirname, join } from 'node:path'
|
|
15
|
+
import { fileURLToPath } from 'node:url'
|
|
16
|
+
|
|
17
|
+
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..')
|
|
18
|
+
const OUT = join(ROOT, 'tests', 'fixtures', 'identifiability-incident-replay.json')
|
|
19
|
+
|
|
20
|
+
interface FixtureMeta {
|
|
21
|
+
seed: number
|
|
22
|
+
beatMs: number
|
|
23
|
+
periodMin: number
|
|
24
|
+
amplitude: number
|
|
25
|
+
noiseStd: number
|
|
26
|
+
baseline: number
|
|
27
|
+
preMinutes: number
|
|
28
|
+
settleSeconds: number
|
|
29
|
+
spFrom: number
|
|
30
|
+
spTo: number
|
|
31
|
+
reference: string
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const meta: FixtureMeta = {
|
|
35
|
+
seed: 20261102,
|
|
36
|
+
beatMs: 1000,
|
|
37
|
+
periodMin: 4.71,
|
|
38
|
+
amplitude: 0.05,
|
|
39
|
+
noiseStd: 0.002,
|
|
40
|
+
baseline: 0.28,
|
|
41
|
+
preMinutes: 35,
|
|
42
|
+
settleSeconds: 47,
|
|
43
|
+
spFrom: 2.6,
|
|
44
|
+
spTo: 2.4,
|
|
45
|
+
reference: '事故参数重构(2026-11-02 会话核验):吹压SP 2.6→2.4 bar 单步干预;壁厚 4.71min 主导振荡;探索响应窗 47s;预窗参照 06:19–06:54(35min)',
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function mulberry32(seed: number): () => number {
|
|
49
|
+
let a = seed >>> 0
|
|
50
|
+
return () => {
|
|
51
|
+
a |= 0
|
|
52
|
+
a = (a + 0x6D2B79F5) | 0
|
|
53
|
+
let t = Math.imul(a ^ (a >>> 15), 1 | a)
|
|
54
|
+
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t
|
|
55
|
+
return ((t ^ (t >>> 15)) >>> 0) / 4294967296
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Box-Muller 高斯噪声(确定性) */
|
|
60
|
+
function gaussianStream(seed: number): () => number {
|
|
61
|
+
const uni = mulberry32(seed)
|
|
62
|
+
let spare: number | null = null
|
|
63
|
+
return () => {
|
|
64
|
+
if (spare != null) {
|
|
65
|
+
const v = spare
|
|
66
|
+
spare = null
|
|
67
|
+
return v
|
|
68
|
+
}
|
|
69
|
+
const u1 = Math.max(1e-12, uni())
|
|
70
|
+
const u2 = uni()
|
|
71
|
+
const mag = Math.sqrt(-2 * Math.log(u1))
|
|
72
|
+
spare = mag * Math.sin(2 * Math.PI * u2)
|
|
73
|
+
return mag * Math.cos(2 * Math.PI * u2)
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function build(): { target: { pre: number[], post: number[] }, control: { pre: number[], post: number[] } } {
|
|
78
|
+
const periodBeats = meta.periodMin * 60_000 / meta.beatMs
|
|
79
|
+
const nPre = meta.preMinutes * 60_000 / meta.beatMs
|
|
80
|
+
const nPost = meta.settleSeconds * 1000 / meta.beatMs
|
|
81
|
+
const gauss = gaussianStream(meta.seed)
|
|
82
|
+
const sample = (i: number, phaseOffset: number): number =>
|
|
83
|
+
meta.baseline + meta.amplitude * Math.sin((2 * Math.PI * i) / periodBeats + phaseOffset) + meta.noiseStd * gauss()
|
|
84
|
+
const pre: number[] = []
|
|
85
|
+
for (let i = 0; i < nPre; i++) pre.push(Number(sample(i, 0).toFixed(6)))
|
|
86
|
+
const post: number[] = []
|
|
87
|
+
for (let i = 0; i < nPost; i++) post.push(Number(sample(i, 0.7).toFixed(6)))
|
|
88
|
+
return {
|
|
89
|
+
target: { pre, post },
|
|
90
|
+
control: { pre: new Array<number>(nPre).fill(meta.spFrom), post: new Array<number>(nPost).fill(meta.spTo) },
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const fixture = { meta, targetNodeId: 'sim-wall-thickness', controlNodeId: 'sim-blow-pressure-sp', ...build() }
|
|
95
|
+
mkdirSync(dirname(OUT), { recursive: true })
|
|
96
|
+
writeFileSync(OUT, JSON.stringify(fixture))
|
|
97
|
+
console.log(`fixture written: ${OUT}`)
|
|
98
|
+
console.log(`pre=${fixture.target.pre.length} beats, post=${fixture.target.post.length} beats, periodBeats=${meta.periodMin * 60000 / meta.beatMs}`)
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GET /api/workshop/process-model/experiments?lineId= ——
|
|
3
|
-
* POST ——
|
|
2
|
+
* GET /api/workshop/process-model/experiments?lineId= —— 参数试验计划列表(非 admin 必须带 lineId)
|
|
3
|
+
* POST —— body.action 分派:
|
|
4
|
+
* (缺省) 创建计划(仿真线→planned 可直接执行;真实线→awaiting_approval,单卡 HITL 批准);
|
|
5
|
+
* 'approve' 人工批准真实线计划(记录批准人/时间入 plan_json);
|
|
6
|
+
* 'run' 执行计划(执行器走 DCW 写咽喉:步限/60s 间隔/保持窗照常生效);
|
|
7
|
+
* 全部动作经 recordConfigAction 入册(D16/SW1.6)。
|
|
4
8
|
*/
|
|
5
9
|
import { getQuery, readBody } from 'h3'
|
|
6
10
|
import { defineApiHandler } from '@/server/utils/response'
|
|
7
11
|
import { requireRole } from '@/server/api/workshop/caller'
|
|
8
12
|
import { filterByLine } from '@/server/services/workshop/permissions'
|
|
9
13
|
import { createExperimentPlan, listExperimentPlans } from '@/server/services/workshop/process-model/experiment'
|
|
14
|
+
import { approveExperimentPlan, runExperimentPlan } from '@/server/services/workshop/process-model/experiment-runner'
|
|
10
15
|
import { assertOptimizationAccess, recordConfigAction } from '@/server/services/workshop/optimization/access'
|
|
11
16
|
|
|
12
17
|
export default defineApiHandler(async (event) => {
|
|
@@ -21,6 +26,25 @@ export default defineApiHandler(async (event) => {
|
|
|
21
26
|
return { plans: user.role === 'admin' ? rows : filterByLine(user, rows, (r: { lineId?: string }) => r.lineId) }
|
|
22
27
|
}
|
|
23
28
|
const body = await readBody<Record<string, unknown>>(event) ?? {}
|
|
29
|
+
const action = String(body.action ?? '')
|
|
30
|
+
if (action === 'approve' || action === 'run') {
|
|
31
|
+
const planId = String(body.planId ?? '')
|
|
32
|
+
if (!planId) throw createError({ statusCode: 400, statusMessage: 'planId required' })
|
|
33
|
+
const row = listExperimentPlans(undefined, 500).find(p => p.id === planId)
|
|
34
|
+
if (!row) throw createError({ statusCode: 404, statusMessage: 'plan not found' })
|
|
35
|
+
assertOptimizationAccess(user, 'write', { kind: 'experiment', lineId: row.lineId })
|
|
36
|
+
if (action === 'approve') {
|
|
37
|
+
const approved = approveExperimentPlan(planId, `rest:${user.id}:${Date.now()}`, user.id)
|
|
38
|
+
recordConfigAction(user, 'process_model.experiment.approve', { kind: 'process_model_experiment', id: planId },
|
|
39
|
+
`人工批准试验计划 ${planId}`, { lineId: row.lineId }, row.lineId)
|
|
40
|
+
return { plan: approved }
|
|
41
|
+
}
|
|
42
|
+
const result = await runExperimentPlan(planId)
|
|
43
|
+
recordConfigAction(user, 'process_model.experiment.run', { kind: 'process_model_experiment', id: planId },
|
|
44
|
+
`执行试验计划 ${planId}:${result.status}(${result.executedSteps}/${result.totalSteps} 步)${result.failedReason ? `;${result.failedReason}` : ''}`,
|
|
45
|
+
{ lineId: row.lineId }, row.lineId)
|
|
46
|
+
return { result }
|
|
47
|
+
}
|
|
24
48
|
const lineId = String(body.lineId ?? '')
|
|
25
49
|
if (!lineId) throw createError({ statusCode: 400, statusMessage: 'lineId required' })
|
|
26
50
|
assertOptimizationAccess(user, 'write', { kind: 'experiment', lineId })
|
|
@@ -35,6 +59,8 @@ export default defineApiHandler(async (event) => {
|
|
|
35
59
|
abortOnAlarm: body.abortOnAlarm !== false,
|
|
36
60
|
budget: body.budget as { maxRuns?: number, maxDurationMs?: number } | undefined,
|
|
37
61
|
createdBy: user.id,
|
|
62
|
+
targets: body.targets as Record<string, string> | undefined,
|
|
63
|
+
dominantPeriodMs: typeof body.dominantPeriodMs === 'number' ? body.dominantPeriodMs : undefined,
|
|
38
64
|
})
|
|
39
65
|
const planDetail = JSON.parse(plan.planJson || '{}') as { repeats?: number, specId?: string | null }
|
|
40
66
|
recordConfigAction(user, 'process_model.experiment.create', { kind: 'process_model_experiment', id: plan.id },
|