agentworkshop 0.7.59 → 0.7.61

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 (541) 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/9j2J4k4w.js +1 -0
  6. package/.output/public/_nuxt/{DTx_DtUo.js → B0w8DZ4C.js} +1 -1
  7. package/.output/public/_nuxt/{cBI0JqsV.js → BMlesJth.js} +1 -1
  8. package/.output/public/_nuxt/BTXdYngG.js +1 -0
  9. package/.output/public/_nuxt/{DMPpE41S2.js → BXbKTAwC2.js} +1 -1
  10. package/.output/public/_nuxt/{Bn1N3mJv.js → B_6yBa_Z.js} +1 -1
  11. package/.output/public/_nuxt/{D6c5ppqB.js → B_ic601Y.js} +1 -1
  12. package/.output/public/_nuxt/BegV7-FE2.js +1 -0
  13. package/.output/public/_nuxt/BhllzW3K2.js +1 -0
  14. package/.output/public/_nuxt/BrRXGr472.js +1 -0
  15. package/.output/public/_nuxt/{BMZ1d25O.js → BtBgrPNT.js} +1 -1
  16. package/.output/public/_nuxt/C5MPzgon2.js +1 -0
  17. package/.output/public/_nuxt/CGChCy-w2.js +1 -0
  18. package/.output/public/_nuxt/CI5sliIF2.js +1 -0
  19. package/.output/public/_nuxt/{DTZO6WMs2.js → CI8awYVQ2.js} +1 -1
  20. package/.output/public/_nuxt/{B03LfmKR.js → CK2ts9sD.js} +1 -1
  21. package/.output/public/_nuxt/CPZKwmLQ.js +1 -0
  22. package/.output/public/_nuxt/CUjdqsjC2.js +1 -0
  23. package/.output/public/_nuxt/{C5wBzGO7.js → CVUMEGa1.js} +1 -1
  24. package/.output/public/_nuxt/{CYGkUj5M2.js → CcLFZjCI2.js} +1 -1
  25. package/.output/public/_nuxt/{iZa330UY.js → Cdw4juXw.js} +1 -1
  26. package/.output/public/_nuxt/{h46i74oE.js → CeEzUIvN.js} +4 -4
  27. package/.output/public/_nuxt/{zGDAozGA.js → CfIGBe_4.js} +4 -4
  28. package/.output/public/_nuxt/{CmTqFlYZ.js → Ci5kuU1q.js} +1 -1
  29. package/.output/public/_nuxt/CiyTTgqr.js +106 -0
  30. package/.output/public/_nuxt/{Dy-V8OEW2.js → CkYk8bj02.js} +6 -6
  31. package/.output/public/_nuxt/Cmiz_VOb2.js +47 -0
  32. package/.output/public/_nuxt/{VVomhVqu2.js → Cnf1PFhB2.js} +1 -1
  33. package/.output/public/_nuxt/CoTm7jd3.js +28 -0
  34. package/.output/public/_nuxt/{BzKT-ne_2.js → CsN8RHJ02.js} +1 -1
  35. package/.output/public/_nuxt/Cst8yEet.js +1 -0
  36. package/.output/public/_nuxt/Cuw2--X2.js +2 -0
  37. package/.output/public/_nuxt/D-jg-SoR.js +1 -0
  38. package/.output/public/_nuxt/{B4R5CHkk.js → D-z6N1Cz.js} +1 -1
  39. package/.output/public/_nuxt/D3gfSKKi2.js +1 -0
  40. package/.output/public/_nuxt/{BtNT93vm2.js → D4elH6Bo2.js} +1 -1
  41. package/.output/public/_nuxt/{BuVH9MB-.js → D4tAdwYm.js} +1 -1
  42. package/.output/public/_nuxt/D5-QB_-l.js +1 -0
  43. package/.output/public/_nuxt/DBzdrPzw2.js +1 -0
  44. package/.output/public/_nuxt/{CCCq9H7D2.js → DC7WzYCf2.js} +1 -1
  45. package/.output/public/_nuxt/DD4J2Otc.js +1 -0
  46. package/.output/public/_nuxt/DE-qkHRd2.js +1 -0
  47. package/.output/public/_nuxt/{BXKCB3rS.js → DE2kUGPK.js} +1 -1
  48. package/.output/public/_nuxt/{CoGETbe-2.js → DI4sdLmu2.js} +1 -1
  49. package/.output/public/_nuxt/DKHA3XxF.js +2 -0
  50. package/.output/public/_nuxt/{Drhta6gr.js → DL6fliAT.js} +2 -2
  51. package/.output/public/_nuxt/{DvUt9uMt2.js → DP6tsk912.js} +1 -1
  52. package/.output/public/_nuxt/DP_e7Vwv.js +24 -0
  53. package/.output/public/_nuxt/{DKhRushG.js → DR83EvmX.js} +1 -1
  54. package/.output/public/_nuxt/DSWuWYx_2.js +1 -0
  55. package/.output/public/_nuxt/{BhrnGVGz.js → DSdxfFX_.js} +1 -1
  56. package/.output/public/_nuxt/DVS06wUy2.js +13 -0
  57. package/.output/public/_nuxt/DXlAfhEi.js +3 -0
  58. package/.output/public/_nuxt/Dc5NeCDq.js +1 -0
  59. package/.output/public/_nuxt/{CW1HGp5X.js → DiHL9ehB.js} +1 -1
  60. package/.output/public/_nuxt/DjtDexGg.js +1 -0
  61. package/.output/public/_nuxt/{CuRtzvsa2.js → DnunMTRD2.js} +1 -1
  62. package/.output/public/_nuxt/{CZ0Gt81h.js → Dok0B4Ol.js} +2 -2
  63. package/.output/public/_nuxt/DqT2_Jtw2.js +1 -0
  64. package/.output/public/_nuxt/{DJZzthKt2.js → DtMlAxCm2.js} +1 -1
  65. package/.output/public/_nuxt/{Du0zf-d3.js → DwzJpr7P.js} +1 -1
  66. package/.output/public/_nuxt/J94L7hHq2.js +1 -0
  67. package/.output/public/_nuxt/LQBLwrYS2.js +1 -0
  68. package/.output/public/_nuxt/N9TYd_Mk2.js +1 -0
  69. package/.output/public/_nuxt/QSY9fE482.js +1 -0
  70. package/.output/public/_nuxt/{MEwEMEMl2.js → Qa9rS9oK2.js} +6 -6
  71. package/.output/public/_nuxt/{pNy4V4kd.js → R3gBFghJ2.js} +1 -1
  72. package/.output/public/_nuxt/{BAqtRt0q.js → ZxBwmbs9.js} +1 -1
  73. package/.output/public/_nuxt/{BMUEVeOK.js → _mD4IkJj.js} +1 -1
  74. package/.output/public/_nuxt/analysis.DfMg76el.css +1 -0
  75. package/.output/public/_nuxt/builds/latest.json +1 -1
  76. package/.output/public/_nuxt/builds/meta/eba8574d-1991-47df-944c-18608bb58181.json +1 -0
  77. package/.output/public/_nuxt/c_nqArmG.js +1 -0
  78. package/.output/public/_nuxt/{default.8ac6QU28.css → default.Bx6RJSbr.css} +1 -1
  79. package/.output/public/_nuxt/{entry.BHNNQA9H.css → entry.BlbU43qz.css} +1 -1
  80. package/.output/public/_nuxt/h8ddxY892.js +1 -0
  81. package/.output/public/_nuxt/{TjGWqrHo.js → i3KBHle7.js} +1 -1
  82. package/.output/public/_nuxt/jmKfTQMN.js +13 -0
  83. package/.output/public/_nuxt/{CZwDnomB.js → taHLOXkS.js} +1 -1
  84. package/.output/public/_nuxt/uYP6z4G72.js +1 -0
  85. package/.output/public/_nuxt/{CIz7SM4H.js → yuIP6K9s.js} +1 -1
  86. package/.output/public/_nuxt/zWg-9WN6.js +19 -0
  87. package/.output/public/_nuxt/zrgcKVTq.js +2 -0
  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 +1662 -1232
  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-BK2RqkbD.mjs} +5 -5
  95. package/.output/server/chunks/build/{AuthGate-DDPYswkA.mjs.map → AuthGate-BK2RqkbD.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-BqtgOBDe.mjs} +2 -2
  98. package/.output/server/chunks/build/{FormItemContext-4ORSzhWv.mjs.map → FormItemContext-BqtgOBDe.mjs.map} +1 -1
  99. package/.output/server/chunks/build/{OmpTerminalPanel-DZ2wHMS1.mjs → OmpTerminalPanel-Bun6rpAk.mjs} +4 -4
  100. package/.output/server/chunks/build/{OmpTerminalPanel-DZ2wHMS1.mjs.map → OmpTerminalPanel-Bun6rpAk.mjs.map} +1 -1
  101. package/.output/server/chunks/build/{PluginSlot-CT4YaNrB.mjs → PluginSlot-Do6dX0RE.mjs} +2 -2
  102. package/.output/server/chunks/build/{PluginSlot-CT4YaNrB.mjs.map → PluginSlot-Do6dX0RE.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_-Dp3ACbQ5.mjs} +22 -21
  110. package/.output/server/chunks/build/{_wsId_-CJqF-hmP.mjs.map → _wsId_-Dp3ACbQ5.mjs.map} +1 -1
  111. package/.output/server/chunks/build/{agents-BTsbna5H.mjs → agents-BfIoGr_p.mjs} +18 -17
  112. package/.output/server/chunks/build/agents-BfIoGr_p.mjs.map +1 -0
  113. package/.output/server/chunks/build/{aml-BBKfWto1.mjs → aml-B5zKrvB3.mjs} +7 -7
  114. package/.output/server/chunks/build/{aml-BBKfWto1.mjs.map → aml-B5zKrvB3.mjs.map} +1 -1
  115. package/.output/server/chunks/build/analysis-MVEnlO7A.mjs +531 -0
  116. package/.output/server/chunks/build/analysis-MVEnlO7A.mjs.map +1 -0
  117. package/.output/server/chunks/build/{card-DJOYGuVH.mjs → card-IyQjdGXA.mjs} +4 -4
  118. package/.output/server/chunks/build/{card-DJOYGuVH.mjs.map → card-IyQjdGXA.mjs.map} +1 -1
  119. package/.output/server/chunks/build/{channel-templates-BPKJ8e4l.mjs → channel-templates-Bd8bgBCh.mjs} +11 -10
  120. package/.output/server/chunks/build/channel-templates-Bd8bgBCh.mjs.map +1 -0
  121. package/.output/server/chunks/build/{checkbox-C4AKj81e.mjs → checkbox-NnjtOam0.mjs} +3 -3
  122. package/.output/server/chunks/build/{checkbox-C4AKj81e.mjs.map → checkbox-NnjtOam0.mjs.map} +1 -1
  123. package/.output/server/chunks/build/{daq-Cz7TaUAM.mjs → daq-mC3-5A0L.mjs} +5 -5
  124. package/.output/server/chunks/build/{daq-Cz7TaUAM.mjs.map → daq-mC3-5A0L.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-flcNWlNg.mjs} +30 -19
  127. package/.output/server/chunks/build/{default-DweMY872.mjs.map → default-flcNWlNg.mjs.map} +1 -1
  128. package/.output/server/chunks/build/{descriptions-CFaUq4y4.mjs → descriptions-DuAefuzp.mjs} +2 -2
  129. package/.output/server/chunks/build/{descriptions-CFaUq4y4.mjs.map → descriptions-DuAefuzp.mjs.map} +1 -1
  130. package/.output/server/chunks/build/{drawer-Cfh9_zft.mjs → drawer-DEIB1_X6.mjs} +2 -2
  131. package/.output/server/chunks/build/{drawer-Cfh9_zft.mjs.map → drawer-DEIB1_X6.mjs.map} +1 -1
  132. package/.output/server/chunks/build/{dropdown-CV9GW3z9.mjs → dropdown-BuD1pxH2.mjs} +6 -5
  133. package/.output/server/chunks/build/{dropdown-CV9GW3z9.mjs.map → dropdown-BuD1pxH2.mjs.map} +1 -1
  134. package/.output/server/chunks/build/{dropdown-CIsqbX4P.mjs → dropdown-w7qhyN2D.mjs} +2 -2
  135. package/.output/server/chunks/build/{dropdown-CIsqbX4P.mjs.map → dropdown-w7qhyN2D.mjs.map} +1 -1
  136. package/.output/server/chunks/build/es-DfgEl5n-.mjs +42 -0
  137. package/.output/server/chunks/build/es-DfgEl5n-.mjs.map +1 -0
  138. package/.output/server/chunks/build/{form-cs_RcfGx.mjs → form-CMLL_-Xx.mjs} +7 -6
  139. package/.output/server/chunks/build/{form-cs_RcfGx.mjs.map → form-CMLL_-Xx.mjs.map} +1 -1
  140. package/.output/server/chunks/build/{input-CobQ5LJ5.mjs → input-DZcioTwL.mjs} +93 -3449
  141. package/.output/server/chunks/build/input-DZcioTwL.mjs.map +1 -0
  142. package/.output/server/chunks/build/{input-number-BpPYAWMk.mjs → input-number-BRnbiKLd.mjs} +6 -5
  143. package/.output/server/chunks/build/{input-number-BpPYAWMk.mjs.map → input-number-BRnbiKLd.mjs.map} +1 -1
  144. package/.output/server/chunks/build/{logs-As9fZqU-.mjs → logs-BYop3JfX.mjs} +3 -3
  145. package/.output/server/chunks/build/{logs-As9fZqU-.mjs.map → logs-BYop3JfX.mjs.map} +1 -1
  146. package/.output/server/chunks/build/{menu-CVmvHyFT.mjs → menu-DXfhc0qN.mjs} +4 -3
  147. package/.output/server/chunks/build/{menu-CVmvHyFT.mjs.map → menu-DXfhc0qN.mjs.map} +1 -1
  148. package/.output/server/chunks/build/{monitor-CdFQ2z4g.mjs → monitor-BjBGkUm2.mjs} +20 -19
  149. package/.output/server/chunks/build/{monitor-CdFQ2z4g.mjs.map → monitor-BjBGkUm2.mjs.map} +1 -1
  150. package/.output/server/chunks/build/{operations-B2gHCWgZ.mjs → operations-fxI8lEBJ.mjs} +3 -3
  151. package/.output/server/chunks/build/{operations-B2gHCWgZ.mjs.map → operations-fxI8lEBJ.mjs.map} +1 -1
  152. package/.output/server/chunks/build/{pages-BItCt1ar.mjs → pages-6JD9VSbx.mjs} +5 -5
  153. package/.output/server/chunks/build/{pages-BItCt1ar.mjs.map → pages-6JD9VSbx.mjs.map} +1 -1
  154. package/.output/server/chunks/build/{permissions-D6mQw_9j.mjs → permissions-u5SZL8Fe.mjs} +14 -13
  155. package/.output/server/chunks/build/permissions-u5SZL8Fe.mjs.map +1 -0
  156. package/.output/server/chunks/build/{plugins-NAS9MQ5r.mjs → plugins-Cas6KOF-.mjs} +5 -5
  157. package/.output/server/chunks/build/{plugins-NAS9MQ5r.mjs.map → plugins-Cas6KOF-.mjs.map} +1 -1
  158. package/.output/server/chunks/build/{popconfirm-DFfoFhmt.mjs → popconfirm-BWxt-53K.mjs} +3 -3
  159. package/.output/server/chunks/build/{popconfirm-DFfoFhmt.mjs.map → popconfirm-BWxt-53K.mjs.map} +1 -1
  160. package/.output/server/chunks/build/{schedules-BjWNDWL5.mjs → schedules-Ct68Jrvw.mjs} +20 -19
  161. package/.output/server/chunks/build/{schedules-BjWNDWL5.mjs.map → schedules-Ct68Jrvw.mjs.map} +1 -1
  162. package/.output/server/chunks/build/{segmented-D7FkCgg7.mjs → segmented-DN62bOFu.mjs} +3 -3
  163. package/.output/server/chunks/build/{segmented-D7FkCgg7.mjs.map → segmented-DN62bOFu.mjs.map} +1 -1
  164. package/.output/server/chunks/build/{select-FqBNxgxT.mjs → select-DQv1DXcW.mjs} +5 -4
  165. package/.output/server/chunks/build/{select-FqBNxgxT.mjs.map → select-DQv1DXcW.mjs.map} +1 -1
  166. package/.output/server/chunks/build/{settings-Cl_KRyEn.mjs → settings-CQzR1YXR.mjs} +14 -13
  167. package/.output/server/chunks/build/settings-CQzR1YXR.mjs.map +1 -0
  168. package/.output/server/chunks/build/{space-B2uhHJG8.mjs → space-6FfG3llN.mjs} +2 -2
  169. package/.output/server/chunks/build/{space-B2uhHJG8.mjs.map → space-6FfG3llN.mjs.map} +1 -1
  170. package/.output/server/chunks/build/{switch-DZAUIbIN.mjs → switch-CfsCVFQP.mjs} +3 -3
  171. package/.output/server/chunks/build/{switch-DZAUIbIN.mjs.map → switch-CfsCVFQP.mjs.map} +1 -1
  172. package/.output/server/chunks/build/{table-CeOYERqr.mjs → table-HOjbB5YY.mjs} +11 -10
  173. package/.output/server/chunks/build/{table-CeOYERqr.mjs.map → table-HOjbB5YY.mjs.map} +1 -1
  174. package/.output/server/chunks/build/{tabs-LLNSdLl2.mjs → tabs-CC26Rbcw.mjs} +6 -5
  175. package/.output/server/chunks/build/{tabs-LLNSdLl2.mjs.map → tabs-CC26Rbcw.mjs.map} +1 -1
  176. package/.output/server/chunks/build/{tag-Dwvkh0Dj.mjs → tag-BtOMjpDx.mjs} +5 -4
  177. package/.output/server/chunks/build/{tag-Dwvkh0Dj.mjs.map → tag-BtOMjpDx.mjs.map} +1 -1
  178. package/.output/server/chunks/build/{teams-CGDZHaQl.mjs → teams-Re0wY2SQ.mjs} +19 -18
  179. package/.output/server/chunks/build/teams-Re0wY2SQ.mjs.map +1 -0
  180. package/.output/server/chunks/build/{tokens-BOYkZuoB.mjs → tokens-DLFIUvXE.mjs} +19 -18
  181. package/.output/server/chunks/build/tokens-DLFIUvXE.mjs.map +1 -0
  182. package/.output/server/chunks/build/tooltip-BSDwL_LM.mjs +3362 -0
  183. package/.output/server/chunks/build/tooltip-BSDwL_LM.mjs.map +1 -0
  184. package/.output/server/chunks/build/town-BV-hbwb5.mjs +1 -1
  185. package/.output/server/chunks/build/{town-P1rYoi0v.mjs → town-Bfme7P2I.mjs} +5 -5
  186. package/.output/server/chunks/build/{town-P1rYoi0v.mjs.map → town-Bfme7P2I.mjs.map} +1 -1
  187. package/.output/server/chunks/build/types-D6J7slEa.mjs +1 -1
  188. package/.output/server/chunks/build/types-DWqIeMRP.mjs +75 -0
  189. package/.output/server/chunks/build/types-DWqIeMRP.mjs.map +1 -0
  190. package/.output/server/chunks/build/{useAgentTemplateActions-DsBRUQni.mjs → useAgentTemplateActions-CjBwCb3u.mjs} +1 -1
  191. package/.output/server/chunks/build/{useAgentTemplateActions-DsBRUQni.mjs.map → useAgentTemplateActions-CjBwCb3u.mjs.map} +1 -1
  192. package/.output/server/chunks/build/{useAgentTemplateForm-DzQ_t2Ue.mjs → useAgentTemplateForm-BX9_xqj8.mjs} +1 -1
  193. package/.output/server/chunks/build/{useAgentTemplateForm-DzQ_t2Ue.mjs.map → useAgentTemplateForm-BX9_xqj8.mjs.map} +1 -1
  194. package/.output/server/chunks/build/{useAmlEntities-BMLHU_39.mjs → useAmlEntities-BrcTqHwa.mjs} +2 -2
  195. package/.output/server/chunks/build/{useAmlEntities-BMLHU_39.mjs.map → useAmlEntities-BrcTqHwa.mjs.map} +1 -1
  196. package/.output/server/chunks/build/{useAmlEnv-DdlyVzPu.mjs → useAmlEnv-jiGYK790.mjs} +1 -1
  197. package/.output/server/chunks/build/{useAmlEnv-DdlyVzPu.mjs.map → useAmlEnv-jiGYK790.mjs.map} +1 -1
  198. package/.output/server/chunks/build/{useAmlJobs-BG_v21hJ.mjs → useAmlJobs-CVZ1btzg.mjs} +1 -1
  199. package/.output/server/chunks/build/{useAmlJobs-BG_v21hJ.mjs.map → useAmlJobs-CVZ1btzg.mjs.map} +1 -1
  200. package/.output/server/chunks/build/{useAmlModels-D7MuOWOy.mjs → useAmlModels-DJkQzcCU.mjs} +1 -1
  201. package/.output/server/chunks/build/{useAmlModels-D7MuOWOy.mjs.map → useAmlModels-DJkQzcCU.mjs.map} +1 -1
  202. package/.output/server/chunks/build/{useAmlNotes-CTZe-GI0.mjs → useAmlNotes-DKnx9a8x.mjs} +1 -1
  203. package/.output/server/chunks/build/{useAmlNotes-CTZe-GI0.mjs.map → useAmlNotes-DKnx9a8x.mjs.map} +1 -1
  204. package/.output/server/chunks/build/{useAmlPredict-BToRrVRV.mjs → useAmlPredict-Bp4ehwKw.mjs} +1 -1
  205. package/.output/server/chunks/build/{useAmlPredict-BToRrVRV.mjs.map → useAmlPredict-Bp4ehwKw.mjs.map} +1 -1
  206. package/.output/server/chunks/build/useAnalysisFeed-B4OwUd7p.mjs +128 -0
  207. package/.output/server/chunks/build/useAnalysisFeed-B4OwUd7p.mjs.map +1 -0
  208. package/.output/server/chunks/build/useDaqAddNode-CaOCbe4-.mjs +1 -1
  209. package/.output/server/chunks/build/{useDaqDetailNode-DXgwAu5u.mjs → useDaqDetailNode-DtZ0oDAn.mjs} +3 -3
  210. package/.output/server/chunks/build/{useDaqDetailNode-DXgwAu5u.mjs.map → useDaqDetailNode-DtZ0oDAn.mjs.map} +1 -1
  211. package/.output/server/chunks/build/useDaqDetailParams-CrTMDs-2.mjs +1 -1
  212. package/.output/server/chunks/build/{useDaqFilters-Jx6EERfr.mjs → useDaqFilters-DYHGhECw.mjs} +3 -3
  213. package/.output/server/chunks/build/{useDaqFilters-Jx6EERfr.mjs.map → useDaqFilters-DYHGhECw.mjs.map} +1 -1
  214. package/.output/server/chunks/build/useDaqStream-DhzdoyIR.mjs +1 -1
  215. package/.output/server/chunks/build/useDaqTemplates-C7GzQmdJ.mjs +1 -1
  216. package/.output/server/chunks/build/{useDashboardData-Ce-EU5DJ.mjs → useDashboardData-B3lZjE7x.mjs} +3 -3
  217. package/.output/server/chunks/build/{useDashboardData-Ce-EU5DJ.mjs.map → useDashboardData-B3lZjE7x.mjs.map} +1 -1
  218. package/.output/server/chunks/build/useDcwAddNode-4mTPQ6T8.mjs +1 -1
  219. package/.output/server/chunks/build/{useDcwDetailScope-4j3B03Pi.mjs → useDcwDetailScope-BWH7jnVh.mjs} +2 -2
  220. package/.output/server/chunks/build/{useDcwDetailScope-4j3B03Pi.mjs.map → useDcwDetailScope-BWH7jnVh.mjs.map} +1 -1
  221. package/.output/server/chunks/build/useDcwStream-BXJ2V8HM.mjs +1 -1
  222. package/.output/server/chunks/build/{useLogsManual-CMjD62nt.mjs → useLogsManual-CElmZuJh.mjs} +1 -1
  223. package/.output/server/chunks/build/{useLogsManual-CMjD62nt.mjs.map → useLogsManual-CElmZuJh.mjs.map} +1 -1
  224. package/.output/server/chunks/build/{useMonitorData-D2gFSonG.mjs → useMonitorData-DcIfMEiz.mjs} +1 -1
  225. package/.output/server/chunks/build/{useMonitorData-D2gFSonG.mjs.map → useMonitorData-DcIfMEiz.mjs.map} +1 -1
  226. package/.output/server/chunks/build/{useTeamActions-BOLQkYxg.mjs → useTeamActions-C3_O_AIU.mjs} +1 -1
  227. package/.output/server/chunks/build/{useTeamActions-BOLQkYxg.mjs.map → useTeamActions-C3_O_AIU.mjs.map} +1 -1
  228. package/.output/server/chunks/build/{useTeamAddMemberDialog-BCgrLPxI.mjs → useTeamAddMemberDialog-DWAoZCKd.mjs} +1 -1
  229. package/.output/server/chunks/build/{useTeamAddMemberDialog-BCgrLPxI.mjs.map → useTeamAddMemberDialog-DWAoZCKd.mjs.map} +1 -1
  230. package/.output/server/chunks/build/{useTeamCreateDialog-CJk40LqS.mjs → useTeamCreateDialog-911mIPWd.mjs} +1 -1
  231. package/.output/server/chunks/build/{useTeamCreateDialog-CJk40LqS.mjs.map → useTeamCreateDialog-911mIPWd.mjs.map} +1 -1
  232. package/.output/server/chunks/build/{useTeamDeployDialog-49hdUXQP.mjs → useTeamDeployDialog-D0STROoQ.mjs} +1 -1
  233. package/.output/server/chunks/build/{useTeamDeployDialog-49hdUXQP.mjs.map → useTeamDeployDialog-D0STROoQ.mjs.map} +1 -1
  234. package/.output/server/chunks/build/{useTeamPluginDialog-Dh-QOoiU.mjs → useTeamPluginDialog-Df6-e2OW.mjs} +1 -1
  235. package/.output/server/chunks/build/{useTeamPluginDialog-Dh-QOoiU.mjs.map → useTeamPluginDialog-Df6-e2OW.mjs.map} +1 -1
  236. package/.output/server/chunks/build/{useTokenCreate-DkYvEQUD.mjs → useTokenCreate-DOojAhM5.mjs} +1 -1
  237. package/.output/server/chunks/build/{useTokenCreate-DkYvEQUD.mjs.map → useTokenCreate-DOojAhM5.mjs.map} +1 -1
  238. package/.output/server/chunks/build/{useTokenRename-DOCP4aeI.mjs → useTokenRename-CMA5dLHx.mjs} +1 -1
  239. package/.output/server/chunks/build/{useTokenRename-DOCP4aeI.mjs.map → useTokenRename-CMA5dLHx.mjs.map} +1 -1
  240. package/.output/server/chunks/build/{useTokenReveal-CybwwflV.mjs → useTokenReveal-C19aCKzt.mjs} +1 -1
  241. package/.output/server/chunks/build/{useTokenReveal-CybwwflV.mjs.map → useTokenReveal-C19aCKzt.mjs.map} +1 -1
  242. package/.output/server/chunks/build/{useTokensList-BLiMvrc4.mjs → useTokensList-D0ZpLOhR.mjs} +1 -1
  243. package/.output/server/chunks/build/{useTokensList-BLiMvrc4.mjs.map → useTokensList-D0ZpLOhR.mjs.map} +1 -1
  244. package/.output/server/chunks/build/{useWorkbenchAuth-DAabQl7X.mjs → useWorkbenchAuth-CN5E3J5L.mjs} +1 -1
  245. package/.output/server/chunks/build/{useWorkbenchAuth-DAabQl7X.mjs.map → useWorkbenchAuth-CN5E3J5L.mjs.map} +1 -1
  246. package/.output/server/chunks/build/{useWorkbenchWorkspaces-6-mpCGCR.mjs → useWorkbenchWorkspaces-ChKByQSD.mjs} +1 -1
  247. package/.output/server/chunks/build/{useWorkbenchWorkspaces-6-mpCGCR.mjs.map → useWorkbenchWorkspaces-ChKByQSD.mjs.map} +1 -1
  248. package/.output/server/chunks/build/{users-B_pHStEa.mjs → users-BW4jowK4.mjs} +15 -14
  249. package/.output/server/chunks/build/users-BW4jowK4.mjs.map +1 -0
  250. package/.output/server/chunks/build/{workshop-C0DefygA.mjs → workshop-Bx55czXL.mjs} +11 -10
  251. package/.output/server/chunks/build/workshop-Bx55czXL.mjs.map +1 -0
  252. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  253. package/.output/server/chunks/routes/api/system/backup/run.post.mjs +2 -2
  254. package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs +46 -0
  255. package/.output/server/chunks/routes/api/workshop/analysis/_id_.delete.mjs.map +1 -0
  256. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs +40 -0
  257. package/.output/server/chunks/routes/api/workshop/analysis/_id_.get.mjs.map +1 -0
  258. package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs +103 -0
  259. package/.output/server/chunks/routes/api/workshop/analysis/_id_.patch.mjs.map +1 -0
  260. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +1 -1
  261. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +1 -1
  262. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  263. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +1 -1
  264. package/.output/server/chunks/routes/api/workshop/channels/_id/chat/index.post.mjs +1 -1
  265. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +1 -1
  266. package/.output/server/chunks/routes/api/workshop/channels/_id/index.put.mjs +1 -1
  267. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  268. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  269. package/.output/server/chunks/routes/api/workshop/channels/_id/index5.get.mjs +1 -1
  270. package/.output/server/chunks/routes/api/workshop/channels/_id/line.put.mjs +1 -1
  271. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +1 -1
  272. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.get.mjs +1 -1
  273. package/.output/server/chunks/routes/api/workshop/channels/_id/twin-profile.patch.mjs +1 -1
  274. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +1 -1
  275. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +7 -7
  276. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +1 -1
  277. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  278. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  279. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  280. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  281. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  282. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  283. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  284. package/.output/server/chunks/routes/api/workshop/dcw/_id/bindings.put.mjs +1 -1
  285. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  286. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  287. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  288. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  289. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  290. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  291. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  292. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  293. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  294. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  295. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  296. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  297. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +1 -1
  298. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +1 -1
  299. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  300. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +1 -1
  301. package/.output/server/chunks/routes/api/workshop/dcw/index5.post.mjs +1 -1
  302. package/.output/server/chunks/routes/api/workshop/dcw/index6.get.mjs +1 -1
  303. package/.output/server/chunks/routes/api/workshop/dcw/index7.get.mjs +1 -1
  304. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  305. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  306. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  307. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  308. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  309. package/.output/server/chunks/routes/api/workshop/dcw/mes-artifacts/file.get.mjs +1 -1
  310. package/.output/server/chunks/routes/api/workshop/dcw/mes-hook-test.post.mjs +1 -1
  311. package/.output/server/chunks/routes/api/workshop/dcw/mes-test-read.post.mjs +1 -1
  312. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  313. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  314. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  315. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  316. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/read.post.mjs +1 -1
  317. package/.output/server/chunks/routes/api/workshop/dcw/params/_id/write.post.mjs +1 -1
  318. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.delete.mjs +1 -1
  319. package/.output/server/chunks/routes/api/workshop/dcw/params/_id_.patch.mjs +1 -1
  320. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  321. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  322. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  323. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  324. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  325. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +1 -1
  326. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  327. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  328. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  329. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  330. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  331. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  332. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  333. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  334. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  335. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +1 -1
  336. package/.output/server/chunks/routes/api/workshop/exp/confirmations/_id/decide.post.mjs +1 -1
  337. package/.output/server/chunks/routes/api/workshop/exp/index.get.mjs +1 -1
  338. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
  339. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  340. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  341. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  342. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  343. package/.output/server/chunks/routes/api/workshop/index.put.mjs +1 -1
  344. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +20 -23
  345. package/.output/server/chunks/routes/api/workshop/index10.get.mjs.map +1 -1
  346. package/.output/server/chunks/routes/api/workshop/index11.get.mjs +25 -11
  347. package/.output/server/chunks/routes/api/workshop/index11.get.mjs.map +1 -1
  348. package/.output/server/chunks/routes/api/workshop/index12.get.mjs +10 -4
  349. package/.output/server/chunks/routes/api/workshop/index12.get.mjs.map +1 -1
  350. package/.output/server/chunks/routes/api/workshop/index13.get.mjs +2 -3
  351. package/.output/server/chunks/routes/api/workshop/index13.get.mjs.map +1 -1
  352. package/.output/server/chunks/routes/api/workshop/index14.get.mjs +3 -2
  353. package/.output/server/chunks/routes/api/workshop/index14.get.mjs.map +1 -1
  354. package/.output/server/chunks/routes/api/workshop/index15.get.mjs +30 -0
  355. package/.output/server/chunks/routes/api/workshop/index15.get.mjs.map +1 -0
  356. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +24 -9
  357. package/.output/server/chunks/routes/api/workshop/index3.get.mjs.map +1 -1
  358. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  359. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +10 -4
  360. package/.output/server/chunks/routes/api/workshop/index4.get.mjs.map +1 -1
  361. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  362. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +4 -29
  363. package/.output/server/chunks/routes/api/workshop/index5.get.mjs.map +1 -1
  364. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +1 -1
  365. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +25 -22
  366. package/.output/server/chunks/routes/api/workshop/index6.get.mjs.map +1 -1
  367. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +26 -5
  368. package/.output/server/chunks/routes/api/workshop/index7.get.mjs.map +1 -1
  369. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +4 -39
  370. package/.output/server/chunks/routes/api/workshop/index8.get.mjs.map +1 -1
  371. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +40 -20
  372. package/.output/server/chunks/routes/api/workshop/index9.get.mjs.map +1 -1
  373. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  374. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  375. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  376. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  377. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +1 -1
  378. package/.output/server/chunks/routes/api/workshop/teams/_id/index.put.mjs +1 -1
  379. package/.output/server/chunks/routes/api/workshop/teams/_id/index2.get.mjs +1 -1
  380. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  381. package/.output/server/chunks/routes/renderer.mjs +3 -3
  382. package/.output/server/chunks/virtual/entry.mjs +199 -468
  383. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  384. package/.output/server/package.json +1 -1
  385. package/README-zh.md +17 -0
  386. package/README.md +20 -0
  387. package/app/components/AppSidebar.vue +1 -0
  388. package/app/components/analysis/AnalysisEditModal.vue +192 -0
  389. package/app/components/analysis/AnalysisFilterCard.vue +159 -0
  390. package/app/components/analysis/AnalysisPageHead.vue +47 -0
  391. package/app/components/analysis/AnalysisTable.vue +322 -0
  392. package/app/composables/useRouteMeta.ts +1 -0
  393. package/app/config/schema.ts +1 -0
  394. package/app/pages/analysis/composables/useAnalysisFeed.ts +85 -0
  395. package/app/pages/analysis/index.vue +128 -0
  396. package/app/pages/analysis/types.ts +50 -0
  397. package/cli/commands/mcp.mjs +160 -160
  398. package/i18n/locales/en.ts +63 -0
  399. package/i18n/locales/zh-CN.ts +63 -0
  400. package/mcp/aw-mcp-server.mjs +799 -799
  401. package/package.json +2 -2
  402. package/scripts/onboarding/onboard.mjs +5 -2
  403. package/scripts/onboarding/sim-twin.mjs +312 -0
  404. package/server/api/workshop/analysis/[id].delete.ts +30 -0
  405. package/server/api/workshop/analysis/[id].get.ts +25 -0
  406. package/server/api/workshop/analysis/[id].patch.ts +100 -0
  407. package/server/api/workshop/analysis/index.get.ts +39 -0
  408. package/server/plugins/workshop.ts +4 -0
  409. package/server/repositories/user.repository.ts +2 -2
  410. package/server/services/workshop/agents/host-tool-bridge/catalog.ts +4 -1
  411. package/server/services/workshop/agents/host-tool-bridge/tools/industrial.ts +5 -2
  412. package/server/services/workshop/agents/industrial/analysis-tools.ts +242 -0
  413. package/server/services/workshop/agents/industrial/index.ts +1 -0
  414. package/server/services/workshop/agents/industrial/ops-tools.ts +3 -2
  415. package/server/services/workshop/analysis/analysis.repo.ts +241 -0
  416. package/server/services/workshop/db/database/migrations.ts +10 -0
  417. package/server/services/workshop/db/database/open.ts +3 -1
  418. package/server/services/workshop/db/database/schema.ts +32 -1
  419. package/server/services/workshop/db/ops.repo.ts +1 -1
  420. package/server/services/workshop/db/retention.ts +2 -0
  421. package/server/services/workshop/db/schema.sql +31 -0
  422. package/server/services/workshop/settings.ts +1 -0
  423. package/shared/config/schema.json +1 -0
  424. package/.output/public/_nuxt/B-Y_rsfn.js +0 -106
  425. package/.output/public/_nuxt/B02cxZz72.js +0 -1
  426. package/.output/public/_nuxt/BKHd_sKD2.js +0 -47
  427. package/.output/public/_nuxt/BikIgp9R.js +0 -1
  428. package/.output/public/_nuxt/BkGqyjWm.js +0 -3
  429. package/.output/public/_nuxt/Br2LgfbH2.js +0 -13
  430. package/.output/public/_nuxt/BrFF_9742.js +0 -1
  431. package/.output/public/_nuxt/BtYg4aGR2.js +0 -1
  432. package/.output/public/_nuxt/C4X_Z1lA.js +0 -1
  433. package/.output/public/_nuxt/CBATzTUf.js +0 -13
  434. package/.output/public/_nuxt/CEP4UrDv.js +0 -1
  435. package/.output/public/_nuxt/CIPKYgrH2.js +0 -1
  436. package/.output/public/_nuxt/CPSHP_EI.js +0 -1
  437. package/.output/public/_nuxt/CSyIwYcJ2.js +0 -1
  438. package/.output/public/_nuxt/CZkTlW93.js +0 -2
  439. package/.output/public/_nuxt/CZyYdpqZ2.js +0 -1
  440. package/.output/public/_nuxt/CeDkXWCz.js +0 -1
  441. package/.output/public/_nuxt/Cl19UD7U.js +0 -1
  442. package/.output/public/_nuxt/ClrkV0C4.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/D8VQGThE.js +0 -28
  447. package/.output/public/_nuxt/DBwuADr82.js +0 -1
  448. package/.output/public/_nuxt/DfqRQSFn.js +0 -19
  449. package/.output/public/_nuxt/DraEWn4N2.js +0 -1
  450. package/.output/public/_nuxt/DyMgrV29.js +0 -1
  451. package/.output/public/_nuxt/H7Rbu32y2.js +0 -1
  452. package/.output/public/_nuxt/YDs3mbQu2.js +0 -1
  453. package/.output/public/_nuxt/Z3MSTcdu2.js +0 -1
  454. package/.output/public/_nuxt/_vR_sc7t.js +0 -24
  455. package/.output/public/_nuxt/builds/meta/92fd7e2e-18f2-45c3-8588-d93004dda6e3.json +0 -1
  456. package/.output/public/_nuxt/gbaq2UOO.js +0 -1
  457. package/.output/public/_nuxt/o-G6YtmK2.js +0 -1
  458. package/.output/public/_nuxt/ylowSquM2.js +0 -1
  459. package/.output/server/chunks/build/agents-BTsbna5H.mjs.map +0 -1
  460. package/.output/server/chunks/build/channel-templates-BPKJ8e4l.mjs.map +0 -1
  461. package/.output/server/chunks/build/input-CobQ5LJ5.mjs.map +0 -1
  462. package/.output/server/chunks/build/permissions-D6mQw_9j.mjs.map +0 -1
  463. package/.output/server/chunks/build/settings-Cl_KRyEn.mjs.map +0 -1
  464. package/.output/server/chunks/build/teams-CGDZHaQl.mjs.map +0 -1
  465. package/.output/server/chunks/build/tokens-BOYkZuoB.mjs.map +0 -1
  466. package/.output/server/chunks/build/users-B_pHStEa.mjs.map +0 -1
  467. package/.output/server/chunks/build/workshop-C0DefygA.mjs.map +0 -1
  468. package/scripts/_audit/.tmp/audit-data/dcw-params.json +0 -15
  469. package/scripts/_audit/.tmp/audit-data/dcws.json +0 -30
  470. package/scripts/_audit/aml-layout-diag.mjs +0 -83
  471. package/scripts/_audit/channel-inspect.mjs +0 -49
  472. package/scripts/_audit/cleanup-apply.mjs +0 -89
  473. package/scripts/_audit/cleanup-plan.mjs +0 -82
  474. package/scripts/_audit/contrast-check.mjs +0 -43
  475. package/scripts/_audit/dcw-controller-e2e.ts +0 -106
  476. package/scripts/_audit/dcw-flush-cost.ts +0 -43
  477. package/scripts/_audit/dcw-rollback-ledger.ts +0 -156
  478. package/scripts/_audit/dcw-unrecorded-write.ts +0 -171
  479. package/scripts/_audit/dcw-write-mutex.ts +0 -157
  480. package/scripts/_audit/design-shots.mjs +0 -145
  481. package/scripts/_audit/docs-font-probe.mjs +0 -68
  482. package/scripts/_audit/docs-probe.mjs +0 -107
  483. package/scripts/_audit/docs-shots.mjs +0 -171
  484. package/scripts/_audit/docs-v3-verify.mjs +0 -255
  485. package/scripts/_audit/docs-vue-lint.mjs +0 -81
  486. package/scripts/_audit/docs-vue-lint2.mjs +0 -91
  487. package/scripts/_audit/exp-cost-scaling.mjs +0 -57
  488. package/scripts/_audit/exp-envelope-and-png.mjs +0 -78
  489. package/scripts/_audit/exp-png-decode.mjs +0 -67
  490. package/scripts/_audit/exp-retention-plan.mjs +0 -61
  491. package/scripts/_audit/exp-retention-rescan.mjs +0 -42
  492. package/scripts/_audit/exp-sweep-fairness.mjs +0 -50
  493. package/scripts/_audit/feature-audit-e2e.mjs +0 -342
  494. package/scripts/_audit/fix-settings-count.mjs +0 -57
  495. package/scripts/_audit/full-e2e-adopt.mjs +0 -238
  496. package/scripts/_audit/full-e2e-close-loop.mjs +0 -134
  497. package/scripts/_audit/full-e2e-retrain.mjs +0 -320
  498. package/scripts/_audit/full-e2e-supplement.mjs +0 -192
  499. package/scripts/_audit/full-e2e-ui-final.mjs +0 -111
  500. package/scripts/_audit/full-e2e-ui-mount.mjs +0 -111
  501. package/scripts/_audit/full-feature-e2e-20260927.mjs +0 -627
  502. package/scripts/_audit/glass-verify.mjs +0 -155
  503. package/scripts/_audit/hydration-diff.mjs +0 -104
  504. package/scripts/_audit/hydration-head.mjs +0 -36
  505. package/scripts/_audit/hydration-probe.mjs +0 -59
  506. package/scripts/_audit/idd-scenarios-e2e.mjs +0 -239
  507. package/scripts/_audit/kb-diag-complete.mjs +0 -261
  508. package/scripts/_audit/kb-diag-complete2.mjs +0 -271
  509. package/scripts/_audit/kb-diag-loop-e2e.mjs +0 -357
  510. package/scripts/_audit/kb-diag-loop-mock.mjs +0 -416
  511. package/scripts/_audit/kb-diag-loop-v2.mjs +0 -314
  512. package/scripts/_audit/lead-matrix-test.mjs +0 -172
  513. package/scripts/_audit/plc-agent-task.mjs +0 -74
  514. package/scripts/_audit/plc-clean-scenario.mjs +0 -434
  515. package/scripts/_audit/plc-clean-shots.mjs +0 -161
  516. package/scripts/_audit/plc-fc10-probe.mjs +0 -30
  517. package/scripts/_audit/probe-binding.mjs +0 -114
  518. package/scripts/_audit/recipe-save-e2e.mjs +0 -365
  519. package/scripts/_audit/review-fix-verify.mjs +0 -158
  520. package/scripts/_audit/runtime-dir-e2e.mjs +0 -393
  521. package/scripts/_audit/town-focus-shot.mjs +0 -129
  522. package/scripts/_audit/town-reposition.mjs +0 -85
  523. package/scripts/_audit/verify-cleanup.mjs +0 -67
  524. package/scripts/_audit/verify-data-integrity.mjs +0 -112
  525. package/scripts/_audit/watchdog-recovery-test.mjs +0 -149
  526. package/scripts/_dbg-optloop-ui-shots.mjs +0 -52
  527. /package/.output/public/_nuxt/{4RTUlYvj2.js → 4RTUlYvj.js} +0 -0
  528. /package/.output/public/_nuxt/{BBhLVYdM.js → BBhLVYdM2.js} +0 -0
  529. /package/.output/public/_nuxt/{BG7XSX-S2.js → BG7XSX-S.js} +0 -0
  530. /package/.output/public/_nuxt/{BU7WuuKh.js → BU7WuuKh2.js} +0 -0
  531. /package/.output/public/_nuxt/{BrRX-l9B2.js → BrRX-l9B.js} +0 -0
  532. /package/.output/public/_nuxt/{CHyzK5m52.js → CHyzK5m5.js} +0 -0
  533. /package/.output/public/_nuxt/{Ckafrjnw2.js → Ckafrjnw.js} +0 -0
  534. /package/.output/public/_nuxt/{D1Xw30Dj2.js → D1Xw30Dj.js} +0 -0
  535. /package/.output/public/_nuxt/{DEhjFhZ2.js → DEhjFhZ22.js} +0 -0
  536. /package/.output/public/_nuxt/{DdNujZN5.js → DdNujZN52.js} +0 -0
  537. /package/.output/public/_nuxt/{DzwIZ81f.js → DzwIZ81f2.js} +0 -0
  538. /package/.output/public/_nuxt/{M6NcguDO.js → M6NcguDO2.js} +0 -0
  539. /package/.output/public/_nuxt/{MW-V7IIP2.js → MW-V7IIP.js} +0 -0
  540. /package/.output/public/_nuxt/{WmMwIS4y.js → WmMwIS4y2.js} +0 -0
  541. /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,241 @@
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
+ /** v27 人工修订归因(未修订 = null/空) */
41
+ updatedAt: string | null
42
+ updatedBy: string
43
+ updatedByName: string
44
+ }
45
+
46
+ export interface AnalysisReportInput {
47
+ id: string
48
+ lineId: string
49
+ lineName: string
50
+ title: string
51
+ category: string
52
+ summary: string
53
+ conclusions: string[]
54
+ report: string
55
+ metrics: Record<string, unknown>
56
+ recipeId: string
57
+ recipeVersion: string
58
+ windowFrom: string | null
59
+ windowTo: string | null
60
+ dataSources: string
61
+ context: Record<string, unknown>
62
+ channelId: string
63
+ channelName: string
64
+ actor: string
65
+ actorName: string
66
+ createdAt: string
67
+ }
68
+
69
+ export interface AnalysisReportFilter {
70
+ /** 作用域限制(可见产线集合;空 = 不限) */
71
+ lineIds?: string[]
72
+ lineId?: string
73
+ recipeId?: string
74
+ category?: string
75
+ /** 关键词(title/summary LIKE) */
76
+ q?: string
77
+ /** created_at 下/上界(ISO) */
78
+ from?: string
79
+ to?: string
80
+ limit?: number
81
+ }
82
+
83
+ const COLS = `id, line_id AS lineId, line_name AS lineName, title, category, summary,
84
+ conclusions_json AS conclusionsJson, report, metrics_json AS metricsJson,
85
+ recipe_id AS recipeId, recipe_version AS recipeVersion,
86
+ window_from AS windowFrom, window_to AS windowTo, data_sources AS dataSources,
87
+ context_json AS contextJson, channel_id AS channelId, channel_name AS channelName,
88
+ actor, actor_name AS actorName, created_at AS createdAt,
89
+ updated_at AS updatedAt, updated_by AS updatedBy, updated_by_name AS updatedByName`
90
+
91
+ function rowToReport(r: Record<string, unknown>): AnalysisReportRow {
92
+ const parseJson = (raw: unknown, dflt: unknown): unknown => {
93
+ try {
94
+ return JSON.parse(String(raw ?? '')) ?? dflt
95
+ }
96
+ catch {
97
+ return dflt
98
+ }
99
+ }
100
+ return {
101
+ ...(r as unknown as Omit<AnalysisReportRow, 'conclusions' | 'metrics' | 'context' | 'conclusionsJson' | 'metricsJson' | 'contextJson'>),
102
+ conclusions: parseJson(r.conclusionsJson, []) as string[],
103
+ metrics: parseJson(r.metricsJson, {}) as Record<string, unknown>,
104
+ context: parseJson(r.contextJson, {}) as Record<string, unknown>,
105
+ } as AnalysisReportRow
106
+ }
107
+
108
+ export function createAnalysisRepo(db: DatabaseSync) {
109
+ const insertStmt = db.prepare(
110
+ `INSERT INTO analysis_reports (id, line_id, line_name, title, category, summary,
111
+ conclusions_json, report, metrics_json, recipe_id, recipe_version,
112
+ window_from, window_to, data_sources, context_json,
113
+ channel_id, channel_name, actor, actor_name, created_at)
114
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
115
+ )
116
+ // v27 人工修订:读改写单条全量 UPDATE(patch 在调用方合并,语句一次 prepare)
117
+ const updateStmt = db.prepare(
118
+ `UPDATE analysis_reports SET title = ?, category = ?, summary = ?, conclusions_json = ?,
119
+ report = ?, metrics_json = ?, recipe_id = ?, recipe_version = ?,
120
+ window_from = ?, window_to = ?, data_sources = ?,
121
+ updated_at = ?, updated_by = ?, updated_by_name = ?
122
+ WHERE id = ?`,
123
+ )
124
+ const getStmt = db.prepare(`SELECT ${COLS} FROM analysis_reports WHERE id = ?`)
125
+ const removeStmt = db.prepare(`DELETE FROM analysis_reports WHERE id = ?`)
126
+ const countStmt = db.prepare('SELECT COUNT(*) AS c FROM analysis_reports')
127
+
128
+ return {
129
+ insert(row: AnalysisReportInput): void {
130
+ insertStmt.run(
131
+ row.id, row.lineId, row.lineName, row.title, row.category, row.summary,
132
+ JSON.stringify(row.conclusions ?? []), row.report ?? '', JSON.stringify(row.metrics ?? {}),
133
+ row.recipeId ?? '', row.recipeVersion ?? '',
134
+ row.windowFrom ?? null, row.windowTo ?? null, row.dataSources ?? '', JSON.stringify(row.context ?? {}),
135
+ row.channelId ?? '', row.channelName ?? '', row.actor ?? '', row.actorName ?? '', row.createdAt,
136
+ )
137
+ },
138
+ get(id: string): AnalysisReportRow | undefined {
139
+ const r = getStmt.get(id) as Record<string, unknown> | undefined
140
+ return r ? rowToReport(r) : undefined
141
+ },
142
+ list(filter: AnalysisReportFilter = {}): AnalysisReportRow[] {
143
+ const where: string[] = []
144
+ const args: SQLInputValue[] = []
145
+ if (filter.lineId) {
146
+ where.push('line_id = ?')
147
+ args.push(filter.lineId)
148
+ }
149
+ if (filter.lineIds && filter.lineIds.length > 0) {
150
+ where.push(`line_id IN (${filter.lineIds.map(() => '?').join(', ')})`)
151
+ args.push(...filter.lineIds)
152
+ }
153
+ if (filter.recipeId) {
154
+ where.push('recipe_id = ?')
155
+ args.push(filter.recipeId)
156
+ }
157
+ if (filter.category) {
158
+ where.push('category = ?')
159
+ args.push(filter.category)
160
+ }
161
+ if (filter.q) {
162
+ // 关键词三列 LIKE:标题 / 一句话结论 / 结论明细(JSON 数组文本,元素原串可命中)
163
+ where.push('(title LIKE ? OR summary LIKE ? OR conclusions_json LIKE ?)')
164
+ const like = `%${filter.q}%`
165
+ args.push(like, like, like)
166
+ }
167
+ if (filter.from) {
168
+ where.push('created_at >= ?')
169
+ args.push(filter.from)
170
+ }
171
+ if (filter.to) {
172
+ where.push('created_at <= ?')
173
+ args.push(filter.to)
174
+ }
175
+ const sql = `SELECT ${COLS} FROM analysis_reports ${where.length ? `WHERE ${where.join(' AND ')}` : ''}
176
+ ORDER BY created_at DESC LIMIT ?`
177
+ args.push(Math.min(500, Math.max(1, filter.limit ?? 100)))
178
+ return (db.prepare(sql).all(...args) as unknown as Record<string, unknown>[]).map(rowToReport)
179
+ },
180
+ remove(id: string): boolean {
181
+ return Number(removeStmt.run(id).changes) > 0
182
+ },
183
+ /**
184
+ * v27 人工修订:部分字段更新(patch 缺省 = 保留原值),固化修订归因。
185
+ * 编辑面属人类管理操作(Agent 面仍无改删);调用方负责权限校验与窗口归一。
186
+ */
187
+ update(id: string, patch: {
188
+ title?: string
189
+ category?: string
190
+ summary?: string
191
+ conclusions?: string[]
192
+ report?: string
193
+ metrics?: Record<string, unknown>
194
+ recipeId?: string
195
+ recipeVersion?: string
196
+ windowFrom?: string | null
197
+ windowTo?: string | null
198
+ dataSources?: string
199
+ }, editor: { id: string, name: string }): AnalysisReportRow | undefined {
200
+ const cur = getStmt.get(id) as Record<string, unknown> | undefined
201
+ if (!cur) return undefined
202
+ const merged = rowToReport(cur)
203
+ updateStmt.run(
204
+ patch.title !== undefined ? patch.title : merged.title,
205
+ patch.category !== undefined ? patch.category : merged.category,
206
+ patch.summary !== undefined ? patch.summary : merged.summary,
207
+ JSON.stringify(patch.conclusions !== undefined ? patch.conclusions : merged.conclusions),
208
+ patch.report !== undefined ? patch.report : merged.report,
209
+ JSON.stringify(patch.metrics !== undefined ? patch.metrics : merged.metrics),
210
+ patch.recipeId !== undefined ? patch.recipeId : merged.recipeId,
211
+ patch.recipeVersion !== undefined ? patch.recipeVersion : merged.recipeVersion,
212
+ patch.windowFrom !== undefined ? patch.windowFrom : merged.windowFrom,
213
+ patch.windowTo !== undefined ? patch.windowTo : merged.windowTo,
214
+ patch.dataSources !== undefined ? patch.dataSources : merged.dataSources,
215
+ new Date().toISOString(),
216
+ editor.id,
217
+ editor.name,
218
+ id,
219
+ )
220
+ return this.get(id)
221
+ },
222
+ count(): number {
223
+ return Number((countStmt.get() as { c: number }).c)
224
+ },
225
+ }
226
+ }
227
+
228
+ export type AnalysisRepo = ReturnType<typeof createAnalysisRepo>
229
+
230
+ let singleton: AnalysisRepo | null = null
231
+
232
+ /** Nitro 插件启动时装配(plugins/workshop.ts) */
233
+ export function configureAnalysisRepo(db: DatabaseSync): void {
234
+ singleton = createAnalysisRepo(db)
235
+ }
236
+
237
+ /** 运行期取用(未装配即抛 = 装配漏接线的响亮失败) */
238
+ export function getAnalysisRepo(): AnalysisRepo {
239
+ if (!singleton) throw new Error('analysis repo 未装配(configureAnalysisRepo 未调用)')
240
+ return singleton
241
+ }
@@ -418,3 +418,13 @@ export function migrateAmlChannelOptimizationColumns(db: DatabaseSync): void {
418
418
  db.exec('CREATE INDEX IF NOT EXISTS idx_opt_explorations_channel ON optimization_explorations(channel_id, created_at DESC)')
419
419
  // aml_training_plans 建表由 SCHEMA_SQL 的 CREATE TABLE IF NOT EXISTS 兜底(启动时全量幂等执行,新旧库同效)
420
420
  }
421
+
422
+ /**
423
+ * v27:数据分析报告人工修订列(updated_at/updated_by/updated_by_name)。
424
+ * 既有库补列(新库由 SCHEMA_SQL 直建);无索引需求 —— 修订列只随行读,不作检索键。
425
+ */
426
+ export function migrateAnalysisEditColumns(db: DatabaseSync): void {
427
+ migrateAddColumn(db, 'analysis_reports', 'updated_at', 'TEXT')
428
+ migrateAddColumn(db, 'analysis_reports', 'updated_by', 'TEXT NOT NULL DEFAULT \'\'')
429
+ migrateAddColumn(db, 'analysis_reports', 'updated_by_name', 'TEXT NOT NULL DEFAULT \'\'')
430
+ }
@@ -6,7 +6,7 @@ import type * as sqliteVec from 'sqlite-vec'
6
6
  import { DatabaseSync } from 'node:sqlite'
7
7
  import { SCHEMA_SQL } from './schema'
8
8
  import { createRequire } from 'node:module'
9
- import { migrateAddColumn, migrateAgentTeamExecutionLeaseColumns, migrateAgentTeamTaskGuardrailColumns, migrateAgentTeamTaskGuardrails, migrateAgentTeamTaskQueueColumns, migrateAmlChannelOptimizationColumns, migrateAmlModelIdentityColumns, migrateApprovalPayloadColumns, migrateDropOwnerFks, migrateGroupChatV17, migrateLegacySchema, migrateMissingForeignKeys, migrateAmlTwinProviderColumns } from './migrations'
9
+ import { migrateAddColumn, migrateAgentTeamExecutionLeaseColumns, migrateAgentTeamTaskGuardrailColumns, migrateAgentTeamTaskGuardrails, migrateAgentTeamTaskQueueColumns, migrateAmlChannelOptimizationColumns, migrateAmlModelIdentityColumns, migrateAnalysisEditColumns, migrateApprovalPayloadColumns, migrateDropOwnerFks, migrateGroupChatV17, migrateLegacySchema, migrateMissingForeignKeys, migrateAmlTwinProviderColumns } from './migrations'
10
10
  import { seedDefaultWorkshopData } from './seed'
11
11
 
12
12
  export const require = createRequire(import.meta.url)
@@ -68,6 +68,8 @@ export function initWorkshopDb(db: DatabaseSync): void {
68
68
  migrateAmlChannelOptimizationColumns(db)
69
69
  // 产线 Co-Pilot P2:审批历史结构化载荷列(payload_json/choice;既有库补列,新库 DDL 已含)
70
70
  migrateApprovalPayloadColumns(db)
71
+ // v27:数据分析报告人工修订列(updated_*;既有库补列,新库 DDL 已含)
72
+ migrateAnalysisEditColumns(db)
71
73
  seedDefaultWorkshopData(db)
72
74
  }
73
75
 
@@ -748,7 +748,38 @@ 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 留痕;Agent 面无改删)
754
+ -- 归因与产线上下文在保存时快照固化(line_name/产品/批次),产线改名或删除后历史仍可读。
755
+ -- v27: 人工修订面 —— 人类用户(产线 operate/admin)可经 REST 编辑,updated_* 固化修订归因。
756
+ CREATE TABLE IF NOT EXISTS analysis_reports (
757
+ id TEXT PRIMARY KEY,
758
+ line_id TEXT NOT NULL DEFAULT '',
759
+ line_name TEXT NOT NULL DEFAULT '',
760
+ title TEXT NOT NULL,
761
+ category TEXT NOT NULL DEFAULT 'general',
762
+ summary TEXT NOT NULL DEFAULT '',
763
+ conclusions_json TEXT NOT NULL DEFAULT '[]',
764
+ report TEXT NOT NULL DEFAULT '',
765
+ metrics_json TEXT NOT NULL DEFAULT '{}',
766
+ recipe_id TEXT NOT NULL DEFAULT '',
767
+ recipe_version TEXT NOT NULL DEFAULT '',
768
+ window_from TEXT,
769
+ window_to TEXT,
770
+ data_sources TEXT NOT NULL DEFAULT '',
771
+ context_json TEXT NOT NULL DEFAULT '{}',
772
+ channel_id TEXT NOT NULL DEFAULT '',
773
+ channel_name TEXT NOT NULL DEFAULT '',
774
+ actor TEXT NOT NULL DEFAULT '',
775
+ actor_name TEXT NOT NULL DEFAULT '',
776
+ created_at TEXT NOT NULL,
777
+ updated_at TEXT,
778
+ updated_by TEXT NOT NULL DEFAULT '',
779
+ updated_by_name TEXT NOT NULL DEFAULT ''
780
+ );
781
+ CREATE INDEX IF NOT EXISTS idx_analysis_reports_line ON analysis_reports(line_id, created_at DESC);
782
+ CREATE INDEX IF NOT EXISTS idx_analysis_reports_recipe ON analysis_reports(recipe_id);`
752
783
 
753
784
  // ===== 默认种子数据(首轮初始化注入;owner NULL = 公共资源,所有登录用户只读共享) =====
754
785
 
@@ -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,34 @@ 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 留痕;Agent 面无改删)
363
+ -- 归因与产线上下文在保存时快照固化(line_name/产品/批次),产线改名或删除后历史仍可读。
364
+ -- v27: 人工修订面 —— 人类用户(产线 operate/admin)可经 REST 编辑,updated_* 固化修订归因。
365
+ CREATE TABLE IF NOT EXISTS analysis_reports (
366
+ id TEXT PRIMARY KEY,
367
+ line_id TEXT NOT NULL DEFAULT '',
368
+ line_name TEXT NOT NULL DEFAULT '',
369
+ title TEXT NOT NULL,
370
+ category TEXT NOT NULL DEFAULT 'general',
371
+ summary TEXT NOT NULL DEFAULT '',
372
+ conclusions_json TEXT NOT NULL DEFAULT '[]',
373
+ report TEXT NOT NULL DEFAULT '',
374
+ metrics_json TEXT NOT NULL DEFAULT '{}',
375
+ recipe_id TEXT NOT NULL DEFAULT '',
376
+ recipe_version TEXT NOT NULL DEFAULT '',
377
+ window_from TEXT,
378
+ window_to TEXT,
379
+ data_sources TEXT NOT NULL DEFAULT '',
380
+ context_json TEXT NOT NULL DEFAULT '{}',
381
+ channel_id TEXT NOT NULL DEFAULT '',
382
+ channel_name TEXT NOT NULL DEFAULT '',
383
+ actor TEXT NOT NULL DEFAULT '',
384
+ actor_name TEXT NOT NULL DEFAULT '',
385
+ created_at TEXT NOT NULL,
386
+ updated_at TEXT,
387
+ updated_by TEXT NOT NULL DEFAULT '',
388
+ updated_by_name TEXT NOT NULL DEFAULT ''
389
+ );
390
+ CREATE INDEX IF NOT EXISTS idx_analysis_reports_line ON analysis_reports(line_id, created_at DESC);
391
+ 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