agentworkshop 0.7.39 → 0.7.41
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 +55 -0
- package/.output/.AgentWorkShop/prompts/host-tools.json +55 -0
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/88GOowgO2.js +1 -0
- package/.output/public/_nuxt/{BNT8gYU92.js → BC9wjTJK2.js} +2 -2
- package/.output/public/_nuxt/{CY9LbPCI.js → BN16aRdQ.js} +1 -1
- package/.output/public/_nuxt/BWVhZntO.js +1 -0
- package/.output/public/_nuxt/{HBLJ-wei.js → BXxH0UQE.js} +1 -1
- package/.output/public/_nuxt/{zIGh7R49.js → BneN7fbu.js} +1 -1
- package/.output/public/_nuxt/BsROmY89.js +1 -0
- package/.output/public/_nuxt/{DUrecWPx.js → C0ZrS1KL.js} +2 -2
- package/.output/public/_nuxt/{C_OLzD09.js → C4oW1HsE.js} +1 -1
- package/.output/public/_nuxt/{CUDwzgLV.js → C4s_niy-.js} +9 -9
- package/.output/public/_nuxt/CFxtLwjp.js +1 -0
- package/.output/public/_nuxt/{Cec0Ua3F.js → CS50LB_l.js} +1 -1
- package/.output/public/_nuxt/CssgYAAL2.js +1 -0
- package/.output/public/_nuxt/D6mbFA-a.js +1 -0
- package/.output/public/_nuxt/D98NH8kG.js +1 -0
- package/.output/public/_nuxt/DGIuvyRN2.js +1 -0
- package/.output/public/_nuxt/DGbd-UiG.js +1 -0
- package/.output/public/_nuxt/{CojCTLKD.js → DGj-WEBg.js} +1 -1
- package/.output/public/_nuxt/{DDShH71m.js → DS8qj8EL.js} +1 -1
- package/.output/public/_nuxt/DTFCy6h-.js +1 -0
- package/.output/public/_nuxt/{DrYV5i68.js → DUjW5Yq5.js} +1 -1
- package/.output/public/_nuxt/{45zuyAso.js → D_OTvQza.js} +1 -1
- package/.output/public/_nuxt/Dap5PmTL.js +2 -0
- package/.output/public/_nuxt/Dqw1lpr-.js +1 -0
- package/.output/public/_nuxt/DvLxILQP.js +1 -0
- package/.output/public/_nuxt/IREZ1eC2.js +1 -0
- package/.output/public/_nuxt/TownView.f-YOdXRs.css +1 -0
- package/.output/public/_nuxt/_id_.D9ymtHB5.css +1 -0
- package/.output/public/_nuxt/_id_.jf-_8E_c.css +1 -0
- package/.output/public/_nuxt/_wsId_.B4WiqkIS.css +1 -0
- package/.output/public/_nuxt/agents.ZD0rVdHE.css +1 -0
- package/.output/public/_nuxt/aml.BN8ZEW4h.css +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/78a295bb-2072-48a4-8b46-6d545fdae743.json +1 -0
- package/.output/public/_nuxt/ca4TJ3Op.js +1 -0
- package/.output/public/_nuxt/channel-templates.BOtahzPi.css +1 -0
- package/.output/public/_nuxt/daq.DjSgY94l.css +1 -0
- package/.output/public/_nuxt/dcw.8Y7FqCVN.css +1 -0
- package/.output/public/_nuxt/default.J32SgqFY.css +1 -0
- package/.output/public/_nuxt/entry.bdm0tv6M.css +1 -0
- package/.output/public/_nuxt/eqq3wWQF.js +18 -0
- package/.output/public/_nuxt/logs.BpKzmKsh.css +1 -0
- package/.output/public/_nuxt/monitor.D9pe7qN6.css +1 -0
- package/.output/public/_nuxt/pages.D7aSDlUI.css +1 -0
- package/.output/public/_nuxt/permissions.DwTVlFe6.css +1 -0
- package/.output/public/_nuxt/plugins.sb4nDGqr.css +1 -0
- package/.output/public/_nuxt/{Cbq-mryP.js → qr6R6Ha1.js} +1 -1
- package/.output/public/_nuxt/settings.BTgR-NiE.css +1 -0
- package/.output/public/_nuxt/teams.CxnxKVVs.css +1 -0
- package/.output/public/_nuxt/tokens.BFY7qv4f.css +1 -0
- package/.output/public/_nuxt/{town.DKIAhKnx.css → town.BBXZmeoP.css} +1 -1
- package/.output/public/_nuxt/users.DLgZ1D0h.css +1 -0
- package/.output/public/_nuxt/workshop.CR_QzeAN.css +1 -0
- package/.output/public/_nuxt/{BzHEilTt.js → xh3_vYcu.js} +1 -1
- package/.output/public/_nuxt/yF0aYMF1.js +4 -0
- package/.output/server/chunks/_/entity.mjs.map +1 -1
- package/.output/server/chunks/_/nitro.mjs +2355 -1362
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/build/{TownView-jVazYOjN.mjs → TownView--otsnr_7.mjs} +290 -208
- package/.output/server/chunks/build/TownView--otsnr_7.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-CfVosNg3.mjs → _id_-Brv-JSvr.mjs} +142 -141
- package/.output/server/chunks/build/_id_-Brv-JSvr.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-Hwr4rZpr.mjs → _id_-D9pl1OZy.mjs} +38 -36
- package/.output/server/chunks/build/_id_-D9pl1OZy.mjs.map +1 -0
- package/.output/server/chunks/build/{_wsId_-BVg3bB77.mjs → _wsId_-BASfDf0s.mjs} +295 -261
- package/.output/server/chunks/build/{_wsId_-BVg3bB77.mjs.map → _wsId_-BASfDf0s.mjs.map} +1 -1
- package/.output/server/chunks/build/{agents-Bvin73QY.mjs → agents-CLQqJF2y.mjs} +21 -27
- package/.output/server/chunks/build/agents-CLQqJF2y.mjs.map +1 -0
- package/.output/server/chunks/build/{aml-BCSJCdX7.mjs → aml-_7FdFL2p.mjs} +109 -109
- package/.output/server/chunks/build/{aml-BCSJCdX7.mjs.map → aml-_7FdFL2p.mjs.map} +1 -1
- package/.output/server/chunks/build/api-error-dul30BYQ.mjs.map +1 -1
- package/.output/server/chunks/build/{channel-templates-BTq8570n.mjs → channel-templates-p6SZNjlM.mjs} +19 -19
- package/.output/server/chunks/build/{channel-templates-BTq8570n.mjs.map → channel-templates-p6SZNjlM.mjs.map} +1 -1
- package/.output/server/chunks/build/{daq-C03Uu5UE.mjs → daq-DkMvD8sg.mjs} +193 -126
- package/.output/server/chunks/build/daq-DkMvD8sg.mjs.map +1 -0
- package/.output/server/chunks/build/{dcw-6vEYVeje.mjs → dcw-C1jgVJkO.mjs} +46 -46
- package/.output/server/chunks/build/{dcw-6vEYVeje.mjs.map → dcw-C1jgVJkO.mjs.map} +1 -1
- package/.output/server/chunks/build/{default-CZmZFpqH.mjs → default-BE4r0FZN.mjs} +152 -58
- package/.output/server/chunks/build/{default-CZmZFpqH.mjs.map → default-BE4r0FZN.mjs.map} +1 -1
- package/.output/server/chunks/build/{logs-B-xhuqln.mjs → logs--dByNyhw.mjs} +35 -35
- package/.output/server/chunks/build/{logs-B-xhuqln.mjs.map → logs--dByNyhw.mjs.map} +1 -1
- package/.output/server/chunks/build/{monitor-CyfDt4nR.mjs → monitor-C0okQaXz.mjs} +33 -33
- package/.output/server/chunks/build/{monitor-CyfDt4nR.mjs.map → monitor-C0okQaXz.mjs.map} +1 -1
- package/.output/server/chunks/build/{pages-BO7yZsXA.mjs → pages-B0bUWnC6.mjs} +35 -19
- package/.output/server/chunks/build/pages-B0bUWnC6.mjs.map +1 -0
- package/.output/server/chunks/build/{permissions-B52oOmaO.mjs → permissions-68SsNjex.mjs} +12 -12
- package/.output/server/chunks/build/{permissions-B52oOmaO.mjs.map → permissions-68SsNjex.mjs.map} +1 -1
- package/.output/server/chunks/build/{plugins-CUWmMdyt.mjs → plugins-lGlUr1lj.mjs} +17 -17
- package/.output/server/chunks/build/{plugins-CUWmMdyt.mjs.map → plugins-lGlUr1lj.mjs.map} +1 -1
- package/.output/server/chunks/build/{settings-DoQ2Oq3P.mjs → settings-Ddd1qx2Z.mjs} +50 -47
- package/.output/server/chunks/build/settings-Ddd1qx2Z.mjs.map +1 -0
- package/.output/server/chunks/build/{teams-2kz3CusY.mjs → teams-MEDLZdMn.mjs} +38 -34
- package/.output/server/chunks/build/teams-MEDLZdMn.mjs.map +1 -0
- package/.output/server/chunks/build/{tokens-BbWLqtVz.mjs → tokens-C7fTM5C2.mjs} +14 -14
- package/.output/server/chunks/build/{tokens-BbWLqtVz.mjs.map → tokens-C7fTM5C2.mjs.map} +1 -1
- package/.output/server/chunks/build/{town-BOl6hs9B.mjs → town-CoQdblbZ.mjs} +38 -12
- package/.output/server/chunks/build/town-CoQdblbZ.mjs.map +1 -0
- package/.output/server/chunks/build/{useDaqStream-CIBaiGAl.mjs → useDaqStream-DfCFpb3p.mjs} +9 -3
- package/.output/server/chunks/build/useDaqStream-DfCFpb3p.mjs.map +1 -0
- package/.output/server/chunks/build/{useDcwStream-CBbiYnWe.mjs → useDcwStream-UPiX-3iO.mjs} +11 -2
- package/.output/server/chunks/build/useDcwStream-UPiX-3iO.mjs.map +1 -0
- package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs +49 -0
- package/.output/server/chunks/build/useResponsive-BKDMGTHs.mjs.map +1 -0
- package/.output/server/chunks/build/{users-fohSmF-J.mjs → users-Cfd5-l2-.mjs} +6 -6
- package/.output/server/chunks/build/{users-fohSmF-J.mjs.map → users-Cfd5-l2-.mjs.map} +1 -1
- package/.output/server/chunks/build/{workshop-DX5-ldc4.mjs → workshop-BL5bhfs0.mjs} +15 -15
- package/.output/server/chunks/build/{workshop-DX5-ldc4.mjs.map → workshop-BL5bhfs0.mjs.map} +1 -1
- package/.output/server/chunks/build/{workspaces-BuydxM-3.mjs → workspaces-Bgz5Ekwp.mjs} +18 -3
- package/.output/server/chunks/build/workspaces-Bgz5Ekwp.mjs.map +1 -0
- package/.output/server/chunks/routes/api/system/config-groups/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/index.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/system/settings/events.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +6 -2
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs +2 -1
- package/.output/server/chunks/routes/api/workshop/aml/datasets/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/channels.post.mjs +3 -3
- package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +3 -2
- package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -1
- package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +8 -6
- package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +5 -5
- package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +14 -4
- package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +4 -4
- package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +4 -3
- package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +31 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +28 -0
- package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs.map +1 -0
- 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_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +32 -0
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +34 -0
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +33 -0
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +34 -0
- package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs.map +1 -0
- 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/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.put.mjs +1 -1
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs +3 -1
- package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs +5 -1
- package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/index9.get.mjs +3 -1
- package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +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/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/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +3 -3
- package/.output/server/chunks/virtual/entry.mjs +51 -25
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/README-zh.md +203 -39
- package/README.md +739 -591
- package/app/app.vue +9 -3
- package/app/assets/css/main.css +517 -7
- package/app/components/AppHeader.vue +98 -7
- package/app/components/AppSidebar.vue +117 -11
- package/app/components/AwChart.vue +2 -1
- package/app/components/workshop/AgentInspectorDrawer.vue +6 -6
- package/app/components/workshop/AgentLanesView.vue +52 -1
- package/app/components/workshop/AssetLibrary.vue +4 -2
- package/app/components/workshop/ChannelSessionList.vue +4 -2
- package/app/components/workshop/Composer.vue +96 -0
- package/app/components/workshop/DaqNodeRow.vue +19 -0
- package/app/components/workshop/DaqTemplateIcon.vue +33 -0
- package/app/components/workshop/DeviceTwinPanel.vue +37 -35
- package/app/components/workshop/EventBlock.vue +3 -3
- package/app/components/workshop/InspectorPanel.vue +47 -11
- package/app/components/workshop/LiveAgentBar.vue +34 -0
- package/app/components/workshop/TaskBoardView.vue +83 -33
- package/app/components/workshop/TranscriptTimeline.vue +56 -0
- package/app/components/workshop/blocks/ClusterError.vue +1 -1
- package/app/components/workshop/blocks/ClusterRoute.vue +3 -1
- package/app/components/workshop/blocks/ClusterStatus.vue +2 -2
- package/app/components/workshop/blocks/ClusterStream.vue +8 -2
- package/app/components/workshop/town/ModelPreview3D.vue +1 -1
- package/app/components/workshop/town/TownView.vue +507 -82
- package/app/composables/useResponsive.ts +88 -0
- package/app/composables/useRouteMeta.ts +3 -0
- package/app/composables/workshop/useDaqStream.ts +7 -4
- package/app/composables/workshop/useDcwStream.ts +8 -2
- package/app/composables/workshop/useVisibleInterval.ts +2 -2
- package/app/composables/workshop/useWorkshopApi.ts +1 -1
- package/app/layouts/default.vue +46 -2
- package/app/pages/aml/index.vue +712 -616
- package/app/pages/daq/[id].vue +12 -7
- package/app/pages/daq/index.vue +216 -13
- package/app/pages/dcw/[id].vue +117 -32
- package/app/pages/dcw/index.vue +83 -23
- package/app/pages/index.vue +35 -1
- package/app/pages/logs/index.vue +147 -13
- package/app/pages/monitor.vue +56 -12
- package/app/pages/permissions/index.vue +34 -0
- package/app/pages/plugins/index.vue +35 -4
- package/app/pages/settings.vue +90 -21
- package/app/pages/tokens.vue +23 -0
- package/app/pages/town.vue +50 -5
- package/app/pages/users.vue +23 -0
- package/app/pages/workshop/agents.vue +92 -2
- package/app/pages/workshop/channel-templates.vue +53 -0
- package/app/pages/workshop/index.vue +14 -0
- package/app/pages/workshop/teams.vue +66 -6
- package/app/pages/workshop/w/[wsId].vue +202 -14
- package/app/plugins/aw-plugins.client.ts +13 -8
- package/app/stores/app.ts +33 -1
- package/app/stores/workshop/user.ts +1 -1
- package/app/stores/workshop/workspaces.ts +18 -2
- package/app/utils/api-error.ts +1 -1
- package/cli/commands/build.mjs +8 -1
- package/docker-compose.yml +6 -0
- package/docs/cli.en.md +2 -2
- package/docs/cli.md +2 -2
- package/docs/plugins.en.md +33 -1
- package/docs/plugins.md +29 -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/nuxt.config.ts +31 -0
- package/package.json +11 -2
- package/scripts/_dbg-param-map-e2e.ts +242 -0
- package/scripts/_dbg-param-map-rest-smoke.mjs +73 -0
- package/scripts/_dbg-param-real-scenario.mjs +153 -0
- package/scripts/_loop-biax-campaign.mjs +124 -0
- package/scripts/api-live-e2e.mjs +40 -8
- package/scripts/capture-walkthrough.mjs +232 -0
- package/scripts/render-walkthrough-figure.mjs +46 -0
- package/scripts/seed-walkthrough-fixture.mjs +143 -0
- package/scripts/test-plugin-hardening.mjs +8 -0
- package/scripts/test-serial-bridge.mjs +418 -0
- package/scripts/ui/admin-shots.mjs +46 -0
- package/scripts/ui/audit-layout.mjs +301 -0
- package/scripts/ui/bump-microfont.mjs +39 -0
- package/scripts/ui/e2e-interactive.mjs +328 -0
- package/scripts/ui/lib.mjs +198 -0
- package/scripts/ui/linkcheck2.mjs +37 -0
- package/scripts/ui/live-render-check.mjs +72 -0
- package/scripts/ui/md-lint.mjs +80 -0
- package/scripts/ui/perf-audit.mjs +132 -0
- package/scripts/ui/readme-assets.mjs +30 -0
- package/scripts/ui/readme-shots.mjs +42 -0
- package/scripts/ui/record.mjs +225 -0
- package/scripts/ui/seed-admin.mjs +68 -0
- package/scripts/ui/seed-demo.mjs +83 -0
- package/scripts/ui/seed-industrial-demo.mjs +171 -0
- package/scripts/ui/shot-hero.mjs +25 -0
- package/scripts/ui/shots.mjs +75 -0
- package/scripts/ui/sim-ui-shot.mjs +16 -0
- package/scripts/ui/verify-nav.mjs +51 -0
- package/scripts/ui/verify-responsive.mjs +285 -0
- package/server/api/system/config-groups/[id].patch.ts +1 -1
- package/server/api/system/config-groups/index.post.ts +1 -1
- package/server/api/system/settings/events.get.ts +1 -1
- package/server/api/system/settings/index.patch.ts +1 -1
- package/server/api/workshop/agent-tools/invoke.post.ts +16 -2
- package/server/api/workshop/aml/datasets/[id].get.ts +8 -1
- package/server/api/workshop/daq/index.get.ts +3 -1
- package/server/api/workshop/daq/infra/reconnect.post.ts +1 -1
- package/server/api/workshop/daq/templates/[key].delete.ts +1 -0
- package/server/api/workshop/daq/templates/[key].patch.ts +1 -0
- package/server/api/workshop/daq/templates/index.post.ts +1 -0
- package/server/api/workshop/dcw/[id]/write.post.ts +10 -2
- package/server/api/workshop/dcw/[id].delete.ts +5 -2
- package/server/api/workshop/dcw/index.get.ts +5 -0
- package/server/api/workshop/dcw/lines/[id].patch.ts +1 -1
- package/server/api/workshop/dcw/params/[id]/read.post.ts +17 -0
- package/server/api/workshop/dcw/params/[id]/write.post.ts +21 -0
- package/server/api/workshop/dcw/params/[id].delete.ts +19 -0
- package/server/api/workshop/dcw/params/[id].patch.ts +23 -0
- package/server/api/workshop/dcw/params/index.get.ts +27 -0
- package/server/api/workshop/dcw/params/index.post.ts +25 -0
- package/server/api/workshop/permissions/index.get.ts +3 -1
- package/server/plugins/aw-plugins.ts +23 -10
- package/server/plugins/dev-stability-guard.ts +3 -1
- package/server/plugins/system-config.ts +6 -1
- package/server/plugins-builtin/serial-bridge/client.mjs +210 -0
- package/server/plugins-builtin/serial-bridge/drivers.mjs +409 -0
- package/server/plugins-builtin/serial-bridge/i18n.json +62 -0
- package/server/plugins-builtin/serial-bridge/index.mjs +247 -0
- package/server/plugins-builtin/serial-bridge/lib.mjs +208 -0
- package/server/plugins-builtin/serial-bridge/rtu.mjs +168 -0
- package/server/services/system-config.ts +28 -9
- package/server/services/workshop/agents/adapters/one-shot-cli-agent.ts +2 -1
- package/server/services/workshop/agents/agent-interface.ts +8 -6
- package/server/services/workshop/agents/base-agent.ts +18 -4
- package/server/services/workshop/agents/claude-agent.ts +7 -3
- package/server/services/workshop/agents/codex-agent.ts +3 -3
- package/server/services/workshop/agents/dsh-agent.ts +3 -3
- package/server/services/workshop/agents/goose-agent.ts +0 -1
- package/server/services/workshop/agents/harness-terminal.ts +14 -1
- package/server/services/workshop/agents/hermes-agent.ts +4 -2
- package/server/services/workshop/agents/host-tool-bridge.ts +5 -1
- package/server/services/workshop/agents/industrial-context.ts +4 -1
- package/server/services/workshop/agents/industrial-tools.ts +164 -6
- package/server/services/workshop/agents/omp-agent.ts +15 -9
- package/server/services/workshop/agents/opencode-agent.ts +47 -21
- package/server/services/workshop/agents/qwen-agent.ts +10 -5
- package/server/services/workshop/aml/entity.ts +3 -1
- package/server/services/workshop/aml/python-runtime.ts +3 -2
- package/server/services/workshop/daq/bus/mqtt.adapter.ts +8 -4
- package/server/services/workshop/daq/daq-controller.ts +25 -5
- package/server/services/workshop/daq/daq-runtime.ts +5 -3
- package/server/services/workshop/daq/drivers.ts +141 -11
- package/server/services/workshop/daq/host-ports.ts +3 -2
- package/server/services/workshop/daq/storage/timescale.adapter.ts +3 -1
- package/server/services/workshop/db/channel.repo.ts +4 -0
- package/server/services/workshop/db/ops.repo.ts +5 -2
- package/server/services/workshop/db/retention.ts +8 -3
- package/server/services/workshop/dcw/dcw-controller.ts +147 -16
- package/server/services/workshop/dcw/dcw-product.repo.ts +38 -1
- package/server/services/workshop/dcw/dcw-runtime.ts +3 -2
- package/server/services/workshop/dcw/drivers.ts +90 -4
- package/server/services/workshop/dcw/param-conversion.ts +78 -0
- package/server/services/workshop/dcw/param-limits.ts +142 -0
- package/server/services/workshop/dcw/param-map.repo.ts +305 -0
- package/server/services/workshop/dcw/plugin-bridge.ts +45 -0
- package/server/services/workshop/dcw/recipe-rollback-manager.ts +13 -7
- package/server/services/workshop/plugins/host.mjs +30 -0
- package/server/services/workshop/runtime/agent-runtime.ts +4 -0
- package/server/services/workshop/runtime/manager.ts +9 -2
- package/server/services/workshop/settings.ts +4 -2
- package/server/types/pg.d.ts +49 -0
- package/server/utils/stability-severity.ts +13 -2
- package/shared/config/groups.mjs +22 -1
- package/shared/config/home.d.mts +28 -0
- package/shared/daq-protocol.ts +15 -0
- package/shared/dcw-protocol.ts +136 -0
- package/uno.config.ts +12 -1
- package/.output/public/_nuxt/8NMOXZOV.js +0 -1
- package/.output/public/_nuxt/BFkgkW8u.js +0 -4
- package/.output/public/_nuxt/C5gUkRwn.js +0 -1
- package/.output/public/_nuxt/CM12FuB42.js +0 -1
- package/.output/public/_nuxt/CZiw7sEV.js +0 -1
- package/.output/public/_nuxt/Cc_9VzD42.js +0 -1
- package/.output/public/_nuxt/CdPzkOMV.js +0 -1
- package/.output/public/_nuxt/CmsOtOAA2.js +0 -1
- package/.output/public/_nuxt/D1YDxZpZ.js +0 -1
- package/.output/public/_nuxt/D20Yamr4.js +0 -1
- package/.output/public/_nuxt/DAe0h2MB.js +0 -1
- package/.output/public/_nuxt/DmqknNvV.js +0 -18
- package/.output/public/_nuxt/DnUuIR83.js +0 -1
- package/.output/public/_nuxt/S_fVQwJK.js +0 -1
- package/.output/public/_nuxt/TownView.0oLiQgTC.css +0 -1
- package/.output/public/_nuxt/_id_.D-SYuyZb.css +0 -1
- package/.output/public/_nuxt/_id_.hma_BU6T.css +0 -1
- package/.output/public/_nuxt/_wsId_.B12v3PhY.css +0 -1
- package/.output/public/_nuxt/agents.BV70ioCv.css +0 -1
- package/.output/public/_nuxt/ahgEJu2R.js +0 -1
- package/.output/public/_nuxt/aml.COEKNNqK.css +0 -1
- package/.output/public/_nuxt/builds/meta/4457d63f-0866-4cea-b320-04a321f24795.json +0 -1
- package/.output/public/_nuxt/channel-templates.C-M5nKcC.css +0 -1
- package/.output/public/_nuxt/daq.B3265ZDn.css +0 -1
- package/.output/public/_nuxt/dcw.DLYZqEhT.css +0 -1
- package/.output/public/_nuxt/default.BXI_fZUi.css +0 -1
- package/.output/public/_nuxt/entry.BB-Eeh-J.css +0 -1
- package/.output/public/_nuxt/logs.CqFyMrJw.css +0 -1
- package/.output/public/_nuxt/monitor.B--1dPzs.css +0 -1
- package/.output/public/_nuxt/pages.ooEzrMm9.css +0 -1
- package/.output/public/_nuxt/permissions.B1pjGChZ.css +0 -1
- package/.output/public/_nuxt/plugins.5e5chZ67.css +0 -1
- package/.output/public/_nuxt/pz2JDAM7.js +0 -2
- package/.output/public/_nuxt/settings.Dm3M0RLy.css +0 -1
- package/.output/public/_nuxt/teams.BC75EGnR.css +0 -1
- package/.output/public/_nuxt/tokens.xRb1fSPU.css +0 -1
- package/.output/public/_nuxt/users.CXnP2E08.css +0 -1
- package/.output/public/_nuxt/workshop.Jk5HxWPE.css +0 -1
- package/.output/server/chunks/build/TownView-jVazYOjN.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-CfVosNg3.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-Hwr4rZpr.mjs.map +0 -1
- package/.output/server/chunks/build/agents-Bvin73QY.mjs.map +0 -1
- package/.output/server/chunks/build/daq-C03Uu5UE.mjs.map +0 -1
- package/.output/server/chunks/build/pages-BO7yZsXA.mjs.map +0 -1
- package/.output/server/chunks/build/settings-DoQ2Oq3P.mjs.map +0 -1
- package/.output/server/chunks/build/teams-2kz3CusY.mjs.map +0 -1
- package/.output/server/chunks/build/town-BOl6hs9B.mjs.map +0 -1
- package/.output/server/chunks/build/useDaqStream-CIBaiGAl.mjs.map +0 -1
- package/.output/server/chunks/build/useDcwStream-CBbiYnWe.mjs.map +0 -1
- package/.output/server/chunks/build/workspaces-BuydxM-3.mjs.map +0 -1
- /package/.output/public/_nuxt/{36oeS8_R2.js → 36oeS8_R.js} +0 -0
- /package/.output/public/_nuxt/{CYWVXZTS.js → CYWVXZTS2.js} +0 -0
package/app/app.vue
CHANGED
|
@@ -68,7 +68,10 @@ const accentBase = computed(() => store.accent ?? String(runtimeCfg.effective['t
|
|
|
68
68
|
const themeConfig = computed(() => {
|
|
69
69
|
const dark = store.isDark
|
|
70
70
|
// 暗:品牌绿保持饱和(仅微提亮);亮:压深保证白字对比
|
|
71
|
-
|
|
71
|
+
// 亮色档主色压深系数 0.36 → 0.46:实测 mixBlack(0.36) 得到的 #228f66
|
|
72
|
+
// 作为**按钮底色**配白字只有 4.05:1、作为**链接文字**配暖纸底同样 4.02:1,
|
|
73
|
+
// 都差一点点达不到 AA。0.46 后两处都过 5:1,色相不变(仍是同一支品牌绿)。
|
|
74
|
+
const accent = dark ? mixWhite(accentBase.value, 0.16) : mixBlack(accentBase.value, 0.46)
|
|
72
75
|
const paper = dark ? '#070b13' : '#f5f5f5' // colorBgLayout(canvas)
|
|
73
76
|
const raised = dark ? '#0d1420' : '#ffffff' // colorBgContainer(surface card)
|
|
74
77
|
const elevated = dark ? '#111a2b' : '#ffffff' // 弹层
|
|
@@ -84,6 +87,9 @@ const themeConfig = computed(() => {
|
|
|
84
87
|
token: {
|
|
85
88
|
colorPrimary: accent,
|
|
86
89
|
colorInfo: dark ? '#41c8f4' : '#3f6094',
|
|
90
|
+
// antd 默认 error 色 #ff4d4f 在暖纸底上只有 3.27:1(实测 danger 文字按钮)
|
|
91
|
+
// —— 亮色档改用同色相的深红,暗色档反相提亮。
|
|
92
|
+
colorError: dark ? '#ff8080' : '#c0261f',
|
|
87
93
|
colorLink: accent,
|
|
88
94
|
borderRadius: 8,
|
|
89
95
|
// 与 main.css --font-body 同源:Geist Variable(实际加载的字体;中文回退系统栈)
|
|
@@ -133,7 +139,7 @@ const themeConfig = computed(() => {
|
|
|
133
139
|
// 强调色注入为 CSS 变量,供自定义样式消费(实时响应设置页换色);
|
|
134
140
|
// lang 透传 i18n locale(保持 <html lang> 响应式)
|
|
135
141
|
const accentStrong = computed(() =>
|
|
136
|
-
store.isDark ? mixWhite(accentBase.value, 0.3) : mixBlack(accentBase.value, 0.
|
|
142
|
+
store.isDark ? mixWhite(accentBase.value, 0.3) : mixBlack(accentBase.value, 0.58),
|
|
137
143
|
)
|
|
138
144
|
|
|
139
145
|
useHead({
|
|
@@ -141,7 +147,7 @@ useHead({
|
|
|
141
147
|
lang: locale,
|
|
142
148
|
style: computed(() => [
|
|
143
149
|
`--color-primary: ${accentBase.value}`,
|
|
144
|
-
`--accent: ${store.isDark ? mixWhite(accentBase.value, 0.16) : mixBlack(accentBase.value, 0.
|
|
150
|
+
`--accent: ${store.isDark ? mixWhite(accentBase.value, 0.16) : mixBlack(accentBase.value, 0.46)}`,
|
|
145
151
|
`--accent-strong: ${accentStrong.value}`,
|
|
146
152
|
`--on-accent: ${store.isDark ? '#08130d' : '#ffffff'}`,
|
|
147
153
|
]),
|
package/app/assets/css/main.css
CHANGED
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
--ink: #0c0a09;
|
|
36
36
|
--ink-soft: #4b463f;
|
|
37
37
|
/* 文字最淡一档(实测 5.0:1 @暖纸 / 5.45:1 @raised,达 AA) */
|
|
38
|
-
--ink-faint: #
|
|
38
|
+
--ink-faint: #5f5850;
|
|
39
39
|
/* ⚠️ --ink-fainter 是**纯装饰**令牌(分隔发丝线/刻度点/装饰底),
|
|
40
40
|
* **不得用作 color** —— 它的对比度(亮 2.53:1 / 暗 3.37:1)不达 WCAG AA 的 4.5:1。
|
|
41
41
|
* 全站文字用法已收敛到 --ink-faint;此处保留令牌是因为"装饰线就该淡",
|
|
@@ -76,16 +76,22 @@
|
|
|
76
76
|
--accent-violet: var(--tone-retry-dot);
|
|
77
77
|
|
|
78
78
|
/* tone 语义状态系统(仅表真实状态,不做装饰;open-tag 状态声部) */
|
|
79
|
-
|
|
79
|
+
/* #a8a29e 在浅灰底上只有 2.3:1 —— "停用/离线/未运行"这类**状态标签的文字**
|
|
80
|
+
用的就是它,是不可读的实测来源。压深到与 --ink-faint 同族。 */
|
|
81
|
+
--tone-neutral-dot: #5c564f;
|
|
80
82
|
--tone-neutral-bg: #efeeec;
|
|
83
|
+
/* 亮色档记号色按**最深承载面**(--paper-deep #efebe5, L≈0.826)反推:
|
|
84
|
+
* 要求 (0.876)/(L+0.05) ≥ 4.5 → L ≤ 0.145。原 #4c8f63 / #b9770e / #c25a4e
|
|
85
|
+
* 在白底上尚可,一落到 paper-deep(表格斑马行、面板底)就掉到 3.7–4.3 —— 实测审计在
|
|
86
|
+
* 亮色档稳定报出 60+ 处不达标,全部来自这三个记号色被当**文字色**用。 */
|
|
81
87
|
--tone-success-bg: #eaf7ef;
|
|
82
|
-
--tone-success-dot: #
|
|
88
|
+
--tone-success-dot: #367048;
|
|
83
89
|
--tone-info-bg: #eef3fb;
|
|
84
90
|
--tone-info-dot: #3f6094;
|
|
85
91
|
--tone-warning-bg: #faf1df;
|
|
86
|
-
--tone-warning-dot: #
|
|
92
|
+
--tone-warning-dot: #8f5c07;
|
|
87
93
|
--tone-danger-bg: #fdecea;
|
|
88
|
-
--tone-danger-dot: #
|
|
94
|
+
--tone-danger-dot: #a83f34;
|
|
89
95
|
--tone-retry-bg: #f1eef9;
|
|
90
96
|
--tone-retry-dot: #6b5aa0;
|
|
91
97
|
/* 运行中信号(busy 呼吸点/运行指示;比 warning-dot 更亮的琥珀,仅作指示点) */
|
|
@@ -623,7 +629,12 @@ ul.task-list {
|
|
|
623
629
|
display: flex;
|
|
624
630
|
align-items: flex-end;
|
|
625
631
|
justify-content: space-between;
|
|
626
|
-
|
|
632
|
+
/* 允许换行:右侧徽标组的内容长度是**数据驱动**的(例如 AML 页的
|
|
633
|
+
* "UV · uv 0.11.29 (901092ee1 2026-07-15 · x86_64-pc-windows-msvc)" 这种长串),
|
|
634
|
+
* 不换行时它被压成一列三行的窄条,而左侧描述也被挤成两行 —— 两边都难看。
|
|
635
|
+
* 给了 wrap 之后,放不下就整组落到第二行,各自都有整行可用。 */
|
|
636
|
+
flex-wrap: wrap;
|
|
637
|
+
gap: 12px 16px;
|
|
627
638
|
margin-bottom: 18px;
|
|
628
639
|
}
|
|
629
640
|
|
|
@@ -635,9 +646,12 @@ ul.task-list {
|
|
|
635
646
|
letter-spacing: -0.015em;
|
|
636
647
|
}
|
|
637
648
|
|
|
638
|
-
/* 版本铭牌:hairline
|
|
649
|
+
/* 版本铭牌:hairline 小片。
|
|
650
|
+
* width:fit-content 是必须的 —— 它是 inline-flex,一旦落在 display:flex/grid 的
|
|
651
|
+
* 父级里就会被拉伸成整行宽,在窄屏变成一条横贯屏幕的空药丸(实测 /settings)。 */
|
|
639
652
|
.aw-stamp {
|
|
640
653
|
display: inline-flex;
|
|
654
|
+
width: fit-content;
|
|
641
655
|
align-items: center;
|
|
642
656
|
gap: 6px;
|
|
643
657
|
padding: 3px 10px;
|
|
@@ -2269,4 +2283,500 @@ html.dark .aw-gauge-band {
|
|
|
2269
2283
|
}
|
|
2270
2284
|
}
|
|
2271
2285
|
|
|
2286
|
+
/* ══════════════════════════════════════════════════════════════════════════
|
|
2287
|
+
v5 · 响应式层 —— 「叠层仪表台」
|
|
2288
|
+
──────────────────────────────────────────────────────────────────────────
|
|
2289
|
+
形态来自产品本身:这是一间产线控制室,桌面是**三栏仪表台**(刻度轨 + 画布 +
|
|
2290
|
+
侧检视)。窄屏不是"把仪表台缩小",而是换成另一台仪器:
|
|
2291
|
+
|
|
2292
|
+
≥1024 三栏仪表台 刻度轨(228) + 画布 + 侧检视
|
|
2293
|
+
900–1023 双栏 刻度轨收成图标轨(64) + 画布
|
|
2294
|
+
640–899 手持巡检仪 刻度轨变抽屉(汉堡拉出),页头纵向堆叠,表格成"账页条"
|
|
2295
|
+
<640 单手巡检 单列,主操作占满行,读数码降一档
|
|
2296
|
+
|
|
2297
|
+
⚠️ 断点值是**内容驱动**推导的,不是设备宽度:
|
|
2298
|
+
· 900 = 刻度轨 228 + 画布最小可用宽 672(DAQ 主表 6 列不折行的下限)
|
|
2299
|
+
· 640 = 单据类页面"一行一事"的下限(低于它,行内键值对必须改堆叠)
|
|
2300
|
+
· 420 = 窄机(iPhone SE 一类),连 12px 标签都要让位给内容
|
|
2301
|
+
⚠️ CSS 变量不能用在 media query 条件里,所以断点只能写数值 ——
|
|
2302
|
+
上面这段注释就是这些数值的**唯一出处**,不要在别处再散落魔数。
|
|
2303
|
+
══════════════════════════════════════════════════════════════════════════ */
|
|
2304
|
+
|
|
2305
|
+
/* ── 结构性兜底:任何容器都不允许把内容顶出视口 ──
|
|
2306
|
+
overflow-x: clip 而非 hidden:clip 不产生滚动容器,
|
|
2307
|
+
因此不会破坏侧栏/浮层的 position: sticky 与 fixed。 */
|
|
2308
|
+
html,
|
|
2309
|
+
body {
|
|
2310
|
+
max-width: 100%;
|
|
2311
|
+
overflow-x: clip;
|
|
2312
|
+
}
|
|
2313
|
+
|
|
2314
|
+
/* 长 token(节点 ID / run id / hash)在窄屏必须能断,否则整页被顶宽 */
|
|
2315
|
+
@media (max-width: 900px) {
|
|
2316
|
+
.aw-mono,
|
|
2317
|
+
code,
|
|
2318
|
+
kbd,
|
|
2319
|
+
samp {
|
|
2320
|
+
overflow-wrap: anywhere;
|
|
2321
|
+
}
|
|
2322
|
+
}
|
|
2323
|
+
|
|
2324
|
+
/* ── 画布留白:窄屏收边(桌面 12/16,手持 8/10)—— 手持设备每像素都贵 ── */
|
|
2325
|
+
@media (max-width: 900px) {
|
|
2326
|
+
.app-content {
|
|
2327
|
+
margin: 10px 10px 0;
|
|
2328
|
+
}
|
|
2329
|
+
|
|
2330
|
+
.app-footer {
|
|
2331
|
+
padding: 0 16px;
|
|
2332
|
+
}
|
|
2333
|
+
}
|
|
2334
|
+
|
|
2335
|
+
@media (max-width: 640px) {
|
|
2336
|
+
.app-content {
|
|
2337
|
+
margin: 8px 8px 0;
|
|
2338
|
+
}
|
|
2339
|
+
}
|
|
2340
|
+
|
|
2341
|
+
/* ══ 1. 页头:量程线在窄屏从"两端对齐"改为"纵向堆叠" ══════════════════════
|
|
2342
|
+
desktop 的 justify-content: space-between 要求两侧都有余量;
|
|
2343
|
+
窄屏两侧一挤,标题就被压成一列竖排字(实测 /daq「暂 停 全 部 采 集」)。
|
|
2344
|
+
堆叠顺序 = 阅读顺序:kicker → 标题 → 描述 → 操作。 */
|
|
2345
|
+
@media (max-width: 900px) {
|
|
2346
|
+
.aw-page-head {
|
|
2347
|
+
flex-direction: column;
|
|
2348
|
+
align-items: stretch;
|
|
2349
|
+
gap: 12px;
|
|
2350
|
+
}
|
|
2351
|
+
|
|
2352
|
+
.aw-page-head > div,
|
|
2353
|
+
.aw-page-head > header {
|
|
2354
|
+
min-width: 0;
|
|
2355
|
+
}
|
|
2356
|
+
|
|
2357
|
+
.aw-page-head h1 {
|
|
2358
|
+
font-size: 24px;
|
|
2359
|
+
line-height: 1.2;
|
|
2360
|
+
}
|
|
2361
|
+
}
|
|
2362
|
+
|
|
2363
|
+
@media (max-width: 640px) {
|
|
2364
|
+
.aw-page-head {
|
|
2365
|
+
padding-bottom: 12px;
|
|
2366
|
+
margin-bottom: 14px;
|
|
2367
|
+
}
|
|
2368
|
+
|
|
2369
|
+
.aw-page-head h1 {
|
|
2370
|
+
font-size: 21px;
|
|
2371
|
+
}
|
|
2372
|
+
}
|
|
2373
|
+
|
|
2374
|
+
/* 行内操作渐显(仅鼠标语境):一张 16 行的表里 32 个红色文字按钮同时在喊,
|
|
2375
|
+
* 数据本身反而被淹没 —— 这是既有设计语言里就写明的"行内操作渐显",
|
|
2376
|
+
* 之前只在少数页面手工实现。这里收敛成一条全局规则。
|
|
2377
|
+
* 触屏没有 hover,所以整条规则包在 (hover: hover) 里,手机上按钮始终可见。 */
|
|
2378
|
+
@media (hover: hover) and (pointer: fine) {
|
|
2379
|
+
.ant-table-tbody > tr .ant-btn-text,
|
|
2380
|
+
.ant-table-tbody > tr .mini-btn {
|
|
2381
|
+
opacity: 0.6;
|
|
2382
|
+
transition: opacity var(--transition-fast);
|
|
2383
|
+
}
|
|
2384
|
+
|
|
2385
|
+
.ant-table-tbody > tr:hover .ant-btn-text,
|
|
2386
|
+
.ant-table-tbody > tr:hover .mini-btn,
|
|
2387
|
+
.ant-table-tbody > tr .ant-btn-text:focus-visible,
|
|
2388
|
+
.ant-table-tbody > tr .mini-btn:focus-visible {
|
|
2389
|
+
opacity: 1;
|
|
2390
|
+
}
|
|
2391
|
+
}
|
|
2392
|
+
|
|
2393
|
+
/* 页头右侧的操作/徽标组:窄屏允许换行,不参与"压扁标题" */
|
|
2394
|
+
@media (max-width: 900px) {
|
|
2395
|
+
.aw-page-head > .badges,
|
|
2396
|
+
.aw-page-head > .actions,
|
|
2397
|
+
.aw-page-head > .head-actions,
|
|
2398
|
+
.aw-page-head > .head-right {
|
|
2399
|
+
display: flex;
|
|
2400
|
+
flex-wrap: wrap;
|
|
2401
|
+
gap: 8px;
|
|
2402
|
+
align-items: center;
|
|
2403
|
+
justify-content: flex-start;
|
|
2404
|
+
}
|
|
2405
|
+
}
|
|
2406
|
+
|
|
2407
|
+
/* ══ 2. 分段控件 / 筛选条:窄屏横向滚动,绝不顶破视口 ══════════════════════
|
|
2408
|
+
antd Segmented 是定宽块,项目里当筛选条用;窄屏必须能横扫。
|
|
2409
|
+
用 mask 在右缘渐隐,提示"还有更多"——比直接裁断诚实。 */
|
|
2410
|
+
@media (max-width: 900px) {
|
|
2411
|
+
.ant-segmented {
|
|
2412
|
+
max-width: 100%;
|
|
2413
|
+
overflow-x: auto;
|
|
2414
|
+
overflow-y: hidden;
|
|
2415
|
+
scrollbar-width: none;
|
|
2416
|
+
-webkit-mask-image: linear-gradient(90deg, #000 0 calc(100% - 22px), transparent 100%);
|
|
2417
|
+
mask-image: linear-gradient(90deg, #000 0 calc(100% - 22px), transparent 100%);
|
|
2418
|
+
}
|
|
2419
|
+
|
|
2420
|
+
.ant-segmented::-webkit-scrollbar {
|
|
2421
|
+
display: none;
|
|
2422
|
+
}
|
|
2423
|
+
|
|
2424
|
+
.ant-segmented-group {
|
|
2425
|
+
flex-wrap: nowrap;
|
|
2426
|
+
}
|
|
2427
|
+
|
|
2428
|
+
.ant-segmented-item-label {
|
|
2429
|
+
white-space: nowrap;
|
|
2430
|
+
}
|
|
2431
|
+
}
|
|
2432
|
+
|
|
2433
|
+
/* ══ 3. 表格:窄屏成为"账页条"(可横扫,首列钉住) ═══════════════════════════
|
|
2434
|
+
窄屏不把表格重排成卡片 —— 那会丢掉列语义(哪一列是"驱动"哪一列是"产线")。
|
|
2435
|
+
保留列,只给它一条可扫的卷轴,并把身份列(第一列)钉在左缘:
|
|
2436
|
+
横扫时始终知道"这一行是谁"。 */
|
|
2437
|
+
@media (max-width: 900px) {
|
|
2438
|
+
.ant-table-wrapper {
|
|
2439
|
+
max-width: 100%;
|
|
2440
|
+
}
|
|
2441
|
+
|
|
2442
|
+
.ant-table-wrapper .ant-table-content,
|
|
2443
|
+
.ant-table-wrapper .ant-table-body {
|
|
2444
|
+
overflow-x: auto !important;
|
|
2445
|
+
-webkit-overflow-scrolling: touch;
|
|
2446
|
+
}
|
|
2447
|
+
|
|
2448
|
+
.ant-table-wrapper .ant-table-thead > tr > th:first-child,
|
|
2449
|
+
.ant-table-wrapper .ant-table-tbody > tr > td:first-child {
|
|
2450
|
+
position: sticky;
|
|
2451
|
+
left: 0;
|
|
2452
|
+
z-index: 2;
|
|
2453
|
+
background: var(--paper-raised);
|
|
2454
|
+
box-shadow: 1px 0 0 var(--line);
|
|
2455
|
+
}
|
|
2456
|
+
|
|
2457
|
+
.ant-table-wrapper .ant-table-thead > tr > th:first-child {
|
|
2458
|
+
z-index: 3;
|
|
2459
|
+
}
|
|
2460
|
+
}
|
|
2461
|
+
|
|
2462
|
+
/* 分页器窄屏收边 */
|
|
2463
|
+
@media (max-width: 640px) {
|
|
2464
|
+
.ant-pagination {
|
|
2465
|
+
flex-wrap: wrap;
|
|
2466
|
+
row-gap: 6px;
|
|
2467
|
+
}
|
|
2468
|
+
|
|
2469
|
+
/* 表格单元格内距降档:antd 的 middle 尺寸是 16px 上下内距,
|
|
2470
|
+
* 单行数据行会被撑到 76px —— 手机上 7 行就占掉三屏(实测 /tokens)。
|
|
2471
|
+
* 降到 10px 后行高回到 ~60px,信息密度翻倍,且不损失可点面积
|
|
2472
|
+
* (行内按钮另有 34px 下限)。 */
|
|
2473
|
+
.ant-table-wrapper .ant-table-tbody > tr > td,
|
|
2474
|
+
.ant-table-wrapper .ant-table-thead > tr > th {
|
|
2475
|
+
padding: 10px 8px;
|
|
2476
|
+
}
|
|
2477
|
+
}
|
|
2478
|
+
|
|
2479
|
+
/* ══ 4. 面板/仪表:窄屏统一收边 + 头部换行 ════════════════════════════════ */
|
|
2480
|
+
@media (max-width: 900px) {
|
|
2481
|
+
.aw-bench,
|
|
2482
|
+
.aw-tile,
|
|
2483
|
+
.aw-glass-panel {
|
|
2484
|
+
border-radius: var(--radius-panel-sm, 10px);
|
|
2485
|
+
}
|
|
2486
|
+
|
|
2487
|
+
.aw-bench-hd {
|
|
2488
|
+
flex-wrap: wrap;
|
|
2489
|
+
gap: 8px;
|
|
2490
|
+
}
|
|
2491
|
+
}
|
|
2492
|
+
|
|
2493
|
+
/* 统计带:桌面是一行分格量规,窄屏折成 2 列(数值本身不被压扁) */
|
|
2494
|
+
@media (max-width: 900px) {
|
|
2495
|
+
.aw-gauge-band {
|
|
2496
|
+
flex-wrap: wrap;
|
|
2497
|
+
}
|
|
2498
|
+
|
|
2499
|
+
.aw-gauge {
|
|
2500
|
+
flex: 1 1 calc(50% - 12px);
|
|
2501
|
+
min-width: 132px;
|
|
2502
|
+
}
|
|
2503
|
+
}
|
|
2504
|
+
|
|
2505
|
+
@media (max-width: 420px) {
|
|
2506
|
+
.aw-gauge {
|
|
2507
|
+
flex: 1 1 100%;
|
|
2508
|
+
}
|
|
2509
|
+
}
|
|
2510
|
+
|
|
2511
|
+
/* ══ 5. 设置行:桌面是"键 — 值"两端对齐,窄屏必须上下堆叠 ══════════════════
|
|
2512
|
+
不堆叠时键名会被压成一列竖排字(实测 /settings 主题设置的描述整段竖排)。 */
|
|
2513
|
+
@media (max-width: 720px) {
|
|
2514
|
+
.aw-row {
|
|
2515
|
+
flex-direction: column;
|
|
2516
|
+
align-items: stretch;
|
|
2517
|
+
gap: 6px;
|
|
2518
|
+
}
|
|
2519
|
+
|
|
2520
|
+
.aw-row-key,
|
|
2521
|
+
.aw-row-val {
|
|
2522
|
+
width: 100%;
|
|
2523
|
+
max-width: 100%;
|
|
2524
|
+
}
|
|
2525
|
+
|
|
2526
|
+
.aw-row-val {
|
|
2527
|
+
justify-content: flex-start;
|
|
2528
|
+
}
|
|
2529
|
+
}
|
|
2530
|
+
|
|
2531
|
+
/* ══ 6. 触摸目标:粗指针设备上所有可点元素至少 40px 高 ════════════════════
|
|
2532
|
+
只在 coarse pointer 上生效 —— 桌面鼠标精度高,放大反而破坏密度。 */
|
|
2533
|
+
@media (pointer: coarse) {
|
|
2534
|
+
.ant-btn,
|
|
2535
|
+
.pill-btn,
|
|
2536
|
+
.ghost-btn,
|
|
2537
|
+
.mini-btn,
|
|
2538
|
+
.aw-pill,
|
|
2539
|
+
.aw-ghost,
|
|
2540
|
+
.icon-btn,
|
|
2541
|
+
.lib-link,
|
|
2542
|
+
.collapse-btn,
|
|
2543
|
+
.aw-diag-btn {
|
|
2544
|
+
min-height: 40px;
|
|
2545
|
+
}
|
|
2546
|
+
|
|
2547
|
+
.ant-btn-sm {
|
|
2548
|
+
min-height: 34px;
|
|
2549
|
+
}
|
|
2550
|
+
|
|
2551
|
+
.menu-item {
|
|
2552
|
+
min-height: 44px;
|
|
2553
|
+
}
|
|
2554
|
+
|
|
2555
|
+
/* 命中区外扩:控件本体只有 16–28px(设计如此),不该为了达标把视觉尺寸撑大,
|
|
2556
|
+
* 正确做法是把**可点区域**扩到 40px。审计量的也是命中区,不是盒子大小。
|
|
2557
|
+
*
|
|
2558
|
+
* ⚠️ 只能用 ::after,而且要先确认该元素没被组件库占用这个伪元素 ——
|
|
2559
|
+
* antd 的表格展开图标恰恰是用 ::before/::after 画那根 +/− 横竖线的,
|
|
2560
|
+
* 用 ::after 去"扩命中区"会直接把图标画坏(曾误加到列表里,已撤)。
|
|
2561
|
+
* 对这类"伪元素已占用"的控件,只能老实把盒子做大。 */
|
|
2562
|
+
/* ⚠️ **不要改这个图标的盒子尺寸**。antd 的 +/− 是用固定像素偏移画的
|
|
2563
|
+
* (::before 的 top:7px/left:3px、::after 的 left:7px…),这些偏移是按 17px 盒子调的;
|
|
2564
|
+
* 把盒子改大,横竖线的交汇点就跑到左上角,图标看起来像"表格边框坏了"(实测踩过)。
|
|
2565
|
+
*
|
|
2566
|
+
* 正确的放大方式是**等比缩放整个图标**:antd 本来就给它加了 transform: scale(.941176),
|
|
2567
|
+
* 覆盖成 1.8 即可 —— 图形与偏移一起放大,永不跑位,命中区也从 16px 变成 30.6px。
|
|
2568
|
+
* (展开态的差异是靠 ::after 的旋转,不在元素 transform 上,所以覆盖它是安全的。) */
|
|
2569
|
+
.ant-table-row-expand-icon {
|
|
2570
|
+
transform: scale(1.8) !important;
|
|
2571
|
+
}
|
|
2572
|
+
|
|
2573
|
+
.ant-switch,
|
|
2574
|
+
.ant-checkbox-wrapper,
|
|
2575
|
+
.ant-radio-button-wrapper {
|
|
2576
|
+
position: relative;
|
|
2577
|
+
}
|
|
2578
|
+
|
|
2579
|
+
.ant-switch::after {
|
|
2580
|
+
position: absolute;
|
|
2581
|
+
inset: -12px;
|
|
2582
|
+
content: '';
|
|
2583
|
+
}
|
|
2584
|
+
|
|
2585
|
+
.ant-checkbox-wrapper::after,
|
|
2586
|
+
.ant-radio-button-wrapper::after {
|
|
2587
|
+
position: absolute;
|
|
2588
|
+
inset: -10px -6px;
|
|
2589
|
+
content: '';
|
|
2590
|
+
}
|
|
2591
|
+
}
|
|
2592
|
+
|
|
2593
|
+
/* ══ 6b. 手持档的语义级字号地板:<small> 就是"小字",手机上它不该真的小 ═════
|
|
2594
|
+
* 逐类点名修了二十几个类名之后仍然漏(实测 /daq 单页还剩 120+ 处,分散在
|
|
2595
|
+
* DaqNodeRow、line-pill、infra-banner 各处,而且被更高特异度的规则盖回来)。
|
|
2596
|
+
* <small> 是语义标签:它在手持档的**下限**由可读性决定,不由排版细节决定 ——
|
|
2597
|
+
* 所以这里用一条语义级兜底,而不是继续加类名。 */
|
|
2598
|
+
@media (max-width: 900px) {
|
|
2599
|
+
/* 用 body 而不是 .app-content:浮层(抽屉/tooltip/popover)被 teleport 到 body 下,
|
|
2600
|
+
* 不属于 .app-content,用后者会漏掉它们(实测:同一批 <small> 在页面里修好、
|
|
2601
|
+
* 在浮层里照旧)。 */
|
|
2602
|
+
body small,
|
|
2603
|
+
body small *,
|
|
2604
|
+
body :not(pre) > code {
|
|
2605
|
+
font-size: 11.5px !important;
|
|
2606
|
+
}
|
|
2607
|
+
|
|
2608
|
+
/* 行内代码同属"要被读的正文",且它常承载 ID / 参数。pre 里的代码块不在此列
|
|
2609
|
+
(代码块有自己的等宽排版,放大反而破坏对齐)。 */
|
|
2610
|
+
.app-content :not(pre) > code {
|
|
2611
|
+
font-size: 11.5px;
|
|
2612
|
+
}
|
|
2613
|
+
}
|
|
2614
|
+
|
|
2615
|
+
/* ══ 7. 字号地板:窄屏不允许出现"看得见但读不了"的微字 ═════════════════════
|
|
2616
|
+
桌面 10–11px 的 mono 微标签是**仪器铭牌**语言,保留;
|
|
2617
|
+
手持距离(≈30cm)下 10px 只剩 6px 有效字号,必须抬到 11.5px 起。 */
|
|
2618
|
+
/* ⚠️ 这里必须 !important:页脚与侧栏铭牌的字号定义在**组件的 scoped 样式**里
|
|
2619
|
+
* (`.app-footer[data-v-x]` = 0,2,0),全局层同选择器只有 0,1,0,靠源码顺序取胜不可靠
|
|
2620
|
+
* (构建后组件样式与 main.css 的先后会被打包器重排)。而"手持视距下的字号地板"是
|
|
2621
|
+
* 无障碍要求,不是主题偏好 —— 它就应该盖过组件里的 10px 微字。 */
|
|
2622
|
+
@media (max-width: 640px) {
|
|
2623
|
+
.aw-kicker,
|
|
2624
|
+
.aw-bench-kicker,
|
|
2625
|
+
.aw-bench-meta,
|
|
2626
|
+
.aw-gauge-label,
|
|
2627
|
+
.aw-gauge .aw-readout small,
|
|
2628
|
+
.app-footer,
|
|
2629
|
+
.app-footer span,
|
|
2630
|
+
.footer-line,
|
|
2631
|
+
/* 几处"分节小标"散落在页面自己的 scoped 样式里(8.5–10px),
|
|
2632
|
+
逐页去改不如在全局层给这一类语义一个统一地板:它们都是**给人读的分节名**。 */
|
|
2633
|
+
.lc-state,
|
|
2634
|
+
.ctl-sec,
|
|
2635
|
+
.dock-mode,
|
|
2636
|
+
.st-pill {
|
|
2637
|
+
font-size: 11.5px !important;
|
|
2638
|
+
}
|
|
2639
|
+
|
|
2640
|
+
/* 壳层铭牌同样受字号地板约束:它们不是"装饰刻度"而是身份/分区信息,
|
|
2641
|
+
手持视距下 8.5–10px 等于读不了(实测审计在 375 每页稳定报 8 条)。 */
|
|
2642
|
+
.logo-sub,
|
|
2643
|
+
.menu-group-text,
|
|
2644
|
+
.sider-footer,
|
|
2645
|
+
.sider-footer .footer-line,
|
|
2646
|
+
.app-footer .sep {
|
|
2647
|
+
font-size: 11.5px;
|
|
2648
|
+
}
|
|
2649
|
+
|
|
2650
|
+
.menu-group-text {
|
|
2651
|
+
letter-spacing: 0.1em;
|
|
2652
|
+
}
|
|
2653
|
+
}
|
|
2654
|
+
|
|
2655
|
+
/* 抽屉打开时(on≤900 的窄屏形态),侧栏铭牌的可读距离比桌面更近,
|
|
2656
|
+
但抽屉宽度只有 264px —— 抬字号同时要收一点字距,避免分组标顶到刻度线。 */
|
|
2657
|
+
@media (max-width: 900px) {
|
|
2658
|
+
body.nav-drawer .app-sider .logo-sub,
|
|
2659
|
+
body.nav-drawer .app-sider .menu-group-text,
|
|
2660
|
+
body.nav-drawer .app-sider .footer-line,
|
|
2661
|
+
body.nav-drawer .app-sider .logo-title {
|
|
2662
|
+
font-size: 11.5px !important;
|
|
2663
|
+
}
|
|
2664
|
+
|
|
2665
|
+
body.nav-drawer .app-sider .menu-group-text {
|
|
2666
|
+
letter-spacing: 0.1em;
|
|
2667
|
+
}
|
|
2668
|
+
}
|
|
2669
|
+
|
|
2670
|
+
/* ══ 8. 浮层:窄屏抽屉/模态占满可用宽,底部留安全区 ═══════════════════════ */
|
|
2671
|
+
@media (max-width: 640px) {
|
|
2672
|
+
.ant-drawer-content-wrapper {
|
|
2673
|
+
max-width: 100vw;
|
|
2674
|
+
}
|
|
2675
|
+
|
|
2676
|
+
.ant-modal {
|
|
2677
|
+
max-width: calc(100vw - 16px);
|
|
2678
|
+
margin: 8px auto;
|
|
2679
|
+
}
|
|
2680
|
+
|
|
2681
|
+
.ant-drawer-body,
|
|
2682
|
+
.ant-modal-body {
|
|
2683
|
+
padding-bottom: max(16px, env(safe-area-inset-bottom));
|
|
2684
|
+
}
|
|
2685
|
+
}
|
|
2686
|
+
|
|
2687
|
+
/* ══ 9. 横屏手机(高度 ≤ 520 且宽 > 640):纵向空间才是瓶颈 ════════════════
|
|
2688
|
+
横屏多用于"看趋势图",此时不该再给页头留桌面级留白。 */
|
|
2689
|
+
@media (max-height: 520px) and (min-width: 641px) {
|
|
2690
|
+
.aw-page-head {
|
|
2691
|
+
padding-bottom: 10px;
|
|
2692
|
+
margin-bottom: 12px;
|
|
2693
|
+
}
|
|
2694
|
+
|
|
2695
|
+
.aw-page-head h1 {
|
|
2696
|
+
font-size: 22px;
|
|
2697
|
+
}
|
|
2698
|
+
|
|
2699
|
+
.app-footer {
|
|
2700
|
+
display: none;
|
|
2701
|
+
}
|
|
2702
|
+
}
|
|
2703
|
+
|
|
2704
|
+
/* ══ 9b. 亮色档:antd 预设 tag 的文字色按"彩色小标签"设计,不是按 AA 正文设计 ══
|
|
2705
|
+
实测 gold preset 的 #d48806 落在 #fffbe6 上只有 2.76:1。
|
|
2706
|
+
这里只压深**文字**、保留色相与底色 —— 色相本身在传信息(lead/worker/阶段),
|
|
2707
|
+
改成灰标签等于把信息抹掉。currentColor 在 color 属性里解析为**继承值**,
|
|
2708
|
+
所以这条既通用又不需要枚举 antd 的十种 preset。 */
|
|
2709
|
+
html:not(.dark) .ant-tag {
|
|
2710
|
+
color: color-mix(in srgb, currentColor 70%, #000);
|
|
2711
|
+
}
|
|
2712
|
+
|
|
2713
|
+
/* antd 开关的"关闭态文字"(unCheckedChildren)是白字压在 #bfbfbf 轨道上,只有 1.9:1。
|
|
2714
|
+
* 这不是我们的配色,而是组件库对"彩色轨道"的默认假设 —— 在浅色主题里轨道是灰的,
|
|
2715
|
+
* 白字必须换成墨色。开启态轨道是品牌绿,白字仍然成立,不动。 */
|
|
2716
|
+
html:not(.dark) .ant-switch .ant-switch-inner .ant-switch-inner-unchecked,
|
|
2717
|
+
html:not(.dark) .ant-switch-inner-unchecked {
|
|
2718
|
+
color: #3a3733 !important;
|
|
2719
|
+
}
|
|
2720
|
+
|
|
2721
|
+
/* ══ 10. 侧栏三种形态:full(≥1024) / rail(900–1023) / drawer(<900) ═══════
|
|
2722
|
+
形态判据写在 <body> 的类上(由 AppSidebar 的 useResponsive 镜像),
|
|
2723
|
+
而不是打 a-layout-sider 自己的 class —— 实测 antd Sider 不透传动态 class,
|
|
2724
|
+
把**结构性布局**挂在第三方组件的 attr 透传行为上是脆的。
|
|
2725
|
+
|
|
2726
|
+
为什么窄屏侧栏必须离开文档流:
|
|
2727
|
+
1. 228px 文字轨 + 画布在 390px 屏上只剩 162px —— 任何页面都读不了;
|
|
2728
|
+
2. antd Sider 的 breakpoint 会把 collapsed 写回持久化偏好,
|
|
2729
|
+
"在手机上打开过一次" 就变成 "桌面侧栏永久收起"(实测复现)。 */
|
|
2730
|
+
body.nav-drawer .app-sider {
|
|
2731
|
+
position: fixed;
|
|
2732
|
+
inset: 0 auto 0 0;
|
|
2733
|
+
z-index: 1200;
|
|
2734
|
+
width: 264px !important;
|
|
2735
|
+
min-width: 264px !important;
|
|
2736
|
+
max-width: 264px !important;
|
|
2737
|
+
height: 100dvh;
|
|
2738
|
+
transform: translateX(-100%);
|
|
2739
|
+
transition:
|
|
2740
|
+
transform 0.28s var(--spring-soft, cubic-bezier(0.22, 1, 0.36, 1)),
|
|
2741
|
+
box-shadow 0.28s ease;
|
|
2742
|
+
will-change: transform;
|
|
2743
|
+
}
|
|
2744
|
+
|
|
2745
|
+
body.nav-drawer.nav-drawer-open .app-sider {
|
|
2746
|
+
transform: translateX(0);
|
|
2747
|
+
box-shadow: 0 24px 60px rgb(0 0 0 / 45%);
|
|
2748
|
+
}
|
|
2749
|
+
|
|
2750
|
+
/* 关闭态彻底移出可达树:transform 只是"看不见",元素仍在文档里可被 Tab 聚焦、
|
|
2751
|
+
也会被几何审计记成"fixed 元素越界"(每个页面稳定 1 条假阳性)。
|
|
2752
|
+
visibility 用延时切换,保证关门动画播完再隐藏。 */
|
|
2753
|
+
body.nav-drawer:not(.nav-drawer-open) .app-sider {
|
|
2754
|
+
visibility: hidden;
|
|
2755
|
+
transition:
|
|
2756
|
+
transform 0.28s var(--spring-soft, cubic-bezier(0.22, 1, 0.36, 1)),
|
|
2757
|
+
visibility 0s linear 0.28s;
|
|
2758
|
+
}
|
|
2759
|
+
|
|
2760
|
+
/* 抽屉内条目回到手指友好的尺寸(桌面 34px 对拇指太窄) */
|
|
2761
|
+
body.nav-drawer .app-sider .menu-item {
|
|
2762
|
+
min-height: 44px;
|
|
2763
|
+
font-size: 14px;
|
|
2764
|
+
}
|
|
2765
|
+
|
|
2766
|
+
body.nav-drawer .app-sider .logo {
|
|
2767
|
+
height: 56px;
|
|
2768
|
+
}
|
|
2769
|
+
|
|
2770
|
+
body.nav-drawer .app-sider .app-menu {
|
|
2771
|
+
padding-bottom: 84px;
|
|
2772
|
+
}
|
|
2773
|
+
|
|
2774
|
+
@media (prefers-reduced-motion: reduce) {
|
|
2775
|
+
body.nav-drawer .app-sider {
|
|
2776
|
+
transition: none;
|
|
2777
|
+
}
|
|
2778
|
+
}
|
|
2779
|
+
|
|
2780
|
+
|
|
2781
|
+
|
|
2272
2782
|
|