agentworkshop 0.7.7 → 0.7.9

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 (337) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +1 -1
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +1 -1
  3. package/.output/nitro.json +1 -1
  4. package/.output/public/_nuxt/-6OnbLFb.js +1 -0
  5. package/.output/public/_nuxt/{BUxYN2mw.js → -nb2uqVg.js} +1 -1
  6. package/.output/public/_nuxt/{DM8DS9MA.js → 6PZPfFcO.js} +1 -1
  7. package/.output/public/_nuxt/91DZTUMJ.js +1 -0
  8. package/.output/public/_nuxt/B0HpdCKS.js +1 -0
  9. package/.output/public/_nuxt/B1g8pJmr.js +2 -0
  10. package/.output/public/_nuxt/B1kA8LhC.js +14 -0
  11. package/.output/public/_nuxt/{uBbDCfTz.js → B5S_UyaC.js} +1 -1
  12. package/.output/public/_nuxt/{DZk24ego.js → B7wL3pDk.js} +1 -1
  13. package/.output/public/_nuxt/B9MUiDFl.js +1 -0
  14. package/.output/public/_nuxt/B9dLFSYI.js +1 -0
  15. package/.output/public/_nuxt/BC8s1Guv.js +1 -0
  16. package/.output/public/_nuxt/{BSXx2vqR.js → BCJFMBQ6.js} +1 -1
  17. package/.output/public/_nuxt/{BYL0Rjqj.js → BDASpD_i.js} +3 -3
  18. package/.output/public/_nuxt/{VnIWJ0ts.js → BN_PdN3J.js} +1 -1
  19. package/.output/public/_nuxt/BUPj10t4.js +1 -0
  20. package/.output/public/_nuxt/BZGNTgTQ2.js +1 -0
  21. package/.output/public/_nuxt/{NIM0Wglj2.js → BaMkWl5i2.js} +1 -1
  22. package/.output/public/_nuxt/BmHvC_OU.js +1 -0
  23. package/.output/public/_nuxt/{BkfchkK62.js → Bp5luxkg2.js} +1 -1
  24. package/.output/public/_nuxt/{ZugRk0CM2.js → BuktKVqK2.js} +1 -1
  25. package/.output/public/_nuxt/By8BpbKH.js +1 -0
  26. package/.output/public/_nuxt/{pRQri7vQ2.js → BytVi9VX2.js} +1 -1
  27. package/.output/public/_nuxt/{D5KJ7_0V.js → C3tCneTM.js} +1 -1
  28. package/.output/public/_nuxt/{CblLEiCZ.js → C9cU_Ujd.js} +3 -3
  29. package/.output/public/_nuxt/{BJ-fxrSw.js → CBciOiTQ.js} +1 -1
  30. package/.output/public/_nuxt/CFn4vHwD.js +1 -0
  31. package/.output/public/_nuxt/{DCXIGxzT.js → CKfhtOt7.js} +2 -2
  32. package/.output/public/_nuxt/CUMdhxg9.js +1 -0
  33. package/.output/public/_nuxt/{ChEKFMxj.js → CUXCQXjG.js} +1 -1
  34. package/.output/public/_nuxt/CfVAr2nf.js +1 -0
  35. package/.output/public/_nuxt/{CvbHIGQY2.js → CgvGu2IO.js} +1 -1
  36. package/.output/public/_nuxt/CjDQPXfv.js +1 -0
  37. package/.output/public/_nuxt/{B4Fia4FB.js → CmHzfVc5.js} +1 -1
  38. package/.output/public/_nuxt/{Do88WZG2.js → Cn3J3NXR.js} +1 -1
  39. package/.output/public/_nuxt/{DNzaswei.js → Cst47G4-.js} +1 -1
  40. package/.output/public/_nuxt/{DYZBdSSg2.js → Ct68Z0232.js} +1 -1
  41. package/.output/public/_nuxt/{BsMpJf7S.js → D-Ca4BGY.js} +6 -6
  42. package/.output/public/_nuxt/D0Szyn_D.js +1 -0
  43. package/.output/public/_nuxt/{CsCpu2Zh.js → D1z7i2UP.js} +1 -1
  44. package/.output/public/_nuxt/{Du-eSpo2.js → D3VJ3lex.js} +1 -1
  45. package/.output/public/_nuxt/D8CqF0yy.js +1 -0
  46. package/.output/public/_nuxt/D8EfUxO2.js +1 -0
  47. package/.output/public/_nuxt/D8wyHvcz2.js +1 -0
  48. package/.output/public/_nuxt/{zwdqvGN_.js → DDdEnkdw.js} +1 -1
  49. package/.output/public/_nuxt/DM4CNkXz.js +1 -0
  50. package/.output/public/_nuxt/DN5RuZ8k.js +18 -0
  51. package/.output/public/_nuxt/DXRZPxGs.js +1 -0
  52. package/.output/public/_nuxt/{C2iWjzEC2.js → DoLasgPj2.js} +1 -1
  53. package/.output/public/_nuxt/{DRq09ZmT.js → DpojD719.js} +1 -1
  54. package/.output/public/_nuxt/Dqj2h40U.js +1 -0
  55. package/.output/public/_nuxt/{BCipft_k2.js → DsUUYP292.js} +1 -1
  56. package/.output/public/_nuxt/DtBu71ev.js +32 -0
  57. package/.output/public/_nuxt/{fQUs58kX2.js → DvgKXPgu2.js} +1 -1
  58. package/.output/public/_nuxt/{C_gFA2H_2.js → DxrgFxIr2.js} +1 -1
  59. package/.output/public/_nuxt/Dy-mxvXY2.js +1 -0
  60. package/.output/public/_nuxt/G0qIw7Gq2.js +1 -0
  61. package/.output/public/_nuxt/{DCEyMaN-.js → MyA0Oeqd.js} +3 -3
  62. package/.output/public/_nuxt/{tRBT-plo.js → OV6PBW2z.js} +1 -1
  63. package/.output/public/_nuxt/TownView.BHLKAjEu.css +1 -0
  64. package/.output/public/_nuxt/VLI2Zy4t.js +5 -0
  65. package/.output/public/_nuxt/_id_.DIxEKj88.css +1 -0
  66. package/.output/public/_nuxt/_id_.DTvjd6VN.css +1 -0
  67. package/.output/public/_nuxt/{_wsId_.COUzMXpP.css → _wsId_.BFyCuUwS.css} +1 -1
  68. package/.output/public/_nuxt/agents.CEbox5-D.css +1 -0
  69. package/.output/public/_nuxt/builds/latest.json +1 -1
  70. package/.output/public/_nuxt/builds/meta/92d6bd39-dbc5-46d5-90d8-8387f36715fa.json +1 -0
  71. package/.output/public/_nuxt/channel-templates.De5ZvrGz.css +1 -0
  72. package/.output/public/_nuxt/daq.6IrhVVfy.css +1 -0
  73. package/.output/public/_nuxt/dcw.DcDjwvqv.css +1 -0
  74. package/.output/public/_nuxt/{default.V3_hUJq1.css → default.BR3e5fPY.css} +1 -1
  75. package/.output/public/_nuxt/{entry.DvlXlPwx.css → entry.5qf6EqfN.css} +1 -1
  76. package/.output/public/_nuxt/{Cyk3du4K2.js → kZV5TQvh2.js} +1 -1
  77. package/.output/public/_nuxt/logs.BO-BSyjm.css +1 -0
  78. package/.output/public/_nuxt/{D4qXvjuV.js → niDwBOZW.js} +2 -2
  79. package/.output/public/_nuxt/pKv_VWR4.js +1 -0
  80. package/.output/public/_nuxt/plugins.Clsky_kl.css +1 -0
  81. package/.output/public/_nuxt/rqZ-1SoP.js +2 -0
  82. package/.output/public/_nuxt/teams.CUMnbQGf.css +1 -0
  83. package/.output/public/_nuxt/tokens.BPLe9ioQ.css +1 -0
  84. package/.output/public/_nuxt/{C8dxXc6K.js → u7KWCGSb.js} +1 -1
  85. package/.output/public/_nuxt/{Bi6AiCuP.js → vJ4FPb-_.js} +1 -1
  86. package/.output/public/_nuxt/wirVyscc.js +1 -0
  87. package/.output/public/_nuxt/workshop.BIdoGfoC.css +1 -0
  88. package/.output/server/chunks/_/nitro.mjs +2042 -1967
  89. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  90. package/.output/server/chunks/build/{TownView-B5KifIaT.mjs → TownView-D8DSdO3H.mjs} +182 -181
  91. package/.output/server/chunks/build/{TownView-B5KifIaT.mjs.map → TownView-D8DSdO3H.mjs.map} +1 -1
  92. package/.output/server/chunks/build/{_id_-Ct4Jhvl1.mjs → _id_-BV4FfiYd.mjs} +37 -36
  93. package/.output/server/chunks/build/_id_-BV4FfiYd.mjs.map +1 -0
  94. package/.output/server/chunks/build/{_id_-C-ewLgfl.mjs → _id_-TP9hvnBM.mjs} +126 -125
  95. package/.output/server/chunks/build/_id_-TP9hvnBM.mjs.map +1 -0
  96. package/.output/server/chunks/build/{_wsId_-CanI_6Su.mjs → _wsId_-Mm9sQSz2.mjs} +125 -124
  97. package/.output/server/chunks/build/{_wsId_-CanI_6Su.mjs.map → _wsId_-Mm9sQSz2.mjs.map} +1 -1
  98. package/.output/server/chunks/build/{agents-DSOptxXA.mjs → agents-To3a5xcZ.mjs} +16 -15
  99. package/.output/server/chunks/build/agents-To3a5xcZ.mjs.map +1 -0
  100. package/.output/server/chunks/build/api-error-dul30BYQ.mjs +47 -0
  101. package/.output/server/chunks/build/api-error-dul30BYQ.mjs.map +1 -0
  102. package/.output/server/chunks/build/{channel-templates-BK0KuPOd.mjs → channel-templates-DRsP-qxl.mjs} +23 -22
  103. package/.output/server/chunks/build/channel-templates-DRsP-qxl.mjs.map +1 -0
  104. package/.output/server/chunks/build/{daq-D9RA_uze.mjs → daq-_hCEaYLd.mjs} +112 -111
  105. package/.output/server/chunks/build/daq-_hCEaYLd.mjs.map +1 -0
  106. package/.output/server/chunks/build/{dcw-BTM5YU-B.mjs → dcw-C7pJ4Y0p.mjs} +47 -46
  107. package/.output/server/chunks/build/dcw-C7pJ4Y0p.mjs.map +1 -0
  108. package/.output/server/chunks/build/{default-BfWGTlbj.mjs → default-Dnjs36e8.mjs} +16 -15
  109. package/.output/server/chunks/build/{default-BfWGTlbj.mjs.map → default-Dnjs36e8.mjs.map} +1 -1
  110. package/.output/server/chunks/build/{logs-Dyk0I2I9.mjs → logs-C039TFW1.mjs} +38 -37
  111. package/.output/server/chunks/build/logs-C039TFW1.mjs.map +1 -0
  112. package/.output/server/chunks/build/{pages-DR2bzczM.mjs → pages-C_VSGSGo.mjs} +5 -4
  113. package/.output/server/chunks/build/pages-C_VSGSGo.mjs.map +1 -0
  114. package/.output/server/chunks/build/{plugins-DnOBIWGg.mjs → plugins-4FMWkN8d.mjs} +25 -22
  115. package/.output/server/chunks/build/plugins-4FMWkN8d.mjs.map +1 -0
  116. package/.output/server/chunks/build/table-Cswq-l2r.mjs +1 -1
  117. package/.output/server/chunks/build/{teams-BhSKBBBM.mjs → teams-DA1lkf1n.mjs} +19 -18
  118. package/.output/server/chunks/build/teams-DA1lkf1n.mjs.map +1 -0
  119. package/.output/server/chunks/build/{tokens-D_eyxmcv.mjs → tokens-DKMvvk3e.mjs} +18 -17
  120. package/.output/server/chunks/build/tokens-DKMvvk3e.mjs.map +1 -0
  121. package/.output/server/chunks/build/{town-DPtOPRRO.mjs → town-D0thZ7PK.mjs} +6 -5
  122. package/.output/server/chunks/build/town-D0thZ7PK.mjs.map +1 -0
  123. package/.output/server/chunks/build/{useDaqStream-hwkhJHFU.mjs → useDaqStream-BVTRw8_H.mjs} +5 -4
  124. package/.output/server/chunks/build/useDaqStream-BVTRw8_H.mjs.map +1 -0
  125. package/.output/server/chunks/build/{useDcwStream-Bdew_yrr.mjs → useDcwStream-DNsivqI_.mjs} +5 -4
  126. package/.output/server/chunks/build/useDcwStream-DNsivqI_.mjs.map +1 -0
  127. package/.output/server/chunks/build/{useDeviceTwins-C6EBg9oN.mjs → useDeviceTwins-WeIom7A6.mjs} +4 -3
  128. package/.output/server/chunks/build/useDeviceTwins-WeIom7A6.mjs.map +1 -0
  129. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs +1 -1
  130. package/.output/server/chunks/build/{useOpsLog-DdCqKVVG.mjs → useOpsLog-DcKnPO43.mjs} +5 -4
  131. package/.output/server/chunks/build/useOpsLog-DcKnPO43.mjs.map +1 -0
  132. package/.output/server/chunks/build/useWorkshopApi-D2gq06N2.mjs +1 -1
  133. package/.output/server/chunks/build/{workshop-iCzNRifn.mjs → workshop-BhWnJMWs.mjs} +50 -43
  134. package/.output/server/chunks/build/workshop-BhWnJMWs.mjs.map +1 -0
  135. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +25 -0
  136. package/.output/server/chunks/routes/api/users/setup-status.get.mjs.map +1 -0
  137. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -1
  138. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
  139. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +1 -1
  140. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +3 -2
  141. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  142. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  143. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  144. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  145. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  146. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  147. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  148. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  149. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  150. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  151. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  152. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  153. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  154. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  155. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  156. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  157. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  158. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  159. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  160. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  161. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  162. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  163. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  164. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  165. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  166. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  167. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -1
  168. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  169. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  170. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  171. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  172. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  173. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  174. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  175. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  176. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  177. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  178. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  179. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  180. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  181. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  184. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  185. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  186. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  187. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  190. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +3 -3
  193. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs.map +1 -1
  194. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +3 -3
  195. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs.map +1 -1
  196. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  197. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
  199. package/.output/server/chunks/routes/renderer.mjs +2 -2
  200. package/.output/server/chunks/virtual/entry.mjs +57 -23
  201. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  202. package/.output/server/package.json +1 -1
  203. package/README-zh.md +27 -7
  204. package/README.md +455 -435
  205. package/app/components/AppHeader.vue +1 -1
  206. package/app/components/workshop/A2aRpcDebugger.vue +1 -1
  207. package/app/components/workshop/AgentInspectorDrawer.vue +3 -3
  208. package/app/components/workshop/AgentLanesView.vue +6 -6
  209. package/app/components/workshop/AssetLibrary.vue +2 -2
  210. package/app/components/workshop/ChannelSessionList.vue +5 -5
  211. package/app/components/workshop/Composer.vue +1 -1
  212. package/app/components/workshop/DeviceTwinPanel.vue +2 -2
  213. package/app/components/workshop/TaskBoardView.vue +1 -1
  214. package/app/components/workshop/TaskInspectorDrawer.vue +2 -2
  215. package/app/components/workshop/town/TownView.vue +23 -23
  216. package/app/composables/workshop/apiClient.ts +1 -1
  217. package/app/composables/workshop/useCharacterAssets.ts +1 -1
  218. package/app/composables/workshop/useDaqStream.ts +1 -1
  219. package/app/composables/workshop/useDcwStream.ts +1 -1
  220. package/app/composables/workshop/useDeviceTwins.ts +1 -1
  221. package/app/composables/workshop/useOpsLog.ts +2 -2
  222. package/app/composables/workshop/useSceneLayouts.ts +1 -1
  223. package/app/pages/daq/[id].vue +1 -1
  224. package/app/pages/daq/index.vue +8 -8
  225. package/app/pages/dcw/[id].vue +13 -13
  226. package/app/pages/dcw/index.vue +7 -7
  227. package/app/pages/logs/index.vue +1 -1
  228. package/app/pages/plugins/index.vue +14 -6
  229. package/app/pages/tokens.vue +3 -3
  230. package/app/pages/workshop/agents.vue +2 -2
  231. package/app/pages/workshop/channel-templates.vue +3 -3
  232. package/app/pages/workshop/index.vue +29 -10
  233. package/app/pages/workshop/teams.vue +3 -3
  234. package/app/utils/api-error.ts +75 -0
  235. package/cli/commands/plugin.mjs +2 -2
  236. package/config.yml +11 -1
  237. package/i18n/dicts/settings.json +4 -0
  238. package/i18n/locales/en.ts +20 -3
  239. package/i18n/locales/zh-CN.ts +20 -3
  240. package/package.json +1 -1
  241. package/scripts/_dbg-codex-handshake.ts +30 -0
  242. package/scripts/_dbg-codex-sandbox.ts +58 -0
  243. package/scripts/_dbg-codex-turn.ts +65 -0
  244. package/scripts/_dbg-interval-config.mjs +156 -0
  245. package/scripts/_dbg-plugins-e2e.mjs +101 -0
  246. package/scripts/_dbg-repo-setup-verify.mjs +31 -0
  247. package/scripts/_dbg-setup-e2e.mjs +88 -0
  248. package/scripts/e2e-harness-provider-task.mjs +126 -0
  249. package/server/api/users/setup-status.get.ts +8 -0
  250. package/server/api/workshop/daq/[id]/samples.get.ts +4 -2
  251. package/server/api/workshop/plugins/[name]/disable.post.ts +5 -3
  252. package/server/api/workshop/plugins/[name]/enable.post.ts +5 -3
  253. package/server/data/daqs.json +138 -42
  254. package/server/data/dcw-lines.json +28 -0
  255. package/server/data/dcw-products.json +140 -0
  256. package/server/data/dcw-recipes.json +506 -0
  257. package/server/data/dcw-rollback.json +226 -6
  258. package/server/data/dcw-runs.json +1807 -1690
  259. package/server/data/dcw-writes.json +240 -0
  260. package/server/data/dcws.json +673 -173
  261. package/server/data/line-runs.json +26 -6
  262. package/server/plugins/security.ts +46 -50
  263. package/server/repositories/user.repository.ts +384 -414
  264. package/server/services/system-config.ts +7 -0
  265. package/server/services/user.service.ts +8 -3
  266. package/server/services/workshop/agents/adapters/line-spawn.ts +6 -3
  267. package/server/services/workshop/agents/host-tool-bridge.ts +21 -1
  268. package/server/services/workshop/agents/industrial-tools.ts +5 -3
  269. package/server/services/workshop/daq/daq-controller.ts +34 -6
  270. package/server/services/workshop/daq/daq-node.ts +3 -3
  271. package/server/services/workshop/daq/daq-runtime.ts +4 -3
  272. package/server/services/workshop/daq/storage/sqlite.adapter.ts +10 -5
  273. package/server/services/workshop/dcw/dcw-controller.ts +4 -2
  274. package/server/services/workshop/plugins/host.mjs +2 -1
  275. package/server/services/workshop/settings.ts +33 -0
  276. package/shared/config/schema.json +4 -0
  277. package/.output/public/_nuxt/2LwEn9gX.js +0 -2
  278. package/.output/public/_nuxt/3612gD2V.js +0 -32
  279. package/.output/public/_nuxt/8eIQAVlb.js +0 -1
  280. package/.output/public/_nuxt/Ah9qOv1m.js +0 -1
  281. package/.output/public/_nuxt/B7aqqzkY.js +0 -1
  282. package/.output/public/_nuxt/BH0Z05CS.js +0 -1
  283. package/.output/public/_nuxt/BJvGPTpC.js +0 -1
  284. package/.output/public/_nuxt/BVZjSVs2.js +0 -1
  285. package/.output/public/_nuxt/BVzDoF8t.js +0 -1
  286. package/.output/public/_nuxt/BjVLsC3M.js +0 -1
  287. package/.output/public/_nuxt/BnVoQ74r.js +0 -1
  288. package/.output/public/_nuxt/Bnp4vIAf.js +0 -1
  289. package/.output/public/_nuxt/Bt_HDizI.js +0 -5
  290. package/.output/public/_nuxt/Bu-P92Pe.js +0 -18
  291. package/.output/public/_nuxt/ButLXkjo.js +0 -2
  292. package/.output/public/_nuxt/By-LNp3k.js +0 -1
  293. package/.output/public/_nuxt/C-GarxYC.js +0 -1
  294. package/.output/public/_nuxt/CGdPdJPP.js +0 -1
  295. package/.output/public/_nuxt/CQiKcuoG.js +0 -14
  296. package/.output/public/_nuxt/CRGlf1Gb.js +0 -1
  297. package/.output/public/_nuxt/CS8R0_J3.js +0 -1
  298. package/.output/public/_nuxt/CUxV8Bw_.js +0 -1
  299. package/.output/public/_nuxt/Cd15nPnG2.js +0 -1
  300. package/.output/public/_nuxt/DNJSkm3Q.js +0 -1
  301. package/.output/public/_nuxt/DXK1U43I.js +0 -1
  302. package/.output/public/_nuxt/Dk6pq9JB2.js +0 -1
  303. package/.output/public/_nuxt/GP2wXyuY.js +0 -1
  304. package/.output/public/_nuxt/PQLnLxYe.js +0 -1
  305. package/.output/public/_nuxt/TownView.Bt33bo1M.css +0 -1
  306. package/.output/public/_nuxt/_id_.BzKMZnLe.css +0 -1
  307. package/.output/public/_nuxt/_id_.CbpDAWRh.css +0 -1
  308. package/.output/public/_nuxt/agents.BlejnOOC.css +0 -1
  309. package/.output/public/_nuxt/builds/meta/14df171d-89cb-43ec-ad6f-9df72d6da7f5.json +0 -1
  310. package/.output/public/_nuxt/channel-templates.lkqEYlWY.css +0 -1
  311. package/.output/public/_nuxt/daq.zZ8GR433.css +0 -1
  312. package/.output/public/_nuxt/dcw.C46dGiF_.css +0 -1
  313. package/.output/public/_nuxt/eHGLpQSg2.js +0 -1
  314. package/.output/public/_nuxt/logs.DaIsHWZE.css +0 -1
  315. package/.output/public/_nuxt/p7wSGMtc.js +0 -1
  316. package/.output/public/_nuxt/plugins.FTm0PcEe.css +0 -1
  317. package/.output/public/_nuxt/teams.B8JNbUZg.css +0 -1
  318. package/.output/public/_nuxt/tokens.CWOTXM-Z.css +0 -1
  319. package/.output/public/_nuxt/ubPfs9mQ.js +0 -1
  320. package/.output/public/_nuxt/workshop.B98sHiJq.css +0 -1
  321. package/.output/server/chunks/build/_id_-C-ewLgfl.mjs.map +0 -1
  322. package/.output/server/chunks/build/_id_-Ct4Jhvl1.mjs.map +0 -1
  323. package/.output/server/chunks/build/agents-DSOptxXA.mjs.map +0 -1
  324. package/.output/server/chunks/build/channel-templates-BK0KuPOd.mjs.map +0 -1
  325. package/.output/server/chunks/build/daq-D9RA_uze.mjs.map +0 -1
  326. package/.output/server/chunks/build/dcw-BTM5YU-B.mjs.map +0 -1
  327. package/.output/server/chunks/build/logs-Dyk0I2I9.mjs.map +0 -1
  328. package/.output/server/chunks/build/pages-DR2bzczM.mjs.map +0 -1
  329. package/.output/server/chunks/build/plugins-DnOBIWGg.mjs.map +0 -1
  330. package/.output/server/chunks/build/teams-BhSKBBBM.mjs.map +0 -1
  331. package/.output/server/chunks/build/tokens-D_eyxmcv.mjs.map +0 -1
  332. package/.output/server/chunks/build/town-DPtOPRRO.mjs.map +0 -1
  333. package/.output/server/chunks/build/useDaqStream-hwkhJHFU.mjs.map +0 -1
  334. package/.output/server/chunks/build/useDcwStream-Bdew_yrr.mjs.map +0 -1
  335. package/.output/server/chunks/build/useDeviceTwins-C6EBg9oN.mjs.map +0 -1
  336. package/.output/server/chunks/build/useOpsLog-DdCqKVVG.mjs.map +0 -1
  337. package/.output/server/chunks/build/workshop-iCzNRifn.mjs.map +0 -1
@@ -53,7 +53,7 @@ const hitlAnswer = async (item: AepHitlItem, confirmed: boolean): Promise<void>
53
53
  await hitl.loadSnapshot()
54
54
  }
55
55
  catch (e) {
56
- message.error(e instanceof Error ? e.message : String(e))
56
+ message.error(apiErrorMessage(e))
57
57
  }
58
58
  finally {
59
59
  hitlAnswering.value = null
@@ -131,7 +131,7 @@ const run = async (): Promise<void> => {
131
131
  }
132
132
  }
133
133
  catch (e) {
134
- append(`✖ ${e instanceof Error ? e.message : String(e)}`)
134
+ append(`✖ ${apiErrorMessage(e)}`)
135
135
  }
136
136
  finally {
137
137
  running.value = false
@@ -54,7 +54,7 @@ const toggleEnabled = async (checked: string | number | boolean): Promise<void>
54
54
  message.success(checked === true ? t('agentInspectorDrawer.k3n5z7y016') : t('agentInspectorDrawer.k1dst50d017'))
55
55
  }
56
56
  catch (e) {
57
- message.error(e instanceof Error ? e.message : String(e))
57
+ message.error(apiErrorMessage(e))
58
58
  }
59
59
  finally {
60
60
  toggling.value = false
@@ -73,7 +73,7 @@ const removeMember = async (): Promise<void> => {
73
73
  emit('removed', props.agentId)
74
74
  }
75
75
  catch (e) {
76
- message.error(e instanceof Error ? e.message : String(e))
76
+ message.error(apiErrorMessage(e))
77
77
  }
78
78
  finally {
79
79
  removing.value = false
@@ -129,7 +129,7 @@ const send = async (): Promise<void> => {
129
129
  sendText.value = ''
130
130
  }
131
131
  catch (e) {
132
- message.error(e instanceof Error ? e.message : String(e))
132
+ message.error(apiErrorMessage(e))
133
133
  }
134
134
  finally {
135
135
  sending.value = false
@@ -115,7 +115,7 @@ const submitEditMember = async (): Promise<void> => {
115
115
  editModalOpen.value = false
116
116
  }
117
117
  catch (err) {
118
- message.error(t('agentLanesView.k3jmrw1045', { p0: err instanceof Error ? err.message : String(err) }))
118
+ message.error(t('agentLanesView.k3jmrw1045', { p0: apiErrorMessage(err) }))
119
119
  }
120
120
  finally {
121
121
  editSubmitting.value = false
@@ -155,7 +155,7 @@ const submitMember = async (): Promise<void> => {
155
155
  memberModalOpen.value = false
156
156
  }
157
157
  catch (err) {
158
- message.error(t('agentLanesView.k1j97j74047', { p0: err instanceof Error ? err.message : String(err) }))
158
+ message.error(t('agentLanesView.k1j97j74047', { p0: apiErrorMessage(err) }))
159
159
  }
160
160
  finally {
161
161
  memberSubmitting.value = false
@@ -181,7 +181,7 @@ const submitMember = async (): Promise<void> => {
181
181
  memberModalOpen.value = false
182
182
  }
183
183
  catch (err) {
184
- const text = err instanceof Error ? err.message : String(err)
184
+ const text = apiErrorMessage(err)
185
185
  message.error(`模板克隆失败${text.includes('LEAD_EXISTS') ? '(已有 lead,不能再添加 lead)' : `: ${text}`}`)
186
186
  }
187
187
  finally {
@@ -202,7 +202,7 @@ const submitMember = async (): Promise<void> => {
202
202
  memberModalOpen.value = false
203
203
  }
204
204
  catch (err) {
205
- const text = err instanceof Error ? err.message : String(err)
205
+ const text = apiErrorMessage(err)
206
206
  message.error(`编组部署失败${text.includes('LEAD_EXISTS') ? '(channel 已有 lead,编组内 lead 成员冲突;请先移除现有 lead 或选用无 lead 编组)' : `: ${text}`}`)
207
207
  }
208
208
  finally {
@@ -218,7 +218,7 @@ const removeMember = async (agentId: string, name: string): Promise<void> => {
218
218
  message.success(t('agentLanesView.k1n3o03a052', { p0: name }))
219
219
  }
220
220
  catch (err) {
221
- message.error(t('agentLanesView.k13dsp10053', { p0: err instanceof Error ? err.message : String(err) }))
221
+ message.error(t('agentLanesView.k13dsp10053', { p0: apiErrorMessage(err) }))
222
222
  }
223
223
  finally {
224
224
  removing.value = null
@@ -234,7 +234,7 @@ const stopMember = async (agentId: string, name: string): Promise<void> => {
234
234
  message.success(t('agentLanesView.kcpbv47054', { p0: name }))
235
235
  }
236
236
  catch (err) {
237
- message.error(t('agentLanesView.k139ec5j055', { p0: err instanceof Error ? err.message : String(err) }))
237
+ message.error(t('agentLanesView.k139ec5j055', { p0: apiErrorMessage(err) }))
238
238
  }
239
239
  finally {
240
240
  stopping.value = null
@@ -71,7 +71,7 @@ async function doUpload(): Promise<void> {
71
71
  uploadError.value = t('assetLibrary.k8nv3or016', { p0: model.name })
72
72
  }
73
73
  catch (err) {
74
- uploadError.value = err instanceof Error ? err.message : String(err)
74
+ uploadError.value = apiErrorMessage(err)
75
75
  }
76
76
  finally {
77
77
  uploading.value = false
@@ -89,7 +89,7 @@ async function doRemove(id: string): Promise<void> {
89
89
  deleteMsg.value = t('assetLibrary.k8n918k013')
90
90
  }
91
91
  catch (err) {
92
- deleteMsg.value = err instanceof Error ? err.message : String(err)
92
+ deleteMsg.value = apiErrorMessage(err)
93
93
  }
94
94
  finally {
95
95
  deletingId.value = ''
@@ -105,7 +105,7 @@ const createAndMount = async (): Promise<void> => {
105
105
  message.success(t('channelSessionList.kn89jvs028'))
106
106
  }
107
107
  catch (e) {
108
- message.error(t('channelSessionList.k1x2th9e041', { p0: e instanceof Error ? e.message : String(e) }))
108
+ message.error(t('channelSessionList.k1x2th9e041', { p0: apiErrorMessage(e) }))
109
109
  }
110
110
  finally {
111
111
  mountSubmitting.value = false
@@ -127,7 +127,7 @@ const mountFromTemplate = async (): Promise<void> => {
127
127
  }
128
128
  catch (e) {
129
129
  const err = e as { data?: { message?: string }, message?: string }
130
- message.error(err?.data?.message ?? err?.message ?? t('channelSessionList.k97xi7u029'))
130
+ message.error(apiErrorMessage(err, t('channelSessionList.k97xi7u029')))
131
131
  }
132
132
  finally {
133
133
  templateMounting.value = false
@@ -136,7 +136,7 @@ const mountFromTemplate = async (): Promise<void> => {
136
136
 
137
137
  const unmount = (channelId: string): void => {
138
138
  wsStore.unmountChannel(props.wsId, channelId)
139
- .catch((e: { data?: { message?: string }, message?: string }) => { message.error(e?.data?.message ?? e?.message ?? t('channelSessionList.k1hgfvdc030')) })
139
+ .catch((e: { data?: { message?: string }, message?: string }) => { message.error(apiErrorMessage(e, t('channelSessionList.k1hgfvdc030'))) })
140
140
  }
141
141
 
142
142
  // ===== Channel 实例设置(场景/工作目录热更新)+ 保存为模板 =====
@@ -224,7 +224,7 @@ const saveSettings = async (): Promise<void> => {
224
224
  void refreshChannels()
225
225
  }
226
226
  catch (e) {
227
- message.error(e instanceof Error ? e.message : String(e))
227
+ message.error(apiErrorMessage(e))
228
228
  }
229
229
  finally {
230
230
  settingsSaving.value = false
@@ -259,7 +259,7 @@ const saveAsTemplate = async (): Promise<void> => {
259
259
  void refreshChannels()
260
260
  }
261
261
  catch (e) {
262
- message.error(e instanceof Error ? e.message : String(e))
262
+ message.error(apiErrorMessage(e))
263
263
  }
264
264
  finally {
265
265
  saveTplSubmitting.value = false
@@ -216,7 +216,7 @@ const send = async (): Promise<void> => {
216
216
  emit('submitted')
217
217
  }
218
218
  catch (e) {
219
- message.error(e instanceof Error ? e.message : String(e))
219
+ message.error(apiErrorMessage(e))
220
220
  }
221
221
  finally {
222
222
  sendLoading.value = false
@@ -77,7 +77,7 @@ async function removeTwin(t: { id: string, name: string }): Promise<void> {
77
77
  await twins.remove(t.id)
78
78
  }
79
79
  catch (err) {
80
- ctrlMsg.value = err instanceof Error ? err.message : String(err)
80
+ ctrlMsg.value = apiErrorMessage(err)
81
81
  }
82
82
  finally {
83
83
  busyId.value = ''
@@ -118,7 +118,7 @@ function doDcwWrite(r: DcwLiveRow): void {
118
118
  void dcw.write(r.id, v).then((out) => {
119
119
  if (!out.ok) dcwErrs[r.id] = out.message
120
120
  }).catch((err: unknown) => {
121
- dcwErrs[r.id] = err instanceof Error ? err.message : String(err)
121
+ dcwErrs[r.id] = apiErrorMessage(err)
122
122
  }).finally(() => {
123
123
  dcwBusy.value = ''
124
124
  })
@@ -150,7 +150,7 @@ const applyMove = async (taskId: string, action: 'cancel' | 'retry'): Promise<vo
150
150
  revert.set(taskId, prev)
151
151
  optimistic.value = revert
152
152
  const err = e as { data?: { message?: string }, message?: string }
153
- message.error(err?.data?.message ?? err?.message ?? t('taskBoardView.k1e7zwuc015'))
153
+ message.error(apiErrorMessage(err, t('taskBoardView.k1e7zwuc015')))
154
154
  }
155
155
  finally {
156
156
  acting.value.delete(taskId)
@@ -72,7 +72,7 @@ const cancel = async (): Promise<void> => {
72
72
  void load()
73
73
  }
74
74
  catch (e) {
75
- message.error(e instanceof Error ? e.message : String(e))
75
+ message.error(apiErrorMessage(e))
76
76
  }
77
77
  finally {
78
78
  cancelling.value = false
@@ -90,7 +90,7 @@ const retry = async (): Promise<void> => {
90
90
  void load()
91
91
  }
92
92
  catch (e) {
93
- message.error(e instanceof Error ? e.message : String(e))
93
+ message.error(apiErrorMessage(e))
94
94
  }
95
95
  finally {
96
96
  retrying.value = false
@@ -190,7 +190,7 @@ async function saveChannelLayout(): Promise<void> {
190
190
  }
191
191
  catch (err) {
192
192
  saveState.value = { state: 'error', at: Date.now() }
193
- errorText.value = err instanceof Error ? err.message : String(err)
193
+ errorText.value = apiErrorMessage(err)
194
194
  }
195
195
  }
196
196
  /** 从场景移除频道(其 Agent 一并撤出) */
@@ -202,7 +202,7 @@ async function removeChannelFromScene(): Promise<void> {
202
202
  onSelectChannel(null)
203
203
  }
204
204
  catch (err) {
205
- errorText.value = err instanceof Error ? err.message : String(err)
205
+ errorText.value = apiErrorMessage(err)
206
206
  }
207
207
  }
208
208
  /** 边界编辑输入 → 场景即时生效(草稿) */
@@ -332,7 +332,7 @@ function onObjNameCommit(): void {
332
332
  if (!name) return
333
333
  scene3dRef.value?.renameDevice(id, name)
334
334
  void deviceTwins.update(id, { name }).catch((err) => {
335
- errorText.value = err instanceof Error ? err.message : String(err)
335
+ errorText.value = apiErrorMessage(err)
336
336
  })
337
337
  }
338
338
  /** 角色独立换模型(选中角色 → character 模型下拉即时换装 + 持久化) */
@@ -353,7 +353,7 @@ async function bindAgentModel(modelRef: string): Promise<void> {
353
353
  scene3dRef.value?.swapAgentModel(agentId, modelRef)
354
354
  }
355
355
  catch (err) {
356
- errorText.value = err instanceof Error ? err.message : String(err)
356
+ errorText.value = apiErrorMessage(err)
357
357
  }
358
358
  }
359
359
  /** 设备独立换模型(下拉选择设备模型 → 重挂 + 落库,广播后其他客户端同步) */
@@ -365,7 +365,7 @@ async function bindDeviceModel(modelRef: string): Promise<void> {
365
365
  await deviceTwins.update(sel.id, { modelRef })
366
366
  }
367
367
  catch (err) {
368
- errorText.value = err instanceof Error ? err.message : String(err)
368
+ errorText.value = apiErrorMessage(err)
369
369
  }
370
370
  }
371
371
  /** 删除选中设备实例(移除孪生 + 场景节点);两步确认:首击布防 3s,再击执行 */
@@ -384,7 +384,7 @@ function removeSelectedDevice(): void {
384
384
  void scene3dRef.value?.removeDevice(sel.id)
385
385
  .then(() => closeScale())
386
386
  .catch((err: unknown) => {
387
- errorText.value = err instanceof Error ? err.message : String(err)
387
+ errorText.value = apiErrorMessage(err)
388
388
  })
389
389
  }
390
390
 
@@ -403,7 +403,7 @@ async function bindMemberModel(agentId: string, modelRef: string): Promise<void>
403
403
  scene3dRef.value?.swapAgentModel(agentId, modelRef)
404
404
  }
405
405
  catch (err) {
406
- errorText.value = err instanceof Error ? err.message : String(err)
406
+ errorText.value = apiErrorMessage(err)
407
407
  }
408
408
  }
409
409
  /** 频道管理面板 tab 切换 */
@@ -620,7 +620,7 @@ async function boot3D(): Promise<void> {
620
620
  scene.hydrate(buildTownInput(), Object.values(sceneLayouts.layouts), sceneTwinPool.value)
621
621
  syncChannelDock()
622
622
  }).catch((err) => {
623
- errorText.value = t('townView.k1hmf2ut192', { p0: err instanceof Error ? err.message : String(err) })
623
+ errorText.value = t('townView.k1hmf2ut192', { p0: apiErrorMessage(err) })
624
624
  window.setTimeout(() => {
625
625
  void sceneLayouts.load()
626
626
  }, 2500)
@@ -734,7 +734,7 @@ function wireCommon(scene: CommonTownScene): void {
734
734
  scene.handleTownEvent(e)
735
735
  }
736
736
  catch (err) {
737
- errorText.value = err instanceof Error ? err.message : String(err)
737
+ errorText.value = apiErrorMessage(err)
738
738
  }
739
739
  })
740
740
  ;(sceneRef as unknown as { _off?: () => void })._off = off
@@ -945,7 +945,7 @@ function bindSceneInput3D(scene: TownScene3D): void {
945
945
  if (near) bindDaq(daqNodeId, near.id)
946
946
  }
947
947
  }).catch((err: unknown) => {
948
- errorText.value = err instanceof Error ? err.message : String(err)
948
+ errorText.value = apiErrorMessage(err)
949
949
  })
950
950
  }
951
951
  return
@@ -961,13 +961,13 @@ function bindSceneInput3D(scene: TownScene3D): void {
961
961
  const near = nearestDeviceTwin(world.x, world.z, 95)
962
962
  if (near) {
963
963
  void dcw.bindNode(dcwNodeId, near.id).catch((err: unknown) => {
964
- errorText.value = err instanceof Error ? err.message : String(err)
964
+ errorText.value = apiErrorMessage(err)
965
965
  })
966
966
  }
967
967
  }
968
968
  if (sceneRef.value) syncSceneDevices(sceneRef.value)
969
969
  }).catch((err: unknown) => {
970
- errorText.value = err instanceof Error ? err.message : String(err)
970
+ errorText.value = apiErrorMessage(err)
971
971
  })
972
972
  }
973
973
  return
@@ -1439,7 +1439,7 @@ async function createDaqFromTemplate(tpl: DaqTemplate): Promise<void> {
1439
1439
  treeOpen.value[`daq:${tpl.id}`] = true
1440
1440
  }
1441
1441
  catch (err: unknown) {
1442
- errorText.value = err instanceof Error ? err.message : String(err)
1442
+ errorText.value = apiErrorMessage(err)
1443
1443
  }
1444
1444
  }
1445
1445
  async function createDcwFromTemplate(tpl: { id: string }): Promise<void> {
@@ -1448,7 +1448,7 @@ async function createDcwFromTemplate(tpl: { id: string }): Promise<void> {
1448
1448
  treeOpen.value[`dcw:${tpl.id}`] = true
1449
1449
  }
1450
1450
  catch (err: unknown) {
1451
- errorText.value = err instanceof Error ? err.message : String(err)
1451
+ errorText.value = apiErrorMessage(err)
1452
1452
  }
1453
1453
  }
1454
1454
  /** 节点叶子拖拽(编辑模式):载荷 = server 节点 id,投放走 PATCH 落位。
@@ -1765,12 +1765,12 @@ const daqOfDevice = (deviceId: string): string[] =>
1765
1765
  deviceId ? daq.nodes.filter(n => n.deviceBindingId === deviceId).map(n => n.id) : []
1766
1766
  function bindDaq(daqId: string, deviceId: string): void {
1767
1767
  void daq.bindNode(daqId, deviceId).catch((err: unknown) => {
1768
- errorText.value = err instanceof Error ? err.message : String(err)
1768
+ errorText.value = apiErrorMessage(err)
1769
1769
  })
1770
1770
  }
1771
1771
  function unbindDaq(daqId: string): void {
1772
1772
  void daq.bindNode(daqId, null).catch((err: unknown) => {
1773
- errorText.value = err instanceof Error ? err.message : String(err)
1773
+ errorText.value = apiErrorMessage(err)
1774
1774
  })
1775
1775
  }
1776
1776
 
@@ -2031,7 +2031,7 @@ function doDcwWrite(node: DcwNodeView): void {
2031
2031
  void dcw.write(node.id, Number(raw)).then((out) => {
2032
2032
  if (!out.ok) dcwWriteErrs[node.id] = out.message
2033
2033
  }).catch((err: unknown) => {
2034
- dcwWriteErrs[node.id] = err instanceof Error ? err.message : String(err)
2034
+ dcwWriteErrs[node.id] = apiErrorMessage(err)
2035
2035
  })
2036
2036
  }
2037
2037
 
@@ -2063,14 +2063,14 @@ function bindDcwChoice(nodeId: string): void {
2063
2063
  const devId = selected.value?.kind === 'device' ? selected.value.id : ''
2064
2064
  if (!devId) return
2065
2065
  void dcw.bindNode(nodeId, devId).catch((err: unknown) => {
2066
- errorText.value = err instanceof Error ? err.message : String(err)
2066
+ errorText.value = apiErrorMessage(err)
2067
2067
  })
2068
2068
  dcwBindPopOpen.value = false
2069
2069
  }
2070
2070
 
2071
2071
  function unbindDcw(dcwId: string): void {
2072
2072
  void dcw.bindNode(dcwId, null).catch((err: unknown) => {
2073
- errorText.value = err instanceof Error ? err.message : String(err)
2073
+ errorText.value = apiErrorMessage(err)
2074
2074
  })
2075
2075
  }
2076
2076
 
@@ -2096,7 +2096,7 @@ function bindSelectedDcw(): void {
2096
2096
  const n = selectedDcwNode.value
2097
2097
  if (!n || !dcwBindPick.value) return
2098
2098
  void dcw.bindNode(n.id, dcwBindPick.value).catch((err: unknown) => {
2099
- errorText.value = err instanceof Error ? err.message : String(err)
2099
+ errorText.value = apiErrorMessage(err)
2100
2100
  })
2101
2101
  dcwBindPick.value = ''
2102
2102
  }
@@ -2104,7 +2104,7 @@ function unbindSelectedDcw(): void {
2104
2104
  const n = selectedDcwNode.value
2105
2105
  if (!n) return
2106
2106
  void dcw.bindNode(n.id, null).catch((err: unknown) => {
2107
- errorText.value = err instanceof Error ? err.message : String(err)
2107
+ errorText.value = apiErrorMessage(err)
2108
2108
  })
2109
2109
  }
2110
2110
  function doWriteSelectedDcw(): void {
@@ -2140,14 +2140,14 @@ function onDaqIntervalCommit(): void {
2140
2140
  const n = selectedDaqNode.value
2141
2141
  if (!n || daqIntervalDraft.value == null) return
2142
2142
  void daq.patchNode(n.id, { intervalMs: Math.max(120, Math.min(60_000, Math.round(daqIntervalDraft.value))) }).catch((err: unknown) => {
2143
- errorText.value = err instanceof Error ? err.message : String(err)
2143
+ errorText.value = apiErrorMessage(err)
2144
2144
  })
2145
2145
  }
2146
2146
  function onDaqThresholdCommit(key: 'min' | 'max' | 'warnLow' | 'warnHigh', raw: string): void {
2147
2147
  const v = Number(raw)
2148
2148
  if (!Number.isFinite(v)) return
2149
2149
  void daq.patchNode(selectedDaqNode.value!.id, { [key]: key.startsWith('warn') ? v : v }).catch((err: unknown) => {
2150
- errorText.value = err instanceof Error ? err.message : String(err)
2150
+ errorText.value = apiErrorMessage(err)
2151
2151
  })
2152
2152
  }
2153
2153
 
@@ -84,7 +84,7 @@ export async function apiFetch<T>(opts: { base: string, path?: string, init?: Re
84
84
  catch (err) {
85
85
  const apiErr = err instanceof ApiError
86
86
  ? err
87
- : new ApiError('INTERNAL_ERROR', 0, err instanceof Error ? err.message : String(err))
87
+ : new ApiError('INTERNAL_ERROR', 0, apiErrorMessage(err))
88
88
  const retryable = idempotent && (apiErr.code === 'NETWORK' || apiErr.status >= 500)
89
89
  lastError = apiErr
90
90
  if (!retryable || attempt === attempts - 1) throw apiErr
@@ -202,7 +202,7 @@ function createStore(): CharacterAssetStore {
202
202
  }
203
203
  catch (err) {
204
204
  store.loaded = false
205
- store.error = err instanceof Error ? err.message : String(err)
205
+ store.error = apiErrorMessage(err)
206
206
  }
207
207
  finally {
208
208
  store.loading = false
@@ -259,7 +259,7 @@ const createStore = () => {
259
259
  store.error = ''
260
260
  }
261
261
  catch (err) {
262
- store.error = err instanceof Error ? err.message : String(err)
262
+ store.error = apiErrorMessage(err)
263
263
  }
264
264
  }
265
265
 
@@ -104,7 +104,7 @@ function createStore() {
104
104
  store.error = ''
105
105
  }
106
106
  catch (err) {
107
- store.error = err instanceof Error ? err.message : String(err)
107
+ store.error = apiErrorMessage(err)
108
108
  }
109
109
  }
110
110
 
@@ -83,7 +83,7 @@ function createStore(): DeviceTwinStore {
83
83
  catch (err) {
84
84
  // 失败不再静默清空:保留旧数据 + 置错误态(apiFetch 归一化网络/HTTP/业务错误)
85
85
  store.loaded = false
86
- store.error = err instanceof Error ? err.message : String(err)
86
+ store.error = apiErrorMessage(err)
87
87
  }
88
88
  finally {
89
89
  store.__loading = null
@@ -117,7 +117,7 @@ const createStore = () => {
117
117
  results.splice(0, results.length, ...(data.logs ?? []))
118
118
  }
119
119
  catch (err) {
120
- error.list = err instanceof Error ? err.message : String(err)
120
+ error.list = apiErrorMessage(err)
121
121
  }
122
122
  finally {
123
123
  loading.list = false
@@ -132,7 +132,7 @@ const createStore = () => {
132
132
  await api('', { method: 'POST', body: JSON.stringify(input) })
133
133
  }
134
134
  catch (err) {
135
- error.post = err instanceof Error ? err.message : String(err)
135
+ error.post = apiErrorMessage(err)
136
136
  throw err
137
137
  }
138
138
  finally {
@@ -143,7 +143,7 @@ function createStore(): SceneLayoutStore {
143
143
  return
144
144
  }
145
145
  catch (err) {
146
- lastErr = err instanceof Error ? err.message : String(err)
146
+ lastErr = apiErrorMessage(err)
147
147
  if (attempt < 2) await sleep(400 * (attempt + 1))
148
148
  }
149
149
  }
@@ -154,7 +154,7 @@ async function doTest(): Promise<void> {
154
154
  testResult.value = await daq.testNode(nodeId.value)
155
155
  }
156
156
  catch (err) {
157
- testResult.value = { ok: false, message: err instanceof Error ? err.message : String(err) }
157
+ testResult.value = { ok: false, message: apiErrorMessage(err) }
158
158
  }
159
159
  finally {
160
160
  testing.value = false
@@ -36,7 +36,7 @@ async function setNodeLine(id: string, e: Event): Promise<void> {
36
36
  if (n) n.lineId = lineId
37
37
  }
38
38
  catch (err) {
39
- message.error(err instanceof Error ? err.message : String(err))
39
+ message.error(apiErrorMessage(err))
40
40
  }
41
41
  }
42
42
 
@@ -47,7 +47,7 @@ async function setNodeDevice(id: string, e: Event): Promise<void> {
47
47
  await daq.bindNode(id, deviceId || null)
48
48
  }
49
49
  catch (err) {
50
- message.error(err instanceof Error ? err.message : String(err))
50
+ message.error(apiErrorMessage(err))
51
51
  }
52
52
  }
53
53
 
@@ -61,7 +61,7 @@ async function toggleNodeEnabled(n: { id: string, enabled: boolean, state: strin
61
61
  message.success(next ? tt('daq.k1nodestart147') : tt('daq.k1nodestop146'))
62
62
  }
63
63
  catch (err) {
64
- message.error(err instanceof Error ? err.message : String(err))
64
+ message.error(apiErrorMessage(err))
65
65
  }
66
66
  }
67
67
 
@@ -135,7 +135,7 @@ async function ackOne(id: string): Promise<void> {
135
135
  message.success(tt('daq.k1acked144'))
136
136
  }
137
137
  catch (err) {
138
- message.error(err instanceof Error ? err.message : String(err))
138
+ message.error(apiErrorMessage(err))
139
139
  }
140
140
  }
141
141
 
@@ -459,7 +459,7 @@ async function doTestConnection(): Promise<void> {
459
459
  addTest.value = await daq.testDriver(addDriver.value, addCfg.value)
460
460
  }
461
461
  catch (err) {
462
- addTest.value = { ok: false, message: err instanceof Error ? err.message : String(err) }
462
+ addTest.value = { ok: false, message: apiErrorMessage(err) }
463
463
  }
464
464
  finally {
465
465
  addTesting.value = false
@@ -504,7 +504,7 @@ async function doAddNode(): Promise<void> {
504
504
  addTest.value = null
505
505
  }
506
506
  catch (err) {
507
- addError.value = err instanceof Error ? err.message : String(err)
507
+ addError.value = apiErrorMessage(err)
508
508
  }
509
509
  finally {
510
510
  addSaving.value = false
@@ -592,7 +592,7 @@ async function saveTpl(): Promise<void> {
592
592
  resetTplForm()
593
593
  }
594
594
  catch (err) {
595
- tplError.value = err instanceof Error ? err.message : String(err)
595
+ tplError.value = apiErrorMessage(err)
596
596
  }
597
597
  finally {
598
598
  tplSaving.value = false
@@ -609,7 +609,7 @@ async function askDelTpl(t: DaqTemplateDef): Promise<void> {
609
609
  await daq.removeTemplate(t.key)
610
610
  }
611
611
  catch (err) {
612
- tplError.value = err instanceof Error ? err.message : String(err)
612
+ tplError.value = apiErrorMessage(err)
613
613
  }
614
614
  finally {
615
615
  confirmingDel.value = ''