agentworkshop 0.7.58 → 0.7.60

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 (545) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +108 -0
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +108 -0
  3. package/.output/.AgentWorkShop/schema.json +1 -0
  4. package/.output/nitro.json +1 -1
  5. package/.output/public/_nuxt/{CZwDnomB.js → 59a6cSgj.js} +1 -1
  6. package/.output/public/_nuxt/5juo_WO2.js +13 -0
  7. package/.output/public/_nuxt/9j2J4k4w.js +1 -0
  8. package/.output/public/_nuxt/B-WTxXEK2.js +1 -0
  9. package/.output/public/_nuxt/{DTx_DtUo.js → B0w8DZ4C.js} +1 -1
  10. package/.output/public/_nuxt/B1BCga5h2.js +13 -0
  11. package/.output/public/_nuxt/B5lMtA7I2.js +1 -0
  12. package/.output/public/_nuxt/B6_fJd2X.js +1 -0
  13. package/.output/public/_nuxt/B7K5B04W2.js +1 -0
  14. package/.output/public/_nuxt/B7KyS_q2.js +1 -0
  15. package/.output/public/_nuxt/B8q3BGY5.js +37 -0
  16. package/.output/public/_nuxt/B9IK8kDl2.js +1 -0
  17. package/.output/public/_nuxt/BFBysc2M2.js +1 -0
  18. package/.output/public/_nuxt/{BMUEVeOK.js → BGFhOMVM.js} +2 -2
  19. package/.output/public/_nuxt/{cBI0JqsV.js → BMlesJth.js} +1 -1
  20. package/.output/public/_nuxt/BNd2NDxg2.js +1 -0
  21. package/.output/public/_nuxt/BP629NAi.js +1 -0
  22. package/.output/public/_nuxt/BVinTfuN.js +1 -0
  23. package/.output/public/_nuxt/{DJZzthKt2.js → B_BYwIf22.js} +1 -1
  24. package/.output/public/_nuxt/{CW1HGp5X.js → B_JLVF30.js} +1 -1
  25. package/.output/public/_nuxt/BdE41Y_c.js +28 -0
  26. package/.output/public/_nuxt/Bdq2LNSO.js +1 -0
  27. package/.output/public/_nuxt/{BMZ1d25O.js → BeNdseTX.js} +1 -1
  28. package/.output/public/_nuxt/Be_StT8b2.js +1 -0
  29. package/.output/public/_nuxt/BhllzW3K2.js +1 -0
  30. package/.output/public/_nuxt/BjUpWKS6.js +1 -0
  31. package/.output/public/_nuxt/{CCCq9H7D2.js → BlEJRYAn2.js} +1 -1
  32. package/.output/public/_nuxt/{Du0zf-d3.js → BplhglEM.js} +1 -1
  33. package/.output/public/_nuxt/BsYEYxWv.js +24 -0
  34. package/.output/public/_nuxt/BtXwFpv42.js +1 -0
  35. package/.output/public/_nuxt/{BrFF_9742.js → BuNXYpib2.js} +1 -1
  36. package/.output/public/_nuxt/{BzKT-ne_2.js → C0sNwDTK2.js} +1 -1
  37. package/.output/public/_nuxt/{h46i74oE.js → C4AICl3l.js} +4 -4
  38. package/.output/public/_nuxt/{BuVH9MB-.js → C5OSTzBh.js} +1 -1
  39. package/.output/public/_nuxt/{DKhRushG.js → C8XVZGSZ.js} +1 -1
  40. package/.output/public/_nuxt/{zGDAozGA.js → C93LpBMF.js} +4 -4
  41. package/.output/public/_nuxt/CDaZC0_6.js +3 -0
  42. package/.output/public/_nuxt/CE43-V_L.js +2 -0
  43. package/.output/public/_nuxt/{B4R5CHkk.js → CEHT9inW.js} +1 -1
  44. package/.output/public/_nuxt/CGChCy-w2.js +1 -0
  45. package/.output/public/_nuxt/{DvUt9uMt2.js → CMDAjShv2.js} +1 -1
  46. package/.output/public/_nuxt/CUjdqsjC2.js +1 -0
  47. package/.output/public/_nuxt/CWfBtswB.js +70 -0
  48. package/.output/public/_nuxt/CYtH1bv2.js +1 -0
  49. package/.output/public/_nuxt/CZmMgjIK.js +1 -0
  50. package/.output/public/_nuxt/{iZa330UY.js → Cdw4juXw.js} +1 -1
  51. package/.output/public/_nuxt/{DMPpE41S2.js → Ce5SiMQR2.js} +1 -1
  52. package/.output/public/_nuxt/{B03LfmKR.js → Cfp00Rdo.js} +1 -1
  53. package/.output/public/_nuxt/{Dy-V8OEW2.js → CgbP5yJk2.js} +7 -7
  54. package/.output/public/_nuxt/ChPNKPw_.js +1 -0
  55. package/.output/public/_nuxt/{C5wBzGO7.js → CjeMxUv8.js} +1 -1
  56. package/.output/public/_nuxt/CktUrk8z.js +1 -0
  57. package/.output/public/_nuxt/Cst8yEet.js +1 -0
  58. package/.output/public/_nuxt/Cuw2--X2.js +2 -0
  59. package/.output/public/_nuxt/Cyd68Xbv2.js +1 -0
  60. package/.output/public/_nuxt/{pNy4V4kd.js → Cyuxcv5s2.js} +1 -1
  61. package/.output/public/_nuxt/{CIz7SM4H.js → D0vmf1z9.js} +1 -1
  62. package/.output/public/_nuxt/D5-QB_-l.js +1 -0
  63. package/.output/public/_nuxt/D9sgxxsM2.js +1 -0
  64. package/.output/public/_nuxt/DBdwjOGB2.js +1 -0
  65. package/.output/public/_nuxt/DBzdrPzw2.js +1 -0
  66. package/.output/public/_nuxt/DD4J2Otc.js +1 -0
  67. package/.output/public/_nuxt/DMCoWgSb2.js +1 -0
  68. package/.output/public/_nuxt/{CmTqFlYZ.js → DTcsb0fG.js} +1 -1
  69. package/.output/public/_nuxt/Ddc_Pn7D.js +19 -0
  70. package/.output/public/_nuxt/Dg1iMuZ-.js +1 -0
  71. package/.output/public/_nuxt/DhSlJyZD2.js +1 -0
  72. package/.output/public/_nuxt/DmwMkvoQ2.js +1 -0
  73. package/.output/public/_nuxt/EQijmkCh2.js +1 -0
  74. package/.output/public/_nuxt/KXQppTXc.js +1 -0
  75. package/.output/public/_nuxt/{CZ0Gt81h.js → KXvRkBgg.js} +2 -2
  76. package/.output/public/_nuxt/LwITbamf2.js +47 -0
  77. package/.output/public/_nuxt/N9TYd_Mk2.js +1 -0
  78. package/.output/public/_nuxt/VeOVO2sE2.js +1 -0
  79. package/.output/public/_nuxt/_jfzcYrl.js +1 -0
  80. package/.output/public/_nuxt/analysis.D2Pao1rm.css +1 -0
  81. package/.output/public/_nuxt/builds/latest.json +1 -1
  82. package/.output/public/_nuxt/builds/meta/f78a1992-e424-494d-ac4b-aa18971ffc10.json +1 -0
  83. package/.output/public/_nuxt/{default.8ac6QU28.css → default.Bx6RJSbr.css} +1 -1
  84. package/.output/public/_nuxt/{entry.BHNNQA9H.css → entry.BlbU43qz.css} +1 -1
  85. package/.output/public/_nuxt/{MEwEMEMl2.js → iCvdSYYN2.js} +6 -6
  86. package/.output/public/_nuxt/{CYGkUj5M2.js → p2sDc0tO2.js} +1 -1
  87. package/.output/public/_nuxt/{Drhta6gr.js → zVupTo2z2.js} +2 -2
  88. package/.output/server/chunks/_/LeftOutlined.mjs +1 -1
  89. package/.output/server/chunks/_/character-asset.repo.mjs +1 -1
  90. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  91. package/.output/server/chunks/_/nitro.mjs +1629 -1246
  92. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  93. package/.output/server/chunks/_/scene-layout.repo.mjs +1 -1
  94. package/.output/server/chunks/build/{AuthGate-DDPYswkA.mjs → AuthGate-CZYkvPrg.mjs} +5 -5
  95. package/.output/server/chunks/build/{AuthGate-DDPYswkA.mjs.map → AuthGate-CZYkvPrg.mjs.map} +1 -1
  96. package/.output/server/chunks/build/Checkbox-4EdGAAl_.mjs +1 -1
  97. package/.output/server/chunks/build/{FormItemContext-4ORSzhWv.mjs → FormItemContext-DcWIIAaK.mjs} +2 -2
  98. package/.output/server/chunks/build/{FormItemContext-4ORSzhWv.mjs.map → FormItemContext-DcWIIAaK.mjs.map} +1 -1
  99. package/.output/server/chunks/build/{OmpTerminalPanel-DZ2wHMS1.mjs → OmpTerminalPanel-CtFJ6Kc8.mjs} +4 -4
  100. package/.output/server/chunks/build/{OmpTerminalPanel-DZ2wHMS1.mjs.map → OmpTerminalPanel-CtFJ6Kc8.mjs.map} +1 -1
  101. package/.output/server/chunks/build/{PluginSlot-CT4YaNrB.mjs → PluginSlot-BT7kYQgK.mjs} +2 -2
  102. package/.output/server/chunks/build/{PluginSlot-CT4YaNrB.mjs.map → PluginSlot-BT7kYQgK.mjs.map} +1 -1
  103. package/.output/server/chunks/build/{TownView-CZbFn6mO.mjs → TownView-kQZFf4zj.mjs} +3 -3
  104. package/.output/server/chunks/build/{TownView-CZbFn6mO.mjs.map → TownView-kQZFf4zj.mjs.map} +1 -1
  105. package/.output/server/chunks/build/{_id_-Df2pgsAq.mjs → _id_-Bbx1b74O.mjs} +3 -3
  106. package/.output/server/chunks/build/{_id_-Df2pgsAq.mjs.map → _id_-Bbx1b74O.mjs.map} +1 -1
  107. package/.output/server/chunks/build/{_id_-CCVhpJtj.mjs → _id_-IijrRw3f.mjs} +3 -3
  108. package/.output/server/chunks/build/{_id_-CCVhpJtj.mjs.map → _id_-IijrRw3f.mjs.map} +1 -1
  109. package/.output/server/chunks/build/{_wsId_-CJqF-hmP.mjs → _wsId_-DOEw9jgZ.mjs} +22 -21
  110. package/.output/server/chunks/build/{_wsId_-CJqF-hmP.mjs.map → _wsId_-DOEw9jgZ.mjs.map} +1 -1
  111. package/.output/server/chunks/build/{agents-BTsbna5H.mjs → agents-C36wR56A.mjs} +18 -17
  112. package/.output/server/chunks/build/agents-C36wR56A.mjs.map +1 -0
  113. package/.output/server/chunks/build/{aml-BBKfWto1.mjs → aml-CBGndvHT.mjs} +7 -7
  114. package/.output/server/chunks/build/{aml-BBKfWto1.mjs.map → aml-CBGndvHT.mjs.map} +1 -1
  115. package/.output/server/chunks/build/analysis-tgzvOWmD.mjs +332 -0
  116. package/.output/server/chunks/build/analysis-tgzvOWmD.mjs.map +1 -0
  117. package/.output/server/chunks/build/{card-DJOYGuVH.mjs → card-Db7OB49d.mjs} +4 -4
  118. package/.output/server/chunks/build/{card-DJOYGuVH.mjs.map → card-Db7OB49d.mjs.map} +1 -1
  119. package/.output/server/chunks/build/{channel-templates-BPKJ8e4l.mjs → channel-templates-BixUrDmU.mjs} +11 -10
  120. package/.output/server/chunks/build/channel-templates-BixUrDmU.mjs.map +1 -0
  121. package/.output/server/chunks/build/{checkbox-C4AKj81e.mjs → checkbox-CyF96D30.mjs} +3 -3
  122. package/.output/server/chunks/build/{checkbox-C4AKj81e.mjs.map → checkbox-CyF96D30.mjs.map} +1 -1
  123. package/.output/server/chunks/build/{daq-Cz7TaUAM.mjs → daq-DLMLufDq.mjs} +5 -5
  124. package/.output/server/chunks/build/{daq-Cz7TaUAM.mjs.map → daq-DLMLufDq.mjs.map} +1 -1
  125. package/.output/server/chunks/build/dcw-EhjJpVQM.mjs +2 -2
  126. package/.output/server/chunks/build/{default-DweMY872.mjs → default-C7Qmdyz_.mjs} +30 -19
  127. package/.output/server/chunks/build/{default-DweMY872.mjs.map → default-C7Qmdyz_.mjs.map} +1 -1
  128. package/.output/server/chunks/build/{descriptions-CFaUq4y4.mjs → descriptions-1bH81YsZ.mjs} +2 -2
  129. package/.output/server/chunks/build/{descriptions-CFaUq4y4.mjs.map → descriptions-1bH81YsZ.mjs.map} +1 -1
  130. package/.output/server/chunks/build/{drawer-Cfh9_zft.mjs → drawer-C7shdEHy.mjs} +2 -2
  131. package/.output/server/chunks/build/{drawer-Cfh9_zft.mjs.map → drawer-C7shdEHy.mjs.map} +1 -1
  132. package/.output/server/chunks/build/{dropdown-CIsqbX4P.mjs → dropdown-BhLSIp5A.mjs} +2 -2
  133. package/.output/server/chunks/build/{dropdown-CIsqbX4P.mjs.map → dropdown-BhLSIp5A.mjs.map} +1 -1
  134. package/.output/server/chunks/build/{dropdown-CV9GW3z9.mjs → dropdown-BiwcuXDi.mjs} +6 -5
  135. package/.output/server/chunks/build/{dropdown-CV9GW3z9.mjs.map → dropdown-BiwcuXDi.mjs.map} +1 -1
  136. package/.output/server/chunks/build/{form-cs_RcfGx.mjs → form-nE8C0G8B.mjs} +7 -6
  137. package/.output/server/chunks/build/{form-cs_RcfGx.mjs.map → form-nE8C0G8B.mjs.map} +1 -1
  138. package/.output/server/chunks/build/{input-CobQ5LJ5.mjs → input-DwF72eVI.mjs} +93 -3449
  139. package/.output/server/chunks/build/input-DwF72eVI.mjs.map +1 -0
  140. package/.output/server/chunks/build/{input-number-BpPYAWMk.mjs → input-number-TSq6ltkz.mjs} +6 -5
  141. package/.output/server/chunks/build/{input-number-BpPYAWMk.mjs.map → input-number-TSq6ltkz.mjs.map} +1 -1
  142. package/.output/server/chunks/build/{logs-As9fZqU-.mjs → logs-hOEVuxqm.mjs} +3 -3
  143. package/.output/server/chunks/build/{logs-As9fZqU-.mjs.map → logs-hOEVuxqm.mjs.map} +1 -1
  144. package/.output/server/chunks/build/{menu-CVmvHyFT.mjs → menu-Cy5Nrecn.mjs} +4 -3
  145. package/.output/server/chunks/build/{menu-CVmvHyFT.mjs.map → menu-Cy5Nrecn.mjs.map} +1 -1
  146. package/.output/server/chunks/build/{monitor-CdFQ2z4g.mjs → monitor-CfVoiavp.mjs} +20 -19
  147. package/.output/server/chunks/build/{monitor-CdFQ2z4g.mjs.map → monitor-CfVoiavp.mjs.map} +1 -1
  148. package/.output/server/chunks/build/{operations-B2gHCWgZ.mjs → operations-fxI8lEBJ.mjs} +3 -3
  149. package/.output/server/chunks/build/{operations-B2gHCWgZ.mjs.map → operations-fxI8lEBJ.mjs.map} +1 -1
  150. package/.output/server/chunks/build/{pages-BItCt1ar.mjs → pages-6JD9VSbx.mjs} +5 -5
  151. package/.output/server/chunks/build/{pages-BItCt1ar.mjs.map → pages-6JD9VSbx.mjs.map} +1 -1
  152. package/.output/server/chunks/build/{permissions-D6mQw_9j.mjs → permissions-XPtQJSaO.mjs} +14 -13
  153. package/.output/server/chunks/build/permissions-XPtQJSaO.mjs.map +1 -0
  154. package/.output/server/chunks/build/{plugins-NAS9MQ5r.mjs → plugins-DjBSG9pV.mjs} +5 -5
  155. package/.output/server/chunks/build/{plugins-NAS9MQ5r.mjs.map → plugins-DjBSG9pV.mjs.map} +1 -1
  156. package/.output/server/chunks/build/{popconfirm-DFfoFhmt.mjs → popconfirm-DKeEbaGd.mjs} +3 -3
  157. package/.output/server/chunks/build/{popconfirm-DFfoFhmt.mjs.map → popconfirm-DKeEbaGd.mjs.map} +1 -1
  158. package/.output/server/chunks/build/{schedules-BjWNDWL5.mjs → schedules-PcDLCUWN.mjs} +20 -19
  159. package/.output/server/chunks/build/{schedules-BjWNDWL5.mjs.map → schedules-PcDLCUWN.mjs.map} +1 -1
  160. package/.output/server/chunks/build/{segmented-D7FkCgg7.mjs → segmented-BdWCdZUM.mjs} +3 -3
  161. package/.output/server/chunks/build/{segmented-D7FkCgg7.mjs.map → segmented-BdWCdZUM.mjs.map} +1 -1
  162. package/.output/server/chunks/build/{select-FqBNxgxT.mjs → select-C5yighj8.mjs} +5 -4
  163. package/.output/server/chunks/build/{select-FqBNxgxT.mjs.map → select-C5yighj8.mjs.map} +1 -1
  164. package/.output/server/chunks/build/{settings-Cl_KRyEn.mjs → settings-90zT_h9w.mjs} +14 -13
  165. package/.output/server/chunks/build/settings-90zT_h9w.mjs.map +1 -0
  166. package/.output/server/chunks/build/{space-B2uhHJG8.mjs → space-BCffbXIG.mjs} +3 -3
  167. package/.output/server/chunks/build/{space-B2uhHJG8.mjs.map → space-BCffbXIG.mjs.map} +1 -1
  168. package/.output/server/chunks/build/{switch-DZAUIbIN.mjs → switch-OG0SM_Px.mjs} +3 -3
  169. package/.output/server/chunks/build/{switch-DZAUIbIN.mjs.map → switch-OG0SM_Px.mjs.map} +1 -1
  170. package/.output/server/chunks/build/{table-CeOYERqr.mjs → table-UpVzu50c.mjs} +11 -10
  171. package/.output/server/chunks/build/{table-CeOYERqr.mjs.map → table-UpVzu50c.mjs.map} +1 -1
  172. package/.output/server/chunks/build/{tabs-LLNSdLl2.mjs → tabs-CWwoL33v.mjs} +6 -5
  173. package/.output/server/chunks/build/{tabs-LLNSdLl2.mjs.map → tabs-CWwoL33v.mjs.map} +1 -1
  174. package/.output/server/chunks/build/{tag-Dwvkh0Dj.mjs → tag-CS7mwrfG.mjs} +5 -4
  175. package/.output/server/chunks/build/{tag-Dwvkh0Dj.mjs.map → tag-CS7mwrfG.mjs.map} +1 -1
  176. package/.output/server/chunks/build/{teams-CGDZHaQl.mjs → teams-BIAFvRw1.mjs} +19 -18
  177. package/.output/server/chunks/build/teams-BIAFvRw1.mjs.map +1 -0
  178. package/.output/server/chunks/build/{tokens-BOYkZuoB.mjs → tokens-CLpdrzQ7.mjs} +19 -18
  179. package/.output/server/chunks/build/tokens-CLpdrzQ7.mjs.map +1 -0
  180. package/.output/server/chunks/build/tooltip-CJlH_8ZK.mjs +3362 -0
  181. package/.output/server/chunks/build/tooltip-CJlH_8ZK.mjs.map +1 -0
  182. package/.output/server/chunks/build/town-BV-hbwb5.mjs +1 -1
  183. package/.output/server/chunks/build/{town-P1rYoi0v.mjs → town-Bfme7P2I.mjs} +5 -5
  184. package/.output/server/chunks/build/{town-P1rYoi0v.mjs.map → town-Bfme7P2I.mjs.map} +1 -1
  185. package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
  186. package/.output/server/chunks/build/types-DWqIeMRP.mjs +75 -0
  187. package/.output/server/chunks/build/types-DWqIeMRP.mjs.map +1 -0
  188. package/.output/server/chunks/build/{useAgentTemplateActions-DsBRUQni.mjs → useAgentTemplateActions-6VyAHgu5.mjs} +1 -1
  189. package/.output/server/chunks/build/{useAgentTemplateActions-DsBRUQni.mjs.map → useAgentTemplateActions-6VyAHgu5.mjs.map} +1 -1
  190. package/.output/server/chunks/build/{useAgentTemplateForm-DzQ_t2Ue.mjs → useAgentTemplateForm-DWa-ezNq.mjs} +1 -1
  191. package/.output/server/chunks/build/{useAgentTemplateForm-DzQ_t2Ue.mjs.map → useAgentTemplateForm-DWa-ezNq.mjs.map} +1 -1
  192. package/.output/server/chunks/build/{useAmlEntities-BMLHU_39.mjs → useAmlEntities-Co2fgjzh.mjs} +1 -1
  193. package/.output/server/chunks/build/{useAmlEntities-BMLHU_39.mjs.map → useAmlEntities-Co2fgjzh.mjs.map} +1 -1
  194. package/.output/server/chunks/build/{useAmlEnv-DdlyVzPu.mjs → useAmlEnv-JTiWPrzH.mjs} +1 -1
  195. package/.output/server/chunks/build/{useAmlEnv-DdlyVzPu.mjs.map → useAmlEnv-JTiWPrzH.mjs.map} +1 -1
  196. package/.output/server/chunks/build/{useAmlJobs-BG_v21hJ.mjs → useAmlJobs-By4pjOzc.mjs} +1 -1
  197. package/.output/server/chunks/build/{useAmlJobs-BG_v21hJ.mjs.map → useAmlJobs-By4pjOzc.mjs.map} +1 -1
  198. package/.output/server/chunks/build/{useAmlModels-D7MuOWOy.mjs → useAmlModels-B1_5vjMA.mjs} +1 -1
  199. package/.output/server/chunks/build/{useAmlModels-D7MuOWOy.mjs.map → useAmlModels-B1_5vjMA.mjs.map} +1 -1
  200. package/.output/server/chunks/build/{useAmlNotes-CTZe-GI0.mjs → useAmlNotes-5uwvCb3h.mjs} +1 -1
  201. package/.output/server/chunks/build/{useAmlNotes-CTZe-GI0.mjs.map → useAmlNotes-5uwvCb3h.mjs.map} +1 -1
  202. package/.output/server/chunks/build/{useAmlPredict-BToRrVRV.mjs → useAmlPredict-lxUv7lAO.mjs} +1 -1
  203. package/.output/server/chunks/build/{useAmlPredict-BToRrVRV.mjs.map → useAmlPredict-lxUv7lAO.mjs.map} +1 -1
  204. package/.output/server/chunks/build/useAnalysisFeed-B4OwUd7p.mjs +128 -0
  205. package/.output/server/chunks/build/useAnalysisFeed-B4OwUd7p.mjs.map +1 -0
  206. package/.output/server/chunks/build/useDaqAddNode-CaOCbe4-.mjs +1 -1
  207. package/.output/server/chunks/build/{useDaqDetailNode-DXgwAu5u.mjs → useDaqDetailNode-DtZ0oDAn.mjs} +3 -3
  208. package/.output/server/chunks/build/{useDaqDetailNode-DXgwAu5u.mjs.map → useDaqDetailNode-DtZ0oDAn.mjs.map} +1 -1
  209. package/.output/server/chunks/build/useDaqDetailParams-CrTMDs-2.mjs +1 -1
  210. package/.output/server/chunks/build/{useDaqFilters-Jx6EERfr.mjs → useDaqFilters-DYHGhECw.mjs} +3 -3
  211. package/.output/server/chunks/build/{useDaqFilters-Jx6EERfr.mjs.map → useDaqFilters-DYHGhECw.mjs.map} +1 -1
  212. package/.output/server/chunks/build/useDaqStream-DhzdoyIR.mjs +1 -1
  213. package/.output/server/chunks/build/useDaqTemplates-C7GzQmdJ.mjs +1 -1
  214. package/.output/server/chunks/build/{useDashboardData-Ce-EU5DJ.mjs → useDashboardData-B3lZjE7x.mjs} +3 -3
  215. package/.output/server/chunks/build/{useDashboardData-Ce-EU5DJ.mjs.map → useDashboardData-B3lZjE7x.mjs.map} +1 -1
  216. package/.output/server/chunks/build/useDcwAddNode-4mTPQ6T8.mjs +1 -1
  217. package/.output/server/chunks/build/{useDcwDetailScope-4j3B03Pi.mjs → useDcwDetailScope-BWH7jnVh.mjs} +2 -2
  218. package/.output/server/chunks/build/{useDcwDetailScope-4j3B03Pi.mjs.map → useDcwDetailScope-BWH7jnVh.mjs.map} +1 -1
  219. package/.output/server/chunks/build/useDcwStream-BXJ2V8HM.mjs +1 -1
  220. package/.output/server/chunks/build/{useLogsManual-CMjD62nt.mjs → useLogsManual-BLfiSU3u.mjs} +1 -1
  221. package/.output/server/chunks/build/{useLogsManual-CMjD62nt.mjs.map → useLogsManual-BLfiSU3u.mjs.map} +1 -1
  222. package/.output/server/chunks/build/{useMonitorData-D2gFSonG.mjs → useMonitorData-BZ6Z-Sy8.mjs} +1 -1
  223. package/.output/server/chunks/build/{useMonitorData-D2gFSonG.mjs.map → useMonitorData-BZ6Z-Sy8.mjs.map} +1 -1
  224. package/.output/server/chunks/build/{useTeamActions-BOLQkYxg.mjs → useTeamActions-ahht5J8Y.mjs} +1 -1
  225. package/.output/server/chunks/build/{useTeamActions-BOLQkYxg.mjs.map → useTeamActions-ahht5J8Y.mjs.map} +1 -1
  226. package/.output/server/chunks/build/{useTeamAddMemberDialog-BCgrLPxI.mjs → useTeamAddMemberDialog-DvXxsVy0.mjs} +1 -1
  227. package/.output/server/chunks/build/{useTeamAddMemberDialog-BCgrLPxI.mjs.map → useTeamAddMemberDialog-DvXxsVy0.mjs.map} +1 -1
  228. package/.output/server/chunks/build/{useTeamCreateDialog-CJk40LqS.mjs → useTeamCreateDialog-A_k-XX5B.mjs} +1 -1
  229. package/.output/server/chunks/build/{useTeamCreateDialog-CJk40LqS.mjs.map → useTeamCreateDialog-A_k-XX5B.mjs.map} +1 -1
  230. package/.output/server/chunks/build/{useTeamDeployDialog-49hdUXQP.mjs → useTeamDeployDialog-CfAFjIr_.mjs} +1 -1
  231. package/.output/server/chunks/build/{useTeamDeployDialog-49hdUXQP.mjs.map → useTeamDeployDialog-CfAFjIr_.mjs.map} +1 -1
  232. package/.output/server/chunks/build/{useTeamPluginDialog-Dh-QOoiU.mjs → useTeamPluginDialog-Djmkk1Nl.mjs} +1 -1
  233. package/.output/server/chunks/build/{useTeamPluginDialog-Dh-QOoiU.mjs.map → useTeamPluginDialog-Djmkk1Nl.mjs.map} +1 -1
  234. package/.output/server/chunks/build/{useTokenCreate-DkYvEQUD.mjs → useTokenCreate-CkWoxSI-.mjs} +1 -1
  235. package/.output/server/chunks/build/{useTokenCreate-DkYvEQUD.mjs.map → useTokenCreate-CkWoxSI-.mjs.map} +1 -1
  236. package/.output/server/chunks/build/{useTokenRename-DOCP4aeI.mjs → useTokenRename-BohjnGT0.mjs} +1 -1
  237. package/.output/server/chunks/build/{useTokenRename-DOCP4aeI.mjs.map → useTokenRename-BohjnGT0.mjs.map} +1 -1
  238. package/.output/server/chunks/build/{useTokenReveal-CybwwflV.mjs → useTokenReveal-BBN5iGz7.mjs} +1 -1
  239. package/.output/server/chunks/build/{useTokenReveal-CybwwflV.mjs.map → useTokenReveal-BBN5iGz7.mjs.map} +1 -1
  240. package/.output/server/chunks/build/{useTokensList-BLiMvrc4.mjs → useTokensList-BQX9WqfT.mjs} +1 -1
  241. package/.output/server/chunks/build/{useTokensList-BLiMvrc4.mjs.map → useTokensList-BQX9WqfT.mjs.map} +1 -1
  242. package/.output/server/chunks/build/{useWorkbenchAuth-DAabQl7X.mjs → useWorkbenchAuth-BTRlS2wZ.mjs} +1 -1
  243. package/.output/server/chunks/build/{useWorkbenchAuth-DAabQl7X.mjs.map → useWorkbenchAuth-BTRlS2wZ.mjs.map} +1 -1
  244. package/.output/server/chunks/build/{useWorkbenchWorkspaces-6-mpCGCR.mjs → useWorkbenchWorkspaces-C6ky7OJH.mjs} +1 -1
  245. package/.output/server/chunks/build/{useWorkbenchWorkspaces-6-mpCGCR.mjs.map → useWorkbenchWorkspaces-C6ky7OJH.mjs.map} +1 -1
  246. package/.output/server/chunks/build/{users-B_pHStEa.mjs → users-BHOEW3Az.mjs} +15 -14
  247. package/.output/server/chunks/build/users-BHOEW3Az.mjs.map +1 -0
  248. package/.output/server/chunks/build/{workshop-C0DefygA.mjs → workshop-DyJ1LXwu.mjs} +11 -10
  249. package/.output/server/chunks/build/workshop-DyJ1LXwu.mjs.map +1 -0
  250. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  251. package/.output/server/chunks/routes/api/system/backup/run.post.mjs +2 -2
  252. package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +46 -0
  253. package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs.map +1 -0
  254. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +39 -0
  255. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs.map +1 -0
  256. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  257. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  258. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  259. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  260. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
  261. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  262. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  263. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  265. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
  269. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +1 -1
  270. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +7 -7
  272. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  273. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  274. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  275. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  276. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  277. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  278. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  279. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  280. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  281. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  282. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  283. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  284. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  285. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  286. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  287. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  288. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  289. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  290. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  291. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  292. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  293. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  294. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  295. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  296. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  297. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
  298. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  299. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
  300. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  301. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  302. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  303. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  304. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  305. package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs +1 -1
  306. package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs +1 -1
  307. package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.mjs +1 -1
  308. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  309. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  310. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  311. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  312. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
  313. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
  314. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
  315. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
  316. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  317. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  318. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  319. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  320. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  321. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  322. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  323. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  324. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  325. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  326. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  327. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  328. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  329. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  330. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  331. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  332. package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +1 -1
  333. package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +1 -1
  334. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
  335. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  336. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  337. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  338. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  339. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  340. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +20 -23
  341. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  342. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +25 -11
  343. package/.output/server/chunks/routes/api/workshop/index11.get.mjs.map +1 -1
  344. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +10 -4
  345. package/.output/server/chunks/routes/api/workshop/index12.get.mjs.map +1 -1
  346. package/.output/server/chunks/routes/api/workshop/index13.get.mjs +2 -3
  347. package/.output/server/chunks/routes/api/workshop/index13.get.mjs.map +1 -1
  348. package/.output/server/chunks/routes/api/workshop/index14.get.mjs +3 -2
  349. package/.output/server/chunks/routes/api/workshop/index14.get.mjs.map +1 -1
  350. package/.output/server/chunks/routes/api/workshop/index15.get.mjs +30 -0
  351. package/.output/server/chunks/routes/api/workshop/index15.get.mjs.map +1 -0
  352. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +20 -9
  353. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
  354. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  355. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +10 -4
  356. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  357. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  358. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +4 -29
  359. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  360. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  361. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +25 -22
  362. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  363. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +26 -5
  364. package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
  365. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +4 -39
  366. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  367. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +40 -20
  368. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  369. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  370. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  371. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  372. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  373. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  374. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  375. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  376. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  377. package/.output/server/chunks/routes/renderer.mjs +2 -2
  378. package/.output/server/chunks/virtual/entry.mjs +551 -824
  379. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  380. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  381. package/.output/server/package.json +1 -1
  382. package/README-zh.md +17 -0
  383. package/README.md +20 -0
  384. package/app/components/AppSidebar.vue +1 -0
  385. package/app/components/analysis/AnalysisFilterCard.vue +160 -0
  386. package/app/components/analysis/AnalysisPageHead.vue +47 -0
  387. package/app/components/analysis/AnalysisTable.vue +306 -0
  388. package/app/composables/useRouteMeta.ts +1 -0
  389. package/app/config/schema.ts +1 -0
  390. package/app/pages/analysis/composables/useAnalysisFeed.ts +85 -0
  391. package/app/pages/analysis/index.vue +92 -0
  392. package/app/pages/analysis/types.ts +44 -0
  393. package/cli/commands/mcp.mjs +160 -154
  394. package/config.yml +1 -1
  395. package/i18n/locales/en.ts +55 -0
  396. package/i18n/locales/zh-CN.ts +55 -0
  397. package/mcp/aw-mcp-server.mjs +799 -796
  398. package/package.json +2 -2
  399. package/scripts/onboarding/onboard.mjs +5 -2
  400. package/scripts/onboarding/sim-twin.mjs +312 -0
  401. package/server/api/workshop/analysis/[id].delete.ts +30 -0
  402. package/server/api/workshop/analysis/[id].get.ts +23 -0
  403. package/server/api/workshop/analysis/index.get.ts +33 -0
  404. package/server/plugins/workshop.ts +4 -0
  405. package/server/repositories/user.repository.ts +2 -2
  406. package/server/services/workshop/agents/host-tool-bridge/catalog.ts +4 -1
  407. package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +5 -2
  408. package/server/services/workshop/agents/industrial/analysis-tools.ts +242 -0
  409. package/server/services/workshop/agents/industrial/index.ts +1 -0
  410. package/server/services/workshop/agents/industrial/ops-tools.ts +3 -2
  411. package/server/services/workshop/analysis/analysis.repo.ts +189 -0
  412. package/server/services/workshop/db/database/schema.ts +28 -1
  413. package/server/services/workshop/db/ops.repo.ts +1 -1
  414. package/server/services/workshop/db/retention.ts +2 -0
  415. package/server/services/workshop/db/schema.sql +27 -0
  416. package/server/services/workshop/settings.ts +1 -0
  417. package/shared/config/schema.json +1 -0
  418. package/.output/public/_nuxt/B-Y_rsfn.js +0 -106
  419. package/.output/public/_nuxt/B02cxZz72.js +0 -1
  420. package/.output/public/_nuxt/BAqtRt0q.js +0 -1
  421. package/.output/public/_nuxt/BKHd_sKD2.js +0 -47
  422. package/.output/public/_nuxt/BXKCB3rS.js +0 -1
  423. package/.output/public/_nuxt/BhrnGVGz.js +0 -1
  424. package/.output/public/_nuxt/BikIgp9R.js +0 -1
  425. package/.output/public/_nuxt/BkGqyjWm.js +0 -3
  426. package/.output/public/_nuxt/Bn1N3mJv.js +0 -1
  427. package/.output/public/_nuxt/Br2LgfbH2.js +0 -13
  428. package/.output/public/_nuxt/BtNT93vm2.js +0 -1
  429. package/.output/public/_nuxt/BtYg4aGR2.js +0 -1
  430. package/.output/public/_nuxt/C4X_Z1lA.js +0 -1
  431. package/.output/public/_nuxt/CBATzTUf.js +0 -13
  432. package/.output/public/_nuxt/CEP4UrDv.js +0 -1
  433. package/.output/public/_nuxt/CIPKYgrH2.js +0 -1
  434. package/.output/public/_nuxt/CPSHP_EI.js +0 -1
  435. package/.output/public/_nuxt/CSyIwYcJ2.js +0 -1
  436. package/.output/public/_nuxt/CZkTlW93.js +0 -2
  437. package/.output/public/_nuxt/CZyYdpqZ2.js +0 -1
  438. package/.output/public/_nuxt/CeDkXWCz.js +0 -1
  439. package/.output/public/_nuxt/Cl19UD7U.js +0 -1
  440. package/.output/public/_nuxt/ClrkV0C4.js +0 -1
  441. package/.output/public/_nuxt/CoGETbe-2.js +0 -1
  442. package/.output/public/_nuxt/CuRtzvsa2.js +0 -1
  443. package/.output/public/_nuxt/Cv_H1gOM2.js +0 -1
  444. package/.output/public/_nuxt/D5i2ofVw2.js +0 -1
  445. package/.output/public/_nuxt/D6XGn5vM.js +0 -2
  446. package/.output/public/_nuxt/D6c5ppqB.js +0 -1
  447. package/.output/public/_nuxt/D8VQGThE.js +0 -28
  448. package/.output/public/_nuxt/DBwuADr82.js +0 -1
  449. package/.output/public/_nuxt/DTZO6WMs2.js +0 -1
  450. package/.output/public/_nuxt/DfqRQSFn.js +0 -19
  451. package/.output/public/_nuxt/DraEWn4N2.js +0 -1
  452. package/.output/public/_nuxt/DyMgrV29.js +0 -1
  453. package/.output/public/_nuxt/H7Rbu32y2.js +0 -1
  454. package/.output/public/_nuxt/TjGWqrHo.js +0 -1
  455. package/.output/public/_nuxt/VVomhVqu2.js +0 -1
  456. package/.output/public/_nuxt/YDs3mbQu2.js +0 -1
  457. package/.output/public/_nuxt/Z3MSTcdu2.js +0 -1
  458. package/.output/public/_nuxt/_vR_sc7t.js +0 -24
  459. package/.output/public/_nuxt/builds/meta/082ac92a-d8d0-4e78-8d5a-b4a610080231.json +0 -1
  460. package/.output/public/_nuxt/gbaq2UOO.js +0 -1
  461. package/.output/public/_nuxt/o-G6YtmK2.js +0 -1
  462. package/.output/public/_nuxt/ylowSquM2.js +0 -1
  463. package/.output/server/chunks/build/agents-BTsbna5H.mjs.map +0 -1
  464. package/.output/server/chunks/build/channel-templates-BPKJ8e4l.mjs.map +0 -1
  465. package/.output/server/chunks/build/input-CobQ5LJ5.mjs.map +0 -1
  466. package/.output/server/chunks/build/permissions-D6mQw_9j.mjs.map +0 -1
  467. package/.output/server/chunks/build/settings-Cl_KRyEn.mjs.map +0 -1
  468. package/.output/server/chunks/build/teams-CGDZHaQl.mjs.map +0 -1
  469. package/.output/server/chunks/build/tokens-BOYkZuoB.mjs.map +0 -1
  470. package/.output/server/chunks/build/users-B_pHStEa.mjs.map +0 -1
  471. package/.output/server/chunks/build/workshop-C0DefygA.mjs.map +0 -1
  472. package/scripts/_audit/.tmp/audit-data/dcw-params.json +0 -15
  473. package/scripts/_audit/.tmp/audit-data/dcws.json +0 -30
  474. package/scripts/_audit/aml-layout-diag.mjs +0 -83
  475. package/scripts/_audit/channel-inspect.mjs +0 -49
  476. package/scripts/_audit/cleanup-apply.mjs +0 -89
  477. package/scripts/_audit/cleanup-plan.mjs +0 -82
  478. package/scripts/_audit/contrast-check.mjs +0 -43
  479. package/scripts/_audit/dcw-controller-e2e.ts +0 -106
  480. package/scripts/_audit/dcw-flush-cost.ts +0 -43
  481. package/scripts/_audit/dcw-rollback-ledger.ts +0 -156
  482. package/scripts/_audit/dcw-unrecorded-write.ts +0 -171
  483. package/scripts/_audit/dcw-write-mutex.ts +0 -157
  484. package/scripts/_audit/design-shots.mjs +0 -145
  485. package/scripts/_audit/docs-font-probe.mjs +0 -68
  486. package/scripts/_audit/docs-probe.mjs +0 -107
  487. package/scripts/_audit/docs-shots.mjs +0 -171
  488. package/scripts/_audit/docs-v3-verify.mjs +0 -255
  489. package/scripts/_audit/docs-vue-lint.mjs +0 -81
  490. package/scripts/_audit/docs-vue-lint2.mjs +0 -91
  491. package/scripts/_audit/exp-cost-scaling.mjs +0 -57
  492. package/scripts/_audit/exp-envelope-and-png.mjs +0 -78
  493. package/scripts/_audit/exp-png-decode.mjs +0 -67
  494. package/scripts/_audit/exp-retention-plan.mjs +0 -61
  495. package/scripts/_audit/exp-retention-rescan.mjs +0 -42
  496. package/scripts/_audit/exp-sweep-fairness.mjs +0 -50
  497. package/scripts/_audit/feature-audit-e2e.mjs +0 -342
  498. package/scripts/_audit/fix-settings-count.mjs +0 -57
  499. package/scripts/_audit/full-e2e-adopt.mjs +0 -238
  500. package/scripts/_audit/full-e2e-close-loop.mjs +0 -134
  501. package/scripts/_audit/full-e2e-retrain.mjs +0 -320
  502. package/scripts/_audit/full-e2e-supplement.mjs +0 -192
  503. package/scripts/_audit/full-e2e-ui-final.mjs +0 -111
  504. package/scripts/_audit/full-e2e-ui-mount.mjs +0 -111
  505. package/scripts/_audit/full-feature-e2e-20260927.mjs +0 -627
  506. package/scripts/_audit/glass-verify.mjs +0 -155
  507. package/scripts/_audit/hydration-diff.mjs +0 -104
  508. package/scripts/_audit/hydration-head.mjs +0 -36
  509. package/scripts/_audit/hydration-probe.mjs +0 -59
  510. package/scripts/_audit/idd-scenarios-e2e.mjs +0 -239
  511. package/scripts/_audit/kb-diag-complete.mjs +0 -261
  512. package/scripts/_audit/kb-diag-complete2.mjs +0 -271
  513. package/scripts/_audit/kb-diag-loop-e2e.mjs +0 -357
  514. package/scripts/_audit/kb-diag-loop-mock.mjs +0 -416
  515. package/scripts/_audit/kb-diag-loop-v2.mjs +0 -314
  516. package/scripts/_audit/lead-matrix-test.mjs +0 -172
  517. package/scripts/_audit/plc-agent-task.mjs +0 -74
  518. package/scripts/_audit/plc-clean-scenario.mjs +0 -434
  519. package/scripts/_audit/plc-clean-shots.mjs +0 -161
  520. package/scripts/_audit/plc-fc10-probe.mjs +0 -30
  521. package/scripts/_audit/probe-binding.mjs +0 -114
  522. package/scripts/_audit/recipe-save-e2e.mjs +0 -365
  523. package/scripts/_audit/review-fix-verify.mjs +0 -158
  524. package/scripts/_audit/runtime-dir-e2e.mjs +0 -393
  525. package/scripts/_audit/town-focus-shot.mjs +0 -129
  526. package/scripts/_audit/town-reposition.mjs +0 -85
  527. package/scripts/_audit/verify-cleanup.mjs +0 -67
  528. package/scripts/_audit/verify-data-integrity.mjs +0 -112
  529. package/scripts/_audit/watchdog-recovery-test.mjs +0 -149
  530. package/scripts/_dbg-optloop-ui-shots.mjs +0 -52
  531. /package/.output/public/_nuxt/{4RTUlYvj2.js → 4RTUlYvj.js} +0 -0
  532. /package/.output/public/_nuxt/{BBhLVYdM.js → BBhLVYdM2.js} +0 -0
  533. /package/.output/public/_nuxt/{BG7XSX-S2.js → BG7XSX-S.js} +0 -0
  534. /package/.output/public/_nuxt/{BU7WuuKh.js → BU7WuuKh2.js} +0 -0
  535. /package/.output/public/_nuxt/{BrRX-l9B2.js → BrRX-l9B.js} +0 -0
  536. /package/.output/public/_nuxt/{CHyzK5m52.js → CHyzK5m5.js} +0 -0
  537. /package/.output/public/_nuxt/{Ckafrjnw2.js → Ckafrjnw.js} +0 -0
  538. /package/.output/public/_nuxt/{D1Xw30Dj2.js → D1Xw30Dj.js} +0 -0
  539. /package/.output/public/_nuxt/{DEhjFhZ2.js → DEhjFhZ22.js} +0 -0
  540. /package/.output/public/_nuxt/{DdNujZN5.js → DdNujZN52.js} +0 -0
  541. /package/.output/public/_nuxt/{DzwIZ81f.js → DzwIZ81f2.js} +0 -0
  542. /package/.output/public/_nuxt/{M6NcguDO.js → M6NcguDO2.js} +0 -0
  543. /package/.output/public/_nuxt/{MW-V7IIP2.js → MW-V7IIP.js} +0 -0
  544. /package/.output/public/_nuxt/{WmMwIS4y.js → WmMwIS4y2.js} +0 -0
  545. /package/.output/public/_nuxt/{qIQFsHtF.js → qIQFsHtF2.js} +0 -0
@@ -0,0 +1,242 @@
1
+ /**
2
+ * 数据分析系统 · 分析报告留痕工具(analysis_save / analysis_query)。
3
+ *
4
+ * 定位:Agent Channel 把分析产出(关键结论/正文/支撑指标)持久化到平台台账,
5
+ * 实现"分析结果可留痕、随时可查回"。台账 append-only —— 本族无更新/删除工具
6
+ * (删仅 REST admin 面),保证留痕不可变。
7
+ *
8
+ * 权限语义(同族只读工具口径):
9
+ * - 目标产线解析:显式 line_id(须在可见范围)→ 频道绑线兜底 → 都没有则拒。
10
+ * - 可见产线 = 节点授权线 ∪ 绑定配方所在线 ∪ 频道绑线(agentOpsScope)。
11
+ * - 不进 WRITE_TOOLS/grant-guard 写族:留痕是台账写入,非产线控制写;
12
+ * 能读该产线数据(≥readonly)的 Agent 才能留痕。
13
+ */
14
+ import { randomUUID } from 'node:crypto'
15
+ import { agentBadgeLabel } from '../agent-badge'
16
+ import { getDcwController } from '../../dcw/dcw-controller'
17
+ import { getDcwLineRepo } from '../../dcw/dcw-line.repo'
18
+ import { recordOps } from '../../ops/ops'
19
+ import { getAnalysisRepo } from '../../analysis/analysis.repo'
20
+ import { agentOpsScope, channelBoundLineId, fmtAuditAt } from './ops-tools'
21
+
22
+ export interface AnalysisSaveInput {
23
+ title?: string
24
+ summary?: string
25
+ conclusions?: string[] | string
26
+ report?: string
27
+ category?: string
28
+ line_id?: string
29
+ recipe_id?: string
30
+ recipe_version?: string
31
+ window_from?: string
32
+ window_to?: string
33
+ data_sources?: string
34
+ metrics?: Record<string, unknown>
35
+ }
36
+
37
+ export interface AnalysisQueryInput {
38
+ report_id?: string
39
+ line_id?: string
40
+ recipe_id?: string
41
+ category?: string
42
+ q?: string
43
+ from?: string
44
+ to?: string
45
+ limit?: number | string
46
+ }
47
+
48
+ /** 可见产线全集 = 节点授权线 ∪ 绑定配方所在线 ∪ 频道绑线(去重) */
49
+ function readableLineIdsOf(agentId: string): string[] {
50
+ const bound = channelBoundLineId(agentId)
51
+ const scope = agentOpsScope(agentId)
52
+ if (!scope) return bound ? [bound] : []
53
+ return [...new Set([...scope.lineIds, ...scope.boundLineIds, ...(bound ? [bound] : [])])]
54
+ }
55
+
56
+ /** 目标产线解析:显式 line_id(须可读)→ 频道绑线兜底;返回产线视图或错误文案 */
57
+ function resolveTargetLine(agentId: string, explicitLineId?: string): { lineId: string, lineName: string } | { error: string } {
58
+ const lineRepo = getDcwLineRepo()
59
+ const wanted = String(explicitLineId ?? '').trim() || channelBoundLineId(agentId)
60
+ if (!wanted) {
61
+ return { error: '无法确定目标产线:本频道未绑定产线,且未指定 line_id。请先绑线,或显式传入可见范围内的 line_id。' }
62
+ }
63
+ const line = lineRepo.byId(wanted)
64
+ if (!line) return { error: `产线不存在: ${wanted}` }
65
+ const readable = readableLineIdsOf(agentId)
66
+ if (!readable.includes(wanted)) {
67
+ return { error: `产线「${line.name}」不在你的可见范围(节点授权线/绑定配方线/频道绑线)。只能对可见产线留痕。` }
68
+ }
69
+ return { lineId: line.id, lineName: line.name }
70
+ }
71
+
72
+ /** 时间入参归一:epoch ms 数值串或 ISO 均收,统一出 ISO;无效返回 null(留空=未指明) */
73
+ function normTimeArg(raw: unknown): string | null {
74
+ const s = String(raw ?? '').trim()
75
+ if (!s) return null
76
+ if (/^\d{10,}$/.test(s)) {
77
+ const ms = Number(s)
78
+ return Number.isFinite(ms) ? new Date(ms).toISOString() : null
79
+ }
80
+ const t = Date.parse(s)
81
+ return Number.isNaN(t) ? null : new Date(t).toISOString()
82
+ }
83
+
84
+ /** conclusions 归一:接受 string[] 或换行分隔的整段字符串(LLM 两种形态都常见) */
85
+ function normConclusions(raw: AnalysisSaveInput['conclusions']): string[] {
86
+ if (Array.isArray(raw)) return raw.map(x => String(x).trim()).filter(Boolean)
87
+ return String(raw ?? '')
88
+ .split('\n')
89
+ .map(x => x.replace(/^[-*\d.\s]+/, '').trim())
90
+ .filter(Boolean)
91
+ }
92
+
93
+ /** 频道名快照(归因用;经全局 manager 直读,未装配/直调上下文留空 —— 同 channelBoundLineId 模式) */
94
+ function channelNameOf(channelId?: string): string {
95
+ if (!channelId) return ''
96
+ try {
97
+ const g = globalThis as typeof globalThis & {
98
+ __workshopManager?: { deps: { repos: { channels: { findById(id: string): { name?: string } | undefined } } } }
99
+ }
100
+ return g.__workshopManager?.deps.repos.channels.findById(channelId)?.name ?? ''
101
+ }
102
+ catch {
103
+ return ''
104
+ }
105
+ }
106
+
107
+ /** 产线上下文快照:保存瞬间把产品/批次/控制模式固化进台账 */
108
+ function lineContextSnapshot(lineId: string): Record<string, unknown> {
109
+ try {
110
+ const ctrl = getDcwController()
111
+ const st = ctrl.lineState(lineId)
112
+ const line = getDcwLineRepo().byId(lineId)
113
+ return {
114
+ controlMode: line?.controlMode ?? '',
115
+ activeRun: st?.active
116
+ ? { runId: st.runId, recipeName: st.recipeName, productName: st.productName, startedAt: st.startedAt }
117
+ : null,
118
+ }
119
+ }
120
+ catch {
121
+ return {}
122
+ }
123
+ }
124
+
125
+ /** 工具:analysis_save —— 把本次分析的关键结论与产出持久化到平台分析台账(数据留痕)。 */
126
+ export async function toolAnalysisSave(agentId: string, args: AnalysisSaveInput, channelId?: string): Promise<{ text: string, isError?: boolean }> {
127
+ const title = String(args.title ?? '').trim()
128
+ const summary = String(args.summary ?? '').trim()
129
+ if (!title) return { text: 'title 必填:分析主题(如「BOPET 线膜厚漂移根因分析」),台账列表靠它辨认。', isError: true }
130
+ if (!summary) return { text: 'summary 必填:一句话关键结论 —— 这是留痕的核心产出,人扫一眼列表要能看懂。', isError: true }
131
+
132
+ const line = resolveTargetLine(agentId, args.line_id)
133
+ if ('error' in line) return { text: line.error, isError: true }
134
+
135
+ // 配方联动:校验存在性 + 归属(留痕的 recipe 字段要可信)
136
+ const recipeId = String(args.recipe_id ?? '').trim()
137
+ let recipeVersion = String(args.recipe_version ?? '').trim()
138
+ if (recipeId) {
139
+ const recipe = getDcwController().listRecipes().find(r => r.id === recipeId)
140
+ if (!recipe) return { text: `配方 ${recipeId} 不存在,recipe_id 留痕被拒(可用 line_context 查看当前配方)。`, isError: true }
141
+ if (recipe.lineId && recipe.lineId !== line.lineId) {
142
+ return { text: `配方「${recipe.name}」不属于产线「${line.lineName}」,不能挂到该线的分析报告下。`, isError: true }
143
+ }
144
+ if (!recipeVersion) recipeVersion = String(recipe.version ?? '')
145
+ }
146
+
147
+ const channelName = channelNameOf(channelId)
148
+ const id = `ar-${randomUUID().replace(/-/g, '').slice(0, 8)}`
149
+ const now = new Date().toISOString()
150
+ const conclusions = normConclusions(args.conclusions)
151
+ const windowFrom = normTimeArg(args.window_from)
152
+ const windowTo = normTimeArg(args.window_to)
153
+
154
+ getAnalysisRepo().insert({
155
+ id,
156
+ lineId: line.lineId,
157
+ lineName: line.lineName,
158
+ title,
159
+ category: String(args.category ?? '').trim() || 'general',
160
+ summary,
161
+ conclusions,
162
+ report: String(args.report ?? ''),
163
+ metrics: (args.metrics && typeof args.metrics === 'object' && !Array.isArray(args.metrics) ? args.metrics : {}) as Record<string, unknown>,
164
+ recipeId,
165
+ recipeVersion,
166
+ windowFrom,
167
+ windowTo,
168
+ dataSources: String(args.data_sources ?? ''),
169
+ context: lineContextSnapshot(line.lineId),
170
+ channelId: channelId ?? '',
171
+ channelName,
172
+ actor: agentId,
173
+ actorName: agentBadgeLabel(agentId),
174
+ createdAt: now,
175
+ })
176
+
177
+ try {
178
+ recordOps({
179
+ actor: agentId, actorName: agentBadgeLabel(agentId), actorKind: 'agent',
180
+ action: 'analysis.save', kind: 'analysis', targetKind: 'analysis', targetId: id,
181
+ lineId: line.lineId, recipeId,
182
+ summary: `Agent 留痕分析报告「${title}」:产线「${line.lineName}」${recipeId ? `,配方 ${recipeId}` : ''} — ${summary}`,
183
+ })
184
+ }
185
+ catch { /* 审计失败不影响留痕 */ }
186
+
187
+ const win = windowFrom || windowTo ? `(数据窗 ${windowFrom ?? '?'} ~ ${windowTo ?? '?'})` : ''
188
+ return { text: `分析报告已留痕:${id}。产线「${line.lineName}」${win},结论 ${conclusions.length} 条,配方 ${recipeId || '未关联'}。台账 append-only,不可改删;随时可用 analysis_query(report_id="${id}") 查回全文。` }
189
+ }
190
+
191
+ /** 工具:analysis_query —— 查询历史分析报告(report_id 精确查全文;或按线/配方/时间/关键词列表)。 */
192
+ export async function toolAnalysisQuery(agentId: string, args: AnalysisQueryInput): Promise<{ text: string, isError?: boolean }> {
193
+ const readable = readableLineIdsOf(agentId)
194
+ const reportId = String(args.report_id ?? '').trim()
195
+ const repo = getAnalysisRepo()
196
+
197
+ if (reportId) {
198
+ const report = repo.get(reportId)
199
+ if (!report) return { text: `分析报告不存在: ${reportId}(留痕不可变,也没有删除找回;请核对 id)。`, isError: true }
200
+ if (report.lineId && !readable.includes(report.lineId)) {
201
+ return { text: `分析报告 ${reportId} 属于产线「${report.lineName}」,不在你的可见范围。`, isError: true }
202
+ }
203
+ const head = [
204
+ `分析报告 ${report.id}:「${report.title}」(分类 ${report.category})`,
205
+ `产线: ${report.lineName || report.lineId || '-'} | 配方: ${report.recipeId || '-'}${report.recipeVersion ? ` v${report.recipeVersion}` : ''}`,
206
+ `分析时间: ${fmtAuditAt(report.createdAt)} | 数据窗: ${report.windowFrom ? fmtAuditAt(report.windowFrom) : '-'} ~ ${report.windowTo ? fmtAuditAt(report.windowTo) : '-'}`,
207
+ `来源: ${report.actorName || report.actor}${report.channelName ? ` @频道「${report.channelName}」` : ''}`,
208
+ `关键结论: ${report.summary}`,
209
+ ...(report.conclusions.length ? [`结论明细:\n${report.conclusions.map((c, i) => ` ${i + 1}. ${c}`).join('\n')}`] : []),
210
+ ]
211
+ const body = report.report ? `\n\n— 完整分析正文 —\n${report.report}` : ''
212
+ const metrics = Object.keys(report.metrics ?? {}).length ? `\n\n— 支撑指标 —\n${JSON.stringify(report.metrics, null, 1)}` : ''
213
+ return { text: `${head.join('\n')}${body}${metrics}` }
214
+ }
215
+
216
+ const explicitLine = String(args.line_id ?? '').trim()
217
+ if (explicitLine && !readable.includes(explicitLine)) {
218
+ return { text: `产线 ${explicitLine} 不在你的可见范围(节点授权线/绑定配方线/频道绑线)。`, isError: true }
219
+ }
220
+ // 作用域空集 = 不可见任何产线 → 直接空结果,不得落成"不过滤"(防越权列举全量台账)
221
+ if (!explicitLine && readable.length === 0) {
222
+ return { text: '你当前没有任何可见产线(无节点授权、无绑定配方、频道未绑线),暂无可查的分析报告。' }
223
+ }
224
+ const rows = repo.list({
225
+ lineId: explicitLine || undefined,
226
+ lineIds: explicitLine ? undefined : readable,
227
+ recipeId: String(args.recipe_id ?? '').trim() || undefined,
228
+ category: String(args.category ?? '').trim() || undefined,
229
+ q: String(args.q ?? '').trim() || undefined,
230
+ from: normTimeArg(args.from) ?? undefined,
231
+ to: normTimeArg(args.to) ?? undefined,
232
+ limit: Math.min(50, Math.max(1, Number(args.limit) || 20)),
233
+ })
234
+ if (rows.length === 0) {
235
+ return { text: `可见范围内暂无匹配的分析报告${args.q ? `(关键词「${String(args.q)}」)` : ''}。留痕由各频道的 analysis_save 产生;若是刚分析完,确认保存工具已被调用。` }
236
+ }
237
+ const lines = rows.map((r) => {
238
+ const recipe = r.recipeId ? ` | 配方 ${r.recipeId}${r.recipeVersion ? ` v${r.recipeVersion}` : ''}` : ''
239
+ return `[${r.id}] ${fmtAuditAt(r.createdAt)} | ${r.lineName || r.lineId || '-'}${recipe} | ${r.title}(${r.category})\n ${r.summary} —— ${r.actorName || r.actor}${r.channelName ? ` @「${r.channelName}」` : ''}`
240
+ })
241
+ return { text: `共 ${rows.length} 条分析报告(新→旧):\n${lines.join('\n')}\n\n用 analysis_query(report_id="ar-xxxx") 查看单条完整正文与结论明细。` }
242
+ }
@@ -29,3 +29,4 @@ export { toolTwinProviderCatalog, toolTwinSceneDiscover, toolTwinSceneCompile, t
29
29
  export { toolAmlActivity } from './aml-activity'
30
30
  export { toolRecipePropose } from './recipe-propose-tools'
31
31
  export { toolLineStart, toolLineStop, toolLineStatus } from './line-tools'
32
+ export { toolAnalysisSave, toolAnalysisQuery } from './analysis-tools'
@@ -21,8 +21,9 @@ import { assertRecipeOperation, recipeApprovalPayload } from './recipe-gate'
21
21
  // 运维日志 / Recipe 变更史查询(Agent 自查面:负责产线 scoped)
22
22
  // ================================================================
23
23
 
24
- /** v18:频道绑定产线(只读扩权)——经全局 manager 读;manager 未装配/未绑定 = null */
25
- function channelBoundLineId(agentId: string): string | null {
24
+ /** v18:频道绑定产线(只读扩权)——经全局 manager 读;manager 未装配/未绑定 = null
25
+ * (export 供 analysis-tools 等同族工具复用「频道绑线=默认目标产线」语义) */
26
+ export function channelBoundLineId(agentId: string): string | null {
26
27
  try {
27
28
  const g = globalThis as typeof globalThis & {
28
29
  __workshopManager?: { channelLineBindingOf(id: string): string | null }
@@ -0,0 +1,189 @@
1
+ /**
2
+ * 数据分析系统 · 分析报告台账(analysis_reports)。
3
+ *
4
+ * 定位:Agent Channel 分析产出的持久留痕 —— append-only,工具面只提供 save/query,
5
+ * 无更新与删除(删仅 REST admin 面)。产线/配方/时间/关键结论为一级字段;
6
+ * 归因(channel/actor)与产线上下文在保存时快照固化,产线改名或删除后历史仍可读。
7
+ *
8
+ * 头注释铁律同 aml.repo:全部参数绑定(无字符串拼 SQL;LIKE 的 % 也在参数侧)。
9
+ */
10
+ import type { DatabaseSync, SQLInputValue } from 'node:sqlite'
11
+
12
+ export interface AnalysisReportRow {
13
+ id: string
14
+ lineId: string
15
+ lineName: string
16
+ title: string
17
+ category: string
18
+ /** 一句话关键结论(列表面展示) */
19
+ summary: string
20
+ /** 关键结论数组(结构化发现) */
21
+ conclusions: string[]
22
+ /** 完整分析正文(markdown) */
23
+ report: string
24
+ /** 支撑指标/数据 */
25
+ metrics: Record<string, unknown>
26
+ recipeId: string
27
+ recipeVersion: string
28
+ /** 分析的数据时间窗(ISO;空 = 未指明) */
29
+ windowFrom: string | null
30
+ windowTo: string | null
31
+ /** 证据来源说明(daq 窗口/mes 数据集/批次号等,人读) */
32
+ dataSources: string
33
+ /** 保存时的产线上下文快照(产品/批次/控制模式等) */
34
+ context: Record<string, unknown>
35
+ channelId: string
36
+ channelName: string
37
+ actor: string
38
+ actorName: string
39
+ createdAt: string
40
+ }
41
+
42
+ export interface AnalysisReportInput {
43
+ id: string
44
+ lineId: string
45
+ lineName: string
46
+ title: string
47
+ category: string
48
+ summary: string
49
+ conclusions: string[]
50
+ report: string
51
+ metrics: Record<string, unknown>
52
+ recipeId: string
53
+ recipeVersion: string
54
+ windowFrom: string | null
55
+ windowTo: string | null
56
+ dataSources: string
57
+ context: Record<string, unknown>
58
+ channelId: string
59
+ channelName: string
60
+ actor: string
61
+ actorName: string
62
+ createdAt: string
63
+ }
64
+
65
+ export interface AnalysisReportFilter {
66
+ /** 作用域限制(可见产线集合;空 = 不限) */
67
+ lineIds?: string[]
68
+ lineId?: string
69
+ recipeId?: string
70
+ category?: string
71
+ /** 关键词(title/summary LIKE) */
72
+ q?: string
73
+ /** created_at 下/上界(ISO) */
74
+ from?: string
75
+ to?: string
76
+ limit?: number
77
+ }
78
+
79
+ const COLS = `id, line_id AS lineId, line_name AS lineName, title, category, summary,
80
+ conclusions_json AS conclusionsJson, report, metrics_json AS metricsJson,
81
+ recipe_id AS recipeId, recipe_version AS recipeVersion,
82
+ window_from AS windowFrom, window_to AS windowTo, data_sources AS dataSources,
83
+ context_json AS contextJson, channel_id AS channelId, channel_name AS channelName,
84
+ actor, actor_name AS actorName, created_at AS createdAt`
85
+
86
+ function rowToReport(r: Record<string, unknown>): AnalysisReportRow {
87
+ const parseJson = (raw: unknown, dflt: unknown): unknown => {
88
+ try {
89
+ return JSON.parse(String(raw ?? '')) ?? dflt
90
+ }
91
+ catch {
92
+ return dflt
93
+ }
94
+ }
95
+ return {
96
+ ...(r as unknown as Omit<AnalysisReportRow, 'conclusions' | 'metrics' | 'context' | 'conclusionsJson' | 'metricsJson' | 'contextJson'>),
97
+ conclusions: parseJson(r.conclusionsJson, []) as string[],
98
+ metrics: parseJson(r.metricsJson, {}) as Record<string, unknown>,
99
+ context: parseJson(r.contextJson, {}) as Record<string, unknown>,
100
+ } as AnalysisReportRow
101
+ }
102
+
103
+ export function createAnalysisRepo(db: DatabaseSync) {
104
+ const insertStmt = db.prepare(
105
+ `INSERT INTO analysis_reports (id, line_id, line_name, title, category, summary,
106
+ conclusions_json, report, metrics_json, recipe_id, recipe_version,
107
+ window_from, window_to, data_sources, context_json,
108
+ channel_id, channel_name, actor, actor_name, created_at)
109
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
110
+ )
111
+ const getStmt = db.prepare(`SELECT ${COLS} FROM analysis_reports WHERE id = ?`)
112
+ const removeStmt = db.prepare(`DELETE FROM analysis_reports WHERE id = ?`)
113
+ const countStmt = db.prepare('SELECT COUNT(*) AS c FROM analysis_reports')
114
+
115
+ return {
116
+ insert(row: AnalysisReportInput): void {
117
+ insertStmt.run(
118
+ row.id, row.lineId, row.lineName, row.title, row.category, row.summary,
119
+ JSON.stringify(row.conclusions ?? []), row.report ?? '', JSON.stringify(row.metrics ?? {}),
120
+ row.recipeId ?? '', row.recipeVersion ?? '',
121
+ row.windowFrom ?? null, row.windowTo ?? null, row.dataSources ?? '', JSON.stringify(row.context ?? {}),
122
+ row.channelId ?? '', row.channelName ?? '', row.actor ?? '', row.actorName ?? '', row.createdAt,
123
+ )
124
+ },
125
+ get(id: string): AnalysisReportRow | undefined {
126
+ const r = getStmt.get(id) as Record<string, unknown> | undefined
127
+ return r ? rowToReport(r) : undefined
128
+ },
129
+ list(filter: AnalysisReportFilter = {}): AnalysisReportRow[] {
130
+ const where: string[] = []
131
+ const args: SQLInputValue[] = []
132
+ if (filter.lineId) {
133
+ where.push('line_id = ?')
134
+ args.push(filter.lineId)
135
+ }
136
+ if (filter.lineIds && filter.lineIds.length > 0) {
137
+ where.push(`line_id IN (${filter.lineIds.map(() => '?').join(', ')})`)
138
+ args.push(...filter.lineIds)
139
+ }
140
+ if (filter.recipeId) {
141
+ where.push('recipe_id = ?')
142
+ args.push(filter.recipeId)
143
+ }
144
+ if (filter.category) {
145
+ where.push('category = ?')
146
+ args.push(filter.category)
147
+ }
148
+ if (filter.q) {
149
+ // 关键词三列 LIKE:标题 / 一句话结论 / 结论明细(JSON 数组文本,元素原串可命中)
150
+ where.push('(title LIKE ? OR summary LIKE ? OR conclusions_json LIKE ?)')
151
+ const like = `%${filter.q}%`
152
+ args.push(like, like, like)
153
+ }
154
+ if (filter.from) {
155
+ where.push('created_at >= ?')
156
+ args.push(filter.from)
157
+ }
158
+ if (filter.to) {
159
+ where.push('created_at <= ?')
160
+ args.push(filter.to)
161
+ }
162
+ const sql = `SELECT ${COLS} FROM analysis_reports ${where.length ? `WHERE ${where.join(' AND ')}` : ''}
163
+ ORDER BY created_at DESC LIMIT ?`
164
+ args.push(Math.min(500, Math.max(1, filter.limit ?? 100)))
165
+ return (db.prepare(sql).all(...args) as unknown as Record<string, unknown>[]).map(rowToReport)
166
+ },
167
+ remove(id: string): boolean {
168
+ return Number(removeStmt.run(id).changes) > 0
169
+ },
170
+ count(): number {
171
+ return Number((countStmt.get() as { c: number }).c)
172
+ },
173
+ }
174
+ }
175
+
176
+ export type AnalysisRepo = ReturnType<typeof createAnalysisRepo>
177
+
178
+ let singleton: AnalysisRepo | null = null
179
+
180
+ /** Nitro 插件启动时装配(plugins/workshop.ts) */
181
+ export function configureAnalysisRepo(db: DatabaseSync): void {
182
+ singleton = createAnalysisRepo(db)
183
+ }
184
+
185
+ /** 运行期取用(未装配即抛 = 装配漏接线的响亮失败) */
186
+ export function getAnalysisRepo(): AnalysisRepo {
187
+ if (!singleton) throw new Error('analysis repo 未装配(configureAnalysisRepo 未调用)')
188
+ return singleton
189
+ }
@@ -748,7 +748,34 @@ CREATE TABLE IF NOT EXISTS mes_fetch_jobs (
748
748
  CREATE INDEX IF NOT EXISTS idx_mes_fetch_jobs_dataset ON mes_fetch_jobs(dataset_id);
749
749
  CREATE INDEX IF NOT EXISTS idx_mes_fetch_jobs_agent ON mes_fetch_jobs(agent_id, created_at DESC);
750
750
 
751
- CREATE INDEX IF NOT EXISTS idx_hitl_requests_agent ON hitl_requests(agent_id, status);`
751
+ CREATE INDEX IF NOT EXISTS idx_hitl_requests_agent ON hitl_requests(agent_id, status);
752
+
753
+ -- v26: 数据分析系统 · 分析报告台账(Agent Channel 经 analysis_save 留痕;append-only,Agent 面无改删)
754
+ -- 归因与产线上下文在保存时快照固化(line_name/产品/批次),产线改名或删除后历史仍可读。
755
+ CREATE TABLE IF NOT EXISTS analysis_reports (
756
+ id TEXT PRIMARY KEY,
757
+ line_id TEXT NOT NULL DEFAULT '',
758
+ line_name TEXT NOT NULL DEFAULT '',
759
+ title TEXT NOT NULL,
760
+ category TEXT NOT NULL DEFAULT 'general',
761
+ summary TEXT NOT NULL DEFAULT '',
762
+ conclusions_json TEXT NOT NULL DEFAULT '[]',
763
+ report TEXT NOT NULL DEFAULT '',
764
+ metrics_json TEXT NOT NULL DEFAULT '{}',
765
+ recipe_id TEXT NOT NULL DEFAULT '',
766
+ recipe_version TEXT NOT NULL DEFAULT '',
767
+ window_from TEXT,
768
+ window_to TEXT,
769
+ data_sources TEXT NOT NULL DEFAULT '',
770
+ context_json TEXT NOT NULL DEFAULT '{}',
771
+ channel_id TEXT NOT NULL DEFAULT '',
772
+ channel_name TEXT NOT NULL DEFAULT '',
773
+ actor TEXT NOT NULL DEFAULT '',
774
+ actor_name TEXT NOT NULL DEFAULT '',
775
+ created_at TEXT NOT NULL
776
+ );
777
+ CREATE INDEX IF NOT EXISTS idx_analysis_reports_line ON analysis_reports(line_id, created_at DESC);
778
+ CREATE INDEX IF NOT EXISTS idx_analysis_reports_recipe ON analysis_reports(recipe_id);`
752
779
 
753
780
  // ===== 默认种子数据(首轮初始化注入;owner NULL = 公共资源,所有登录用户只读共享) =====
754
781
 
@@ -174,7 +174,7 @@ export interface AuditEntry {
174
174
  lineId?: string
175
175
  productId?: string
176
176
  recipeId?: string
177
- kind?: 'write' | 'manual' | 'alarm' | 'line' | 'recipe' | 'rollback' | 'daq' | 'system'
177
+ kind?: 'write' | 'manual' | 'alarm' | 'line' | 'recipe' | 'rollback' | 'daq' | 'analysis' | 'system'
178
178
  summary?: string
179
179
  /** 严重级(2026-10-08 写控 ACK 鉴定):info 缺省 / warn(未证实) / error(写入失败);日志页红黄标 */
180
180
  level?: 'info' | 'warn' | 'error'
@@ -5,6 +5,7 @@
5
5
  * messages 默认 30d (retention.messages_days)
6
6
  * audit_log 默认 90d (retention.audit_days;合规观察期,从严保留)
7
7
  * approval_history 默认 180d (retention.approval_days;历史裁决主张不可变,放宽)
8
+ * analysis_reports 默认 365d (retention.analysis_days;数据分析留痕台账,最宽松)
8
9
  * retention.disabled 整体逃生门(env AW_RETENTION_DISABLED / RETENTION_DISABLED 兼容别名)。
9
10
  * 覆盖链:config.yml < runtime-settings < env(AW_<键> 或历史别名)。时间列均为 TEXT ISO。
10
11
  * channel_events 与 daq_samples 已有各自保留机制,此处不重复覆盖。
@@ -27,6 +28,7 @@ const TARGETS = [
27
28
  { table: 'messages', column: 'created_at', days: 30, cfgKey: 'messages_days' },
28
29
  { table: 'audit_log', column: 'at', days: 90, cfgKey: 'audit_days' },
29
30
  { table: 'approval_history', column: 'created_at', days: 180, cfgKey: 'approval_days' },
31
+ { table: 'analysis_reports', column: 'created_at', days: 365, cfgKey: 'analysis_days' },
30
32
  ] as const
31
33
 
32
34
  export interface RetentionResult { table: string, removed: number, days: number }
@@ -358,3 +358,30 @@ CREATE TABLE IF NOT EXISTS mes_fetch_jobs (
358
358
  );
359
359
  CREATE INDEX IF NOT EXISTS idx_mes_fetch_jobs_dataset ON mes_fetch_jobs(dataset_id);
360
360
  CREATE INDEX IF NOT EXISTS idx_mes_fetch_jobs_agent ON mes_fetch_jobs(agent_id, created_at DESC);
361
+
362
+ -- v26: 数据分析系统 · 分析报告台账(Agent Channel 经 analysis_save 留痕;append-only,Agent 面无改删)
363
+ -- 归因与产线上下文在保存时快照固化(line_name/产品/批次),产线改名或删除后历史仍可读。
364
+ CREATE TABLE IF NOT EXISTS analysis_reports (
365
+ id TEXT PRIMARY KEY,
366
+ line_id TEXT NOT NULL DEFAULT '',
367
+ line_name TEXT NOT NULL DEFAULT '',
368
+ title TEXT NOT NULL,
369
+ category TEXT NOT NULL DEFAULT 'general',
370
+ summary TEXT NOT NULL DEFAULT '',
371
+ conclusions_json TEXT NOT NULL DEFAULT '[]',
372
+ report TEXT NOT NULL DEFAULT '',
373
+ metrics_json TEXT NOT NULL DEFAULT '{}',
374
+ recipe_id TEXT NOT NULL DEFAULT '',
375
+ recipe_version TEXT NOT NULL DEFAULT '',
376
+ window_from TEXT,
377
+ window_to TEXT,
378
+ data_sources TEXT NOT NULL DEFAULT '',
379
+ context_json TEXT NOT NULL DEFAULT '{}',
380
+ channel_id TEXT NOT NULL DEFAULT '',
381
+ channel_name TEXT NOT NULL DEFAULT '',
382
+ actor TEXT NOT NULL DEFAULT '',
383
+ actor_name TEXT NOT NULL DEFAULT '',
384
+ created_at TEXT NOT NULL
385
+ );
386
+ CREATE INDEX IF NOT EXISTS idx_analysis_reports_line ON analysis_reports(line_id, created_at DESC);
387
+ CREATE INDEX IF NOT EXISTS idx_analysis_reports_recipe ON analysis_reports(recipe_id);
@@ -141,6 +141,7 @@ export interface RetentionSettings {
141
141
  messages_days: number
142
142
  audit_days: number
143
143
  approval_days: number
144
+ analysis_days: number
144
145
  }
145
146
  export interface LogSettings {
146
147
  level: 'debug' | 'info' | 'warn' | 'error'
@@ -116,6 +116,7 @@
116
116
  { "key": "retention.messages_days", "type": "number", "group": "retention", "label": "消息保留(天)", "labelKey": "settings.runtime.retention.messagesDays", "description": "Channel 消息保留天数", "applies": "restart", "default": 30, "min": 1, "max": 3650 },
117
117
  { "key": "retention.audit_days", "type": "number", "group": "retention", "label": "审计日志保留(天)", "labelKey": "settings.runtime.retention.auditDays", "description": "审计日志保留天数(合规观察期,从严保留)", "applies": "restart", "default": 90, "min": 1, "max": 3650 },
118
118
  { "key": "retention.approval_days", "type": "number", "group": "retention", "label": "审批历史保留(天)", "labelKey": "settings.runtime.retention.approvalDays", "description": "审批历史保留天数(历史裁决主张不可变,放宽)", "applies": "restart", "default": 180, "min": 1, "max": 3650 },
119
+ { "key": "retention.analysis_days", "type": "number", "group": "retention", "label": "分析报告保留(天)", "labelKey": "settings.runtime.retention.analysisDays", "description": "数据分析报告台账保留天数(数据留痕,宽松保留)", "applies": "restart", "default": 365, "min": 1, "max": 3650 },
119
120
 
120
121
  { "key": "log.level", "type": "string", "group": "log", "label": "日志级别", "labelKey": "settings.runtime.log.level", "description": "服务端日志级别(debug/info/warn/error)", "applies": "restart", "default": "info", "aliases": ["AWSHOP_LOG_LEVEL"] },
121
122