agentworkshop 0.7.6 → 0.7.8

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 (538) 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/{rzGB_ojX.js → 3612gD2V.js} +2 -2
  5. package/.output/public/_nuxt/8eIQAVlb.js +1 -0
  6. package/.output/public/_nuxt/Ah9qOv1m.js +1 -0
  7. package/.output/public/_nuxt/{DdPeifHR.js → B4Fia4FB.js} +1 -1
  8. package/.output/public/_nuxt/B7aqqzkY.js +1 -0
  9. package/.output/public/_nuxt/BJ-fxrSw.js +1 -0
  10. package/.output/public/_nuxt/{DPDqAD1e.js → BSXx2vqR.js} +1 -1
  11. package/.output/public/_nuxt/{CdSgfcYR.js → BVZjSVs2.js} +1 -1
  12. package/.output/public/_nuxt/{DP6bdyIp.js → BVzDoF8t.js} +1 -1
  13. package/.output/public/_nuxt/BYL0Rjqj.js +7 -0
  14. package/.output/public/_nuxt/{CXmkVXS5.js → BjVLsC3M.js} +1 -1
  15. package/.output/public/_nuxt/{7ZABjMRh2.js → BkfchkK62.js} +1 -1
  16. package/.output/public/_nuxt/BnVoQ74r.js +1 -0
  17. package/.output/public/_nuxt/Bnp4vIAf.js +1 -0
  18. package/.output/public/_nuxt/BsMpJf7S.js +70 -0
  19. package/.output/public/_nuxt/{Z8k0uMSI.js → Bt_HDizI.js} +1 -1
  20. package/.output/public/_nuxt/Bu-P92Pe.js +18 -0
  21. package/.output/public/_nuxt/ButLXkjo.js +2 -0
  22. package/.output/public/_nuxt/{D8DDDzV62.js → C2iWjzEC2.js} +1 -1
  23. package/.output/public/_nuxt/{HWXLx5Hz.js → C8dxXc6K.js} +5 -5
  24. package/.output/public/_nuxt/CGdPdJPP.js +1 -0
  25. package/.output/public/_nuxt/{CN7Zh8GQ.js → CRGlf1Gb.js} +1 -1
  26. package/.output/public/_nuxt/{DSBfvCi5.js → CblLEiCZ.js} +7 -7
  27. package/.output/public/_nuxt/Cd15nPnG2.js +1 -0
  28. package/.output/public/_nuxt/{OwJ1LJkF.js → CsCpu2Zh.js} +1 -1
  29. package/.output/public/_nuxt/CvbHIGQY2.js +1 -0
  30. package/.output/public/_nuxt/Cyk3du4K2.js +1 -0
  31. package/.output/public/_nuxt/{DVQAz9WI.js → D4qXvjuV.js} +2 -2
  32. package/.output/public/_nuxt/{CfIXY-ET.js → DCEyMaN-.js} +1 -1
  33. package/.output/public/_nuxt/{BFYNhG9S.js → DCXIGxzT.js} +1 -1
  34. package/.output/public/_nuxt/{B9aPoQvt.js → DM8DS9MA.js} +1 -1
  35. package/.output/public/_nuxt/{ChnfyQHz.js → DNzaswei.js} +1 -1
  36. package/.output/public/_nuxt/{CrFGZYVB2.js → DYZBdSSg2.js} +1 -1
  37. package/.output/public/_nuxt/{dObsRdSQ.js → DZk24ego.js} +1 -1
  38. package/.output/public/_nuxt/{CyygA0q4.js → Dc46i75T.js} +4 -4
  39. package/.output/public/_nuxt/DeYsUzhr.js +1 -0
  40. package/.output/public/_nuxt/Dk6pq9JB2.js +1 -0
  41. package/.output/public/_nuxt/{ByGNWgAr.js → Do88WZG2.js} +3 -3
  42. package/.output/public/_nuxt/{R_WxTozV2.js → Du-eSpo2.js} +1 -1
  43. package/.output/public/_nuxt/OmpTerminalPanel.B_Pl5Ynm.css +1 -0
  44. package/.output/public/_nuxt/R_Wv_Nd9.js +1 -0
  45. package/.output/public/_nuxt/{Bsc69G4x.js → VnIWJ0ts.js} +3 -3
  46. package/.output/public/_nuxt/_id_.BzKMZnLe.css +1 -0
  47. package/.output/public/_nuxt/_id_.CbpDAWRh.css +1 -0
  48. package/.output/public/_nuxt/{_wsId_.DET_GinP.css → _wsId_.COUzMXpP.css} +1 -1
  49. package/.output/public/_nuxt/agents.BlejnOOC.css +1 -0
  50. package/.output/public/_nuxt/builds/latest.json +1 -1
  51. package/.output/public/_nuxt/builds/meta/e5bb1803-86d9-43b3-85be-dc787dc9a978.json +1 -0
  52. package/.output/public/_nuxt/daq.zZ8GR433.css +1 -0
  53. package/.output/public/_nuxt/{default.D17kXlD6.css → default.V3_hUJq1.css} +1 -1
  54. package/.output/public/_nuxt/{entry.DvlXlPwx.css → entry.5qf6EqfN.css} +1 -1
  55. package/.output/public/_nuxt/{B4GHHF6d2.js → fQUs58kX2.js} +1 -1
  56. package/.output/public/_nuxt/p7wSGMtc.js +1 -0
  57. package/.output/public/_nuxt/tRBT-plo.js +1 -0
  58. package/.output/public/_nuxt/workshop.3kAcLB_M.css +1 -0
  59. package/.output/server/chunks/_/SearchOutlined.mjs +4 -4
  60. package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
  61. package/.output/server/chunks/_/character-asset.repo.mjs +3 -6
  62. package/.output/server/chunks/_/character-asset.repo.mjs.map +1 -1
  63. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  64. package/.output/server/chunks/_/nitro.mjs +12807 -9814
  65. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  66. package/.output/server/chunks/_/scene-layout.repo.mjs +4 -10
  67. package/.output/server/chunks/_/scene-layout.repo.mjs.map +1 -1
  68. package/.output/server/chunks/build/{Col-D7fjGDF6.mjs → Col-biaNnEPf.mjs} +2 -2
  69. package/.output/server/chunks/build/{Col-D7fjGDF6.mjs.map → Col-biaNnEPf.mjs.map} +1 -1
  70. package/.output/server/chunks/build/{OmpTerminalPanel-B_SYhmgb.mjs → OmpTerminalPanel-COphA1br.mjs} +20 -19
  71. package/.output/server/chunks/build/OmpTerminalPanel-COphA1br.mjs.map +1 -0
  72. package/.output/server/chunks/build/{TownView-Bl8Gkcxi.mjs → TownView-B5KifIaT.mjs} +5 -5
  73. package/.output/server/chunks/build/{TownView-Bl8Gkcxi.mjs.map → TownView-B5KifIaT.mjs.map} +1 -1
  74. package/.output/server/chunks/build/{_id_-GnRJPykX.mjs → _id_-C-ewLgfl.mjs} +120 -120
  75. package/.output/server/chunks/build/{_id_-GnRJPykX.mjs.map → _id_-C-ewLgfl.mjs.map} +1 -1
  76. package/.output/server/chunks/build/{_id_-CWLFGZjV.mjs → _id_-Ct4Jhvl1.mjs} +43 -39
  77. package/.output/server/chunks/build/_id_-Ct4Jhvl1.mjs.map +1 -0
  78. package/.output/server/chunks/build/{_wsId_-BhQMjyHG.mjs → _wsId_-CanI_6Su.mjs} +591 -53
  79. package/.output/server/chunks/build/{_wsId_-BhQMjyHG.mjs.map → _wsId_-CanI_6Su.mjs.map} +1 -1
  80. package/.output/server/chunks/build/{agents-D4l1icvn.mjs → agents-DSOptxXA.mjs} +146 -91
  81. package/.output/server/chunks/build/agents-DSOptxXA.mjs.map +1 -0
  82. package/.output/server/chunks/build/{alert-gH-s7yIh.mjs → alert-qJnjyRcP.mjs} +3 -3
  83. package/.output/server/chunks/build/{alert-gH-s7yIh.mjs.map → alert-qJnjyRcP.mjs.map} +1 -1
  84. package/.output/server/chunks/build/{button-BhbX5ACI.mjs → button-DEcZFcqN.mjs} +3 -3
  85. package/.output/server/chunks/build/{button-BhbX5ACI.mjs.map → button-DEcZFcqN.mjs.map} +1 -1
  86. package/.output/server/chunks/build/{card-l4BbX67w.mjs → card-Dipvaykh.mjs} +5 -5
  87. package/.output/server/chunks/build/{card-l4BbX67w.mjs.map → card-Dipvaykh.mjs.map} +1 -1
  88. package/.output/server/chunks/build/{channel-templates-DqjtC-R0.mjs → channel-templates-BK0KuPOd.mjs} +13 -12
  89. package/.output/server/chunks/build/channel-templates-BK0KuPOd.mjs.map +1 -0
  90. package/.output/server/chunks/build/{checkbox-BF11p3dH.mjs → checkbox-dzcpU_Cd.mjs} +4 -4
  91. package/.output/server/chunks/build/{checkbox-BF11p3dH.mjs.map → checkbox-dzcpU_Cd.mjs.map} +1 -1
  92. package/.output/server/chunks/build/{daq-BOgpn9sl.mjs → daq-D9RA_uze.mjs} +103 -103
  93. package/.output/server/chunks/build/{daq-BOgpn9sl.mjs.map → daq-D9RA_uze.mjs.map} +1 -1
  94. package/.output/server/chunks/build/dcw-BTM5YU-B.mjs +2 -2
  95. package/.output/server/chunks/build/{default-CKJWhkot.mjs → default-BfWGTlbj.mjs} +81 -23
  96. package/.output/server/chunks/build/{default-CKJWhkot.mjs.map → default-BfWGTlbj.mjs.map} +1 -1
  97. package/.output/server/chunks/build/{drawer-CVValqoh.mjs → drawer-Cmh90erI.mjs} +3 -3
  98. package/.output/server/chunks/build/{drawer-CVValqoh.mjs.map → drawer-Cmh90erI.mjs.map} +1 -1
  99. package/.output/server/chunks/build/{dropdown-ByCsEWlQ.mjs → dropdown-CGQ0KAzA.mjs} +2 -2
  100. package/.output/server/chunks/build/{dropdown-ByCsEWlQ.mjs.map → dropdown-CGQ0KAzA.mjs.map} +1 -1
  101. package/.output/server/chunks/build/{dropdown-Dex8PXu6.mjs → dropdown-vhn1NPFs.mjs} +4 -4
  102. package/.output/server/chunks/build/{dropdown-Dex8PXu6.mjs.map → dropdown-vhn1NPFs.mjs.map} +1 -1
  103. package/.output/server/chunks/build/{input-number-BBlRoAJ7.mjs → input-number-Bd55elNN.mjs} +5 -5
  104. package/.output/server/chunks/build/{input-number-BBlRoAJ7.mjs.map → input-number-Bd55elNN.mjs.map} +1 -1
  105. package/.output/server/chunks/build/{input--KMeLYqZ.mjs → input-sf_BT6o6.mjs} +3 -3
  106. package/.output/server/chunks/build/{input--KMeLYqZ.mjs.map → input-sf_BT6o6.mjs.map} +1 -1
  107. package/.output/server/chunks/build/logs-Dyk0I2I9.mjs +1 -1
  108. package/.output/server/chunks/build/{menu-xN-SXb9Q.mjs → menu-WCrlpYVh.mjs} +3 -3
  109. package/.output/server/chunks/build/{menu-xN-SXb9Q.mjs.map → menu-WCrlpYVh.mjs.map} +1 -1
  110. package/.output/server/chunks/build/{modal-DrCOcjrl.mjs → modal-yvUquPj5.mjs} +4 -4
  111. package/.output/server/chunks/build/{modal-DrCOcjrl.mjs.map → modal-yvUquPj5.mjs.map} +1 -1
  112. package/.output/server/chunks/build/{monitor-KW8WLOJd.mjs → monitor-MIOvsyLa.mjs} +21 -21
  113. package/.output/server/chunks/build/{monitor-KW8WLOJd.mjs.map → monitor-MIOvsyLa.mjs.map} +1 -1
  114. package/.output/server/chunks/build/pages-DR2bzczM.mjs +1 -1
  115. package/.output/server/chunks/build/{plugins-B-ZNey0Z.mjs → plugins-DnOBIWGg.mjs} +7 -7
  116. package/.output/server/chunks/build/{plugins-B-ZNey0Z.mjs.map → plugins-DnOBIWGg.mjs.map} +1 -1
  117. package/.output/server/chunks/build/{popconfirm-C5H1Qoh3.mjs → popconfirm-CRaHcz5O.mjs} +4 -4
  118. package/.output/server/chunks/build/{popconfirm-C5H1Qoh3.mjs.map → popconfirm-CRaHcz5O.mjs.map} +1 -1
  119. package/.output/server/chunks/build/{useWorkshopApi-Bh5VUHWu.mjs → segmented-DPe9ZzLO.mjs} +7 -78
  120. package/.output/server/chunks/build/segmented-DPe9ZzLO.mjs.map +1 -0
  121. package/.output/server/chunks/build/{select-D7H2ysgT.mjs → select-D-CeE5vY.mjs} +3 -3
  122. package/.output/server/chunks/build/{select-D7H2ysgT.mjs.map → select-D-CeE5vY.mjs.map} +1 -1
  123. package/.output/server/chunks/build/{settings-Cr06lbRy.mjs → settings-DA8IkGLo.mjs} +11 -11
  124. package/.output/server/chunks/build/{settings-Cr06lbRy.mjs.map → settings-DA8IkGLo.mjs.map} +1 -1
  125. package/.output/server/chunks/build/{space-DCwIlnkI.mjs → space-CCBYAkXt.mjs} +2 -2
  126. package/.output/server/chunks/build/{space-DCwIlnkI.mjs.map → space-CCBYAkXt.mjs.map} +1 -1
  127. package/.output/server/chunks/build/{switch-VC0m9ede.mjs → switch-CelRXpcy.mjs} +3 -3
  128. package/.output/server/chunks/build/{switch-VC0m9ede.mjs.map → switch-CelRXpcy.mjs.map} +1 -1
  129. package/.output/server/chunks/build/{table-BksLg3Q_.mjs → table-Cswq-l2r.mjs} +10 -10
  130. package/.output/server/chunks/build/{table-BksLg3Q_.mjs.map → table-Cswq-l2r.mjs.map} +1 -1
  131. package/.output/server/chunks/build/{tabs-CzUfD3iX.mjs → tabs-BM3tAh_J.mjs} +5 -5
  132. package/.output/server/chunks/build/{tabs-CzUfD3iX.mjs.map → tabs-BM3tAh_J.mjs.map} +1 -1
  133. package/.output/server/chunks/build/{tag-oQI3VtqM.mjs → tag-NO9jEqKy.mjs} +4 -4
  134. package/.output/server/chunks/build/{tag-oQI3VtqM.mjs.map → tag-NO9jEqKy.mjs.map} +1 -1
  135. package/.output/server/chunks/build/{teams-QR3BBF7A.mjs → teams-BhSKBBBM.mjs} +15 -14
  136. package/.output/server/chunks/build/teams-BhSKBBBM.mjs.map +1 -0
  137. package/.output/server/chunks/build/{tokens-DFvr_TLj.mjs → tokens-D_eyxmcv.mjs} +16 -16
  138. package/.output/server/chunks/build/{tokens-DFvr_TLj.mjs.map → tokens-D_eyxmcv.mjs.map} +1 -1
  139. package/.output/server/chunks/build/town-BUqRobze.mjs +1 -1
  140. package/.output/server/chunks/build/{town-_4tEEEVW.mjs → town-DPtOPRRO.mjs} +4 -4
  141. package/.output/server/chunks/build/{town-_4tEEEVW.mjs.map → town-DPtOPRRO.mjs.map} +1 -1
  142. package/.output/server/chunks/build/useDaqStream-hwkhJHFU.mjs +1 -1
  143. package/.output/server/chunks/build/useDcwStream-Bdew_yrr.mjs +1 -1
  144. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs +42 -0
  145. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs.map +1 -0
  146. package/.output/server/chunks/build/useWorkshopApi-D2gq06N2.mjs +81 -0
  147. package/.output/server/chunks/build/useWorkshopApi-D2gq06N2.mjs.map +1 -0
  148. package/.output/server/chunks/build/useWorkshopWs-B3j5wIAK.mjs +1 -1
  149. package/.output/server/chunks/build/user-Dk-ytEUV.mjs +1 -1
  150. package/.output/server/chunks/build/{users-4FZ0yFUO.mjs → users-CmVvb1oq.mjs} +16 -16
  151. package/.output/server/chunks/build/{users-4FZ0yFUO.mjs.map → users-CmVvb1oq.mjs.map} +1 -1
  152. package/.output/server/chunks/build/{workshop-k0XZTFKg.mjs → workshop-D5CQj2A8.mjs} +53 -47
  153. package/.output/server/chunks/build/workshop-D5CQj2A8.mjs.map +1 -0
  154. package/.output/server/chunks/build/workspaces-IfORCDJE.mjs +1 -1
  155. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  156. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  157. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  158. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  159. package/.output/server/chunks/routes/api/metrics.mjs +1 -1
  160. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -1
  161. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -1
  162. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -1
  163. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -1
  164. package/.output/server/chunks/routes/api/system/index.get.mjs +3 -3
  165. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
  166. package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -1
  167. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -1
  168. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -1
  169. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -1
  170. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -1
  171. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -1
  172. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
  173. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -1
  174. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
  175. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -1
  176. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  177. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
  178. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -1
  179. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -1
  180. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
  181. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +25 -0
  182. package/.output/server/chunks/routes/api/users/setup-status.get.mjs.map +1 -0
  183. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -1
  184. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -1
  185. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  186. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -1
  187. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  190. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -1
  191. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
  192. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  193. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  194. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +6 -14
  197. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  198. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +39 -0
  199. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs.map +1 -0
  200. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  203. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
  205. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -1
  208. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -2
  209. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -2
  211. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/caller.mjs +2 -2
  213. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +3 -3
  214. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -2
  219. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -1
  226. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -1
  229. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +2 -2
  232. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -1
  235. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  237. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  238. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -1
  239. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -2
  241. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -1
  242. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -2
  243. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +9 -2
  244. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs.map +1 -1
  245. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -1
  246. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +3 -3
  247. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +2 -2
  248. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +2 -2
  249. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +2 -2
  250. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +7 -4
  251. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  252. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -2
  253. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +2 -2
  254. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +2 -2
  255. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +2 -2
  256. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -2
  257. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +2 -2
  258. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -2
  259. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -2
  260. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -2
  261. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -2
  262. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -2
  263. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -2
  264. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -2
  265. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -2
  266. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -2
  267. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -2
  268. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -2
  269. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -2
  270. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +2 -2
  271. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -2
  272. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -2
  273. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -2
  274. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -2
  275. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -2
  276. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -2
  277. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -2
  278. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -2
  279. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -2
  280. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -2
  281. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -2
  282. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -2
  283. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -2
  284. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -2
  285. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -2
  286. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -2
  287. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -2
  288. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -2
  289. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -2
  290. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -2
  291. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -2
  292. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -2
  293. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -2
  294. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -2
  295. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -2
  296. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -2
  297. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +2 -2
  298. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -2
  299. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -2
  300. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -2
  301. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -2
  302. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -2
  303. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -2
  304. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  305. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  306. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -2
  307. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -2
  308. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
  309. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +247 -0
  310. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs.map +1 -0
  311. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +27 -0
  312. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs.map +1 -0
  313. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +2 -2
  314. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +20 -8
  315. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs.map +1 -1
  316. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -1
  317. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  318. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
  319. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  320. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  321. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  322. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +2 -2
  323. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +2 -2
  324. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -2
  325. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +2 -2
  326. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -2
  327. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  328. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -2
  329. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  330. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -1
  331. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -1
  332. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  333. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +1 -1
  334. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -1
  335. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -1
  336. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -1
  337. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +2 -2
  338. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +2 -2
  339. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -1
  340. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -1
  341. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +2 -2
  342. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +2 -2
  343. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -1
  344. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  345. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  346. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -1
  347. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  348. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -1
  349. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -1
  350. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -1
  351. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +2 -2
  352. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -1
  353. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  354. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -1
  355. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -1
  356. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -1
  357. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  358. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -1
  359. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
  360. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +3 -3
  361. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -1
  362. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -1
  363. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -1
  364. package/.output/server/chunks/routes/renderer.mjs +2 -2
  365. package/.output/server/chunks/virtual/entry.mjs +132 -114
  366. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  367. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  368. package/.output/server/index.mjs +1 -1
  369. package/.output/server/package.json +1 -1
  370. package/README-zh.md +27 -7
  371. package/README.md +455 -435
  372. package/app/components/AppHeader.vue +56 -2
  373. package/app/components/workshop/ChannelSessionList.vue +703 -593
  374. package/app/components/workshop/terminal/OmpTerminalPanel.vue +2 -1
  375. package/app/composables/workshop/useLocalTime.ts +16 -0
  376. package/app/composables/workshop/useSceneLayouts.ts +2 -1
  377. package/app/composables/workshop/useWorkshopApi.ts +249 -224
  378. package/app/pages/daq/[id].vue +7 -6
  379. package/app/pages/daq/index.vue +2 -2
  380. package/app/pages/dcw/[id].vue +3 -3
  381. package/app/pages/workshop/agents.vue +432 -382
  382. package/app/pages/workshop/index.vue +25 -6
  383. package/bin/aw.mjs +0 -0
  384. package/cli/aw.mjs +8 -1
  385. package/cli/commands/stop.mjs +7 -4
  386. package/cli/commands/tui.mjs +10 -1
  387. package/cli/core/registry.mjs +5 -3
  388. package/config.yml +144 -134
  389. package/docs/tui.md +1 -1
  390. package/i18n/dicts/settings.json +4 -0
  391. package/i18n/locales/en.ts +9 -0
  392. package/i18n/locales/zh-CN.ts +9 -0
  393. package/package.json +148 -140
  394. package/scripts/_dbg-catalog-smoke.ts +20 -0
  395. package/scripts/_dbg-codex-handshake.ts +30 -0
  396. package/scripts/_dbg-codex-probe.mjs +58 -0
  397. package/scripts/_dbg-codex-sandbox.ts +58 -0
  398. package/scripts/_dbg-codex-turn.ts +65 -0
  399. package/scripts/_dbg-dsh-probe.mjs +31 -0
  400. package/scripts/_dbg-interval-config.mjs +145 -0
  401. package/scripts/_dbg-interval-scenario.mjs +126 -0
  402. package/scripts/_dbg-line-spawn.ts +31 -0
  403. package/scripts/_dbg-live-engine-probe.mjs +80 -0
  404. package/scripts/_dbg-mcp-bridge-probe.mjs +147 -0
  405. package/scripts/_dbg-opencode-sse.mjs +101 -0
  406. package/scripts/_dbg-opencode-start.ts +57 -0
  407. package/scripts/_dbg-plugin-matrix.mjs +212 -0
  408. package/scripts/_dbg-protocol-matrix.mjs +425 -0
  409. package/scripts/_dbg-real-scenario-timeline.log +123 -0
  410. package/scripts/_dbg-registry-smoke.ts +14 -0
  411. package/scripts/_dbg-setup-e2e.mjs +88 -0
  412. package/scripts/_dbg-sim-keeper.mjs +100 -0
  413. package/scripts/_dbg-team-drill.mjs +173 -0
  414. package/scripts/dev-guard.mjs +11 -3
  415. package/scripts/dev-protocol-simulators.mjs +28 -1
  416. package/scripts/e2e-harness-provider-task.mjs +126 -0
  417. package/scripts/e2e-multi-harness.ts +374 -0
  418. package/scripts/e2e-multiharness-team.mjs +319 -0
  419. package/scripts/e2e-plc-scenario.mjs +292 -0
  420. package/scripts/e2e-real-scenario.mjs +452 -0
  421. package/scripts/migrate-local-time.mjs +123 -0
  422. package/scripts/start.mjs +30 -2
  423. package/server/api/system/settings/index.get.ts +3 -3
  424. package/server/api/users/setup-status.get.ts +8 -0
  425. package/server/api/workshop/agent-tools/invoke.post.ts +27 -41
  426. package/server/api/workshop/agent-tools/list.get.ts +25 -0
  427. package/server/api/workshop/channels/[id]/index.patch.ts +38 -30
  428. package/server/api/workshop/daq/[id]/samples.get.ts +8 -3
  429. package/server/api/workshop/harnesses/[id]/providers.get.ts +16 -0
  430. package/server/api/workshop/harnesses.get.ts +12 -0
  431. package/server/api/workshop/hitl/respond.post.ts +87 -67
  432. package/server/api/workshop/ws.ts +13 -0
  433. package/server/data/daqs.json +1421 -19
  434. package/server/data/dcw-lines.json +273 -0
  435. package/server/data/dcw-products.json +224 -0
  436. package/server/data/dcw-recipes.json +868 -0
  437. package/server/data/dcw-rollback.json +1177 -1
  438. package/server/data/dcw-runs.json +3032 -2834
  439. package/server/data/dcw-writes.json +1116 -0
  440. package/server/data/dcws.json +3447 -297
  441. package/server/data/line-runs.json +52 -2
  442. package/server/harness/aw-mcp-bridge.mjs +153 -0
  443. package/server/plugins/00-local-time.ts +10 -0
  444. package/server/plugins/aw-plugins.ts +3 -0
  445. package/server/plugins/backup.ts +116 -97
  446. package/server/plugins/dev-stability-guard.ts +24 -15
  447. package/server/plugins/retention.ts +1 -0
  448. package/server/plugins/security.ts +46 -29
  449. package/server/plugins/workshop.ts +156 -153
  450. package/server/repositories/user.repository.ts +15 -22
  451. package/server/services/system-config.ts +32 -6
  452. package/server/services/user.service.ts +8 -3
  453. package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json +1 -0
  454. package/server/services/workshop/.mimosa/hook-status/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f-e6b75bbfe6.json +14 -0
  455. package/server/services/workshop/agents/adapters/line-spawn.ts +111 -0
  456. package/server/services/workshop/agents/adapters/stdio-jsonrpc.ts +316 -0
  457. package/server/services/workshop/agents/agent-interface.ts +17 -0
  458. package/server/services/workshop/agents/codex-agent.ts +822 -0
  459. package/server/services/workshop/agents/dsh-agent.ts +670 -0
  460. package/server/services/workshop/agents/factory.ts +4 -16
  461. package/server/services/workshop/agents/harness-env.ts +54 -0
  462. package/server/services/workshop/agents/harness-models.ts +270 -0
  463. package/server/services/workshop/agents/host-tool-bridge.ts +612 -0
  464. package/server/services/workshop/agents/industrial-tools.ts +7 -1
  465. package/server/services/workshop/agents/node-bindings.repo.ts +4 -5
  466. package/server/services/workshop/agents/omp-agent.ts +1178 -1957
  467. package/server/services/workshop/agents/opencode-agent.ts +987 -0
  468. package/server/services/workshop/agents/prompt-builder.ts +393 -0
  469. package/server/services/workshop/agents/registry.ts +125 -0
  470. package/server/services/workshop/assets/character-asset.repo.ts +3 -5
  471. package/server/services/workshop/assets/device-twin.repo.ts +3 -5
  472. package/server/services/workshop/daq/daq-controller.ts +38 -6
  473. package/server/services/workshop/daq/daq-node.repo.ts +3 -5
  474. package/server/services/workshop/daq/daq-node.ts +3 -3
  475. package/server/services/workshop/daq/daq-runtime.ts +4 -3
  476. package/server/services/workshop/daq/daq-templates.ts +3 -5
  477. package/server/services/workshop/daq/drivers.ts +41 -12
  478. package/server/services/workshop/daq/storage/sqlite.adapter.ts +313 -309
  479. package/server/services/workshop/db/backup-registry.ts +33 -0
  480. package/server/services/workshop/db/channel.repo.ts +104 -101
  481. package/server/services/workshop/db/database.ts +956 -949
  482. package/server/services/workshop/dcw/dcw-controller.ts +5 -1
  483. package/server/services/workshop/dcw/dcw-line.repo.ts +4 -11
  484. package/server/services/workshop/dcw/dcw-node.repo.ts +3 -5
  485. package/server/services/workshop/dcw/dcw-node.ts +13 -1
  486. package/server/services/workshop/dcw/dcw-product.repo.ts +3 -4
  487. package/server/services/workshop/dcw/dcw-recipe.repo.ts +3 -19
  488. package/server/services/workshop/dcw/dcw-templates.ts +3 -5
  489. package/server/services/workshop/dcw/drivers.ts +37 -13
  490. package/server/services/workshop/dcw/line-run.ts +3 -5
  491. package/server/services/workshop/dcw/recipe-rollback.repo.ts +4 -10
  492. package/server/services/workshop/json-store.mjs +72 -0
  493. package/server/services/workshop/plugins/host.mjs +2 -1
  494. package/server/services/workshop/runtime/agent-runtime.ts +44 -0
  495. package/server/services/workshop/runtime/manager.ts +2953 -2868
  496. package/server/services/workshop/scene/scene-layout.repo.ts +4 -11
  497. package/server/services/workshop/settings.ts +30 -0
  498. package/shared/config/schema.json +9 -0
  499. package/shared/config/single-instance.mjs +5 -1
  500. package/shared/local-time.mjs +36 -0
  501. package/shared/workshop-protocol.ts +11 -5
  502. package/tui/aw-tui.mjs +28 -10
  503. package/tui/components/hitl-card.mjs +47 -36
  504. package/tui/lib/ws.mjs +2 -1
  505. package/.output/public/_nuxt/9X0fVBD7.js +0 -57
  506. package/.output/public/_nuxt/B6M2WJWm2.js +0 -1
  507. package/.output/public/_nuxt/B9Yie5HN.js +0 -2
  508. package/.output/public/_nuxt/BF9XPEuw.js +0 -1
  509. package/.output/public/_nuxt/BbQornXa.js +0 -1
  510. package/.output/public/_nuxt/Bxgaym6j.js +0 -1
  511. package/.output/public/_nuxt/Bxh5nf8j.js +0 -1
  512. package/.output/public/_nuxt/CXLI50Sq.js +0 -1
  513. package/.output/public/_nuxt/CdfAP_IH2.js +0 -1
  514. package/.output/public/_nuxt/Ce1zyNYu.js +0 -1
  515. package/.output/public/_nuxt/D-Ne4C9a.js +0 -1
  516. package/.output/public/_nuxt/DEHNjlTq2.js +0 -1
  517. package/.output/public/_nuxt/DFnGFEav.js +0 -18
  518. package/.output/public/_nuxt/DYWgGHNo.js +0 -7
  519. package/.output/public/_nuxt/OmpTerminalPanel.Bc9GjNU5.css +0 -1
  520. package/.output/public/_nuxt/W1E3-5ML.js +0 -14
  521. package/.output/public/_nuxt/XVB9_zwP.js +0 -1
  522. package/.output/public/_nuxt/Xaf_HIR3.js +0 -1
  523. package/.output/public/_nuxt/_id_.BeqSLvl_.css +0 -1
  524. package/.output/public/_nuxt/_id_.DN3U6EF9.css +0 -1
  525. package/.output/public/_nuxt/agents.BJwgTLFZ.css +0 -1
  526. package/.output/public/_nuxt/builds/meta/55c10854-ee0e-4be4-924b-a1b0e100fe11.json +0 -1
  527. package/.output/public/_nuxt/daq.BXsnevQv.css +0 -1
  528. package/.output/public/_nuxt/workshop.B98sHiJq.css +0 -1
  529. package/.output/public/_nuxt/yIKY_V1P.js +0 -1
  530. package/.output/server/chunks/build/OmpTerminalPanel-B_SYhmgb.mjs.map +0 -1
  531. package/.output/server/chunks/build/_id_-CWLFGZjV.mjs.map +0 -1
  532. package/.output/server/chunks/build/agents-D4l1icvn.mjs.map +0 -1
  533. package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs.map +0 -1
  534. package/.output/server/chunks/build/interval-WlxgjTzO.mjs +0 -9
  535. package/.output/server/chunks/build/interval-WlxgjTzO.mjs.map +0 -1
  536. package/.output/server/chunks/build/teams-QR3BBF7A.mjs.map +0 -1
  537. package/.output/server/chunks/build/useWorkshopApi-Bh5VUHWu.mjs.map +0 -1
  538. package/.output/server/chunks/build/workshop-k0XZTFKg.mjs.map +0 -1
@@ -1,153 +1,156 @@
1
- /**
2
- * Workshop 启动插件(设计文档 §8)。
3
- * Nitro 启动时:创建 data/ 目录 → openWorkshopDb(data/workshop.sqlite)→ 装配 5 个 repo
4
- * + createAgentImpl 工厂 → createAgentChannelManager → restore() 恢复运行时
5
- * → 为有 lead 的 channel 启动 SchedulerLoop → 挂 globalThis.__workshopManager。
6
- *
7
- * 导出:
8
- * - getWorkshopManager():读取进程级 manager 单例(先检查已设置;未初始化抛 503)
9
- * - ensureLeadSchedulerLoop():为 channel 装配并启动 lead 的 SchedulerLoop(幂等)
10
- *
11
- * 注意:不静态 import 'nitropack/runtime/plugin'——defineNitroPlugin 是恒等函数,
12
- * 插件 default 直接导出普通函数即可,避免把 nitropack 依赖引入可被 tsx 直跑测试
13
- * 导入的模块图(顶层 node_modules 无 nitropack 符号链接)。
14
- */
15
- import { mkdirSync } from 'node:fs'
16
- import { resolve } from 'node:path'
17
- import { ensureDataDir } from '@/shared/config/home.mjs'
18
- import { openWorkshopDb, initWorkshopDb } from '../services/workshop/db/database'
19
- import { createChannelRepo } from '../services/workshop/db/channel.repo'
20
- import { createAgentRepo } from '../services/workshop/db/agent.repo'
21
- import { createChannelAgentRepo } from '../services/workshop/db/channel-agent.repo'
22
- import { createTeamRepo } from '../services/workshop/db/team.repo'
23
- import { createTeamMemberRepo } from '../services/workshop/db/team-member.repo'
24
- import { createChannelTemplateRepo } from '../services/workshop/db/channel-template.repo'
25
- import { createTaskRepo } from '../services/workshop/db/task.repo'
26
- import { createMessageRepo } from '../services/workshop/db/message.repo'
27
- import { createSubscriptionRepo } from '../services/workshop/db/subscription.repo'
28
- import { createMemoryRepo } from '../services/workshop/db/memory.repo'
29
- import { createUserRepo } from '../services/workshop/db/user.repo'
30
- import { createChannelEventRepo } from '../services/workshop/db/channel-event.repo'
31
- import { createApprovalHistoryRepo, createAlarmEventRepo, createAuditRepo, createApprovalRequestRepo } from '../services/workshop/db/ops.repo'
32
- import { bindOpsRepos } from '../services/workshop/ops/ops'
33
- import { configureHitlResolver } from '../services/workshop/agents/hitl-registry'
34
- import { ensureAllEventRecorders } from '../api/workshop/ws'
35
- import { createAgentImpl } from '../services/workshop/agents/factory'
36
- import {
37
- createAgentChannelManager,
38
- type AgentChannelManager,
39
- type AllRepos,
40
- type ManagerDeps,
41
- } from '../services/workshop/runtime/manager'
42
- import { AppError } from '../utils/errors'
43
- import { workshopSettings } from '../services/workshop/settings'
44
-
45
- declare global {
46
-
47
- var __workshopManager: AgentChannelManager | undefined
48
- }
49
-
50
- /** 读取进程级 manager 单例(先检查已设置;未初始化抛 503) */
51
- export function getWorkshopManager(): AgentChannelManager {
52
- const manager = globalThis.__workshopManager
53
- if (!manager) {
54
- throw new AppError(503, 'WORKSHOP_NOT_READY', 'workshop 尚未初始化(plugin 未执行)')
55
- }
56
- return manager
57
- }
58
-
59
- /**
60
- * 为 channel 装配并启动 lead 的 SchedulerLoop(幂等)。
61
- * 委托 manager.ensureChannelActive(懒加载:装配 lead + 调度循环)。
62
- */
63
- export function ensureLeadSchedulerLoop(
64
- manager: AgentChannelManager,
65
- channelId: string,
66
- options?: { tickMs?: number, stallMs?: number },
67
- ): void {
68
- manager.ensureChannelActive(channelId, options)
69
- }
70
-
71
- /**
72
- * Nitro 启动插件(默认导出普通函数;defineNitroPlugin 为恒等包装)。
73
- * 注意:runNitroPlugins 同步调用 plugin,不 await 返回值;manager.restore() 方法体全同步
74
- * (无 await 语句),直接调用即同步完成恢复,故此处不 await。
75
- * 幂等:globalThis.__workshopManager 已设置(如测试预置)则跳过初始化。
76
- */
77
- export default function workshopPlugin(nitroApp: {
78
- hooks: { hook(name: string, fn: (...args: unknown[]) => void | Promise<void>): void }
79
- }): void {
80
- // 进程级未处理拒绝兜底(Node ≥23 默认对 unhandledRejection 抛错可击穿整个服务)。
81
- // 环境型连接复位(休眠/断网后陈旧 socket read ECONNRESET、omp 子进程管道抖动等)
82
- // 不应让服务崩溃;记录上下文后继续运行(正常业务错误仍走各自显式处理路径)。
83
- process.on('unhandledRejection', (reason) => {
84
- console.error('[workshop] 未处理 Promise rejection(已兜底,不影响服务):', reason)
85
- })
86
-
87
- // 先检查已设置:避免重复装配覆盖既有单例
88
- if (globalThis.__workshopManager) return
89
-
90
- // 数据目录经配置根解析(repo: <repo>/.AgentWorkShop/data;home: ~/.AgentWorkShop/data;
91
- // ensureDataDir 自动迁移旧 cwd/data 位置,目录不存在则创建)
92
- const dataDir = ensureDataDir()
93
- mkdirSync(dataDir, { recursive: true })
94
-
95
- // 打开(或创建)数据库 → 初始化(建表 + PRAGMA;openWorkshopDb 已内置,显式再调一次保持幂等)
96
- const db = openWorkshopDb(resolve(dataDir, 'workshop.sqlite'))
97
- initWorkshopDb(db)
98
-
99
- // 装配 repos + Agent impl 工厂
100
- const repos: AllRepos = {
101
- users: createUserRepo(db),
102
- channelEvents: createChannelEventRepo(db),
103
- channels: createChannelRepo(db),
104
- agents: createAgentRepo(db),
105
- teams: createTeamRepo(db),
106
- teamMembers: createTeamMemberRepo(db),
107
- channelTemplates: createChannelTemplateRepo(db),
108
- channelAgents: createChannelAgentRepo(db),
109
- messages: createMessageRepo(db),
110
- subscriptions: createSubscriptionRepo(db),
111
- tasks: createTaskRepo(db),
112
- memories: createMemoryRepo(db),
113
- }
114
- // S4/S5/R1/R3:合规三表仓储接线(审批历史/报警事件/审计日志/高危复核)
115
- bindOpsRepos({
116
- approvalHistory: createApprovalHistoryRepo(db),
117
- alarmEvents: createAlarmEventRepo(db),
118
- audit: createAuditRepo(db),
119
- approvalRequests: createApprovalRequestRepo(db),
120
- })
121
- const deps: ManagerDeps = { repos, implFactory: createAgentImpl, db }
122
-
123
- // 创建 manager → 挂全局单例(后续 REST/A2A/WS 经 getWorkshopManager() 读取)
124
- const manager = createAgentChannelManager(deps)
125
- globalThis.__workshopManager = manager
126
-
127
- // HITL 全局待办:agentId → channelId/agentName 解析器(避免 registry 反向依赖 manager)
128
- configureHitlResolver((agentId) => {
129
- const row = repos.channelAgents.findById(agentId)
130
- return row ? { channelId: row.channelId, agentName: row.name } : null
131
- })
132
-
133
- // 懒加载恢复:仅激活有待办任务的 channel(装配 lead + 调度循环);其余纯持久化
134
- manager.restore()
135
-
136
- // 全时事件录制:为全部存量 channel 建立常驻流(事件 server 驱动落库,与 client 无关)
137
- void ensureAllEventRecorders(manager).catch(err => console.error('[workshop] 事件录制器初始化失败:', err))
138
-
139
- // idle sweeper:空闲 agent 超时自动卸载(释放 omp 子进程与内存)。
140
- // busy 成员有三重守卫(state!==idle / 信箱 pending / lead 活跃任务)不会被卸载,
141
- // "作业期间进程不断开"由守卫保证;空闲宽限可经 workshop.idle_grace_ms 调整 ——
142
- // 需要进程更长常驻(免冷启动 30~90s)时调大(env WORKSHOP_IDLE_GRACE_MS 兼容)。
143
- const idleSweepMs = workshopSettings().idle_sweep_ms
144
- const idleGraceMs = workshopSettings().idle_grace_ms
145
- const stopSweeper = manager.startIdleSweeper({ intervalMs: idleSweepMs, graceMs: idleGraceMs })
146
-
147
- // 关机:完整关闭 manager(sweeper + 调度循环 + agent 运行时),关闭数据库
148
- nitroApp.hooks.hook('close', async () => {
149
- stopSweeper()
150
- await manager.shutdown()
151
- db.close()
152
- })
153
- }
1
+ /**
2
+ * Workshop 启动插件(设计文档 §8)。
3
+ * Nitro 启动时:创建 data/ 目录 → openWorkshopDb(data/workshop.sqlite)→ 装配 5 个 repo
4
+ * + createAgentImpl 工厂 → createAgentChannelManager → restore() 恢复运行时
5
+ * → 为有 lead 的 channel 启动 SchedulerLoop → 挂 globalThis.__workshopManager。
6
+ *
7
+ * 导出:
8
+ * - getWorkshopManager():读取进程级 manager 单例(先检查已设置;未初始化抛 503)
9
+ * - ensureLeadSchedulerLoop():为 channel 装配并启动 lead 的 SchedulerLoop(幂等)
10
+ *
11
+ * 注意:不静态 import 'nitropack/runtime/plugin'——defineNitroPlugin 是恒等函数,
12
+ * 插件 default 直接导出普通函数即可,避免把 nitropack 依赖引入可被 tsx 直跑测试
13
+ * 导入的模块图(顶层 node_modules 无 nitropack 符号链接)。
14
+ */
15
+ import { mkdirSync } from 'node:fs'
16
+ import { resolve } from 'node:path'
17
+ import { ensureDataDir } from '@/shared/config/home.mjs'
18
+ import { openWorkshopDb, initWorkshopDb } from '../services/workshop/db/database'
19
+ import { backupRegistry } from '../services/workshop/db/backup-registry'
20
+ import { createChannelRepo } from '../services/workshop/db/channel.repo'
21
+ import { createAgentRepo } from '../services/workshop/db/agent.repo'
22
+ import { createChannelAgentRepo } from '../services/workshop/db/channel-agent.repo'
23
+ import { createTeamRepo } from '../services/workshop/db/team.repo'
24
+ import { createTeamMemberRepo } from '../services/workshop/db/team-member.repo'
25
+ import { createChannelTemplateRepo } from '../services/workshop/db/channel-template.repo'
26
+ import { createTaskRepo } from '../services/workshop/db/task.repo'
27
+ import { createMessageRepo } from '../services/workshop/db/message.repo'
28
+ import { createSubscriptionRepo } from '../services/workshop/db/subscription.repo'
29
+ import { createMemoryRepo } from '../services/workshop/db/memory.repo'
30
+ import { createUserRepo } from '../services/workshop/db/user.repo'
31
+ import { createChannelEventRepo } from '../services/workshop/db/channel-event.repo'
32
+ import { createApprovalHistoryRepo, createAlarmEventRepo, createAuditRepo, createApprovalRequestRepo } from '../services/workshop/db/ops.repo'
33
+ import { bindOpsRepos } from '../services/workshop/ops/ops'
34
+ import { configureHitlResolver } from '../services/workshop/agents/hitl-registry'
35
+ import { ensureAllEventRecorders } from '../api/workshop/ws'
36
+ import { createAgentImpl } from '../services/workshop/agents/factory'
37
+ import {
38
+ createAgentChannelManager,
39
+ type AgentChannelManager,
40
+ type AllRepos,
41
+ type ManagerDeps,
42
+ } from '../services/workshop/runtime/manager'
43
+ import { AppError } from '../utils/errors'
44
+ import { workshopSettings } from '../services/workshop/settings'
45
+
46
+ declare global {
47
+
48
+ var __workshopManager: AgentChannelManager | undefined
49
+ }
50
+
51
+ /** 读取进程级 manager 单例(先检查已设置;未初始化抛 503) */
52
+ export function getWorkshopManager(): AgentChannelManager {
53
+ const manager = globalThis.__workshopManager
54
+ if (!manager) {
55
+ throw new AppError(503, 'WORKSHOP_NOT_READY', 'workshop 尚未初始化(plugin 未执行)')
56
+ }
57
+ return manager
58
+ }
59
+
60
+ /**
61
+ * 为 channel 装配并启动 lead 的 SchedulerLoop(幂等)。
62
+ * 委托 manager.ensureChannelActive(懒加载:装配 lead + 调度循环)。
63
+ */
64
+ export function ensureLeadSchedulerLoop(
65
+ manager: AgentChannelManager,
66
+ channelId: string,
67
+ options?: { tickMs?: number, stallMs?: number },
68
+ ): void {
69
+ manager.ensureChannelActive(channelId, options)
70
+ }
71
+
72
+ /**
73
+ * Nitro 启动插件(默认导出普通函数;defineNitroPlugin 为恒等包装)。
74
+ * 注意:runNitroPlugins 同步调用 plugin,不 await 返回值;manager.restore() 方法体全同步
75
+ * (无 await 语句),直接调用即同步完成恢复,故此处不 await。
76
+ * 幂等:globalThis.__workshopManager 已设置(如测试预置)则跳过初始化。
77
+ */
78
+ export default function workshopPlugin(nitroApp: {
79
+ hooks: { hook(name: string, fn: (...args: unknown[]) => void | Promise<void>): void }
80
+ }): void {
81
+ // 进程级未处理拒绝兜底(Node ≥23 默认对 unhandledRejection 抛错可击穿整个服务)。
82
+ // 环境型连接复位(休眠/断网后陈旧 socket read ECONNRESET、omp 子进程管道抖动等)
83
+ // 不应让服务崩溃;记录上下文后继续运行(正常业务错误仍走各自显式处理路径)。
84
+ process.on('unhandledRejection', (reason) => {
85
+ console.error('[workshop] 未处理 Promise rejection(已兜底,不影响服务):', reason)
86
+ })
87
+
88
+ // 先检查已设置:避免重复装配覆盖既有单例
89
+ if (globalThis.__workshopManager) return
90
+
91
+ // 数据目录经配置根解析(repo: <repo>/.AgentWorkShop/data;home: ~/.AgentWorkShop/data;
92
+ // ensureDataDir 自动迁移旧 cwd/data 位置,目录不存在则创建)
93
+ const dataDir = ensureDataDir()
94
+ mkdirSync(dataDir, { recursive: true })
95
+
96
+ // 打开(或创建)数据库 → 初始化(建表 + PRAGMA;openWorkshopDb 已内置,显式再调一次保持幂等)
97
+ const db = openWorkshopDb(resolve(dataDir, 'workshop.sqlite'))
98
+ initWorkshopDb(db)
99
+ // 登记主连接(备份插件 serialize 跑在主连接上,杜绝第二连接失效语句的事故)
100
+ backupRegistry.register(resolve(dataDir, 'workshop.sqlite'), db)
101
+
102
+ // 装配 repos + Agent impl 工厂
103
+ const repos: AllRepos = {
104
+ users: createUserRepo(db),
105
+ channelEvents: createChannelEventRepo(db),
106
+ channels: createChannelRepo(db),
107
+ agents: createAgentRepo(db),
108
+ teams: createTeamRepo(db),
109
+ teamMembers: createTeamMemberRepo(db),
110
+ channelTemplates: createChannelTemplateRepo(db),
111
+ channelAgents: createChannelAgentRepo(db),
112
+ messages: createMessageRepo(db),
113
+ subscriptions: createSubscriptionRepo(db),
114
+ tasks: createTaskRepo(db),
115
+ memories: createMemoryRepo(db),
116
+ }
117
+ // S4/S5/R1/R3:合规三表仓储接线(审批历史/报警事件/审计日志/高危复核)
118
+ bindOpsRepos({
119
+ approvalHistory: createApprovalHistoryRepo(db),
120
+ alarmEvents: createAlarmEventRepo(db),
121
+ audit: createAuditRepo(db),
122
+ approvalRequests: createApprovalRequestRepo(db),
123
+ })
124
+ const deps: ManagerDeps = { repos, implFactory: createAgentImpl, db }
125
+
126
+ // 创建 manager → 挂全局单例(后续 REST/A2A/WS 经 getWorkshopManager() 读取)
127
+ const manager = createAgentChannelManager(deps)
128
+ globalThis.__workshopManager = manager
129
+
130
+ // HITL 全局待办:agentId → channelId/agentName 解析器(避免 registry 反向依赖 manager)
131
+ configureHitlResolver((agentId) => {
132
+ const row = repos.channelAgents.findById(agentId)
133
+ return row ? { channelId: row.channelId, agentName: row.name } : null
134
+ })
135
+
136
+ // 懒加载恢复:仅激活有待办任务的 channel(装配 lead + 调度循环);其余纯持久化
137
+ manager.restore()
138
+
139
+ // 全时事件录制:为全部存量 channel 建立常驻流(事件 server 驱动落库,与 client 无关)
140
+ void ensureAllEventRecorders(manager).catch(err => console.error('[workshop] 事件录制器初始化失败:', err))
141
+
142
+ // idle sweeper:空闲 agent 超时自动卸载(释放 omp 子进程与内存)。
143
+ // busy 成员有三重守卫(state!==idle / 信箱 pending / lead 活跃任务)不会被卸载,
144
+ // "作业期间进程不断开"由守卫保证;空闲宽限可经 workshop.idle_grace_ms 调整 ——
145
+ // 需要进程更长常驻(免冷启动 30~90s)时调大(env WORKSHOP_IDLE_GRACE_MS 兼容)。
146
+ const idleSweepMs = workshopSettings().idle_sweep_ms
147
+ const idleGraceMs = workshopSettings().idle_grace_ms
148
+ const stopSweeper = manager.startIdleSweeper({ intervalMs: idleSweepMs, graceMs: idleGraceMs })
149
+
150
+ // 关机:完整关闭 manager(sweeper + 调度循环 + agent 运行时),关闭数据库
151
+ nitroApp.hooks.hook('close', async () => {
152
+ stopSweeper()
153
+ await manager.shutdown()
154
+ db.close()
155
+ })
156
+ }
@@ -1,4 +1,5 @@
1
1
  import { existsSync } from 'node:fs'
2
+ import { backupRegistry } from '../services/workshop/db/backup-registry'
2
3
  import { join, resolve } from 'node:path'
3
4
  import { randomBytes, randomUUID, scryptSync, createHash, timingSafeEqual } from 'node:crypto'
4
5
  import { DatabaseSync } from 'node:sqlite'
@@ -41,25 +42,19 @@ CREATE TABLE IF NOT EXISTS user_tokens (
41
42
  CREATE INDEX IF NOT EXISTS idx_user_tokens_user ON user_tokens(user_id);
42
43
  `
43
44
 
44
- /** 种子用户(首次建库时写入;默认密码 Awshop@123,便于开箱登录) */
45
- const SEED_USERS = [
46
- { name: '张伟', email: 'zhangwei@awshop.io', role: 'admin', status: 'active' },
47
- { name: '王芳', email: 'wangfang@awshop.io', role: 'editor', status: 'active' },
48
- { name: '李娜', email: 'lina@awshop.io', role: 'user', status: 'disabled' },
49
- { name: '刘洋', email: 'liuyang@awshop.io', role: 'editor', status: 'active' },
50
- { name: '陈静', email: 'chenjing@awshop.io', role: 'user', status: 'active' },
51
- { name: 'Michael Chen', email: 'michael@awshop.io', role: 'user', status: 'active' },
52
- ]
53
-
54
45
  let db: DatabaseSync | null = null
55
46
 
56
47
  function getDb(): DatabaseSync {
57
48
  if (!db) {
58
49
  // 目录由 ensureDataDir 内部创建(含旧位置迁移)
59
50
  db = new DatabaseSync(DB_PATH)
51
+ // 主连接登记(备份 serialize 用;见 backup-registry 说明)
52
+ backupRegistry.register(DB_PATH, db)
53
+ db.exec('PRAGMA busy_timeout = 5000')
60
54
  db.exec(SCHEMA_SQL)
61
55
  migrateSchema(db)
62
- seedIfEmpty()
56
+ // 首启零用户:不播种任何账号,由使用者在登录页注册第一个账号(自动成为管理员,
57
+ // 见 user.service.register 的初始化判定)
63
58
  importLegacyWorkshopUsers(db)
64
59
  }
65
60
  return db
@@ -91,17 +86,6 @@ function maskPreview(raw: string): string {
91
86
  return `${raw.slice(0, 6)}${'•'.repeat(8)}${raw.slice(-4)}`
92
87
  }
93
88
 
94
- /** 首次建库写入种子用户(幂等:users 非空即跳过) */
95
- function seedIfEmpty(): void {
96
- const d = db!
97
- const { n } = d.prepare('SELECT COUNT(*) AS n FROM users').get() as { n: number }
98
- if (n > 0) return
99
- const insert = d.prepare('INSERT INTO users (id, name, email, password_hash, role, status, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)')
100
- const hash = hashPassword('Awshop@123')
101
- for (const u of SEED_USERS) {
102
- insert.run(randomUUID(), u.name, u.email, hash, u.role, u.status, now())
103
- }
104
- }
105
89
  /**
106
90
  * 一次性迁移:旧 workshop 本地用户(data/workshop.sqlite 的 users 表)导入全局用户系统。
107
91
  * - 保留原 id/name(资源归属 owner_user_id 不变,历史数据不丢)
@@ -215,6 +199,8 @@ WHERE t.token_hash = ?`,
215
199
  if (!row) return null
216
200
  // R2:过期单点判定(resolveUser/resolveAgentOrUser/me 全部经此收敛)
217
201
  if (row.expiresAt && Date.parse(row.expiresAt) < Date.now()) return null
202
+ // 禁用账号即时失效(此前存量 token 在禁用后最长 30 天仍可用)
203
+ if (row.status && row.status !== 'active') return null
218
204
  d.prepare('UPDATE user_tokens SET last_used_at = ? WHERE token_hash = ?').run(now(), hash)
219
205
  return row
220
206
  }
@@ -265,6 +251,13 @@ export const userRepository = {
265
251
  return row ? toUser(row) : undefined
266
252
  },
267
253
 
254
+ /** 是否存在活跃管理员(初始化判定:false → 系统处于首启注册模式,首个注册账号将成为管理员) */
255
+ hasActiveAdmin(): boolean {
256
+ const d = getDb()
257
+ const { n } = d.prepare("SELECT COUNT(*) AS n FROM users WHERE role = 'admin' AND status = 'active'").get() as { n: number }
258
+ return n > 0
259
+ },
260
+
268
261
  /** 内部:取密码哈希(仅认证路径使用,不参与领域对象外泄) */
269
262
  getPasswordHash(email: string): { id: string, hash: string } | null {
270
263
  const d = getDb()
@@ -14,9 +14,10 @@
14
14
  * 使用:server/plugins/system-config.ts 在 Nitro 启动时 init();
15
15
  * 业务经 getSystemConfigService() 读取(不存在则惰性初始化,幂等)。
16
16
  */
17
- import { watch, existsSync } from 'node:fs'
18
- import { join } from 'node:path'
17
+ import { watch, existsSync, mkdirSync, copyFileSync } from 'node:fs'
18
+ import { join, dirname } from 'node:path'
19
19
  import { useRuntimeConfig } from '#imports'
20
+ import { resolveRunMode } from '@/shared/config/home.mjs'
20
21
  import { AppError } from '../utils/errors'
21
22
  import {
22
23
  loadDescriptors,
@@ -82,7 +83,8 @@ declare global {
82
83
 
83
84
  export class SystemConfigService {
84
85
  private descriptors: SettingsDescriptor[] = []
85
- private map = new Map<string, SettingsDescriptor>()
86
+ /** key → 描述符(loadDescriptorMap 返回普通对象,非 Map;下标访问) */
87
+ private map: Record<string, SettingsDescriptor> = {}
86
88
  private overrides: Record<string, unknown> = {}
87
89
  private envOverrides: Record<string, unknown> = {}
88
90
  private effective: Record<string, unknown> = {}
@@ -97,7 +99,29 @@ export class SystemConfigService {
97
99
 
98
100
  constructor(readonly root: string) {
99
101
  this.configPath = join(root, 'config.yml')
100
- this.settingsPath = join(root, 'data', 'runtime-settings.json')
102
+ // 设置文件必须与 CLI(aw config set)/start/dev-guard 同源(resolveRunMode 单一入口):
103
+ // 原先写死 <cwd>/data/runtime-settings.json 造成"API 写 A、子系统读 B"的脑裂 —— 备份
104
+ // 周期/保留期/DAQ 覆盖等运行时设置对服务端静默无效。
105
+ const rm = resolveRunMode({ cwd: root, packageRoot: process.env.AW_PACKAGE_ROOT, env: process.env })
106
+ this.configPath = rm.configPath ?? this.configPath
107
+ this.settingsPath = rm.settingsPath ?? this.settingsPath
108
+ // 一次性收敛:遗留 <cwd>/data/runtime-settings.json 且目标不存在 → 迁移;两者并存 → 告警遗留被忽略
109
+ try {
110
+ const legacy = join(root, 'data', 'runtime-settings.json')
111
+ if (existsSync(legacy) && legacy !== this.settingsPath) {
112
+ if (!existsSync(this.settingsPath)) {
113
+ mkdirSync(dirname(this.settingsPath), { recursive: true })
114
+ copyFileSync(legacy, this.settingsPath)
115
+ console.log(`[system-config] 遗留设置已迁移: ${legacy} -> ${this.settingsPath}`)
116
+ }
117
+ else {
118
+ console.warn(`[system-config] 检测到遗留设置文件 ${legacy}(现以 ${this.settingsPath} 为准,该文件被忽略)`)
119
+ }
120
+ }
121
+ }
122
+ catch (err) {
123
+ console.warn('[system-config] 遗留设置迁移失败(不阻断启动):', String(err?.message ?? err))
124
+ }
101
125
  }
102
126
 
103
127
  /** Nitro 启动时调用:加载覆盖 → 应用到 runtimeConfig → 挂文件监听 */
@@ -183,7 +207,7 @@ export class SystemConfigService {
183
207
  const validated: Record<string, unknown> = {}
184
208
  const changed: string[] = []
185
209
  for (const [key, value] of Object.entries(raw)) {
186
- const desc = this.map.get(key)
210
+ const desc = this.map[key]
187
211
  if (!desc) continue // 未知键:忽略(schema 演进容错)
188
212
  const errs = validateValue(desc, value)
189
213
  if (errs.length) {
@@ -198,6 +222,8 @@ export class SystemConfigService {
198
222
  }
199
223
  this.overrides = validated
200
224
  this.recompute()
225
+ // 运行语义设置读取层(settings.ts effective 3s TTL)即时失效:live 键热重载零延迟
226
+ void import('./workshop/settings').then(m => m.invalidateRuntimeSettingsCache()).catch(() => {})
201
227
  return { changed }
202
228
  }
203
229
 
@@ -249,7 +275,7 @@ export class SystemConfigService {
249
275
  const next = { ...this.overrides }
250
276
  const changed: string[] = []
251
277
  for (const [key, rawValue] of Object.entries(patch)) {
252
- const desc = this.map.get(key)
278
+ const desc = this.map[key]
253
279
  if (!desc) {
254
280
  errors[key] = ['未知设置项(不在 shared/config/schema.json 中)']
255
281
  continue
@@ -83,7 +83,8 @@ export const userService = {
83
83
 
84
84
  // ===== 认证(公开端点)=====
85
85
 
86
- /** 注册:创建账号 + 签发首个 token(邮箱/用户名占用 → 409) */
86
+ /** 注册:创建账号 + 签发首个 token(邮箱/用户名占用 → 409)。
87
+ * 首启初始化:系统尚无活跃管理员时,首个注册账号授予 admin(空库自注册建站) */
87
88
  register(input: UserRegister): AuthResult {
88
89
  if (userRepository.findByEmail(input.email)) {
89
90
  throw new AppError(409, ErrorCodes.CONFLICT, '邮箱已被注册')
@@ -91,8 +92,12 @@ export const userService = {
91
92
  if (userRepository.findByName(input.name)) {
92
93
  throw new AppError(409, 'USER_EXISTS', `用户名已存在: ${input.name}`)
93
94
  }
94
- const user = userRepository.create({ ...input, role: 'user', status: 'active' })
95
- const { raw } = userRepository.createToken(user.id, 'default')
95
+ const needsBootstrap = !userRepository.hasActiveAdmin()
96
+ if (needsBootstrap) {
97
+ console.log(`[users] 初始化:尚无管理员账号,首个注册账号授予管理员角色(${input.email})`)
98
+ }
99
+ const user = userRepository.create({ ...input, role: needsBootstrap ? 'admin' : 'user', status: 'active' })
100
+ const { raw } = userRepository.createToken(user.id, needsBootstrap ? 'bootstrap-admin' : 'default')
96
101
  return { user: this.publicProfile(user), token: raw }
97
102
  },
98
103
 
@@ -0,0 +1 @@
1
+ {"touched":[],"bashMutation":true,"reportedFindings":[],"findingEvents":[],"baseline":null,"stateErrors":[],"omittedReportedFindings":0,"omittedFindingEvents":0,"processing":null,"updatedAt":"2026-09-04T17:27:52.487Z"}
@@ -0,0 +1,14 @@
1
+ {
2
+ "schemaVersion": "mimosa-hook-status/v1",
3
+ "recordedAt": "2026-09-04T17:28:09.989Z",
4
+ "sessionId": "sess_fed429fb-c8b7-4a50-bbd6-45afc580893f",
5
+ "event": "PostToolUse",
6
+ "toolName": "Write",
7
+ "file": "D:\\codes\\ABO\\AgentWorkShop\\.omc\\plans\\codemod-fix-helper.cjs",
8
+ "outcome": "clear",
9
+ "coverage": "complete",
10
+ "findingCount": 0,
11
+ "durationMs": 4,
12
+ "hostState": "hook_complete",
13
+ "reportHint": ".mimosa/reports/"
14
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * 受控子进程拉起工具(harness 适配器共用)。
3
+ *
4
+ * 安全约束:
5
+ * - 永不走 shell —— 除一种 Windows 特例:.cmd/.bat shim(如 npm 全局安装的
6
+ * codex.cmd)不能被 CreateProcess 直接执行,须经固定的 'cmd.exe' /d /s /c
7
+ * 包装;此时逐参数做严格校验(拒绝引号与控制字符)并全量引号包裹,参数面
8
+ * 仍是结构化且无元字符的,不存在可注入的自由文本。
9
+ * - 包装器是字面量 'cmd.exe',不由环境变量或请求决定;
10
+ * - 命令先经 assertPlainExecutable(拒绝 shell 元字符)与 PATH 解析
11
+ * (必须解析为磁盘上真实存在的文件)才可拉起。
12
+ */
13
+ import { spawn as launchChildProcess, type ChildProcess } from 'node:child_process'
14
+ import { existsSync, statSync } from 'node:fs'
15
+ import { join } from 'node:path'
16
+
17
+ const SHELL_META = /[\r\n;&|`<>$]/
18
+
19
+ /** 拒绝 shell 元字符(命令只能是纯可执行路径) */
20
+ export function assertPlainExecutable(command: string): string {
21
+ if (!command || SHELL_META.test(command)) {
22
+ throw new Error(`非法 harness 命令(含 shell 元字符或为空): ${JSON.stringify(command.slice(0, 80))}`)
23
+ }
24
+ return command
25
+ }
26
+
27
+ /** PATH + PATHEXT 解析裸命令名 → 绝对路径(win32;非 Windows 返回 null)。带扩展名优先,裸名(sh 脚本)最后 */
28
+ function resolveOnPath(command: string): string | null {
29
+ if (process.platform !== 'win32') return null
30
+ const isFile = (p: string): boolean => {
31
+ try {
32
+ return existsSync(p) && statSync(p).isFile()
33
+ }
34
+ catch {
35
+ return false
36
+ }
37
+ }
38
+ const hasDir = command.includes('/') || command.includes('\\') || /^[A-Za-z]:/.test(command)
39
+ const exts = (process.env.PATHEXT?.split(';').filter(Boolean) ?? ['.EXE', '.CMD', '.BAT', '.COM']).map(e => e.toLowerCase())
40
+ const bases = hasDir
41
+ ? [command]
42
+ : (process.env.PATH ?? '').split(';').filter(Boolean).map(dir => join(dir, command))
43
+ // PATHEXT 顺序(.exe → .cmd → …)优先;裸名兜底(npm sh 脚本,win 上不可执行,仅最后回退)
44
+ for (const base of bases) {
45
+ for (const ext of exts) {
46
+ const full = base + ext
47
+ if (isFile(full)) return full
48
+ }
49
+ }
50
+ for (const base of bases) {
51
+ if (isFile(base)) return base
52
+ }
53
+ return null
54
+ }
55
+
56
+ /**
57
+ * 命令解析:裸名经 PATH 解析,返回磁盘上的绝对路径;.cmd/.bat 标记 needsCmd。
58
+ */
59
+ function resolveExecutable(command: string): { file: string, needsCmd: boolean } {
60
+ assertPlainExecutable(command)
61
+ const file = resolveOnPath(command) ?? command
62
+ if (process.platform === 'win32') {
63
+ const lower = file.toLowerCase()
64
+ if (lower.endsWith('.cmd') || lower.endsWith('.bat')) return { file, needsCmd: true }
65
+ }
66
+ return { file, needsCmd: false }
67
+ }
68
+
69
+ export interface LineSpawnOptions {
70
+ cwd?: string
71
+ env?: Record<string, string>
72
+ }
73
+
74
+ /** .cmd 包装时的逐参数校验(引号/控制字符会改变 cmd 解析,拒绝) */
75
+ function assertCmdSafeArg(arg: string): string {
76
+ if (/["\r\n\0]/.test(arg)) {
77
+ throw new Error(`参数含引号/控制字符,拒绝经 cmd 包装执行: ${JSON.stringify(arg.slice(0, 80))}`)
78
+ }
79
+ return arg
80
+ }
81
+
82
+ /** 拉起逐行 stdio 子进程(命令已经 resolveExecutable 校验) */
83
+ export function spawnLineProcess(command: string, args: string[], options: LineSpawnOptions = {}): ChildProcess {
84
+ const { file, needsCmd } = resolveExecutable(command)
85
+ const env = { ...process.env, ...options.env }
86
+ if (needsCmd) {
87
+ // Windows .cmd shim:固定包装器 'cmd.exe' + /d /s /c。
88
+ // 可执行文件路径无条件引号包裹:无空格路径裸奔时,/s 模式的 cmd 会吞掉
89
+ // 路径中的反斜杠(C:\Users\... → C:Users...),引擎进程立即退出(code=1)。
90
+ // 参数仍逐个经 assertCmdSafeArg 校验(拒绝引号与控制字符),引号包裹不引入注入面。
91
+ const line = [`"${file}"`, ...args.map(a => assertCmdSafeArg(a)).map((token) => {
92
+ token = token.replace(/[\];&`<>$]/g, '^$1')
93
+ return token.includes(' ') ? `"${token}"` : token
94
+ })].join(' ')
95
+ return launchChildProcess('cmd.exe', ['/d', '/s', '/c', line], {
96
+ stdio: ['pipe', 'pipe', 'pipe'],
97
+ cwd: options.cwd ?? process.cwd(),
98
+ env,
99
+ windowsHide: true,
100
+ shell: false,
101
+ windowsVerbatimArguments: true,
102
+ })
103
+ }
104
+ return launchChildProcess(file, args, {
105
+ stdio: ['pipe', 'pipe', 'pipe'],
106
+ cwd: options.cwd ?? process.cwd(),
107
+ env,
108
+ windowsHide: true,
109
+ shell: false,
110
+ })
111
+ }