agentworkshop 0.7.60 → 0.7.62

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 (292) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +1 -1
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +1 -1
  3. package/.output/nitro.json +1 -1
  4. package/.output/public/_nuxt/B5RD2ZST.js +2 -0
  5. package/.output/public/_nuxt/{KXQppTXc.js → BTXdYngG.js} +1 -1
  6. package/.output/public/_nuxt/{Ce5SiMQR2.js → BXbKTAwC2.js} +1 -1
  7. package/.output/public/_nuxt/B_6yBa_Z.js +1 -0
  8. package/.output/public/_nuxt/B_ic601Y.js +1 -0
  9. package/.output/public/_nuxt/{DhSlJyZD2.js → BegV7-FE2.js} +1 -1
  10. package/.output/public/_nuxt/{D9sgxxsM2.js → BrRXGr472.js} +1 -1
  11. package/.output/public/_nuxt/{BeNdseTX.js → BtBgrPNT.js} +1 -1
  12. package/.output/public/_nuxt/{Cyd68Xbv2.js → C5MPzgon2.js} +1 -1
  13. package/.output/public/_nuxt/{DBdwjOGB2.js → CI5sliIF2.js} +1 -1
  14. package/.output/public/_nuxt/CI8awYVQ2.js +1 -0
  15. package/.output/public/_nuxt/{Cfp00Rdo.js → CK2ts9sD.js} +1 -1
  16. package/.output/public/_nuxt/{BjUpWKS6.js → CPZKwmLQ.js} +1 -1
  17. package/.output/public/_nuxt/{CjeMxUv8.js → CVUMEGa1.js} +1 -1
  18. package/.output/public/_nuxt/{p2sDc0tO2.js → CcLFZjCI2.js} +1 -1
  19. package/.output/public/_nuxt/{C93LpBMF.js → CfIGBe_4.js} +3 -3
  20. package/.output/public/_nuxt/{DTcsb0fG.js → Ci5kuU1q.js} +1 -1
  21. package/.output/public/_nuxt/CiyTTgqr.js +106 -0
  22. package/.output/public/_nuxt/{CgbP5yJk2.js → CkYk8bj02.js} +7 -7
  23. package/.output/public/_nuxt/Cmiz_VOb2.js +47 -0
  24. package/.output/public/_nuxt/Cnf1PFhB2.js +1 -0
  25. package/.output/public/_nuxt/CoTm7jd3.js +28 -0
  26. package/.output/public/_nuxt/{C0sNwDTK2.js → CsN8RHJ02.js} +1 -1
  27. package/.output/public/_nuxt/D-jg-SoR.js +1 -0
  28. package/.output/public/_nuxt/{CEHT9inW.js → D-z6N1Cz.js} +1 -1
  29. package/.output/public/_nuxt/D3gfSKKi2.js +1 -0
  30. package/.output/public/_nuxt/D4elH6Bo2.js +1 -0
  31. package/.output/public/_nuxt/{C5OSTzBh.js → D4tAdwYm.js} +1 -1
  32. package/.output/public/_nuxt/{C4AICl3l.js → DAfWhONg.js} +4 -4
  33. package/.output/public/_nuxt/{BlEJRYAn2.js → DC7WzYCf2.js} +1 -1
  34. package/.output/public/_nuxt/{VeOVO2sE2.js → DE-qkHRd2.js} +1 -1
  35. package/.output/public/_nuxt/DE2kUGPK.js +1 -0
  36. package/.output/public/_nuxt/DI4sdLmu2.js +1 -0
  37. package/.output/public/_nuxt/{zVupTo2z2.js → DL6fliAT.js} +2 -2
  38. package/.output/public/_nuxt/{CMDAjShv2.js → DP6tsk912.js} +1 -1
  39. package/.output/public/_nuxt/DP_e7Vwv.js +24 -0
  40. package/.output/public/_nuxt/{C8XVZGSZ.js → DR83EvmX.js} +1 -1
  41. package/.output/public/_nuxt/{BtXwFpv42.js → DSWuWYx_2.js} +1 -1
  42. package/.output/public/_nuxt/DSdxfFX_.js +1 -0
  43. package/.output/public/_nuxt/DVS06wUy2.js +13 -0
  44. package/.output/public/_nuxt/DXlAfhEi.js +3 -0
  45. package/.output/public/_nuxt/Dc5NeCDq.js +1 -0
  46. package/.output/public/_nuxt/{B_JLVF30.js → DiHL9ehB.js} +1 -1
  47. package/.output/public/_nuxt/{Bdq2LNSO.js → DjtDexGg.js} +1 -1
  48. package/.output/public/_nuxt/DnunMTRD2.js +1 -0
  49. package/.output/public/_nuxt/{KXvRkBgg.js → Dok0B4Ol.js} +2 -2
  50. package/.output/public/_nuxt/{BFBysc2M2.js → DqT2_Jtw2.js} +1 -1
  51. package/.output/public/_nuxt/{B_BYwIf22.js → DtMlAxCm2.js} +1 -1
  52. package/.output/public/_nuxt/{BplhglEM.js → DwzJpr7P.js} +1 -1
  53. package/.output/public/_nuxt/J94L7hHq2.js +1 -0
  54. package/.output/public/_nuxt/LQBLwrYS2.js +1 -0
  55. package/.output/public/_nuxt/QSY9fE482.js +1 -0
  56. package/.output/public/_nuxt/{iCvdSYYN2.js → Qa9rS9oK2.js} +2 -2
  57. package/.output/public/_nuxt/{Cyuxcv5s2.js → R3gBFghJ2.js} +1 -1
  58. package/.output/public/_nuxt/ZxBwmbs9.js +1 -0
  59. package/.output/public/_nuxt/{BGFhOMVM.js → _mD4IkJj.js} +2 -2
  60. package/.output/public/_nuxt/analysis.BwhKdel9.css +1 -0
  61. package/.output/public/_nuxt/builds/latest.json +1 -1
  62. package/.output/public/_nuxt/builds/meta/603a62a6-71d7-4d9c-bb1d-e8264a58798e.json +1 -0
  63. package/.output/public/_nuxt/{CZmMgjIK.js → c_nqArmG.js} +1 -1
  64. package/.output/public/_nuxt/h8ddxY892.js +1 -0
  65. package/.output/public/_nuxt/i3KBHle7.js +1 -0
  66. package/.output/public/_nuxt/jmKfTQMN.js +13 -0
  67. package/.output/public/_nuxt/{59a6cSgj.js → taHLOXkS.js} +1 -1
  68. package/.output/public/_nuxt/{EQijmkCh2.js → uYP6z4G72.js} +1 -1
  69. package/.output/public/_nuxt/{D0vmf1z9.js → yuIP6K9s.js} +1 -1
  70. package/.output/public/_nuxt/{Ddc_Pn7D.js → zWg-9WN6.js} +4 -4
  71. package/.output/public/_nuxt/zrgcKVTq.js +2 -0
  72. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  73. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  74. package/.output/server/chunks/_/nitro.mjs +2444 -2394
  75. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  76. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  77. package/.output/server/chunks/build/{AuthGate-CZYkvPrg.mjs → AuthGate-BK2RqkbD.mjs} +5 -5
  78. package/.output/server/chunks/build/{AuthGate-CZYkvPrg.mjs.map → AuthGate-BK2RqkbD.mjs.map} +1 -1
  79. package/.output/server/chunks/build/{FormItemContext-DcWIIAaK.mjs → FormItemContext-BqtgOBDe.mjs} +1 -1
  80. package/.output/server/chunks/build/{FormItemContext-DcWIIAaK.mjs.map → FormItemContext-BqtgOBDe.mjs.map} +1 -1
  81. package/.output/server/chunks/build/{OmpTerminalPanel-CtFJ6Kc8.mjs → OmpTerminalPanel-Bun6rpAk.mjs} +4 -4
  82. package/.output/server/chunks/build/{OmpTerminalPanel-CtFJ6Kc8.mjs.map → OmpTerminalPanel-Bun6rpAk.mjs.map} +1 -1
  83. package/.output/server/chunks/build/{PluginSlot-BT7kYQgK.mjs → PluginSlot-Do6dX0RE.mjs} +1 -1
  84. package/.output/server/chunks/build/{PluginSlot-BT7kYQgK.mjs.map → PluginSlot-Do6dX0RE.mjs.map} +1 -1
  85. package/.output/server/chunks/build/{_wsId_-DOEw9jgZ.mjs → _wsId_-Dp3ACbQ5.mjs} +19 -19
  86. package/.output/server/chunks/build/{_wsId_-DOEw9jgZ.mjs.map → _wsId_-Dp3ACbQ5.mjs.map} +1 -1
  87. package/.output/server/chunks/build/{agents-C36wR56A.mjs → agents-BfIoGr_p.mjs} +18 -18
  88. package/.output/server/chunks/build/{agents-C36wR56A.mjs.map → agents-BfIoGr_p.mjs.map} +1 -1
  89. package/.output/server/chunks/build/{aml-CBGndvHT.mjs → aml-B5zKrvB3.mjs} +7 -7
  90. package/.output/server/chunks/build/{aml-CBGndvHT.mjs.map → aml-B5zKrvB3.mjs.map} +1 -1
  91. package/.output/server/chunks/build/analysis-CPIxT0FP.mjs +531 -0
  92. package/.output/server/chunks/build/analysis-CPIxT0FP.mjs.map +1 -0
  93. package/.output/server/chunks/build/{card-Db7OB49d.mjs → card-IyQjdGXA.mjs} +3 -3
  94. package/.output/server/chunks/build/{card-Db7OB49d.mjs.map → card-IyQjdGXA.mjs.map} +1 -1
  95. package/.output/server/chunks/build/{channel-templates-BixUrDmU.mjs → channel-templates-Bd8bgBCh.mjs} +11 -11
  96. package/.output/server/chunks/build/{channel-templates-BixUrDmU.mjs.map → channel-templates-Bd8bgBCh.mjs.map} +1 -1
  97. package/.output/server/chunks/build/{checkbox-CyF96D30.mjs → checkbox-NnjtOam0.mjs} +2 -2
  98. package/.output/server/chunks/build/{checkbox-CyF96D30.mjs.map → checkbox-NnjtOam0.mjs.map} +1 -1
  99. package/.output/server/chunks/build/{daq-DLMLufDq.mjs → daq-mC3-5A0L.mjs} +1 -1
  100. package/.output/server/chunks/build/{daq-DLMLufDq.mjs.map → daq-mC3-5A0L.mjs.map} +1 -1
  101. package/.output/server/chunks/build/{default-C7Qmdyz_.mjs → default-flcNWlNg.mjs} +12 -12
  102. package/.output/server/chunks/build/{default-C7Qmdyz_.mjs.map → default-flcNWlNg.mjs.map} +1 -1
  103. package/.output/server/chunks/build/{descriptions-1bH81YsZ.mjs → descriptions-DuAefuzp.mjs} +1 -1
  104. package/.output/server/chunks/build/{descriptions-1bH81YsZ.mjs.map → descriptions-DuAefuzp.mjs.map} +1 -1
  105. package/.output/server/chunks/build/{drawer-C7shdEHy.mjs → drawer-DEIB1_X6.mjs} +1 -1
  106. package/.output/server/chunks/build/{drawer-C7shdEHy.mjs.map → drawer-DEIB1_X6.mjs.map} +1 -1
  107. package/.output/server/chunks/build/{dropdown-BiwcuXDi.mjs → dropdown-BuD1pxH2.mjs} +5 -5
  108. package/.output/server/chunks/build/{dropdown-BiwcuXDi.mjs.map → dropdown-BuD1pxH2.mjs.map} +1 -1
  109. package/.output/server/chunks/build/{dropdown-BhLSIp5A.mjs → dropdown-w7qhyN2D.mjs} +2 -2
  110. package/.output/server/chunks/build/{dropdown-BhLSIp5A.mjs.map → dropdown-w7qhyN2D.mjs.map} +1 -1
  111. package/.output/server/chunks/build/es-DfgEl5n-.mjs +42 -0
  112. package/.output/server/chunks/build/es-DfgEl5n-.mjs.map +1 -0
  113. package/.output/server/chunks/build/{form-nE8C0G8B.mjs → form-CMLL_-Xx.mjs} +6 -6
  114. package/.output/server/chunks/build/{form-nE8C0G8B.mjs.map → form-CMLL_-Xx.mjs.map} +1 -1
  115. package/.output/server/chunks/build/{input-DwF72eVI.mjs → input-DZcioTwL.mjs} +3 -3
  116. package/.output/server/chunks/build/{input-DwF72eVI.mjs.map → input-DZcioTwL.mjs.map} +1 -1
  117. package/.output/server/chunks/build/{input-number-TSq6ltkz.mjs → input-number-BRnbiKLd.mjs} +5 -5
  118. package/.output/server/chunks/build/{input-number-TSq6ltkz.mjs.map → input-number-BRnbiKLd.mjs.map} +1 -1
  119. package/.output/server/chunks/build/{logs-hOEVuxqm.mjs → logs-BYop3JfX.mjs} +2 -2
  120. package/.output/server/chunks/build/{logs-hOEVuxqm.mjs.map → logs-BYop3JfX.mjs.map} +1 -1
  121. package/.output/server/chunks/build/{menu-Cy5Nrecn.mjs → menu-DXfhc0qN.mjs} +3 -3
  122. package/.output/server/chunks/build/{menu-Cy5Nrecn.mjs.map → menu-DXfhc0qN.mjs.map} +1 -1
  123. package/.output/server/chunks/build/{monitor-CfVoiavp.mjs → monitor-BjBGkUm2.mjs} +19 -19
  124. package/.output/server/chunks/build/{monitor-CfVoiavp.mjs.map → monitor-BjBGkUm2.mjs.map} +1 -1
  125. package/.output/server/chunks/build/{permissions-XPtQJSaO.mjs → permissions-u5SZL8Fe.mjs} +14 -14
  126. package/.output/server/chunks/build/{permissions-XPtQJSaO.mjs.map → permissions-u5SZL8Fe.mjs.map} +1 -1
  127. package/.output/server/chunks/build/{plugins-DjBSG9pV.mjs → plugins-Cas6KOF-.mjs} +5 -5
  128. package/.output/server/chunks/build/{plugins-DjBSG9pV.mjs.map → plugins-Cas6KOF-.mjs.map} +1 -1
  129. package/.output/server/chunks/build/{popconfirm-DKeEbaGd.mjs → popconfirm-BWxt-53K.mjs} +2 -2
  130. package/.output/server/chunks/build/{popconfirm-DKeEbaGd.mjs.map → popconfirm-BWxt-53K.mjs.map} +1 -1
  131. package/.output/server/chunks/build/{schedules-PcDLCUWN.mjs → schedules-Ct68Jrvw.mjs} +19 -19
  132. package/.output/server/chunks/build/{schedules-PcDLCUWN.mjs.map → schedules-Ct68Jrvw.mjs.map} +1 -1
  133. package/.output/server/chunks/build/{segmented-BdWCdZUM.mjs → segmented-DN62bOFu.mjs} +2 -2
  134. package/.output/server/chunks/build/{segmented-BdWCdZUM.mjs.map → segmented-DN62bOFu.mjs.map} +1 -1
  135. package/.output/server/chunks/build/{select-C5yighj8.mjs → select-DQv1DXcW.mjs} +4 -4
  136. package/.output/server/chunks/build/{select-C5yighj8.mjs.map → select-DQv1DXcW.mjs.map} +1 -1
  137. package/.output/server/chunks/build/{settings-90zT_h9w.mjs → settings-CQzR1YXR.mjs} +13 -13
  138. package/.output/server/chunks/build/{settings-90zT_h9w.mjs.map → settings-CQzR1YXR.mjs.map} +1 -1
  139. package/.output/server/chunks/build/{space-BCffbXIG.mjs → space-6FfG3llN.mjs} +3 -3
  140. package/.output/server/chunks/build/{space-BCffbXIG.mjs.map → space-6FfG3llN.mjs.map} +1 -1
  141. package/.output/server/chunks/build/{switch-OG0SM_Px.mjs → switch-CfsCVFQP.mjs} +2 -2
  142. package/.output/server/chunks/build/{switch-OG0SM_Px.mjs.map → switch-CfsCVFQP.mjs.map} +1 -1
  143. package/.output/server/chunks/build/{table-UpVzu50c.mjs → table-HOjbB5YY.mjs} +9 -9
  144. package/.output/server/chunks/build/{table-UpVzu50c.mjs.map → table-HOjbB5YY.mjs.map} +1 -1
  145. package/.output/server/chunks/build/{tabs-CWwoL33v.mjs → tabs-CC26Rbcw.mjs} +4 -4
  146. package/.output/server/chunks/build/{tabs-CWwoL33v.mjs.map → tabs-CC26Rbcw.mjs.map} +1 -1
  147. package/.output/server/chunks/build/{tag-CS7mwrfG.mjs → tag-BtOMjpDx.mjs} +4 -4
  148. package/.output/server/chunks/build/{tag-CS7mwrfG.mjs.map → tag-BtOMjpDx.mjs.map} +1 -1
  149. package/.output/server/chunks/build/{teams-BIAFvRw1.mjs → teams-Re0wY2SQ.mjs} +19 -19
  150. package/.output/server/chunks/build/{teams-BIAFvRw1.mjs.map → teams-Re0wY2SQ.mjs.map} +1 -1
  151. package/.output/server/chunks/build/{tokens-CLpdrzQ7.mjs → tokens-DLFIUvXE.mjs} +19 -19
  152. package/.output/server/chunks/build/{tokens-CLpdrzQ7.mjs.map → tokens-DLFIUvXE.mjs.map} +1 -1
  153. package/.output/server/chunks/build/{tooltip-CJlH_8ZK.mjs → tooltip-BSDwL_LM.mjs} +4 -4
  154. package/.output/server/chunks/build/{tooltip-CJlH_8ZK.mjs.map → tooltip-BSDwL_LM.mjs.map} +1 -1
  155. package/.output/server/chunks/build/{useAgentTemplateActions-6VyAHgu5.mjs → useAgentTemplateActions-CjBwCb3u.mjs} +1 -1
  156. package/.output/server/chunks/build/{useAgentTemplateActions-6VyAHgu5.mjs.map → useAgentTemplateActions-CjBwCb3u.mjs.map} +1 -1
  157. package/.output/server/chunks/build/{useAgentTemplateForm-DWa-ezNq.mjs → useAgentTemplateForm-BX9_xqj8.mjs} +1 -1
  158. package/.output/server/chunks/build/{useAgentTemplateForm-DWa-ezNq.mjs.map → useAgentTemplateForm-BX9_xqj8.mjs.map} +1 -1
  159. package/.output/server/chunks/build/{useAmlEntities-Co2fgjzh.mjs → useAmlEntities-BrcTqHwa.mjs} +2 -2
  160. package/.output/server/chunks/build/{useAmlEntities-Co2fgjzh.mjs.map → useAmlEntities-BrcTqHwa.mjs.map} +1 -1
  161. package/.output/server/chunks/build/{useAmlEnv-JTiWPrzH.mjs → useAmlEnv-jiGYK790.mjs} +1 -1
  162. package/.output/server/chunks/build/{useAmlEnv-JTiWPrzH.mjs.map → useAmlEnv-jiGYK790.mjs.map} +1 -1
  163. package/.output/server/chunks/build/{useAmlJobs-By4pjOzc.mjs → useAmlJobs-CVZ1btzg.mjs} +1 -1
  164. package/.output/server/chunks/build/{useAmlJobs-By4pjOzc.mjs.map → useAmlJobs-CVZ1btzg.mjs.map} +1 -1
  165. package/.output/server/chunks/build/{useAmlModels-B1_5vjMA.mjs → useAmlModels-DJkQzcCU.mjs} +1 -1
  166. package/.output/server/chunks/build/{useAmlModels-B1_5vjMA.mjs.map → useAmlModels-DJkQzcCU.mjs.map} +1 -1
  167. package/.output/server/chunks/build/{useAmlNotes-5uwvCb3h.mjs → useAmlNotes-DKnx9a8x.mjs} +1 -1
  168. package/.output/server/chunks/build/{useAmlNotes-5uwvCb3h.mjs.map → useAmlNotes-DKnx9a8x.mjs.map} +1 -1
  169. package/.output/server/chunks/build/{useAmlPredict-lxUv7lAO.mjs → useAmlPredict-Bp4ehwKw.mjs} +1 -1
  170. package/.output/server/chunks/build/{useAmlPredict-lxUv7lAO.mjs.map → useAmlPredict-Bp4ehwKw.mjs.map} +1 -1
  171. package/.output/server/chunks/build/{useLogsManual-BLfiSU3u.mjs → useLogsManual-CElmZuJh.mjs} +1 -1
  172. package/.output/server/chunks/build/{useLogsManual-BLfiSU3u.mjs.map → useLogsManual-CElmZuJh.mjs.map} +1 -1
  173. package/.output/server/chunks/build/{useMonitorData-BZ6Z-Sy8.mjs → useMonitorData-DcIfMEiz.mjs} +1 -1
  174. package/.output/server/chunks/build/{useMonitorData-BZ6Z-Sy8.mjs.map → useMonitorData-DcIfMEiz.mjs.map} +1 -1
  175. package/.output/server/chunks/build/{useTeamActions-ahht5J8Y.mjs → useTeamActions-C3_O_AIU.mjs} +1 -1
  176. package/.output/server/chunks/build/{useTeamActions-ahht5J8Y.mjs.map → useTeamActions-C3_O_AIU.mjs.map} +1 -1
  177. package/.output/server/chunks/build/{useTeamAddMemberDialog-DvXxsVy0.mjs → useTeamAddMemberDialog-DWAoZCKd.mjs} +1 -1
  178. package/.output/server/chunks/build/{useTeamAddMemberDialog-DvXxsVy0.mjs.map → useTeamAddMemberDialog-DWAoZCKd.mjs.map} +1 -1
  179. package/.output/server/chunks/build/{useTeamCreateDialog-A_k-XX5B.mjs → useTeamCreateDialog-911mIPWd.mjs} +1 -1
  180. package/.output/server/chunks/build/{useTeamCreateDialog-A_k-XX5B.mjs.map → useTeamCreateDialog-911mIPWd.mjs.map} +1 -1
  181. package/.output/server/chunks/build/{useTeamDeployDialog-CfAFjIr_.mjs → useTeamDeployDialog-D0STROoQ.mjs} +1 -1
  182. package/.output/server/chunks/build/{useTeamDeployDialog-CfAFjIr_.mjs.map → useTeamDeployDialog-D0STROoQ.mjs.map} +1 -1
  183. package/.output/server/chunks/build/{useTeamPluginDialog-Djmkk1Nl.mjs → useTeamPluginDialog-Df6-e2OW.mjs} +1 -1
  184. package/.output/server/chunks/build/{useTeamPluginDialog-Djmkk1Nl.mjs.map → useTeamPluginDialog-Df6-e2OW.mjs.map} +1 -1
  185. package/.output/server/chunks/build/{useTokenCreate-CkWoxSI-.mjs → useTokenCreate-DOojAhM5.mjs} +1 -1
  186. package/.output/server/chunks/build/{useTokenCreate-CkWoxSI-.mjs.map → useTokenCreate-DOojAhM5.mjs.map} +1 -1
  187. package/.output/server/chunks/build/{useTokenRename-BohjnGT0.mjs → useTokenRename-CMA5dLHx.mjs} +1 -1
  188. package/.output/server/chunks/build/{useTokenRename-BohjnGT0.mjs.map → useTokenRename-CMA5dLHx.mjs.map} +1 -1
  189. package/.output/server/chunks/build/{useTokenReveal-BBN5iGz7.mjs → useTokenReveal-C19aCKzt.mjs} +1 -1
  190. package/.output/server/chunks/build/{useTokenReveal-BBN5iGz7.mjs.map → useTokenReveal-C19aCKzt.mjs.map} +1 -1
  191. package/.output/server/chunks/build/{useTokensList-BQX9WqfT.mjs → useTokensList-D0ZpLOhR.mjs} +1 -1
  192. package/.output/server/chunks/build/{useTokensList-BQX9WqfT.mjs.map → useTokensList-D0ZpLOhR.mjs.map} +1 -1
  193. package/.output/server/chunks/build/{useWorkbenchAuth-BTRlS2wZ.mjs → useWorkbenchAuth-CN5E3J5L.mjs} +1 -1
  194. package/.output/server/chunks/build/{useWorkbenchAuth-BTRlS2wZ.mjs.map → useWorkbenchAuth-CN5E3J5L.mjs.map} +1 -1
  195. package/.output/server/chunks/build/{useWorkbenchWorkspaces-C6ky7OJH.mjs → useWorkbenchWorkspaces-ChKByQSD.mjs} +1 -1
  196. package/.output/server/chunks/build/{useWorkbenchWorkspaces-C6ky7OJH.mjs.map → useWorkbenchWorkspaces-ChKByQSD.mjs.map} +1 -1
  197. package/.output/server/chunks/build/{users-BHOEW3Az.mjs → users-BW4jowK4.mjs} +15 -15
  198. package/.output/server/chunks/build/{users-BHOEW3Az.mjs.map → users-BW4jowK4.mjs.map} +1 -1
  199. package/.output/server/chunks/build/{workshop-DyJ1LXwu.mjs → workshop-Bx55czXL.mjs} +11 -11
  200. package/.output/server/chunks/build/{workshop-DyJ1LXwu.mjs.map → workshop-Bx55czXL.mjs.map} +1 -1
  201. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +3 -2
  202. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs.map +1 -1
  203. package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs +103 -0
  204. package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs.map +1 -0
  205. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  213. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  226. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +6 -2
  229. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
  230. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  232. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  235. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
  236. package/.output/server/chunks/routes/renderer.mjs +2 -2
  237. package/.output/server/chunks/virtual/entry.mjs +533 -529
  238. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  239. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  240. package/.output/server/package.json +1 -1
  241. package/app/components/analysis/AnalysisEditModal.vue +192 -0
  242. package/app/components/analysis/AnalysisFilterCard.vue +159 -160
  243. package/app/components/analysis/AnalysisPageHead.vue +47 -47
  244. package/app/components/analysis/AnalysisTable.vue +322 -306
  245. package/app/pages/analysis/composables/useAnalysisFeed.ts +85 -85
  246. package/app/pages/analysis/index.vue +128 -92
  247. package/app/pages/analysis/types.ts +50 -44
  248. package/i18n/locales/en.ts +8 -0
  249. package/i18n/locales/zh-CN.ts +8 -0
  250. package/package.json +1 -1
  251. package/server/api/workshop/analysis/[id].delete.ts +30 -30
  252. package/server/api/workshop/analysis/[id].get.ts +25 -23
  253. package/server/api/workshop/analysis/[id].patch.ts +100 -0
  254. package/server/api/workshop/analysis/index.get.ts +39 -33
  255. package/server/services/workshop/agents/industrial/analysis-tools.ts +242 -242
  256. package/server/services/workshop/agents/industrial/daq-tools.ts +16 -7
  257. package/server/services/workshop/analysis/analysis.repo.ts +241 -189
  258. package/server/services/workshop/db/database/migrations.ts +10 -0
  259. package/server/services/workshop/db/database/open.ts +3 -1
  260. package/server/services/workshop/db/database/schema.ts +6 -2
  261. package/server/services/workshop/db/schema.sql +6 -2
  262. package/.output/public/_nuxt/5juo_WO2.js +0 -13
  263. package/.output/public/_nuxt/B-WTxXEK2.js +0 -1
  264. package/.output/public/_nuxt/B1BCga5h2.js +0 -13
  265. package/.output/public/_nuxt/B5lMtA7I2.js +0 -1
  266. package/.output/public/_nuxt/B6_fJd2X.js +0 -1
  267. package/.output/public/_nuxt/B7K5B04W2.js +0 -1
  268. package/.output/public/_nuxt/B7KyS_q2.js +0 -1
  269. package/.output/public/_nuxt/B8q3BGY5.js +0 -37
  270. package/.output/public/_nuxt/B9IK8kDl2.js +0 -1
  271. package/.output/public/_nuxt/BNd2NDxg2.js +0 -1
  272. package/.output/public/_nuxt/BP629NAi.js +0 -1
  273. package/.output/public/_nuxt/BVinTfuN.js +0 -1
  274. package/.output/public/_nuxt/BdE41Y_c.js +0 -28
  275. package/.output/public/_nuxt/Be_StT8b2.js +0 -1
  276. package/.output/public/_nuxt/BsYEYxWv.js +0 -24
  277. package/.output/public/_nuxt/BuNXYpib2.js +0 -1
  278. package/.output/public/_nuxt/CDaZC0_6.js +0 -3
  279. package/.output/public/_nuxt/CE43-V_L.js +0 -2
  280. package/.output/public/_nuxt/CWfBtswB.js +0 -70
  281. package/.output/public/_nuxt/CYtH1bv2.js +0 -1
  282. package/.output/public/_nuxt/ChPNKPw_.js +0 -1
  283. package/.output/public/_nuxt/CktUrk8z.js +0 -1
  284. package/.output/public/_nuxt/DMCoWgSb2.js +0 -1
  285. package/.output/public/_nuxt/Dg1iMuZ-.js +0 -1
  286. package/.output/public/_nuxt/DmwMkvoQ2.js +0 -1
  287. package/.output/public/_nuxt/LwITbamf2.js +0 -47
  288. package/.output/public/_nuxt/_jfzcYrl.js +0 -1
  289. package/.output/public/_nuxt/analysis.D2Pao1rm.css +0 -1
  290. package/.output/public/_nuxt/builds/meta/f78a1992-e424-494d-ac4b-aa18971ffc10.json +0 -1
  291. package/.output/server/chunks/build/analysis-tgzvOWmD.mjs +0 -332
  292. package/.output/server/chunks/build/analysis-tgzvOWmD.mjs.map +0 -1
@@ -1,85 +1,85 @@
1
- /**
2
- * 数据分析页的数据面:REST 快照为底 + WS 实时帧触发节流刷新。
3
- *
4
- * 权威查询走 GET /api/workshop/analysis(lineId/category/q/from/to);
5
- * 实时面是 TownBus 旁路的 ops.log 帧(kind='analysis',由 analysis_save 的 recordOps 广播)——
6
- * 收到新留痕帧后去抖拉一次快照,避免自己维护两套行形状的合并去重。
7
- */
8
- import { computed, onScopeDispose, reactive, ref } from 'vue'
9
- import { apiFetch } from '@/app/composables/workshop/apiClient'
10
- import { useTownBus } from '@/app/composables/workshop/useTownBus'
11
- import { ANALYSIS_WINDOW_PRESETS, type AnalysisReportView, type AnalysisWindowPreset } from '../types'
12
-
13
- /** 统一客户端:信封 {code,message,data} 解析取 .data(与 aml 页请求写法同源) */
14
- function analysisApi<T>(path: string, init?: RequestInit): Promise<T> {
15
- return apiFetch<T>({ base: '/api/workshop/analysis', path, init })
16
- }
17
-
18
- export function useAnalysisFeed() {
19
- const bus = useTownBus()
20
-
21
- const q = reactive<{ lineId: string, category: string, preset: AnalysisWindowPreset, text: string }>({
22
- lineId: '',
23
- category: '',
24
- preset: 'all',
25
- text: '',
26
- })
27
- const hasFilter = computed(() => Boolean(q.lineId || q.category || q.preset !== 'all' || q.text.trim()))
28
-
29
- const rows = ref<AnalysisReportView[]>([])
30
- const loading = ref(false)
31
- const error = ref('')
32
- /** 实时轨计数(本会话收到的 analysis 留痕帧数,页头脉冲用) */
33
- const liveCount = ref(0)
34
-
35
- async function doQuery(): Promise<void> {
36
- loading.value = true
37
- error.value = ''
38
- try {
39
- const preset = ANALYSIS_WINDOW_PRESETS.find(p => p.key === q.preset)
40
- const params = new URLSearchParams()
41
- if (q.lineId) params.set('lineId', q.lineId)
42
- if (q.category) params.set('category', q.category)
43
- if (q.text.trim()) params.set('q', q.text.trim())
44
- if (preset?.ms) params.set('from', new Date(Date.now() - preset.ms).toISOString())
45
- params.set('limit', '200')
46
- const data = await analysisApi<{ reports: AnalysisReportView[], count: number }>(`/?${params.toString()}`)
47
- rows.value = data.reports ?? []
48
- }
49
- catch (err) {
50
- error.value = err instanceof Error ? err.message : String(err)
51
- }
52
- finally {
53
- loading.value = false
54
- }
55
- }
56
-
57
- function resetFilters(): void {
58
- q.lineId = ''
59
- q.category = ''
60
- q.preset = 'all'
61
- q.text = ''
62
- void doQuery()
63
- }
64
-
65
- // WS 实时面:analysis 留痕帧 → 计数 + 去抖刷新快照(连发多份报告只拉一次)。
66
- // TownBus 信封 type 是宽化联合,kind 按字段读取收窄。
67
- let refreshTimer: ReturnType<typeof setTimeout> | null = null
68
- const unsubscribe = bus.subscribe((e) => {
69
- if (e.type !== 'ops.log') return
70
- const p = e.payload as { kind?: string, action?: string }
71
- if (p.kind !== 'analysis' || p.action === 'analysis.delete') return
72
- liveCount.value++
73
- if (refreshTimer) return
74
- refreshTimer = setTimeout(() => {
75
- refreshTimer = null
76
- void doQuery()
77
- }, 800)
78
- })
79
- onScopeDispose(() => {
80
- unsubscribe()
81
- if (refreshTimer) clearTimeout(refreshTimer)
82
- })
83
-
84
- return { q, hasFilter, rows, loading, error, liveCount, doQuery, resetFilters }
85
- }
1
+ /**
2
+ * 数据分析页的数据面:REST 快照为底 + WS 实时帧触发节流刷新。
3
+ *
4
+ * 权威查询走 GET /api/workshop/analysis(lineId/category/q/from/to);
5
+ * 实时面是 TownBus 旁路的 ops.log 帧(kind='analysis',由 analysis_save 的 recordOps 广播)——
6
+ * 收到新留痕帧后去抖拉一次快照,避免自己维护两套行形状的合并去重。
7
+ */
8
+ import { computed, onScopeDispose, reactive, ref } from 'vue'
9
+ import { apiFetch } from '@/app/composables/workshop/apiClient'
10
+ import { useTownBus } from '@/app/composables/workshop/useTownBus'
11
+ import { ANALYSIS_WINDOW_PRESETS, type AnalysisReportView, type AnalysisWindowPreset } from '../types'
12
+
13
+ /** 统一客户端:信封 {code,message,data} 解析取 .data(与 aml 页请求写法同源) */
14
+ function analysisApi<T>(path: string, init?: RequestInit): Promise<T> {
15
+ return apiFetch<T>({ base: '/api/workshop/analysis', path, init })
16
+ }
17
+
18
+ export function useAnalysisFeed() {
19
+ const bus = useTownBus()
20
+
21
+ const q = reactive<{ lineId: string, category: string, preset: AnalysisWindowPreset, text: string }>({
22
+ lineId: '',
23
+ category: '',
24
+ preset: 'all',
25
+ text: '',
26
+ })
27
+ const hasFilter = computed(() => Boolean(q.lineId || q.category || q.preset !== 'all' || q.text.trim()))
28
+
29
+ const rows = ref<AnalysisReportView[]>([])
30
+ const loading = ref(false)
31
+ const error = ref('')
32
+ /** 实时轨计数(本会话收到的 analysis 留痕帧数,页头脉冲用) */
33
+ const liveCount = ref(0)
34
+
35
+ async function doQuery(): Promise<void> {
36
+ loading.value = true
37
+ error.value = ''
38
+ try {
39
+ const preset = ANALYSIS_WINDOW_PRESETS.find(p => p.key === q.preset)
40
+ const params = new URLSearchParams()
41
+ if (q.lineId) params.set('lineId', q.lineId)
42
+ if (q.category) params.set('category', q.category)
43
+ if (q.text.trim()) params.set('q', q.text.trim())
44
+ if (preset?.ms) params.set('from', new Date(Date.now() - preset.ms).toISOString())
45
+ params.set('limit', '200')
46
+ const data = await analysisApi<{ reports: AnalysisReportView[], count: number }>(`/?${params.toString()}`)
47
+ rows.value = data.reports ?? []
48
+ }
49
+ catch (err) {
50
+ error.value = err instanceof Error ? err.message : String(err)
51
+ }
52
+ finally {
53
+ loading.value = false
54
+ }
55
+ }
56
+
57
+ function resetFilters(): void {
58
+ q.lineId = ''
59
+ q.category = ''
60
+ q.preset = 'all'
61
+ q.text = ''
62
+ void doQuery()
63
+ }
64
+
65
+ // WS 实时面:analysis 留痕帧 → 计数 + 去抖刷新快照(连发多份报告只拉一次)。
66
+ // TownBus 信封 type 是宽化联合,kind 按字段读取收窄。
67
+ let refreshTimer: ReturnType<typeof setTimeout> | null = null
68
+ const unsubscribe = bus.subscribe((e) => {
69
+ if (e.type !== 'ops.log') return
70
+ const p = e.payload as { kind?: string, action?: string }
71
+ if (p.kind !== 'analysis' || p.action === 'analysis.delete') return
72
+ liveCount.value++
73
+ if (refreshTimer) return
74
+ refreshTimer = setTimeout(() => {
75
+ refreshTimer = null
76
+ void doQuery()
77
+ }, 800)
78
+ })
79
+ onScopeDispose(() => {
80
+ unsubscribe()
81
+ if (refreshTimer) clearTimeout(refreshTimer)
82
+ })
83
+
84
+ return { q, hasFilter, rows, loading, error, liveCount, doQuery, resetFilters }
85
+ }
@@ -1,92 +1,128 @@
1
- <template>
2
- <div class="page">
3
- <!-- 页头(aw-page-head 规范)+ 实时轨计数 -->
4
- <AnalysisPageHead :live-count="feed.liveCount.value" />
5
-
6
- <!-- 筛选:产线 / 类别 / 时间窗 / 关键词 -->
7
- <AnalysisFilterCard
8
- v-model:line-id="feed.q.lineId"
9
- v-model:category="feed.q.category"
10
- v-model:preset="feed.q.preset"
11
- v-model:text="feed.q.text"
12
- :has-filter="feed.hasFilter.value"
13
- :loading="feed.loading.value"
14
- @query="feed.doQuery"
15
- @reset="feed.resetFilters"
16
- />
17
-
18
- <!-- 分析报告台账:REST 快照为底,analysis 留痕 WS 帧去抖刷新;admin 可删(清污数据) -->
19
- <AnalysisTable
20
- v-model:expanded-id="expandedId"
21
- :rows="feed.rows.value"
22
- :loading="feed.loading.value"
23
- :error="feed.error.value"
24
- :admin="userStore.isAdmin"
25
- @toggle="toggleRow"
26
- @remove="removeReport"
27
- />
28
- </div>
29
- </template>
30
-
31
- <script setup lang="ts">
32
- /**
33
- * 数据分析页 —— Agent Channel 分析产出的持久留痕台账(append-only)。
34
- *
35
- * 数据权威在 server analysis_reports 表:GET /api/workshop/analysis 按维度查询;
36
- * 实时面是 TownBus 旁路的 ops.log 帧(kind='analysis',analysis_save 的 recordOps 广播),
37
- * 收到帧后去抖拉快照。留痕由 Agent 经 analysis_save 原生工具写入,页面纯只读
38
- * (清污数据走 admin 的 DELETE /api/workshop/analysis/:id)。
39
- * 数据面在 composables/useAnalysisFeed,展示在 components/analysis/*
40
- * (app/pages 下任何 .vue 都会成为路由,页面私有子组件不放这里)。
41
- */
42
- import { onMounted, ref } from 'vue'
43
- import { useUserStore } from '~/stores/workshop/user'
44
- import { useWorkshopWs } from '@/app/composables/workshop/useWorkshopWs'
45
- import { apiFetch } from '@/app/composables/workshop/apiClient'
46
- import { apiErrorMessage } from '@/app/utils/api-error'
47
- import { useAnalysisFeed } from './composables/useAnalysisFeed'
48
- import type { AnalysisReportView } from './types'
49
- import AnalysisPageHead from '~/components/analysis/AnalysisPageHead.vue'
50
- import AnalysisFilterCard from '~/components/analysis/AnalysisFilterCard.vue'
51
- import AnalysisTable from '~/components/analysis/AnalysisTable.vue'
52
-
53
- const ws = useWorkshopWs()
54
- const feed = useAnalysisFeed()
55
- const userStore = useUserStore()
56
- const expandedId = ref('')
57
-
58
- function toggleRow(row: AnalysisReportView): void {
59
- expandedId.value = expandedId.value === row.id ? '' : row.id
60
- }
61
-
62
- /** 管理面删除(仅 admin;REST 侧 requireRole 兜底) */
63
- const removing = ref(false)
64
- async function removeReport(row: AnalysisReportView): Promise<void> {
65
- if (removing.value) return
66
- removing.value = true
67
- try {
68
- await apiFetch({ base: '/api/workshop/analysis', path: `/${row.id}`, init: { method: 'DELETE' } })
69
- if (expandedId.value === row.id) expandedId.value = ''
70
- await feed.doQuery()
71
- }
72
- catch (err) {
73
- feed.error.value = apiErrorMessage(err)
74
- }
75
- finally {
76
- removing.value = false
77
- }
78
- }
79
-
80
- onMounted(() => {
81
- ws.ensureConnected()
82
- void feed.doQuery()
83
- })
84
- </script>
85
-
86
- <script lang="ts">
87
- export default { name: 'AnalysisPage' }
88
- </script>
89
-
90
- <style scoped>
91
- .page { display: flex; flex-direction: column; gap: 12px; }
92
- </style>
1
+ <template>
2
+ <div class="page">
3
+ <!-- 页头(aw-page-head 规范)+ 实时轨计数 -->
4
+ <AnalysisPageHead :live-count="feed.liveCount.value" />
5
+
6
+ <!-- 筛选:产线 / 类别 / 时间窗 / 关键词 -->
7
+ <AnalysisFilterCard
8
+ v-model:line-id="feed.q.lineId"
9
+ v-model:category="feed.q.category"
10
+ v-model:preset="feed.q.preset"
11
+ v-model:text="feed.q.text"
12
+ :has-filter="feed.hasFilter.value"
13
+ :loading="feed.loading.value"
14
+ @query="feed.doQuery"
15
+ @reset="feed.resetFilters"
16
+ />
17
+
18
+ <!-- 分析报告台账:REST 快照为底,analysis 留痕 WS 帧去抖刷新;admin 可删,canEdit 可修订 -->
19
+ <AnalysisTable
20
+ v-model:expanded-id="expandedId"
21
+ :rows="feed.rows.value"
22
+ :loading="feed.loading.value"
23
+ :error="feed.error.value"
24
+ :admin="userStore.isAdmin"
25
+ @toggle="toggleRow"
26
+ @remove="removeReport"
27
+ @edit="openEdit"
28
+ />
29
+
30
+ <!-- 人工修订弹窗(v27 编辑面;canEdit 行可见) -->
31
+ <AnalysisEditModal
32
+ :report="editing"
33
+ :saving="savingEdit"
34
+ @close="editing = null"
35
+ @save="saveEdit"
36
+ />
37
+ </div>
38
+ </template>
39
+
40
+ <script setup lang="ts">
41
+ /**
42
+ * 数据分析页 —— Agent Channel 分析产出的持久留痕台账(append-only)。
43
+ *
44
+ * 数据权威在 server analysis_reports 表:GET /api/workshop/analysis 按维度查询;
45
+ * 实时面是 TownBus 旁路的 ops.log 帧(kind='analysis',analysis_save 的 recordOps 广播),
46
+ * 收到帧后去抖拉快照。留痕由 Agent 经 analysis_save 原生工具写入,页面纯只读
47
+ * (清污数据走 admin 的 DELETE /api/workshop/analysis/:id)。
48
+ * 数据面在 composables/useAnalysisFeed,展示在 components/analysis/*
49
+ * (app/pages 下任何 .vue 都会成为路由,页面私有子组件不放这里)。
50
+ */
51
+ import { onMounted, ref } from 'vue'
52
+ import { useUserStore } from '~/stores/workshop/user'
53
+ import { useWorkshopWs } from '@/app/composables/workshop/useWorkshopWs'
54
+ import { apiFetch } from '@/app/composables/workshop/apiClient'
55
+ import { apiErrorMessage } from '@/app/utils/api-error'
56
+ import { useAnalysisFeed } from './composables/useAnalysisFeed'
57
+ import type { AnalysisReportView } from './types'
58
+ import AnalysisPageHead from '~/components/analysis/AnalysisPageHead.vue'
59
+ import AnalysisFilterCard from '~/components/analysis/AnalysisFilterCard.vue'
60
+ import AnalysisTable from '~/components/analysis/AnalysisTable.vue'
61
+ import AnalysisEditModal from '~/components/analysis/AnalysisEditModal.vue'
62
+
63
+ const ws = useWorkshopWs()
64
+ const feed = useAnalysisFeed()
65
+ const userStore = useUserStore()
66
+ const expandedId = ref('')
67
+
68
+ function toggleRow(row: AnalysisReportView): void {
69
+ expandedId.value = expandedId.value === row.id ? '' : row.id
70
+ }
71
+
72
+ /** 管理面删除(仅 admin;REST 侧 requireRole 兜底) */
73
+ const removing = ref(false)
74
+ async function removeReport(row: AnalysisReportView): Promise<void> {
75
+ if (removing.value) return
76
+ removing.value = true
77
+ try {
78
+ await apiFetch({ base: '/api/workshop/analysis', path: `/${row.id}`, init: { method: 'DELETE' } })
79
+ if (expandedId.value === row.id) expandedId.value = ''
80
+ await feed.doQuery()
81
+ }
82
+ catch (err) {
83
+ feed.error.value = apiErrorMessage(err)
84
+ }
85
+ finally {
86
+ removing.value = false
87
+ }
88
+ }
89
+
90
+ /** 人工修订(v27 编辑面):弹窗预填 → PATCH → 刷新(服务端按 canEdit 同口径鉴权) */
91
+ const editing = ref<AnalysisReportView | null>(null)
92
+ const savingEdit = ref(false)
93
+ function openEdit(row: AnalysisReportView): void {
94
+ editing.value = row
95
+ }
96
+ async function saveEdit(patch: Record<string, unknown>): Promise<void> {
97
+ if (!editing.value || savingEdit.value) return
98
+ savingEdit.value = true
99
+ try {
100
+ await apiFetch({
101
+ base: '/api/workshop/analysis',
102
+ path: `/${editing.value.id}`,
103
+ init: { method: 'PATCH', body: JSON.stringify(patch) },
104
+ })
105
+ editing.value = null
106
+ await feed.doQuery()
107
+ }
108
+ catch (err) {
109
+ feed.error.value = apiErrorMessage(err)
110
+ }
111
+ finally {
112
+ savingEdit.value = false
113
+ }
114
+ }
115
+
116
+ onMounted(() => {
117
+ ws.ensureConnected()
118
+ void feed.doQuery()
119
+ })
120
+ </script>
121
+
122
+ <script lang="ts">
123
+ export default { name: 'AnalysisPage' }
124
+ </script>
125
+
126
+ <style scoped>
127
+ .page { display: flex; flex-direction: column; gap: 12px; }
128
+ </style>
@@ -1,44 +1,50 @@
1
- /**
2
- * 数据分析页的类型面(与 server/services/workshop/analysis/analysis.repo.ts 的
3
- * AnalysisReportRow 驼峰投影一致;JSON 列已在服务端解析)。
4
- */
5
-
6
- /** 分析类别(与 analysis_save 工具描述的建议档一致;自由面,未知类别按原文展示) */
7
- export type AnalysisCategory = 'quality' | 'oee' | 'alarm' | 'trend' | 'optimization' | 'general'
8
-
9
- export const ANALYSIS_CATEGORIES: AnalysisCategory[] = ['quality', 'oee', 'alarm', 'trend', 'optimization', 'general']
10
-
11
- /** 时间窗预设(前端算 fromMs;all = 不限) */
12
- export type AnalysisWindowPreset = '1h' | '24h' | '7d' | '30d' | 'all'
13
-
14
- export const ANALYSIS_WINDOW_PRESETS: { key: AnalysisWindowPreset, ms: number | null }[] = [
15
- { key: '1h', ms: 3_600_000 },
16
- { key: '24h', ms: 86_400_000 },
17
- { key: '7d', ms: 7 * 86_400_000 },
18
- { key: '30d', ms: 30 * 86_400_000 },
19
- { key: 'all', ms: null },
20
- ]
21
-
22
- export interface AnalysisReportView {
23
- id: string
24
- lineId: string
25
- lineName: string
26
- title: string
27
- category: string
28
- /** 一句话关键结论 */
29
- summary: string
30
- conclusions: string[]
31
- report: string
32
- metrics: Record<string, unknown>
33
- recipeId: string
34
- recipeVersion: string
35
- windowFrom: string | null
36
- windowTo: string | null
37
- dataSources: string
38
- context: Record<string, unknown>
39
- channelId: string
40
- channelName: string
41
- actor: string
42
- actorName: string
43
- createdAt: string
44
- }
1
+ /**
2
+ * 数据分析页的类型面(与 server/services/workshop/analysis/analysis.repo.ts 的
3
+ * AnalysisReportRow 驼峰投影一致;JSON 列已在服务端解析)。
4
+ */
5
+
6
+ /** 分析类别(与 analysis_save 工具描述的建议档一致;自由面,未知类别按原文展示) */
7
+ export type AnalysisCategory = 'quality' | 'oee' | 'alarm' | 'trend' | 'optimization' | 'general'
8
+
9
+ export const ANALYSIS_CATEGORIES: AnalysisCategory[] = ['quality', 'oee', 'alarm', 'trend', 'optimization', 'general']
10
+
11
+ /** 时间窗预设(前端算 fromMs;all = 不限) */
12
+ export type AnalysisWindowPreset = '1h' | '24h' | '7d' | '30d' | 'all'
13
+
14
+ export const ANALYSIS_WINDOW_PRESETS: { key: AnalysisWindowPreset, ms: number | null }[] = [
15
+ { key: '1h', ms: 3_600_000 },
16
+ { key: '24h', ms: 86_400_000 },
17
+ { key: '7d', ms: 7 * 86_400_000 },
18
+ { key: '30d', ms: 30 * 86_400_000 },
19
+ { key: 'all', ms: null },
20
+ ]
21
+
22
+ export interface AnalysisReportView {
23
+ id: string
24
+ lineId: string
25
+ lineName: string
26
+ title: string
27
+ category: string
28
+ /** 一句话关键结论 */
29
+ summary: string
30
+ conclusions: string[]
31
+ report: string
32
+ metrics: Record<string, unknown>
33
+ recipeId: string
34
+ recipeVersion: string
35
+ windowFrom: string | null
36
+ windowTo: string | null
37
+ dataSources: string
38
+ context: Record<string, unknown>
39
+ channelId: string
40
+ channelName: string
41
+ actor: string
42
+ actorName: string
43
+ createdAt: string
44
+ /** v27 人工修订归因(未修订 = null/空) */
45
+ updatedAt: string | null
46
+ updatedBy: string
47
+ updatedByName: string
48
+ /** 编辑能力位(服务端按 admin/产线 operate 判定) */
49
+ canEdit?: boolean
50
+ }
@@ -881,6 +881,14 @@ export default {
881
881
  remove: 'Delete',
882
882
  removeConfirm: 'Delete analysis report "{p0}"? This cannot be undone',
883
883
  cancel: 'Cancel',
884
+ editTitle: 'Revise analysis report',
885
+ save: 'Save revision',
886
+ kRecipe: 'Recipe ID',
887
+ kVersion: 'Recipe version',
888
+ kWindowFrom: 'Data window from',
889
+ kWindowTo: 'Data window to',
890
+ conclusionsHint: 'one per line',
891
+ kRevised: 'Revised',
884
892
  thTime: 'Analyzed At',
885
893
  thLine: 'Line',
886
894
  thTitle: 'Title',
@@ -881,6 +881,14 @@ export default {
881
881
  remove: '删除',
882
882
  removeConfirm: '删除分析报告「{p0}」?删除后不可恢复',
883
883
  cancel: '取消',
884
+ editTitle: '修订分析报告',
885
+ save: '保存修订',
886
+ kRecipe: '配方 id',
887
+ kVersion: '配方版本',
888
+ kWindowFrom: '数据窗起点',
889
+ kWindowTo: '数据窗终点',
890
+ conclusionsHint: '每行一条',
891
+ kRevised: '修订记录',
884
892
  thTime: '分析时间',
885
893
  thLine: '产线',
886
894
  thTitle: '标题',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentworkshop",
3
- "version": "0.7.60",
3
+ "version": "0.7.62",
4
4
  "type": "module",
5
5
  "description": "AgentWorkShop 软件开发系统 - 基于 Nuxt 4 的配置驱动运行范式",
6
6
  "license": "Apache-2.0",
@@ -1,30 +1,30 @@
1
- /**
2
- * DELETE /api/workshop/analysis/:id —— 删除分析报告(仅 admin;台账 Agent 面无删,清污数据走此口)。
3
- */
4
- import { getRouterParam } from 'h3'
5
- import { requireRole } from '@/server/api/workshop/caller'
6
- import { defineApiHandler } from '@/server/utils/response'
7
- import { AppError } from '@/server/utils/errors'
8
- import { getAnalysisRepo } from '@/server/services/workshop/analysis/analysis.repo'
9
- import { recordOps } from '@/server/services/workshop/ops/ops'
10
-
11
- export default defineApiHandler(async (event) => {
12
- const user = requireRole(event)
13
- const id = getRouterParam(event, 'id')!
14
- const report = getAnalysisRepo().get(id)
15
- if (!report) throw new AppError(404, 'NOT_FOUND', `分析报告不存在: ${id}`)
16
- getAnalysisRepo().remove(id)
17
- recordOps({
18
- actor: user.id,
19
- actorName: user.name,
20
- actorKind: 'user',
21
- action: 'analysis.delete',
22
- kind: 'analysis',
23
- targetKind: 'analysis',
24
- targetId: id,
25
- lineId: report.lineId,
26
- recipeId: report.recipeId,
27
- summary: `删除分析报告「${report.title}」(产线「${report.lineName || report.lineId || '-'}」)`,
28
- })
29
- return { ok: true }
30
- })
1
+ /**
2
+ * DELETE /api/workshop/analysis/:id —— 删除分析报告(仅 admin;台账 Agent 面无删,清污数据走此口)。
3
+ */
4
+ import { getRouterParam } from 'h3'
5
+ import { requireRole } from '@/server/api/workshop/caller'
6
+ import { defineApiHandler } from '@/server/utils/response'
7
+ import { AppError } from '@/server/utils/errors'
8
+ import { getAnalysisRepo } from '@/server/services/workshop/analysis/analysis.repo'
9
+ import { recordOps } from '@/server/services/workshop/ops/ops'
10
+
11
+ export default defineApiHandler(async (event) => {
12
+ const user = requireRole(event)
13
+ const id = getRouterParam(event, 'id')!
14
+ const report = getAnalysisRepo().get(id)
15
+ if (!report) throw new AppError(404, 'NOT_FOUND', `分析报告不存在: ${id}`)
16
+ getAnalysisRepo().remove(id)
17
+ recordOps({
18
+ actor: user.id,
19
+ actorName: user.name,
20
+ actorKind: 'user',
21
+ action: 'analysis.delete',
22
+ kind: 'analysis',
23
+ targetKind: 'analysis',
24
+ targetId: id,
25
+ lineId: report.lineId,
26
+ recipeId: report.recipeId,
27
+ summary: `删除分析报告「${report.title}」(产线「${report.lineName || report.lineId || '-'}」)`,
28
+ })
29
+ return { ok: true }
30
+ })
@@ -1,23 +1,25 @@
1
- /**
2
- * GET /api/workshop/analysis/:id —— 分析报告详情(含完整正文;产线可见性校验)。
3
- */
4
- import { getRouterParam } from 'h3'
5
- import { defineApiHandler } from '@/server/utils/response'
6
- import { AppError } from '@/server/utils/errors'
7
- import { resolveUser } from '@/server/api/workshop/caller'
8
- import { visibleLineIds } from '@/server/services/workshop/permissions'
9
- import { getAnalysisRepo } from '@/server/services/workshop/analysis/analysis.repo'
10
-
11
- export default defineApiHandler(async (event) => {
12
- const user = resolveUser(event)
13
- const id = getRouterParam(event, 'id')!
14
- const report = getAnalysisRepo().get(id)
15
- if (!report) throw new AppError(404, 'NOT_FOUND', `分析报告不存在: ${id}`)
16
- if (report.lineId) {
17
- const visible = visibleLineIds(user)
18
- if (visible && !visible.has(report.lineId)) {
19
- throw new AppError(403, 'LINE_FORBIDDEN', `无权查看产线「${report.lineName || report.lineId}」的分析报告`)
20
- }
21
- }
22
- return { report }
23
- })
1
+ /**
2
+ * GET /api/workshop/analysis/:id —— 分析报告详情(含完整正文;产线可见性校验)。
3
+ */
4
+ import { getRouterParam } from 'h3'
5
+ import { defineApiHandler } from '@/server/utils/response'
6
+ import { AppError } from '@/server/utils/errors'
7
+ import { resolveUser } from '@/server/api/workshop/caller'
8
+ import { visibleLineIds, lineMode } from '@/server/services/workshop/permissions'
9
+ import { getAnalysisRepo } from '@/server/services/workshop/analysis/analysis.repo'
10
+
11
+ export default defineApiHandler(async (event) => {
12
+ const user = resolveUser(event)
13
+ const id = getRouterParam(event, 'id')!
14
+ const report = getAnalysisRepo().get(id)
15
+ if (!report) throw new AppError(404, 'NOT_FOUND', `分析报告不存在: ${id}`)
16
+ if (report.lineId) {
17
+ const visible = visibleLineIds(user)
18
+ if (visible && !visible.has(report.lineId)) {
19
+ throw new AppError(403, 'LINE_FORBIDDEN', `无权查看产线「${report.lineName || report.lineId}」的分析报告`)
20
+ }
21
+ }
22
+ // v27 编辑能力位(与列表端点同口径:admin 或产线 operate)
23
+ const canEdit = user.role === 'admin' || (Boolean(report.lineId) && lineMode(user, report.lineId) === 'operate')
24
+ return { report: { ...report, canEdit } }
25
+ })