agentworkshop 0.7.41 → 0.7.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/B8uy9iRW.js +1 -0
  3. package/.output/public/_nuxt/BGTYYQH-.js +1 -0
  4. package/.output/public/_nuxt/BUmHEJ77.js +2 -0
  5. package/.output/public/_nuxt/BY7YrV_D.js +1 -0
  6. package/.output/public/_nuxt/Bqcgz95s.js +18 -0
  7. package/.output/public/_nuxt/C7UlqPeD.js +1 -0
  8. package/.output/public/_nuxt/CTmDn-YP.js +1 -0
  9. package/.output/public/_nuxt/Cs8pVeVG.js +1 -0
  10. package/.output/public/_nuxt/DKySmNPI.js +14 -0
  11. package/.output/public/_nuxt/Di0NY_ht.js +1 -0
  12. package/.output/public/_nuxt/Du9v6qGB.js +1 -0
  13. package/.output/public/_nuxt/{DGbd-UiG.js → EHlEMRii.js} +1 -1
  14. package/.output/public/_nuxt/Eke1fs-U.js +1 -0
  15. package/.output/public/_nuxt/{DeJykBFf.js → H0BcqZtT.js} +1 -1
  16. package/.output/public/_nuxt/{C4oW1HsE.js → HSYEkkce.js} +1 -1
  17. package/.output/public/_nuxt/{D_OTvQza.js → J9oU00D1.js} +1 -1
  18. package/.output/public/_nuxt/OmpTerminalPanel.BxR5-lvi.css +1 -0
  19. package/.output/public/_nuxt/SSyAPaHc.js +1 -0
  20. package/.output/public/_nuxt/TownView.li4EMQxK.css +1 -0
  21. package/.output/public/_nuxt/VdLk4jLE2.js +1 -0
  22. package/.output/public/_nuxt/_id_.BhsXoEuk.css +1 -0
  23. package/.output/public/_nuxt/_id_.DQyj-WKN.css +1 -0
  24. package/.output/public/_nuxt/{_wsId_.B4WiqkIS.css → _wsId_.CTx-BlfF.css} +1 -1
  25. package/.output/public/_nuxt/aShsv_rG.js +19 -0
  26. package/.output/public/_nuxt/{yF0aYMF1.js → aesgXKSr.js} +3 -3
  27. package/.output/public/_nuxt/agents.B21nUEUX.css +1 -0
  28. package/.output/public/_nuxt/aml.ekTjxFkf.css +1 -0
  29. package/.output/public/_nuxt/builds/latest.json +1 -1
  30. package/.output/public/_nuxt/builds/meta/b5506ef0-f48e-4f14-a6c0-d65e505d0b09.json +1 -0
  31. package/.output/public/_nuxt/channel-templates.DplM1pJ3.css +1 -0
  32. package/.output/public/_nuxt/daq.BdVmoIfe.css +1 -0
  33. package/.output/public/_nuxt/dcw.DCgyzpWV.css +1 -0
  34. package/.output/public/_nuxt/{default.J32SgqFY.css → default.Bh3L2HU8.css} +1 -1
  35. package/.output/public/_nuxt/lHAxdSsj.js +1 -0
  36. package/.output/public/_nuxt/pages.j9rzRocr.css +1 -0
  37. package/.output/public/_nuxt/plugins.DhiZbHU8.css +1 -0
  38. package/.output/public/_nuxt/settings.BRx9rIDg.css +1 -0
  39. package/.output/public/_nuxt/teams.BLlOPB_Z.css +1 -0
  40. package/.output/public/_nuxt/tokens.De8xzszn.css +1 -0
  41. package/.output/public/_nuxt/workshop.D1jFNkrn.css +1 -0
  42. package/.output/server/chunks/_/nitro.mjs +748 -733
  43. package/.output/server/chunks/build/{OmpTerminalPanel-Cu_s4i0A.mjs → OmpTerminalPanel-CVvxpsF7.mjs} +15 -15
  44. package/.output/server/chunks/build/{OmpTerminalPanel-Cu_s4i0A.mjs.map → OmpTerminalPanel-CVvxpsF7.mjs.map} +1 -1
  45. package/.output/server/chunks/build/{TownView--otsnr_7.mjs → TownView-CJ6IsDCc.mjs} +226 -225
  46. package/.output/server/chunks/build/{TownView--otsnr_7.mjs.map → TownView-CJ6IsDCc.mjs.map} +1 -1
  47. package/.output/server/chunks/build/{_id_-Brv-JSvr.mjs → _id_-CVD_H0ir.mjs} +143 -142
  48. package/.output/server/chunks/build/_id_-CVD_H0ir.mjs.map +1 -0
  49. package/.output/server/chunks/build/{_id_-D9pl1OZy.mjs → _id_-CtxMb3qp.mjs} +41 -41
  50. package/.output/server/chunks/build/_id_-CtxMb3qp.mjs.map +1 -0
  51. package/.output/server/chunks/build/{_wsId_-BASfDf0s.mjs → _wsId_-DpY3T-md.mjs} +514 -444
  52. package/.output/server/chunks/build/{_wsId_-BASfDf0s.mjs.map → _wsId_-DpY3T-md.mjs.map} +1 -1
  53. package/.output/server/chunks/build/{agents-CLQqJF2y.mjs → agents-DsCkuXDV.mjs} +49 -46
  54. package/.output/server/chunks/build/agents-DsCkuXDV.mjs.map +1 -0
  55. package/.output/server/chunks/build/{aml-_7FdFL2p.mjs → aml-CT0xKGKI.mjs} +122 -105
  56. package/.output/server/chunks/build/aml-CT0xKGKI.mjs.map +1 -0
  57. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs +117 -0
  58. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs.map +1 -0
  59. package/.output/server/chunks/build/{channel-templates-p6SZNjlM.mjs → channel-templates-Dla9FbYa.mjs} +49 -37
  60. package/.output/server/chunks/build/channel-templates-Dla9FbYa.mjs.map +1 -0
  61. package/.output/server/chunks/build/{daq-DkMvD8sg.mjs → daq-DWWSKGAV.mjs} +89 -88
  62. package/.output/server/chunks/build/daq-DWWSKGAV.mjs.map +1 -0
  63. package/.output/server/chunks/build/{dcw-C1jgVJkO.mjs → dcw-CT8k17_E.mjs} +44 -43
  64. package/.output/server/chunks/build/dcw-CT8k17_E.mjs.map +1 -0
  65. package/.output/server/chunks/build/{default-BE4r0FZN.mjs → default-D3525UFX.mjs} +16 -15
  66. package/.output/server/chunks/build/{default-BE4r0FZN.mjs.map → default-D3525UFX.mjs.map} +1 -1
  67. package/.output/server/chunks/build/{monitor-C0okQaXz.mjs → monitor-Dh2Kvaq5.mjs} +2 -2
  68. package/.output/server/chunks/build/{monitor-C0okQaXz.mjs.map → monitor-Dh2Kvaq5.mjs.map} +1 -1
  69. package/.output/server/chunks/build/{pages-B0bUWnC6.mjs → pages-BHcSBM2D.mjs} +24 -18
  70. package/.output/server/chunks/build/pages-BHcSBM2D.mjs.map +1 -0
  71. package/.output/server/chunks/build/{plugins-lGlUr1lj.mjs → plugins-BNgIi61W.mjs} +23 -17
  72. package/.output/server/chunks/build/plugins-BNgIi61W.mjs.map +1 -0
  73. package/.output/server/chunks/build/{settings-Ddd1qx2Z.mjs → settings-ipYBDWdn.mjs} +45 -44
  74. package/.output/server/chunks/build/settings-ipYBDWdn.mjs.map +1 -0
  75. package/.output/server/chunks/build/{teams-MEDLZdMn.mjs → teams-5lx-CwFa.mjs} +47 -44
  76. package/.output/server/chunks/build/teams-5lx-CwFa.mjs.map +1 -0
  77. package/.output/server/chunks/build/{tokens-C7fTM5C2.mjs → tokens-q-IDT8Io.mjs} +73 -53
  78. package/.output/server/chunks/build/tokens-q-IDT8Io.mjs.map +1 -0
  79. package/.output/server/chunks/build/{town-CoQdblbZ.mjs → town-QJWB5wng.mjs} +3 -2
  80. package/.output/server/chunks/build/town-QJWB5wng.mjs.map +1 -0
  81. package/.output/server/chunks/build/{workshop-BL5bhfs0.mjs → workshop-BIlCj_ZP.mjs} +45 -45
  82. package/.output/server/chunks/build/workshop-BIlCj_ZP.mjs.map +1 -0
  83. package/.output/server/chunks/routes/renderer.mjs +1 -1
  84. package/.output/server/chunks/virtual/entry.mjs +637 -86
  85. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  86. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  87. package/.output/server/package.json +1 -1
  88. package/README-zh.md +13 -3
  89. package/README.md +13 -3
  90. package/app/components/AppHeader.vue +961 -959
  91. package/app/components/workshop/A2aRpcDebugger.vue +237 -237
  92. package/app/components/workshop/AgentInspectorDrawer.vue +424 -424
  93. package/app/components/workshop/AgentLanesView.vue +998 -998
  94. package/app/components/workshop/ArtifactCard.vue +120 -120
  95. package/app/components/workshop/AssetLibrary.vue +452 -452
  96. package/app/components/workshop/ChannelSessionList.vue +812 -804
  97. package/app/components/workshop/CommandPalette.vue +269 -269
  98. package/app/components/workshop/Composer.vue +827 -827
  99. package/app/components/workshop/DeviceTwinPanel.vue +643 -643
  100. package/app/components/workshop/EventBlock.vue +602 -602
  101. package/app/components/workshop/FileSelectorModal.vue +188 -188
  102. package/app/components/workshop/InspectorPanel.vue +301 -301
  103. package/app/components/workshop/MemoryPanel.vue +364 -364
  104. package/app/components/workshop/MultiChannelView.vue +189 -189
  105. package/app/components/workshop/TaskBoardView.vue +686 -686
  106. package/app/components/workshop/TaskInspectorDrawer.vue +390 -390
  107. package/app/components/workshop/TranscriptTimeline.vue +601 -601
  108. package/app/components/workshop/blocks/ClusterArtifact.vue +61 -61
  109. package/app/components/workshop/blocks/ClusterError.vue +85 -85
  110. package/app/components/workshop/blocks/ClusterLife.vue +87 -87
  111. package/app/components/workshop/blocks/ClusterMember.vue +95 -93
  112. package/app/components/workshop/blocks/ClusterMemory.vue +84 -84
  113. package/app/components/workshop/blocks/ClusterOther.vue +67 -67
  114. package/app/components/workshop/blocks/ClusterStatus.vue +149 -147
  115. package/app/components/workshop/blocks/ClusterTool.vue +158 -158
  116. package/app/components/workshop/terminal/OmpTerminalPanel.vue +1011 -1011
  117. package/app/components/workshop/town/TownView.vue +56 -56
  118. package/app/middleware/locale-cookie.global.ts +22 -0
  119. package/app/pages/aml/index.vue +24 -2
  120. package/app/pages/daq/[id].vue +11 -11
  121. package/app/pages/daq/index.vue +2316 -2316
  122. package/app/pages/dcw/[id].vue +18 -19
  123. package/app/pages/dcw/index.vue +3 -3
  124. package/app/pages/index.vue +987 -981
  125. package/app/pages/plugins/index.vue +317 -311
  126. package/app/pages/settings.vue +1564 -1562
  127. package/app/pages/tokens.vue +15 -15
  128. package/app/pages/workshop/agents.vue +612 -609
  129. package/app/pages/workshop/channel-templates.vue +18 -11
  130. package/app/pages/workshop/index.vue +668 -668
  131. package/app/pages/workshop/teams.vue +743 -740
  132. package/app/pages/workshop/w/[wsId].vue +704 -704
  133. package/app/plugins/locale-restore.client.ts +16 -1
  134. package/app/utils/builtin-catalog.ts +104 -0
  135. package/config.yml +170 -170
  136. package/docs/full-test-plan.md +2 -3
  137. package/i18n/locales/en.ts +293 -35
  138. package/i18n/locales/zh-CN.ts +265 -7
  139. package/package.json +2 -2
  140. package/scripts/_dbg-perms-e2e.mjs +132 -109
  141. package/scripts/_demo-agentteam-capture.mjs +278 -0
  142. package/scripts/_e2e-ui-functional.mjs +371 -0
  143. package/scripts/_i18n-en-cjk-scan.mjs +28 -0
  144. package/scripts/_i18n-en-verify.mjs +107 -0
  145. package/scripts/_i18n-extra-checks.mjs +53 -0
  146. package/scripts/_i18n-scan-hardcoded.mjs +180 -0
  147. package/scripts/_i18n-verify-keys.mjs +50 -0
  148. package/scripts/_loop-biax-campaign.mjs +15 -9
  149. package/scripts/_sweep-button-contrast.mjs +87 -0
  150. package/scripts/ui/record-demo.mjs +557 -0
  151. package/server/plugins-builtin/diag-bridge/index.mjs +608 -661
  152. package/server/plugins-builtin/rag-bridge/index.mjs +57 -133
  153. package/server/services/workshop/daq/drivers.ts +11 -0
  154. package/.output/public/_nuxt/88GOowgO2.js +0 -1
  155. package/.output/public/_nuxt/BN16aRdQ.js +0 -1
  156. package/.output/public/_nuxt/BWVhZntO.js +0 -1
  157. package/.output/public/_nuxt/BXxH0UQE.js +0 -1
  158. package/.output/public/_nuxt/BsROmY89.js +0 -1
  159. package/.output/public/_nuxt/C0ZrS1KL.js +0 -19
  160. package/.output/public/_nuxt/C4s_niy-.js +0 -14
  161. package/.output/public/_nuxt/D6mbFA-a.js +0 -1
  162. package/.output/public/_nuxt/DS8qj8EL.js +0 -1
  163. package/.output/public/_nuxt/DUjW5Yq5.js +0 -1
  164. package/.output/public/_nuxt/Dap5PmTL.js +0 -2
  165. package/.output/public/_nuxt/Dqw1lpr-.js +0 -1
  166. package/.output/public/_nuxt/DvLxILQP.js +0 -1
  167. package/.output/public/_nuxt/OmpTerminalPanel.B_Pl5Ynm.css +0 -1
  168. package/.output/public/_nuxt/TownView.f-YOdXRs.css +0 -1
  169. package/.output/public/_nuxt/_id_.D9ymtHB5.css +0 -1
  170. package/.output/public/_nuxt/_id_.jf-_8E_c.css +0 -1
  171. package/.output/public/_nuxt/agents.ZD0rVdHE.css +0 -1
  172. package/.output/public/_nuxt/aml.BN8ZEW4h.css +0 -1
  173. package/.output/public/_nuxt/builds/meta/78a295bb-2072-48a4-8b46-6d545fdae743.json +0 -1
  174. package/.output/public/_nuxt/channel-templates.BOtahzPi.css +0 -1
  175. package/.output/public/_nuxt/daq.DjSgY94l.css +0 -1
  176. package/.output/public/_nuxt/dcw.8Y7FqCVN.css +0 -1
  177. package/.output/public/_nuxt/eqq3wWQF.js +0 -18
  178. package/.output/public/_nuxt/pages.D7aSDlUI.css +0 -1
  179. package/.output/public/_nuxt/plugins.sb4nDGqr.css +0 -1
  180. package/.output/public/_nuxt/qr6R6Ha1.js +0 -1
  181. package/.output/public/_nuxt/settings.BTgR-NiE.css +0 -1
  182. package/.output/public/_nuxt/teams.CxnxKVVs.css +0 -1
  183. package/.output/public/_nuxt/tokens.BFY7qv4f.css +0 -1
  184. package/.output/public/_nuxt/workshop.CR_QzeAN.css +0 -1
  185. package/.output/server/chunks/build/_id_-Brv-JSvr.mjs.map +0 -1
  186. package/.output/server/chunks/build/_id_-D9pl1OZy.mjs.map +0 -1
  187. package/.output/server/chunks/build/agents-CLQqJF2y.mjs.map +0 -1
  188. package/.output/server/chunks/build/aml-_7FdFL2p.mjs.map +0 -1
  189. package/.output/server/chunks/build/channel-templates-p6SZNjlM.mjs.map +0 -1
  190. package/.output/server/chunks/build/daq-DkMvD8sg.mjs.map +0 -1
  191. package/.output/server/chunks/build/dcw-C1jgVJkO.mjs.map +0 -1
  192. package/.output/server/chunks/build/pages-B0bUWnC6.mjs.map +0 -1
  193. package/.output/server/chunks/build/plugins-lGlUr1lj.mjs.map +0 -1
  194. package/.output/server/chunks/build/settings-Ddd1qx2Z.mjs.map +0 -1
  195. package/.output/server/chunks/build/teams-MEDLZdMn.mjs.map +0 -1
  196. package/.output/server/chunks/build/tokens-C7fTM5C2.mjs.map +0 -1
  197. package/.output/server/chunks/build/town-CoQdblbZ.mjs.map +0 -1
  198. package/.output/server/chunks/build/workshop-BL5bhfs0.mjs.map +0 -1
  199. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.continue.json +0 -1
  200. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.json +0 -1
  201. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/054bb4bc4e4217a2ab0b0c6b663747214a9af464f5568ea60e784704e340bb0f.source +0 -153
  202. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/0554197c3d2bac203a1f5c48a5d52495d1336db1bd7aa4f4c19875810363e684.source +0 -153
  203. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/05c203d12a954fffba942e1d626e3f5fec05b18a5aef2bac003b7884a4b77406.source +0 -431
  204. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/145a6e6ba811af35aed31e0cc3211f53706a14980fa069ee9e3c1591139f96f0.source +0 -180
  205. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/1ae0fb281f97899c025e368ca73f41349b01fb5f85b19e08d7ebccff49095ed5.source +0 -112
  206. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/20ee9967aa0541c516db7575bdd4a1a745939bc7016bd10d7635903113edb8ec.source +0 -227
  207. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/233751843aeba9d4c5263f275b8102de00443c06f286918cbd23e0b6729e01aa.source +0 -131
  208. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/263c2e05b425e5c322e60c6475279f963bab3a873eb521b21df7fec935a46597.source +0 -160
  209. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/2ac5eaac28eaaee2178c4b32014df8e732f9dd432a285a872f5b7f31c1395fa4.source +0 -157
  210. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/33a0db0d2d95d2c11d0720090458e5fba1425376f5ceb5b422d1d3471be3226b.source +0 -348
  211. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/359e474ae83db35e4615d3728de6bf694b64d4dce9b536730a3b6518f9c0494a.source +0 -296
  212. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/37a4c3c31c4b70f6b719c53d1e9c4fcba603f31adfdd11bb6ef9f0d094923c56.source +0 -285
  213. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/461feca1c14a695eb8b0f17a6f95fe97eeceabc0510faaea4ba6d25bde147d8d.source +0 -217
  214. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/4cfadbda8591f29d5e1e230dc000e701b756e850441b3900fb596a4d2f6e98c2.source +0 -301
  215. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/50ca2810cf0b248c96948994c0c404531bbad6e553166b6816b3b03bfa0f75d2.source +0 -151
  216. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/52d9e8cb591a9ae86e238c3620a610cd386717bee222c0f37b25b2ac7e523dc4.source +0 -135
  217. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/6c87daafa4c006560a954636a97333f6123153c9d34d96203f7ee3a14e556357.source +0 -156
  218. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/77bc47854b577900621cacf1697f81fa2bc005af129d37614a97a3441c08f99f.source +0 -72
  219. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/7bbb789d3a527817118cf8399ed1861d6a962ade10878fd07223435d333a7089.source +0 -469
  220. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/86b7c1daafc8b60ba9982dde5bf1bcc74265709483c176e71f23ec6fc267451f.source +0 -259
  221. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/8df66d62bd41984d0970e8236882080c5085ac937d07a29779463d6a03b37c76.source +0 -97
  222. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/9962f2d1b3a85137bd40cc835725600b39f89ee02a27c06b2e0402e1eafde115.source +0 -277
  223. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/a1090ea066b792cb201739f4994e37bf7c12f52e805239a1eab87f18a537f266.source +0 -171
  224. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/a5241091650134d0919897e086a606a3846c8b2b54f8b4c84a8696c145ac3e9e.source +0 -425
  225. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/af19fa4c6e34d5540028be4b17600161283af3a2a2dfc61a3fdc0834436a0c14.source +0 -99
  226. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/b3713d78e2b2f93905ff6be8d58a8d0a2f42dea322eb67c987fda22ff6a084d5.source +0 -325
  227. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/b3849943c3aff102d1af815631fc843a2a52c17646a4b04696ece323e483bbec.source +0 -332
  228. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/bac735a3803a6650b7f1eb8f587e6dc5c68ea055000c3c99a11789438b78e837.source +0 -43
  229. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/d32c24d61eb8b33c73e5a8fc7e4dc7ef437aed238ee4371c2b00617e6104090a.source +0 -154
  230. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/d5170dc9a9879fda04fdf91d8a110d4efb6787ee38dda596d4da899883d36a72.source +0 -531
  231. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/dc59bcd7bb397be63ba2f2c3fec23f3782dcb17d2d75a9981eeced761f33eb32.source +0 -439
  232. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/eb5ff8cf66b92aec7bf6726781d8df74faa2b030c3aaac17d6b00c1fc04c9b32.source +0 -323
  233. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f10615a6fae18436e70d1201b2d44fdae3174a3aa7bb4db97dea1b3ed291d721.source +0 -433
  234. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f36d3e271668bc1260c2823542d22dbf1d0f7041ff16b1ac175bce2256e582ca.source +0 -280
  235. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f94449380af09f31ac352152007146a75cc80bae8d6411ffe57b2c56f933b0ff.source +0 -117
  236. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/fe4dfd81178fd6b648335f6405d9ede71319aebde796008e50db21f8adf44c99.source +0 -160
  237. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/ffb4e3aa548cfdadabaa44ab599f9b6a3ca6288176a2cc7a4b2fc2a12b5fb848.source +0 -101
  238. package/scripts/.mimosa/hook-status/sess_aeaecb58-8833-4b83-b93c-050467d21e03-d944d71bb3.json +0 -14
  239. package/scripts/_dbg-audit-all-pages.mjs +0 -43
  240. package/scripts/_dbg-daq-frames-e2e.mjs +0 -118
  241. package/scripts/_dbg-daq-rowstyle-verify.mjs +0 -112
  242. package/scripts/_dbg-hitl-timeout-e2e.mjs +0 -93
  243. package/scripts/_dbg-live-line-e2e.mjs +0 -279
  244. package/scripts/_dbg-minimal-omp.mjs +0 -77
  245. package/scripts/_dbg-mode-nav.mjs +0 -173
  246. package/scripts/_dbg-real-scenario-timeline.log +0 -55
  247. package/scripts/_dbg-team-repro.mjs +0 -76
  248. package/scripts/_dbg-town-agents-probe.mjs +0 -60
  249. package/scripts/_dbg-visual-acceptance.mjs +0 -63
  250. package/scripts/_townview_style.css +0 -1185
  251. package/scripts/_townview_template.html +0 -1215
  252. package/server/data/agent-node-bindings.json +0 -554
  253. package/server/data/daq-templates.json +0 -16
  254. package/server/data/daqs.json +0 -7464
  255. package/server/data/dcw-lines.json +0 -1787
  256. package/server/data/dcw-products.json +0 -1626
  257. package/server/data/dcw-recipes.json +0 -4672
  258. package/server/data/dcw-rollback.json +0 -20754
  259. package/server/data/dcw-runs.json +0 -6354
  260. package/server/data/dcw-templates.json +0 -146
  261. package/server/data/dcw-writes.json +0 -15650
  262. package/server/data/dcws.json +0 -9033
  263. package/server/data/device-twins.json +0 -133
  264. package/server/data/line-runs.json +0 -322
  265. package/server/data/scene-layouts.json +0 -277
@@ -1,390 +1,390 @@
1
- <script setup lang="ts">
2
- /**
3
- * Task 抽屉(P1):执行详情。
4
- * - REST 全量详情(描述/artifacts 全文/history)
5
- * - AEP 状态时间线(该任务全部 task.status/progress 事件重放)
6
- * - 子任务树;操作:取消任务
7
- */
8
- import { message } from 'ant-design-vue'
9
- import { useStorage } from '@vueuse/core'
10
- import { useEntitiesStore } from '@/app/stores/workshop/entities'
11
- import { useEventsStore } from '@/app/stores/workshop/events'
12
- import { useWorkshopApi, type TaskDto } from '@/app/composables/workshop/useWorkshopApi'
13
- import { formatLocalClock } from '@/app/composables/workshop/useLocalTime'
14
-
15
- const { t } = useI18n()
16
-
17
- const props = defineProps<{
18
- channelId: string
19
- taskId: string | null
20
- }>()
21
- const open = defineModel<boolean>('open', { default: false })
22
-
23
- // 抽屉宽度拖拽调节(PaneSplitter;持久化,双击复位)
24
- const DRAWER_W_DEFAULT = 560
25
- const drawerWidth = useStorage('aw.drawer.taskW', DRAWER_W_DEFAULT)
26
- const resizeDrawer = (d: number): void => {
27
- drawerWidth.value = Math.min(960, Math.max(380, drawerWidth.value - d))
28
- }
29
-
30
- const entities = useEntitiesStore()
31
- const events = useEventsStore()
32
- const api = useWorkshopApi()
33
-
34
- const detail = ref<TaskDto | null>(null)
35
- const loading = ref(false)
36
- const load = async (): Promise<void> => {
37
- if (!props.taskId) return
38
- loading.value = true
39
- try {
40
- const res = await api.getTask(props.taskId)
41
- detail.value = (res as unknown as { data?: TaskDto }).data ?? null
42
- }
43
- finally {
44
- loading.value = false
45
- }
46
- }
47
- watch(() => [open.value, props.taskId], () => {
48
- if (open.value && props.taskId) void load()
49
- })
50
-
51
- const taskView = computed(() =>
52
- props.taskId ? entities.taskById(props.channelId, props.taskId) : undefined,
53
- )
54
- const children = computed(() =>
55
- props.taskId ? (entities.tasks[props.channelId] ?? []).filter(t => t.parentId === props.taskId) : [],
56
- )
57
-
58
- /** AEP 状态时间线重放 */
59
- const timeline = computed(() => {
60
- if (!props.taskId) return []
61
- return events.ring(props.channelId).items.filter(e =>
62
- e.taskId === props.taskId && (e.type === 'task.status' || e.type === 'task.progress'))
63
- })
64
-
65
- const cancelling = ref(false)
66
- const cancel = async (): Promise<void> => {
67
- if (!props.taskId) return
68
- cancelling.value = true
69
- try {
70
- await api.cancelTask(props.taskId)
71
- message.success(t('taskInspectorDrawer.k1xj595a013'))
72
- void load()
73
- }
74
- catch (e) {
75
- message.error(apiErrorMessage(e))
76
- }
77
- finally {
78
- cancelling.value = false
79
- }
80
- }
81
-
82
- /** HITL:重试 FAILED 任务(lead/worker 任务均可;优先原 assignee,否则最短队列 worker) */
83
- const retrying = ref(false)
84
- const retry = async (): Promise<void> => {
85
- if (!props.taskId) return
86
- retrying.value = true
87
- try {
88
- await api.retryTask(props.taskId)
89
- message.success(t('taskInspectorDrawer.ke7bh8u014'))
90
- void load()
91
- }
92
- catch (e) {
93
- message.error(apiErrorMessage(e))
94
- }
95
- finally {
96
- retrying.value = false
97
- }
98
- }
99
-
100
- const agentName = (id: string): string =>
101
- entities.agentById(props.channelId, id)?.name ?? id.slice(0, 8)
102
-
103
- /** 失败原因:FAILED 任务取历史末条非空文本(REST 全量详情含 history) */
104
- const failureReason = computed(() => {
105
- const d = detail.value
106
- if (!d || d.state !== 'FAILED') return ''
107
- const history = (d as unknown as { history?: Array<{ parts?: Array<{ text?: string }> }> }).history ?? []
108
- for (let i = history.length - 1; i >= 0; i--) {
109
- const text = (history[i]?.parts ?? []).map(p => p.text ?? '').join(' ').trim()
110
- if (text) return text.slice(0, 500)
111
- }
112
- return d.description?.trim() ?? ''
113
- })
114
-
115
- const stateColor: Record<string, string> = {
116
- SUBMITTED: 'default',
117
- ASSIGNED: 'processing',
118
- WORKING: 'processing',
119
- WAITING: 'warning',
120
- COMPLETED: 'success',
121
- FAILED: 'error',
122
- CANCELED: 'default',
123
- }
124
- </script>
125
-
126
- <template>
127
- <a-drawer
128
- v-model:open="open"
129
- placement="right"
130
- :width="drawerWidth"
131
- :title="detail?.title ?? taskView?.title ?? '任务详情'"
132
- class="aw-resizable-drawer"
133
- >
134
- <workshop-pane-splitter
135
- variant="bare"
136
- class="drawer-resizer"
137
- :label="$t('taskInspectorDrawer.k6hcbxi001')"
138
- @resize="resizeDrawer"
139
- @reset="drawerWidth = DRAWER_W_DEFAULT"
140
- />
141
- <a-spin :spinning="loading">
142
- <template v-if="detail || taskView">
143
- <div class="head">
144
- <a-tag
145
- :color="stateColor[taskView?.state ?? detail?.state ?? ''] ?? 'default'"
146
- >
147
- {{ taskView?.state ?? detail?.state }}
148
- </a-tag>
149
- <span class="meta">{{ $t('taskInspectorDrawer.k3o48o4010') }}{{ agentName(taskView?.assigneeId ?? detail?.assigneeId ?? '') }}</span>
150
- <span class="meta">{{ taskView?.progress ?? detail?.progress ?? 0 }}%</span>
151
- <div class="spacer" />
152
- <a-popconfirm
153
- v-if="(taskView?.state ?? detail?.state) === 'FAILED'"
154
- :title="$t('taskInspectorDrawer.kns2a6x002')"
155
- @confirm="retry"
156
- >
157
- <a-button
158
- size="small"
159
- :loading="retrying"
160
- >
161
- {{ $t('taskInspectorDrawer.k1lcgf2b005') }}
162
- </a-button>
163
- </a-popconfirm>
164
- <a-popconfirm
165
- :title="$t('taskInspectorDrawer.k1a7jqb9003')"
166
- @confirm="cancel"
167
- >
168
- <a-button
169
- danger
170
- size="small"
171
- :loading="cancelling"
172
- :disabled="['COMPLETED', 'CANCELED', 'FAILED'].includes(taskView?.state ?? detail?.state ?? '')"
173
- >
174
- {{ $t('taskInspectorDrawer.k1bs0t9b006') }}
175
- </a-button>
176
- </a-popconfirm>
177
- </div>
178
-
179
- <!-- 失败原因(FAILED 任务:历史末条错误原文,让用户知道哪里出了问题) -->
180
- <div
181
- v-if="(taskView?.state ?? detail?.state) === 'FAILED' && failureReason"
182
- class="failure-reason"
183
- >
184
- <span class="fr-label">失败原因</span>
185
- <span class="fr-text">{{ failureReason }}</span>
186
- </div>
187
-
188
- <a-descriptions
189
- v-if="detail?.description"
190
- :column="1"
191
- size="small"
192
- class="desc"
193
- >
194
- <a-descriptions-item :label="$t('taskInspectorDrawer.k40gkk004')">
195
- {{ detail.description }}
196
- </a-descriptions-item>
197
- </a-descriptions>
198
-
199
- <div
200
- v-if="detail?.routeReason"
201
- class="route-reason"
202
- >
203
- <span class="route-label">{{ $t('taskInspectorDrawer.k1knph8c007') }}</span>
204
- <span class="route-text">{{ detail.routeReason }}</span>
205
- </div>
206
-
207
- <a-tabs
208
- size="small"
209
- default-active-key="timeline"
210
- >
211
- <a-tab-pane
212
- key="timeline"
213
- tab="状态时间线"
214
- >
215
- <div
216
- v-if="timeline.length === 0"
217
- class="empty"
218
- >
219
- {{ $t('taskInspectorDrawer.kr3vr2x008') }}
220
- </div>
221
- <div
222
- v-for="e in timeline"
223
- :key="`${e.seq}-${e.type}`"
224
- class="tl-row"
225
- >
226
- <span class="tl-time">{{ formatLocalClock(e.at) }}</span>
227
- <a-tag
228
- v-if="e.type === 'task.status'"
229
- :color="stateColor[(e.payload as { state: string }).state] ?? 'default'"
230
- class="state"
231
- >
232
- {{ (e.payload as { state: string }).state }}
233
- </a-tag>
234
- <span
235
- v-else
236
- class="tl-progress"
237
- >{{ $t('taskInspectorDrawer.k485ye011') }} {{ (e.payload as { progress: number }).progress }}%</span>
238
- </div>
239
- </a-tab-pane>
240
-
241
- <a-tab-pane
242
- key="artifacts"
243
- :tab="$t('taskInspectorDrawer.kkp77tf015', { p0: detail?.artifacts.length ?? 0 })"
244
- >
245
- <div
246
- v-if="!detail?.artifacts.length"
247
- class="empty"
248
- >
249
- ({{ $t('taskInspectorDrawer.k401n2012') }}
250
- </div>
251
- <workshop-artifact-card
252
- v-for="a in detail?.artifacts ?? []"
253
- :key="a.artifactId"
254
- :artifact="a"
255
- />
256
- </a-tab-pane>
257
-
258
- <a-tab-pane
259
- key="children"
260
- :tab="$t('taskInspectorDrawer.khnua62016', { p0: children.length })"
261
- >
262
- <div
263
- v-if="children.length === 0"
264
- class="empty"
265
- >
266
- {{ $t('taskInspectorDrawer.k1kmqn5u009') }}
267
- </div>
268
- <div
269
- v-for="c in children"
270
- :key="c.id"
271
- class="child-row"
272
- >
273
- <a-tag
274
- :color="stateColor[c.state] ?? 'default'"
275
- class="state"
276
- >
277
- {{ c.state }}
278
- </a-tag>
279
- <span class="child-title">{{ c.title }}</span>
280
- <span class="child-meta">{{ agentName(c.assigneeId) }} · {{ c.progress }}%</span>
281
- </div>
282
- </a-tab-pane>
283
-
284
- <a-tab-pane
285
- key="raw"
286
- :tab="$t('taskInspectorDrawer.kxj74io017', { p0: detail?.artifacts.reduce((n, a) => n + a.parts.length, 0) ?? 0 })"
287
- >
288
- <pre class="raw">{{ JSON.stringify(detail?.artifacts, null, 2)?.slice(0, 4000) }}</pre>
289
- </a-tab-pane>
290
- </a-tabs>
291
- </template>
292
- </a-spin>
293
- </a-drawer>
294
- </template>
295
-
296
- <style scoped>
297
- /* 抽屉左缘调宽手柄:锚定 panel 左缘(aw-resizable-drawer 提供 positioning 上下文) */
298
- .drawer-resizer {
299
- position: absolute;
300
- inset: 0 auto 0 0;
301
- z-index: 8;
302
- }
303
- .head {
304
- display: flex;
305
- gap: 8px;
306
- align-items: center;
307
- padding-bottom: 8px;
308
- border-bottom: 1px solid color-mix(in srgb, currentColor 10%, transparent);
309
- }
310
- .meta { font-size: 12px; font-family: var(--font-mono); opacity: 0.6; }
311
- .spacer { flex: 1 1 auto; }
312
- .desc { margin-top: 8px; }
313
- /* 失败原因块(FAILED 任务:历史末条错误原文) */
314
- .failure-reason {
315
- display: flex;
316
- gap: 8px;
317
- align-items: baseline;
318
- margin-top: 10px;
319
- padding: 8px 10px;
320
- background: rgba(255, 107, 107, 0.09);
321
- border: 1px solid rgba(255, 107, 107, 0.35);
322
- border-radius: 8px;
323
- }
324
- .fr-label {
325
- flex: none;
326
- font-size: 11px;
327
- font-weight: 700;
328
- color: #ff8080;
329
- }
330
- .fr-text {
331
- font-size: 12px;
332
- line-height: 1.55;
333
- color: var(--tone-danger-dot, #ff8080);
334
- white-space: pre-wrap;
335
- word-break: break-all;
336
- }
337
- .route-reason {
338
- display: flex;
339
- gap: 8px;
340
- align-items: baseline;
341
- margin-top: 6px;
342
- padding: 8px 10px;
343
- font-size: 12px;
344
- background: var(--paper-deep);
345
- border: 1px solid var(--line);
346
- border-radius: var(--radius-chip);
347
- }
348
- .route-label {
349
- flex: 0 0 auto;
350
- font-family: var(--font-mono);
351
- font-size: 10px;
352
- letter-spacing: 0.08em;
353
- text-transform: uppercase;
354
- color: var(--ink-faint);
355
- }
356
- .route-text { color: var(--ink-soft); }
357
- .tl-row {
358
- display: flex;
359
- gap: 8px;
360
- align-items: center;
361
- padding: 3px 0;
362
- font-size: 12px;
363
- font-family: var(--font-mono);
364
- }
365
- .tl-time { opacity: 0.45; }
366
- .state { margin-inline-end: 0; font-size: 10px; }
367
- .tl-progress { opacity: 0.7; }
368
- .child-row {
369
- display: flex;
370
- gap: 6px;
371
- align-items: center;
372
- padding: 4px 6px;
373
- border-radius: var(--radius-chip);
374
- }
375
- .child-row:hover { background: color-mix(in srgb, currentColor 8%, transparent); }
376
- .child-title {
377
- flex: 1 1 auto;
378
- overflow: hidden;
379
- font-size: 12px;
380
- text-overflow: ellipsis;
381
- white-space: nowrap;
382
- }
383
- .child-meta { font-size: 11px; opacity: 0.5; }
384
- .empty { padding: 12px 4px; font-size: 12px; opacity: 0.4; }
385
- .raw {
386
- max-height: 300px;
387
- overflow: auto;
388
- font-size: 11px;
389
- }
390
- </style>
1
+ <script setup lang="ts">
2
+ /**
3
+ * Task 抽屉(P1):执行详情。
4
+ * - REST 全量详情(描述/artifacts 全文/history)
5
+ * - AEP 状态时间线(该任务全部 task.status/progress 事件重放)
6
+ * - 子任务树;操作:取消任务
7
+ */
8
+ import { message } from 'ant-design-vue'
9
+ import { useStorage } from '@vueuse/core'
10
+ import { useEntitiesStore } from '@/app/stores/workshop/entities'
11
+ import { useEventsStore } from '@/app/stores/workshop/events'
12
+ import { useWorkshopApi, type TaskDto } from '@/app/composables/workshop/useWorkshopApi'
13
+ import { formatLocalClock } from '@/app/composables/workshop/useLocalTime'
14
+
15
+ const { t } = useI18n()
16
+
17
+ const props = defineProps<{
18
+ channelId: string
19
+ taskId: string | null
20
+ }>()
21
+ const open = defineModel<boolean>('open', { default: false })
22
+
23
+ // 抽屉宽度拖拽调节(PaneSplitter;持久化,双击复位)
24
+ const DRAWER_W_DEFAULT = 560
25
+ const drawerWidth = useStorage('aw.drawer.taskW', DRAWER_W_DEFAULT)
26
+ const resizeDrawer = (d: number): void => {
27
+ drawerWidth.value = Math.min(960, Math.max(380, drawerWidth.value - d))
28
+ }
29
+
30
+ const entities = useEntitiesStore()
31
+ const events = useEventsStore()
32
+ const api = useWorkshopApi()
33
+
34
+ const detail = ref<TaskDto | null>(null)
35
+ const loading = ref(false)
36
+ const load = async (): Promise<void> => {
37
+ if (!props.taskId) return
38
+ loading.value = true
39
+ try {
40
+ const res = await api.getTask(props.taskId)
41
+ detail.value = (res as unknown as { data?: TaskDto }).data ?? null
42
+ }
43
+ finally {
44
+ loading.value = false
45
+ }
46
+ }
47
+ watch(() => [open.value, props.taskId], () => {
48
+ if (open.value && props.taskId) void load()
49
+ })
50
+
51
+ const taskView = computed(() =>
52
+ props.taskId ? entities.taskById(props.channelId, props.taskId) : undefined,
53
+ )
54
+ const children = computed(() =>
55
+ props.taskId ? (entities.tasks[props.channelId] ?? []).filter(t => t.parentId === props.taskId) : [],
56
+ )
57
+
58
+ /** AEP 状态时间线重放 */
59
+ const timeline = computed(() => {
60
+ if (!props.taskId) return []
61
+ return events.ring(props.channelId).items.filter(e =>
62
+ e.taskId === props.taskId && (e.type === 'task.status' || e.type === 'task.progress'))
63
+ })
64
+
65
+ const cancelling = ref(false)
66
+ const cancel = async (): Promise<void> => {
67
+ if (!props.taskId) return
68
+ cancelling.value = true
69
+ try {
70
+ await api.cancelTask(props.taskId)
71
+ message.success(t('taskInspectorDrawer.k1xj595a013'))
72
+ void load()
73
+ }
74
+ catch (e) {
75
+ message.error(apiErrorMessage(e))
76
+ }
77
+ finally {
78
+ cancelling.value = false
79
+ }
80
+ }
81
+
82
+ /** HITL:重试 FAILED 任务(lead/worker 任务均可;优先原 assignee,否则最短队列 worker) */
83
+ const retrying = ref(false)
84
+ const retry = async (): Promise<void> => {
85
+ if (!props.taskId) return
86
+ retrying.value = true
87
+ try {
88
+ await api.retryTask(props.taskId)
89
+ message.success(t('taskInspectorDrawer.ke7bh8u014'))
90
+ void load()
91
+ }
92
+ catch (e) {
93
+ message.error(apiErrorMessage(e))
94
+ }
95
+ finally {
96
+ retrying.value = false
97
+ }
98
+ }
99
+
100
+ const agentName = (id: string): string =>
101
+ entities.agentById(props.channelId, id)?.name ?? id.slice(0, 8)
102
+
103
+ /** 失败原因:FAILED 任务取历史末条非空文本(REST 全量详情含 history) */
104
+ const failureReason = computed(() => {
105
+ const d = detail.value
106
+ if (!d || d.state !== 'FAILED') return ''
107
+ const history = (d as unknown as { history?: Array<{ parts?: Array<{ text?: string }> }> }).history ?? []
108
+ for (let i = history.length - 1; i >= 0; i--) {
109
+ const text = (history[i]?.parts ?? []).map(p => p.text ?? '').join(' ').trim()
110
+ if (text) return text.slice(0, 500)
111
+ }
112
+ return d.description?.trim() ?? ''
113
+ })
114
+
115
+ const stateColor: Record<string, string> = {
116
+ SUBMITTED: 'default',
117
+ ASSIGNED: 'processing',
118
+ WORKING: 'processing',
119
+ WAITING: 'warning',
120
+ COMPLETED: 'success',
121
+ FAILED: 'error',
122
+ CANCELED: 'default',
123
+ }
124
+ </script>
125
+
126
+ <template>
127
+ <a-drawer
128
+ v-model:open="open"
129
+ placement="right"
130
+ :width="drawerWidth"
131
+ :title="detail?.title ?? taskView?.title ?? $t('taskInspectorDrawer.fallbackTitle')"
132
+ class="aw-resizable-drawer"
133
+ >
134
+ <workshop-pane-splitter
135
+ variant="bare"
136
+ class="drawer-resizer"
137
+ :label="$t('taskInspectorDrawer.k6hcbxi001')"
138
+ @resize="resizeDrawer"
139
+ @reset="drawerWidth = DRAWER_W_DEFAULT"
140
+ />
141
+ <a-spin :spinning="loading">
142
+ <template v-if="detail || taskView">
143
+ <div class="head">
144
+ <a-tag
145
+ :color="stateColor[taskView?.state ?? detail?.state ?? ''] ?? 'default'"
146
+ >
147
+ {{ taskView?.state ?? detail?.state }}
148
+ </a-tag>
149
+ <span class="meta">{{ $t('taskInspectorDrawer.k3o48o4010') }}{{ agentName(taskView?.assigneeId ?? detail?.assigneeId ?? '') }}</span>
150
+ <span class="meta">{{ taskView?.progress ?? detail?.progress ?? 0 }}%</span>
151
+ <div class="spacer" />
152
+ <a-popconfirm
153
+ v-if="(taskView?.state ?? detail?.state) === 'FAILED'"
154
+ :title="$t('taskInspectorDrawer.kns2a6x002')"
155
+ @confirm="retry"
156
+ >
157
+ <a-button
158
+ size="small"
159
+ :loading="retrying"
160
+ >
161
+ {{ $t('taskInspectorDrawer.k1lcgf2b005') }}
162
+ </a-button>
163
+ </a-popconfirm>
164
+ <a-popconfirm
165
+ :title="$t('taskInspectorDrawer.k1a7jqb9003')"
166
+ @confirm="cancel"
167
+ >
168
+ <a-button
169
+ danger
170
+ size="small"
171
+ :loading="cancelling"
172
+ :disabled="['COMPLETED', 'CANCELED', 'FAILED'].includes(taskView?.state ?? detail?.state ?? '')"
173
+ >
174
+ {{ $t('taskInspectorDrawer.k1bs0t9b006') }}
175
+ </a-button>
176
+ </a-popconfirm>
177
+ </div>
178
+
179
+ <!-- 失败原因(FAILED 任务:历史末条错误原文,让用户知道哪里出了问题) -->
180
+ <div
181
+ v-if="(taskView?.state ?? detail?.state) === 'FAILED' && failureReason"
182
+ class="failure-reason"
183
+ >
184
+ <span class="fr-label">{{ $t('taskInspectorDrawer.failReason') }}</span>
185
+ <span class="fr-text">{{ failureReason }}</span>
186
+ </div>
187
+
188
+ <a-descriptions
189
+ v-if="detail?.description"
190
+ :column="1"
191
+ size="small"
192
+ class="desc"
193
+ >
194
+ <a-descriptions-item :label="$t('taskInspectorDrawer.k40gkk004')">
195
+ {{ detail.description }}
196
+ </a-descriptions-item>
197
+ </a-descriptions>
198
+
199
+ <div
200
+ v-if="detail?.routeReason"
201
+ class="route-reason"
202
+ >
203
+ <span class="route-label">{{ $t('taskInspectorDrawer.k1knph8c007') }}</span>
204
+ <span class="route-text">{{ detail.routeReason }}</span>
205
+ </div>
206
+
207
+ <a-tabs
208
+ size="small"
209
+ default-active-key="timeline"
210
+ >
211
+ <a-tab-pane
212
+ key="timeline"
213
+ :tab="$t('taskInspectorDrawer.tabTimeline')"
214
+ >
215
+ <div
216
+ v-if="timeline.length === 0"
217
+ class="empty"
218
+ >
219
+ {{ $t('taskInspectorDrawer.kr3vr2x008') }}
220
+ </div>
221
+ <div
222
+ v-for="e in timeline"
223
+ :key="`${e.seq}-${e.type}`"
224
+ class="tl-row"
225
+ >
226
+ <span class="tl-time">{{ formatLocalClock(e.at) }}</span>
227
+ <a-tag
228
+ v-if="e.type === 'task.status'"
229
+ :color="stateColor[(e.payload as { state: string }).state] ?? 'default'"
230
+ class="state"
231
+ >
232
+ {{ (e.payload as { state: string }).state }}
233
+ </a-tag>
234
+ <span
235
+ v-else
236
+ class="tl-progress"
237
+ >{{ $t('taskInspectorDrawer.k485ye011') }} {{ (e.payload as { progress: number }).progress }}%</span>
238
+ </div>
239
+ </a-tab-pane>
240
+
241
+ <a-tab-pane
242
+ key="artifacts"
243
+ :tab="$t('taskInspectorDrawer.kkp77tf015', { p0: detail?.artifacts.length ?? 0 })"
244
+ >
245
+ <div
246
+ v-if="!detail?.artifacts.length"
247
+ class="empty"
248
+ >
249
+ ({{ $t('taskInspectorDrawer.k401n2012') }}
250
+ </div>
251
+ <workshop-artifact-card
252
+ v-for="a in detail?.artifacts ?? []"
253
+ :key="a.artifactId"
254
+ :artifact="a"
255
+ />
256
+ </a-tab-pane>
257
+
258
+ <a-tab-pane
259
+ key="children"
260
+ :tab="$t('taskInspectorDrawer.khnua62016', { p0: children.length })"
261
+ >
262
+ <div
263
+ v-if="children.length === 0"
264
+ class="empty"
265
+ >
266
+ {{ $t('taskInspectorDrawer.k1kmqn5u009') }}
267
+ </div>
268
+ <div
269
+ v-for="c in children"
270
+ :key="c.id"
271
+ class="child-row"
272
+ >
273
+ <a-tag
274
+ :color="stateColor[c.state] ?? 'default'"
275
+ class="state"
276
+ >
277
+ {{ c.state }}
278
+ </a-tag>
279
+ <span class="child-title">{{ c.title }}</span>
280
+ <span class="child-meta">{{ agentName(c.assigneeId) }} · {{ c.progress }}%</span>
281
+ </div>
282
+ </a-tab-pane>
283
+
284
+ <a-tab-pane
285
+ key="raw"
286
+ :tab="$t('taskInspectorDrawer.kxj74io017', { p0: detail?.artifacts.reduce((n, a) => n + a.parts.length, 0) ?? 0 })"
287
+ >
288
+ <pre class="raw">{{ JSON.stringify(detail?.artifacts, null, 2)?.slice(0, 4000) }}</pre>
289
+ </a-tab-pane>
290
+ </a-tabs>
291
+ </template>
292
+ </a-spin>
293
+ </a-drawer>
294
+ </template>
295
+
296
+ <style scoped>
297
+ /* 抽屉左缘调宽手柄:锚定 panel 左缘(aw-resizable-drawer 提供 positioning 上下文) */
298
+ .drawer-resizer {
299
+ position: absolute;
300
+ inset: 0 auto 0 0;
301
+ z-index: 8;
302
+ }
303
+ .head {
304
+ display: flex;
305
+ gap: 8px;
306
+ align-items: center;
307
+ padding-bottom: 8px;
308
+ border-bottom: 1px solid color-mix(in srgb, currentColor 10%, transparent);
309
+ }
310
+ .meta { font-size: 12px; font-family: var(--font-mono); opacity: 0.6; }
311
+ .spacer { flex: 1 1 auto; }
312
+ .desc { margin-top: 8px; }
313
+ /* 失败原因块(FAILED 任务:历史末条错误原文) */
314
+ .failure-reason {
315
+ display: flex;
316
+ gap: 8px;
317
+ align-items: baseline;
318
+ margin-top: 10px;
319
+ padding: 8px 10px;
320
+ background: rgba(255, 107, 107, 0.09);
321
+ border: 1px solid rgba(255, 107, 107, 0.35);
322
+ border-radius: 8px;
323
+ }
324
+ .fr-label {
325
+ flex: none;
326
+ font-size: 11px;
327
+ font-weight: 700;
328
+ color: #ff8080;
329
+ }
330
+ .fr-text {
331
+ font-size: 12px;
332
+ line-height: 1.55;
333
+ color: var(--tone-danger-dot, #ff8080);
334
+ white-space: pre-wrap;
335
+ word-break: break-all;
336
+ }
337
+ .route-reason {
338
+ display: flex;
339
+ gap: 8px;
340
+ align-items: baseline;
341
+ margin-top: 6px;
342
+ padding: 8px 10px;
343
+ font-size: 12px;
344
+ background: var(--paper-deep);
345
+ border: 1px solid var(--line);
346
+ border-radius: var(--radius-chip);
347
+ }
348
+ .route-label {
349
+ flex: 0 0 auto;
350
+ font-family: var(--font-mono);
351
+ font-size: 10px;
352
+ letter-spacing: 0.08em;
353
+ text-transform: uppercase;
354
+ color: var(--ink-faint);
355
+ }
356
+ .route-text { color: var(--ink-soft); }
357
+ .tl-row {
358
+ display: flex;
359
+ gap: 8px;
360
+ align-items: center;
361
+ padding: 3px 0;
362
+ font-size: 12px;
363
+ font-family: var(--font-mono);
364
+ }
365
+ .tl-time { opacity: 0.45; }
366
+ .state { margin-inline-end: 0; font-size: 10px; }
367
+ .tl-progress { opacity: 0.7; }
368
+ .child-row {
369
+ display: flex;
370
+ gap: 6px;
371
+ align-items: center;
372
+ padding: 4px 6px;
373
+ border-radius: var(--radius-chip);
374
+ }
375
+ .child-row:hover { background: color-mix(in srgb, currentColor 8%, transparent); }
376
+ .child-title {
377
+ flex: 1 1 auto;
378
+ overflow: hidden;
379
+ font-size: 12px;
380
+ text-overflow: ellipsis;
381
+ white-space: nowrap;
382
+ }
383
+ .child-meta { font-size: 11px; opacity: 0.5; }
384
+ .empty { padding: 12px 4px; font-size: 12px; opacity: 0.4; }
385
+ .raw {
386
+ max-height: 300px;
387
+ overflow: auto;
388
+ font-size: 11px;
389
+ }
390
+ </style>