agentworkshop 0.7.5 → 0.7.7

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 (519) 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/C-GarxYC.js +1 -0
  23. package/.output/public/_nuxt/{D8DDDzV62.js → C2iWjzEC2.js} +1 -1
  24. package/.output/public/_nuxt/{HWXLx5Hz.js → C8dxXc6K.js} +5 -5
  25. package/.output/public/_nuxt/CGdPdJPP.js +1 -0
  26. package/.output/public/_nuxt/{CyygA0q4.js → CQiKcuoG.js} +4 -4
  27. package/.output/public/_nuxt/{CN7Zh8GQ.js → CRGlf1Gb.js} +1 -1
  28. package/.output/public/_nuxt/{DSBfvCi5.js → CblLEiCZ.js} +7 -7
  29. package/.output/public/_nuxt/Cd15nPnG2.js +1 -0
  30. package/.output/public/_nuxt/{OwJ1LJkF.js → CsCpu2Zh.js} +1 -1
  31. package/.output/public/_nuxt/CvbHIGQY2.js +1 -0
  32. package/.output/public/_nuxt/Cyk3du4K2.js +1 -0
  33. package/.output/public/_nuxt/{DVQAz9WI.js → D4qXvjuV.js} +2 -2
  34. package/.output/public/_nuxt/{CfIXY-ET.js → DCEyMaN-.js} +1 -1
  35. package/.output/public/_nuxt/{BFYNhG9S.js → DCXIGxzT.js} +1 -1
  36. package/.output/public/_nuxt/{B9aPoQvt.js → DM8DS9MA.js} +1 -1
  37. package/.output/public/_nuxt/{ChnfyQHz.js → DNzaswei.js} +1 -1
  38. package/.output/public/_nuxt/{CrFGZYVB2.js → DYZBdSSg2.js} +1 -1
  39. package/.output/public/_nuxt/{dObsRdSQ.js → DZk24ego.js} +1 -1
  40. package/.output/public/_nuxt/DeYsUzhr.js +1 -0
  41. package/.output/public/_nuxt/Dk6pq9JB2.js +1 -0
  42. package/.output/public/_nuxt/{ByGNWgAr.js → Do88WZG2.js} +3 -3
  43. package/.output/public/_nuxt/{R_WxTozV2.js → Du-eSpo2.js} +1 -1
  44. package/.output/public/_nuxt/OmpTerminalPanel.B_Pl5Ynm.css +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/14df171d-89cb-43ec-ad6f-9df72d6da7f5.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/{B4GHHF6d2.js → fQUs58kX2.js} +1 -1
  55. package/.output/public/_nuxt/p7wSGMtc.js +1 -0
  56. package/.output/public/_nuxt/tRBT-plo.js +1 -0
  57. package/.output/server/chunks/_/SearchOutlined.mjs +4 -4
  58. package/.output/server/chunks/_/SearchOutlined.mjs.map +1 -1
  59. package/.output/server/chunks/_/character-asset.repo.mjs +3 -6
  60. package/.output/server/chunks/_/character-asset.repo.mjs.map +1 -1
  61. package/.output/server/chunks/_/host-bindings.mjs +1 -1
  62. package/.output/server/chunks/_/nitro.mjs +4967 -2035
  63. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  64. package/.output/server/chunks/_/scene-layout.repo.mjs +4 -10
  65. package/.output/server/chunks/_/scene-layout.repo.mjs.map +1 -1
  66. package/.output/server/chunks/build/{Col-D7fjGDF6.mjs → Col-biaNnEPf.mjs} +2 -2
  67. package/.output/server/chunks/build/{Col-D7fjGDF6.mjs.map → Col-biaNnEPf.mjs.map} +1 -1
  68. package/.output/server/chunks/build/{OmpTerminalPanel-B_SYhmgb.mjs → OmpTerminalPanel-COphA1br.mjs} +20 -19
  69. package/.output/server/chunks/build/OmpTerminalPanel-COphA1br.mjs.map +1 -0
  70. package/.output/server/chunks/build/{TownView-Bl8Gkcxi.mjs → TownView-B5KifIaT.mjs} +4 -4
  71. package/.output/server/chunks/build/{TownView-Bl8Gkcxi.mjs.map → TownView-B5KifIaT.mjs.map} +1 -1
  72. package/.output/server/chunks/build/{_id_-GnRJPykX.mjs → _id_-C-ewLgfl.mjs} +119 -119
  73. package/.output/server/chunks/build/{_id_-GnRJPykX.mjs.map → _id_-C-ewLgfl.mjs.map} +1 -1
  74. package/.output/server/chunks/build/{_id_-CWLFGZjV.mjs → _id_-Ct4Jhvl1.mjs} +42 -38
  75. package/.output/server/chunks/build/_id_-Ct4Jhvl1.mjs.map +1 -0
  76. package/.output/server/chunks/build/{_wsId_-BhQMjyHG.mjs → _wsId_-CanI_6Su.mjs} +591 -53
  77. package/.output/server/chunks/build/{_wsId_-BhQMjyHG.mjs.map → _wsId_-CanI_6Su.mjs.map} +1 -1
  78. package/.output/server/chunks/build/{agents-D4l1icvn.mjs → agents-DSOptxXA.mjs} +146 -91
  79. package/.output/server/chunks/build/agents-DSOptxXA.mjs.map +1 -0
  80. package/.output/server/chunks/build/{alert-gH-s7yIh.mjs → alert-qJnjyRcP.mjs} +3 -3
  81. package/.output/server/chunks/build/{alert-gH-s7yIh.mjs.map → alert-qJnjyRcP.mjs.map} +1 -1
  82. package/.output/server/chunks/build/{button-BhbX5ACI.mjs → button-DEcZFcqN.mjs} +3 -3
  83. package/.output/server/chunks/build/{button-BhbX5ACI.mjs.map → button-DEcZFcqN.mjs.map} +1 -1
  84. package/.output/server/chunks/build/{card-l4BbX67w.mjs → card-Dipvaykh.mjs} +5 -5
  85. package/.output/server/chunks/build/{card-l4BbX67w.mjs.map → card-Dipvaykh.mjs.map} +1 -1
  86. package/.output/server/chunks/build/{channel-templates-DqjtC-R0.mjs → channel-templates-BK0KuPOd.mjs} +13 -12
  87. package/.output/server/chunks/build/channel-templates-BK0KuPOd.mjs.map +1 -0
  88. package/.output/server/chunks/build/{checkbox-BF11p3dH.mjs → checkbox-dzcpU_Cd.mjs} +4 -4
  89. package/.output/server/chunks/build/{checkbox-BF11p3dH.mjs.map → checkbox-dzcpU_Cd.mjs.map} +1 -1
  90. package/.output/server/chunks/build/{daq-BOgpn9sl.mjs → daq-D9RA_uze.mjs} +102 -102
  91. package/.output/server/chunks/build/{daq-BOgpn9sl.mjs.map → daq-D9RA_uze.mjs.map} +1 -1
  92. package/.output/server/chunks/build/dcw-BTM5YU-B.mjs +1 -1
  93. package/.output/server/chunks/build/{default-CKJWhkot.mjs → default-BfWGTlbj.mjs} +81 -23
  94. package/.output/server/chunks/build/{default-CKJWhkot.mjs.map → default-BfWGTlbj.mjs.map} +1 -1
  95. package/.output/server/chunks/build/{drawer-CVValqoh.mjs → drawer-Cmh90erI.mjs} +3 -3
  96. package/.output/server/chunks/build/{drawer-CVValqoh.mjs.map → drawer-Cmh90erI.mjs.map} +1 -1
  97. package/.output/server/chunks/build/{dropdown-ByCsEWlQ.mjs → dropdown-CGQ0KAzA.mjs} +2 -2
  98. package/.output/server/chunks/build/{dropdown-ByCsEWlQ.mjs.map → dropdown-CGQ0KAzA.mjs.map} +1 -1
  99. package/.output/server/chunks/build/{dropdown-Dex8PXu6.mjs → dropdown-vhn1NPFs.mjs} +4 -4
  100. package/.output/server/chunks/build/{dropdown-Dex8PXu6.mjs.map → dropdown-vhn1NPFs.mjs.map} +1 -1
  101. package/.output/server/chunks/build/{input-number-BBlRoAJ7.mjs → input-number-Bd55elNN.mjs} +5 -5
  102. package/.output/server/chunks/build/{input-number-BBlRoAJ7.mjs.map → input-number-Bd55elNN.mjs.map} +1 -1
  103. package/.output/server/chunks/build/{input--KMeLYqZ.mjs → input-sf_BT6o6.mjs} +3 -3
  104. package/.output/server/chunks/build/{input--KMeLYqZ.mjs.map → input-sf_BT6o6.mjs.map} +1 -1
  105. package/.output/server/chunks/build/logs-Dyk0I2I9.mjs +1 -1
  106. package/.output/server/chunks/build/{menu-xN-SXb9Q.mjs → menu-WCrlpYVh.mjs} +3 -3
  107. package/.output/server/chunks/build/{menu-xN-SXb9Q.mjs.map → menu-WCrlpYVh.mjs.map} +1 -1
  108. package/.output/server/chunks/build/{modal-DrCOcjrl.mjs → modal-yvUquPj5.mjs} +4 -4
  109. package/.output/server/chunks/build/{modal-DrCOcjrl.mjs.map → modal-yvUquPj5.mjs.map} +1 -1
  110. package/.output/server/chunks/build/{monitor-KW8WLOJd.mjs → monitor-MIOvsyLa.mjs} +21 -21
  111. package/.output/server/chunks/build/{monitor-KW8WLOJd.mjs.map → monitor-MIOvsyLa.mjs.map} +1 -1
  112. package/.output/server/chunks/build/pages-DR2bzczM.mjs +1 -1
  113. package/.output/server/chunks/build/{plugins-B-ZNey0Z.mjs → plugins-DnOBIWGg.mjs} +7 -7
  114. package/.output/server/chunks/build/{plugins-B-ZNey0Z.mjs.map → plugins-DnOBIWGg.mjs.map} +1 -1
  115. package/.output/server/chunks/build/{popconfirm-C5H1Qoh3.mjs → popconfirm-CRaHcz5O.mjs} +4 -4
  116. package/.output/server/chunks/build/{popconfirm-C5H1Qoh3.mjs.map → popconfirm-CRaHcz5O.mjs.map} +1 -1
  117. package/.output/server/chunks/build/{useWorkshopApi-Bh5VUHWu.mjs → segmented-DPe9ZzLO.mjs} +7 -78
  118. package/.output/server/chunks/build/segmented-DPe9ZzLO.mjs.map +1 -0
  119. package/.output/server/chunks/build/{select-D7H2ysgT.mjs → select-D-CeE5vY.mjs} +3 -3
  120. package/.output/server/chunks/build/{select-D7H2ysgT.mjs.map → select-D-CeE5vY.mjs.map} +1 -1
  121. package/.output/server/chunks/build/{settings-Cr06lbRy.mjs → settings-DA8IkGLo.mjs} +11 -11
  122. package/.output/server/chunks/build/{settings-Cr06lbRy.mjs.map → settings-DA8IkGLo.mjs.map} +1 -1
  123. package/.output/server/chunks/build/{space-DCwIlnkI.mjs → space-CCBYAkXt.mjs} +2 -2
  124. package/.output/server/chunks/build/{space-DCwIlnkI.mjs.map → space-CCBYAkXt.mjs.map} +1 -1
  125. package/.output/server/chunks/build/{switch-VC0m9ede.mjs → switch-CelRXpcy.mjs} +3 -3
  126. package/.output/server/chunks/build/{switch-VC0m9ede.mjs.map → switch-CelRXpcy.mjs.map} +1 -1
  127. package/.output/server/chunks/build/{table-BksLg3Q_.mjs → table-Cswq-l2r.mjs} +10 -10
  128. package/.output/server/chunks/build/{table-BksLg3Q_.mjs.map → table-Cswq-l2r.mjs.map} +1 -1
  129. package/.output/server/chunks/build/{tabs-CzUfD3iX.mjs → tabs-BM3tAh_J.mjs} +5 -5
  130. package/.output/server/chunks/build/{tabs-CzUfD3iX.mjs.map → tabs-BM3tAh_J.mjs.map} +1 -1
  131. package/.output/server/chunks/build/{tag-oQI3VtqM.mjs → tag-NO9jEqKy.mjs} +4 -4
  132. package/.output/server/chunks/build/{tag-oQI3VtqM.mjs.map → tag-NO9jEqKy.mjs.map} +1 -1
  133. package/.output/server/chunks/build/{teams-QR3BBF7A.mjs → teams-BhSKBBBM.mjs} +15 -14
  134. package/.output/server/chunks/build/teams-BhSKBBBM.mjs.map +1 -0
  135. package/.output/server/chunks/build/{tokens-DFvr_TLj.mjs → tokens-D_eyxmcv.mjs} +16 -16
  136. package/.output/server/chunks/build/{tokens-DFvr_TLj.mjs.map → tokens-D_eyxmcv.mjs.map} +1 -1
  137. package/.output/server/chunks/build/town-BUqRobze.mjs +1 -1
  138. package/.output/server/chunks/build/{town-_4tEEEVW.mjs → town-DPtOPRRO.mjs} +4 -4
  139. package/.output/server/chunks/build/{town-_4tEEEVW.mjs.map → town-DPtOPRRO.mjs.map} +1 -1
  140. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs +42 -0
  141. package/.output/server/chunks/build/useLocalTime-9a4B-aHv.mjs.map +1 -0
  142. package/.output/server/chunks/build/useWorkshopApi-D2gq06N2.mjs +81 -0
  143. package/.output/server/chunks/build/useWorkshopApi-D2gq06N2.mjs.map +1 -0
  144. package/.output/server/chunks/build/useWorkshopWs-B3j5wIAK.mjs +1 -1
  145. package/.output/server/chunks/build/user-Dk-ytEUV.mjs +1 -1
  146. package/.output/server/chunks/build/{users-4FZ0yFUO.mjs → users-CmVvb1oq.mjs} +16 -16
  147. package/.output/server/chunks/build/{users-4FZ0yFUO.mjs.map → users-CmVvb1oq.mjs.map} +1 -1
  148. package/.output/server/chunks/build/{workshop-k0XZTFKg.mjs → workshop-iCzNRifn.mjs} +9 -9
  149. package/.output/server/chunks/build/{workshop-k0XZTFKg.mjs.map → workshop-iCzNRifn.mjs.map} +1 -1
  150. package/.output/server/chunks/build/workspaces-IfORCDJE.mjs +1 -1
  151. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  152. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  153. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  154. package/.output/server/chunks/routes/api/mcp/workshop.mjs +1 -1
  155. package/.output/server/chunks/routes/api/metrics.mjs +1 -1
  156. package/.output/server/chunks/routes/api/plugins/_name/_...path_.mjs +1 -1
  157. package/.output/server/chunks/routes/api/plugins/client/_name_.get.mjs +1 -1
  158. package/.output/server/chunks/routes/api/plugins/manifest.get.mjs +1 -1
  159. package/.output/server/chunks/routes/api/system/config.get.mjs +1 -1
  160. package/.output/server/chunks/routes/api/system/index.get.mjs +3 -3
  161. package/.output/server/chunks/routes/api/system/index.get.mjs.map +1 -1
  162. package/.output/server/chunks/routes/api/system/index.patch.mjs +1 -1
  163. package/.output/server/chunks/routes/api/system/monitor/terminal/ws.mjs +1 -1
  164. package/.output/server/chunks/routes/api/system/monitor/terminate.post.mjs +1 -1
  165. package/.output/server/chunks/routes/api/system/monitor.get.mjs +1 -1
  166. package/.output/server/chunks/routes/api/system/settings/events.get.mjs +1 -1
  167. package/.output/server/chunks/routes/api/system/settings/reset.post.mjs +1 -1
  168. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
  169. package/.output/server/chunks/routes/api/users/_id_.get.mjs +1 -1
  170. package/.output/server/chunks/routes/api/users/_id_.put.mjs +1 -1
  171. package/.output/server/chunks/routes/api/users/index.get.mjs +1 -1
  172. package/.output/server/chunks/routes/api/users/index.post.mjs +1 -1
  173. package/.output/server/chunks/routes/api/users/login.post.mjs +1 -1
  174. package/.output/server/chunks/routes/api/users/logout.post.mjs +1 -1
  175. package/.output/server/chunks/routes/api/users/me.get.mjs +1 -1
  176. package/.output/server/chunks/routes/api/users/register.post.mjs +1 -1
  177. package/.output/server/chunks/routes/api/users/tokens/_id/token.get.mjs +1 -1
  178. package/.output/server/chunks/routes/api/users/tokens/_id_.delete.mjs +1 -1
  179. package/.output/server/chunks/routes/api/users/tokens/_id_.patch.mjs +1 -1
  180. package/.output/server/chunks/routes/api/workshop/_...path_.mjs +1 -1
  181. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.get.mjs +1 -1
  182. package/.output/server/chunks/routes/api/workshop/a2a/_agentId/index.post.mjs +1 -1
  183. package/.output/server/chunks/routes/api/workshop/a2a/send.post.mjs +1 -1
  184. package/.output/server/chunks/routes/api/workshop/agent-tools/approvals/_id/decide.post.mjs +1 -1
  185. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.delete.mjs +1 -1
  186. package/.output/server/chunks/routes/api/workshop/agent-tools/bindings/_id_.patch.mjs +1 -1
  187. package/.output/server/chunks/routes/api/workshop/agent-tools/index.get.mjs +1 -1
  188. package/.output/server/chunks/routes/api/workshop/agent-tools/index.post.mjs +1 -1
  189. package/.output/server/chunks/routes/api/workshop/agent-tools/index2.get.mjs +1 -1
  190. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +6 -14
  191. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  192. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs +39 -0
  193. package/.output/server/chunks/routes/api/workshop/agent-tools/list.get.mjs.map +1 -0
  194. package/.output/server/chunks/routes/api/workshop/agents/_id_.delete.mjs +1 -1
  195. package/.output/server/chunks/routes/api/workshop/agents/_id_.get.mjs +1 -1
  196. package/.output/server/chunks/routes/api/workshop/agents/_id_.patch.mjs +1 -1
  197. package/.output/server/chunks/routes/api/workshop/agents/subscribe.post.mjs +1 -1
  198. package/.output/server/chunks/routes/api/workshop/approvals/_id/decide.post.mjs +1 -1
  199. package/.output/server/chunks/routes/api/workshop/assets/character/_id_.delete.mjs +1 -1
  200. package/.output/server/chunks/routes/api/workshop/assets/devices/_id_.delete.mjs +1 -1
  201. package/.output/server/chunks/routes/api/workshop/assets/index.get.mjs +1 -1
  202. package/.output/server/chunks/routes/api/workshop/assets/index.post.mjs +2 -2
  203. package/.output/server/chunks/routes/api/workshop/assets/index2.get.mjs +1 -1
  204. package/.output/server/chunks/routes/api/workshop/assets/index2.post.mjs +2 -2
  205. package/.output/server/chunks/routes/api/workshop/audit.get.mjs +1 -1
  206. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -1
  207. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +2 -2
  208. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.delete.mjs +1 -1
  209. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.get.mjs +1 -1
  210. package/.output/server/chunks/routes/api/workshop/channel-templates/_id_.patch.mjs +1 -1
  211. package/.output/server/chunks/routes/api/workshop/channel-templates/from-channel.post.mjs +1 -1
  212. package/.output/server/chunks/routes/api/workshop/channels/_id/activate.post.mjs +2 -2
  213. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.get.mjs +1 -1
  214. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/index.post.mjs +1 -1
  215. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/_memoryId_.delete.mjs +1 -1
  216. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/memories/search.post.mjs +1 -1
  217. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/model.patch.mjs +1 -1
  218. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/position.patch.mjs +1 -1
  219. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/range.patch.mjs +1 -1
  220. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId/stop.post.mjs +1 -1
  221. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.delete.mjs +1 -1
  222. package/.output/server/chunks/routes/api/workshop/channels/_id/agents/_agentId_.patch.mjs +1 -1
  223. package/.output/server/chunks/routes/api/workshop/channels/_id/events.get.mjs +1 -1
  224. package/.output/server/chunks/routes/api/workshop/channels/_id/index.get.mjs +1 -1
  225. package/.output/server/chunks/routes/api/workshop/channels/_id/index.post.mjs +2 -2
  226. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.get.mjs +1 -1
  227. package/.output/server/chunks/routes/api/workshop/channels/_id/index2.post.mjs +1 -1
  228. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.get.mjs +1 -1
  229. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +1 -1
  230. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.get.mjs +1 -1
  231. package/.output/server/chunks/routes/api/workshop/channels/_id/index4.post.mjs +1 -1
  232. package/.output/server/chunks/routes/api/workshop/channels/_id/memories/_memoryId_.delete.mjs +1 -1
  233. package/.output/server/chunks/routes/api/workshop/channels/_id/queue.get.mjs +1 -1
  234. package/.output/server/chunks/routes/api/workshop/channels/_id/terminals.get.mjs +2 -2
  235. package/.output/server/chunks/routes/api/workshop/channels/_id_.delete.mjs +1 -1
  236. package/.output/server/chunks/routes/api/workshop/channels/index.get.mjs +2 -2
  237. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs +9 -2
  238. package/.output/server/chunks/routes/api/workshop/channels/index.patch.mjs.map +1 -1
  239. package/.output/server/chunks/routes/api/workshop/channels.get.mjs +1 -1
  240. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +2 -2
  241. package/.output/server/chunks/routes/api/workshop/daq/_id/bind.post.mjs +2 -2
  242. package/.output/server/chunks/routes/api/workshop/daq/_id/frames/content.get.mjs +2 -2
  243. package/.output/server/chunks/routes/api/workshop/daq/_id/frames.get.mjs +2 -2
  244. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +6 -4
  245. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  246. package/.output/server/chunks/routes/api/workshop/daq/_id/test.post.mjs +2 -2
  247. package/.output/server/chunks/routes/api/workshop/daq/_id_.delete.mjs +2 -2
  248. package/.output/server/chunks/routes/api/workshop/daq/_id_.patch.mjs +2 -2
  249. package/.output/server/chunks/routes/api/workshop/daq/alarms/_id/ack.post.mjs +2 -2
  250. package/.output/server/chunks/routes/api/workshop/daq/alarms.get.mjs +2 -2
  251. package/.output/server/chunks/routes/api/workshop/daq/controller.post.mjs +2 -2
  252. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +2 -2
  253. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +2 -2
  254. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +2 -2
  255. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +2 -2
  256. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +2 -2
  257. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +2 -2
  258. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +2 -2
  259. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +2 -2
  260. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +2 -2
  261. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +2 -2
  262. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +2 -2
  263. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +2 -2
  264. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +2 -2
  265. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +2 -2
  266. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +2 -2
  267. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +2 -2
  268. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +2 -2
  269. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +2 -2
  270. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +2 -2
  271. package/.output/server/chunks/routes/api/workshop/dcw/index3.post.mjs +2 -2
  272. package/.output/server/chunks/routes/api/workshop/dcw/index4.get.mjs +2 -2
  273. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +2 -2
  274. package/.output/server/chunks/routes/api/workshop/dcw/index5.get.mjs +2 -2
  275. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +2 -2
  276. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +2 -2
  277. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +2 -2
  278. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +2 -2
  279. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +2 -2
  280. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +2 -2
  281. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +2 -2
  282. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +2 -2
  283. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +2 -2
  284. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +2 -2
  285. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +2 -2
  286. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +2 -2
  287. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +2 -2
  288. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +2 -2
  289. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +2 -2
  290. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.delete.mjs +2 -2
  291. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id_.patch.mjs +2 -2
  292. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +2 -2
  293. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +2 -2
  294. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +2 -2
  295. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +2 -2
  296. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +2 -2
  297. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +2 -2
  298. package/.output/server/chunks/routes/api/workshop/device-twins/_id/control.post.mjs +1 -1
  299. package/.output/server/chunks/routes/api/workshop/device-twins/_id/telemetry.post.mjs +1 -1
  300. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +2 -2
  301. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.patch.mjs +2 -2
  302. package/.output/server/chunks/routes/api/workshop/fs/dirs.get.mjs +1 -1
  303. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +247 -0
  304. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs.map +1 -0
  305. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +27 -0
  306. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs.map +1 -0
  307. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  308. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +19 -7
  309. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs.map +1 -1
  310. package/.output/server/chunks/routes/api/workshop/index.get.mjs +1 -1
  311. package/.output/server/chunks/routes/api/workshop/index.post.mjs +1 -1
  312. package/.output/server/chunks/routes/api/workshop/index10.get.mjs +1 -1
  313. package/.output/server/chunks/routes/api/workshop/index2.get.mjs +1 -1
  314. package/.output/server/chunks/routes/api/workshop/index2.post.mjs +1 -1
  315. package/.output/server/chunks/routes/api/workshop/index3.get.mjs +1 -1
  316. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +2 -2
  317. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +2 -2
  318. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +2 -2
  319. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +2 -2
  320. package/.output/server/chunks/routes/api/workshop/index5.post.mjs +2 -2
  321. package/.output/server/chunks/routes/api/workshop/index6.get.mjs +1 -1
  322. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +2 -2
  323. package/.output/server/chunks/routes/api/workshop/index7.get.mjs +1 -1
  324. package/.output/server/chunks/routes/api/workshop/index7.post.mjs +1 -1
  325. package/.output/server/chunks/routes/api/workshop/index8.get.mjs +1 -1
  326. package/.output/server/chunks/routes/api/workshop/index8.post.mjs +1 -1
  327. package/.output/server/chunks/routes/api/workshop/index9.get.mjs +1 -1
  328. package/.output/server/chunks/routes/api/workshop/mailbox/all.get.mjs +1 -1
  329. package/.output/server/chunks/routes/api/workshop/mailbox.get.mjs +1 -1
  330. package/.output/server/chunks/routes/api/workshop/memories/maintenance.post.mjs +1 -1
  331. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  332. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  333. package/.output/server/chunks/routes/api/workshop/plugins/index.get.mjs +1 -1
  334. package/.output/server/chunks/routes/api/workshop/runtime.get.mjs +1 -1
  335. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  336. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  337. package/.output/server/chunks/routes/api/workshop/scene/layouts.get.mjs +1 -1
  338. package/.output/server/chunks/routes/api/workshop/tasks/_id/complete.post.mjs +1 -1
  339. package/.output/server/chunks/routes/api/workshop/tasks/_id/dispatch.post.mjs +1 -1
  340. package/.output/server/chunks/routes/api/workshop/tasks/_id/index.post.mjs +1 -1
  341. package/.output/server/chunks/routes/api/workshop/tasks/_id/report.post.mjs +1 -1
  342. package/.output/server/chunks/routes/api/workshop/tasks/_id/retry.post.mjs +1 -1
  343. package/.output/server/chunks/routes/api/workshop/tasks/_id_.get.mjs +1 -1
  344. package/.output/server/chunks/routes/api/workshop/tasks.get.mjs +1 -1
  345. package/.output/server/chunks/routes/api/workshop/teams/_id/deploy.post.mjs +2 -2
  346. package/.output/server/chunks/routes/api/workshop/teams/_id/index.get.mjs +1 -1
  347. package/.output/server/chunks/routes/api/workshop/teams/_id/index.post.mjs +1 -1
  348. package/.output/server/chunks/routes/api/workshop/teams/_id/members/_agentId_.delete.mjs +1 -1
  349. package/.output/server/chunks/routes/api/workshop/teams/_id_.delete.mjs +1 -1
  350. package/.output/server/chunks/routes/api/workshop/teams/_id_.get.mjs +1 -1
  351. package/.output/server/chunks/routes/api/workshop/teams/_id_.patch.mjs +1 -1
  352. package/.output/server/chunks/routes/api/workshop/users/me.get.mjs +1 -1
  353. package/.output/server/chunks/routes/api/workshop/users/register.post.mjs +1 -1
  354. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +2 -2
  355. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.delete.mjs +1 -1
  356. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channels/_channelId_.post.mjs +1 -1
  357. package/.output/server/chunks/routes/api/workshop/workspaces/index.delete.mjs +1 -1
  358. package/.output/server/chunks/routes/renderer.mjs +1 -1
  359. package/.output/server/chunks/virtual/entry.mjs +123 -113
  360. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  361. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  362. package/.output/server/index.mjs +1 -1
  363. package/.output/server/package.json +1 -1
  364. package/app/components/AppHeader.vue +56 -2
  365. package/app/components/workshop/ChannelSessionList.vue +703 -593
  366. package/app/components/workshop/terminal/OmpTerminalPanel.vue +2 -1
  367. package/app/composables/workshop/useLocalTime.ts +16 -0
  368. package/app/composables/workshop/useSceneLayouts.ts +2 -1
  369. package/app/composables/workshop/useWorkshopApi.ts +249 -224
  370. package/app/pages/daq/[id].vue +7 -6
  371. package/app/pages/daq/index.vue +2 -2
  372. package/app/pages/dcw/[id].vue +3 -3
  373. package/app/pages/workshop/agents.vue +432 -382
  374. package/bin/aw.mjs +0 -0
  375. package/cli/aw.mjs +8 -1
  376. package/cli/commands/stop.mjs +111 -108
  377. package/cli/commands/tui.mjs +10 -1
  378. package/cli/core/registry.mjs +5 -3
  379. package/cli/infra.mjs +108 -109
  380. package/config.yml +134 -134
  381. package/docs/tui.md +1 -1
  382. package/i18n/locales/en.ts +5 -0
  383. package/i18n/locales/zh-CN.ts +5 -0
  384. package/package.json +148 -140
  385. package/scripts/_dbg-catalog-smoke.ts +20 -0
  386. package/scripts/_dbg-codex-probe.mjs +58 -0
  387. package/scripts/_dbg-dsh-probe.mjs +31 -0
  388. package/scripts/_dbg-interval-scenario.mjs +126 -0
  389. package/scripts/_dbg-line-spawn.ts +31 -0
  390. package/scripts/_dbg-live-engine-probe.mjs +80 -0
  391. package/scripts/_dbg-mcp-bridge-probe.mjs +147 -0
  392. package/scripts/_dbg-opencode-sse.mjs +101 -0
  393. package/scripts/_dbg-opencode-start.ts +57 -0
  394. package/scripts/_dbg-plugin-matrix.mjs +212 -0
  395. package/scripts/_dbg-protocol-matrix.mjs +425 -0
  396. package/scripts/_dbg-real-scenario-timeline.log +123 -0
  397. package/scripts/_dbg-registry-smoke.ts +14 -0
  398. package/scripts/_dbg-sim-keeper.mjs +100 -0
  399. package/scripts/_dbg-team-drill.mjs +173 -0
  400. package/scripts/dev-guard.mjs +11 -3
  401. package/scripts/dev-protocol-simulators.mjs +28 -1
  402. package/scripts/e2e-multi-harness.ts +374 -0
  403. package/scripts/e2e-multiharness-team.mjs +319 -0
  404. package/scripts/e2e-plc-scenario.mjs +292 -0
  405. package/scripts/e2e-real-scenario.mjs +452 -0
  406. package/scripts/migrate-local-time.mjs +123 -0
  407. package/scripts/start.mjs +60 -9
  408. package/server/api/system/settings/index.get.ts +3 -3
  409. package/server/api/workshop/agent-tools/invoke.post.ts +27 -41
  410. package/server/api/workshop/agent-tools/list.get.ts +25 -0
  411. package/server/api/workshop/channels/[id]/index.patch.ts +38 -30
  412. package/server/api/workshop/daq/[id]/samples.get.ts +6 -3
  413. package/server/api/workshop/harnesses/[id]/providers.get.ts +16 -0
  414. package/server/api/workshop/harnesses.get.ts +12 -0
  415. package/server/api/workshop/hitl/respond.post.ts +87 -67
  416. package/server/api/workshop/ws.ts +13 -0
  417. package/server/data/daqs.json +1366 -16
  418. package/server/data/dcw-lines.json +266 -0
  419. package/server/data/dcw-products.json +203 -0
  420. package/server/data/dcw-recipes.json +784 -0
  421. package/server/data/dcw-rollback.json +1144 -1
  422. package/server/data/dcw-runs.json +983 -791
  423. package/server/data/dcw-writes.json +1080 -0
  424. package/server/data/dcws.json +3278 -203
  425. package/server/data/line-runs.json +52 -2
  426. package/server/harness/aw-mcp-bridge.mjs +153 -0
  427. package/server/plugins/00-local-time.ts +10 -0
  428. package/server/plugins/aw-plugins.ts +3 -0
  429. package/server/plugins/backup.ts +116 -97
  430. package/server/plugins/dev-stability-guard.ts +24 -15
  431. package/server/plugins/retention.ts +1 -0
  432. package/server/plugins/security.ts +24 -3
  433. package/server/plugins/workshop.ts +156 -153
  434. package/server/repositories/user.repository.ts +414 -391
  435. package/server/services/system-config.ts +30 -6
  436. package/server/services/workshop/.mimosa/hook-state/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f.json +1 -0
  437. package/server/services/workshop/.mimosa/hook-status/sess_fed429fb-c8b7-4a50-bbd6-45afc580893f-e6b75bbfe6.json +14 -0
  438. package/server/services/workshop/agents/adapters/line-spawn.ts +108 -0
  439. package/server/services/workshop/agents/adapters/stdio-jsonrpc.ts +316 -0
  440. package/server/services/workshop/agents/agent-interface.ts +17 -0
  441. package/server/services/workshop/agents/codex-agent.ts +822 -0
  442. package/server/services/workshop/agents/dsh-agent.ts +670 -0
  443. package/server/services/workshop/agents/factory.ts +4 -16
  444. package/server/services/workshop/agents/harness-env.ts +54 -0
  445. package/server/services/workshop/agents/harness-models.ts +270 -0
  446. package/server/services/workshop/agents/host-tool-bridge.ts +592 -0
  447. package/server/services/workshop/agents/industrial-tools.ts +5 -1
  448. package/server/services/workshop/agents/node-bindings.repo.ts +4 -5
  449. package/server/services/workshop/agents/omp-agent.ts +1178 -1957
  450. package/server/services/workshop/agents/opencode-agent.ts +987 -0
  451. package/server/services/workshop/agents/prompt-builder.ts +393 -0
  452. package/server/services/workshop/agents/registry.ts +125 -0
  453. package/server/services/workshop/assets/character-asset.repo.ts +3 -5
  454. package/server/services/workshop/assets/device-twin.repo.ts +3 -5
  455. package/server/services/workshop/daq/daq-controller.ts +8 -4
  456. package/server/services/workshop/daq/daq-node.repo.ts +3 -5
  457. package/server/services/workshop/daq/daq-node.ts +2 -2
  458. package/server/services/workshop/daq/daq-templates.ts +3 -5
  459. package/server/services/workshop/daq/drivers.ts +41 -12
  460. package/server/services/workshop/daq/storage/sqlite.adapter.ts +313 -309
  461. package/server/services/workshop/db/backup-registry.ts +33 -0
  462. package/server/services/workshop/db/channel.repo.ts +104 -101
  463. package/server/services/workshop/db/database.ts +956 -949
  464. package/server/services/workshop/dcw/dcw-controller.ts +3 -1
  465. package/server/services/workshop/dcw/dcw-line.repo.ts +4 -11
  466. package/server/services/workshop/dcw/dcw-node.repo.ts +3 -5
  467. package/server/services/workshop/dcw/dcw-node.ts +13 -1
  468. package/server/services/workshop/dcw/dcw-product.repo.ts +3 -4
  469. package/server/services/workshop/dcw/dcw-recipe.repo.ts +3 -19
  470. package/server/services/workshop/dcw/dcw-templates.ts +3 -5
  471. package/server/services/workshop/dcw/drivers.ts +37 -13
  472. package/server/services/workshop/dcw/line-run.ts +3 -5
  473. package/server/services/workshop/dcw/recipe-rollback.repo.ts +4 -10
  474. package/server/services/workshop/json-store.mjs +72 -0
  475. package/server/services/workshop/plugins/host.mjs +2 -1
  476. package/server/services/workshop/runtime/agent-runtime.ts +44 -0
  477. package/server/services/workshop/runtime/manager.ts +2953 -2868
  478. package/server/services/workshop/scene/scene-layout.repo.ts +4 -11
  479. package/server/services/workshop/settings.ts +7 -0
  480. package/shared/config/schema.json +5 -0
  481. package/shared/config/single-instance.mjs +133 -86
  482. package/shared/local-time.mjs +36 -0
  483. package/shared/workshop-protocol.ts +11 -5
  484. package/tui/aw-tui.mjs +28 -10
  485. package/tui/components/hitl-card.mjs +47 -36
  486. package/tui/lib/config.mjs +62 -58
  487. package/tui/lib/ws.mjs +2 -1
  488. package/.output/public/_nuxt/9X0fVBD7.js +0 -57
  489. package/.output/public/_nuxt/B6M2WJWm2.js +0 -1
  490. package/.output/public/_nuxt/B9Yie5HN.js +0 -2
  491. package/.output/public/_nuxt/BF9XPEuw.js +0 -1
  492. package/.output/public/_nuxt/BbQornXa.js +0 -1
  493. package/.output/public/_nuxt/Bxgaym6j.js +0 -1
  494. package/.output/public/_nuxt/Bxh5nf8j.js +0 -1
  495. package/.output/public/_nuxt/CXLI50Sq.js +0 -1
  496. package/.output/public/_nuxt/CdfAP_IH2.js +0 -1
  497. package/.output/public/_nuxt/Ce1zyNYu.js +0 -1
  498. package/.output/public/_nuxt/D-Ne4C9a.js +0 -1
  499. package/.output/public/_nuxt/DEHNjlTq2.js +0 -1
  500. package/.output/public/_nuxt/DFnGFEav.js +0 -18
  501. package/.output/public/_nuxt/DYWgGHNo.js +0 -7
  502. package/.output/public/_nuxt/OmpTerminalPanel.Bc9GjNU5.css +0 -1
  503. package/.output/public/_nuxt/W1E3-5ML.js +0 -14
  504. package/.output/public/_nuxt/XVB9_zwP.js +0 -1
  505. package/.output/public/_nuxt/Xaf_HIR3.js +0 -1
  506. package/.output/public/_nuxt/_id_.BeqSLvl_.css +0 -1
  507. package/.output/public/_nuxt/_id_.DN3U6EF9.css +0 -1
  508. package/.output/public/_nuxt/agents.BJwgTLFZ.css +0 -1
  509. package/.output/public/_nuxt/builds/meta/55c10854-ee0e-4be4-924b-a1b0e100fe11.json +0 -1
  510. package/.output/public/_nuxt/daq.BXsnevQv.css +0 -1
  511. package/.output/public/_nuxt/yIKY_V1P.js +0 -1
  512. package/.output/server/chunks/build/OmpTerminalPanel-B_SYhmgb.mjs.map +0 -1
  513. package/.output/server/chunks/build/_id_-CWLFGZjV.mjs.map +0 -1
  514. package/.output/server/chunks/build/agents-D4l1icvn.mjs.map +0 -1
  515. package/.output/server/chunks/build/channel-templates-DqjtC-R0.mjs.map +0 -1
  516. package/.output/server/chunks/build/interval-WlxgjTzO.mjs +0 -9
  517. package/.output/server/chunks/build/interval-WlxgjTzO.mjs.map +0 -1
  518. package/.output/server/chunks/build/teams-QR3BBF7A.mjs.map +0 -1
  519. package/.output/server/chunks/build/useWorkshopApi-Bh5VUHWu.mjs.map +0 -1
@@ -9,8 +9,8 @@
9
9
  * 应用级单例,写入 server/data/scene-layouts.json,进程内缓存,启动读盘。
10
10
  */
11
11
 
12
- import fs from 'node:fs'
13
12
  import path from 'node:path'
13
+ import { loadJsonFile, saveJsonFileAtomic } from '../json-store.mjs'
14
14
 
15
15
  export interface SceneLayout {
16
16
  channelId: string
@@ -44,18 +44,11 @@ const DB_PATH = process.cwd().endsWith('server')
44
44
  : path.join(process.cwd(), 'server', 'data', 'scene-layouts.json')
45
45
 
46
46
  function load(): SceneLayout[] {
47
- try {
48
- const raw = fs.readFileSync(DB_PATH, 'utf-8')
49
- const parsed = JSON.parse(raw)
50
- return Array.isArray(parsed) ? parsed : []
51
- }
52
- catch {
53
- return []
54
- }
47
+ const parsed = loadJsonFile(DB_PATH, [])
48
+ return Array.isArray(parsed) ? parsed as SceneLayout[] : []
55
49
  }
56
50
  function save(list: SceneLayout[]): void {
57
- fs.mkdirSync(path.dirname(DB_PATH), { recursive: true })
58
- fs.writeFileSync(DB_PATH, JSON.stringify(list, null, 2), 'utf-8')
51
+ saveJsonFileAtomic(DB_PATH, list)
59
52
  }
60
53
 
61
54
  class SceneLayoutRepo {
@@ -69,6 +69,12 @@ export interface OmpSettings {
69
69
  compact_min_interval_ms: number
70
70
  compact_wait_ms: number
71
71
  }
72
+ export interface HarnessSettings {
73
+ opencode_command: string
74
+ codex_command: string
75
+ dsh_command: string
76
+ hitl_timeout_ms: number
77
+ }
72
78
  export interface DcwSettings {
73
79
  rollback_cooldown_ms: number
74
80
  rollback_min_window_ms: number
@@ -113,6 +119,7 @@ export interface DaqRuntimeSettings {
113
119
 
114
120
  export const memorySettings = (): MemorySettings => section<MemorySettings>('memory')
115
121
  export const ompSettings = (): OmpSettings => section<OmpSettings>('omp')
122
+ export const harnessSettings = (): HarnessSettings => section<HarnessSettings>('harness')
116
123
  export const dcwSettings = (): DcwSettings => section<DcwSettings>('dcw')
117
124
  export const workshopSettings = (): WorkshopSettings => section<WorkshopSettings>('workshop')
118
125
  export const backupSettings = (): BackupSettings => section<BackupSettings>('backup')
@@ -59,6 +59,11 @@
59
59
  { "key": "omp.compact_min_interval_ms", "type": "number", "group": "omp", "label": "压缩最小间隔(ms)", "labelKey": "settings.runtime.omp.compactMinIntervalMs", "description": "两次自动压缩之间的最小间隔", "applies": "restart", "default": 300000, "min": 30000, "max": 3600000 },
60
60
  { "key": "omp.compact_wait_ms", "type": "number", "group": "omp", "label": "压缩等待超时(ms)", "labelKey": "settings.runtime.omp.compactWaitMs", "description": "等待 compaction_end 完成事件的超时", "applies": "restart", "default": 120000, "min": 10000, "max": 600000 },
61
61
 
62
+ { "key": "harness.opencode_command", "type": "string", "group": "harness", "label": "opencode 命令", "labelKey": "settings.runtime.harness.opencodeCommand", "description": "OpenCode 引擎可执行文件(PATH 解析)", "applies": "restart", "default": "opencode" },
63
+ { "key": "harness.codex_command", "type": "string", "group": "harness", "label": "codex 命令", "labelKey": "settings.runtime.harness.codexCommand", "description": "OpenAI Codex CLI 可执行文件(app-server 模式)", "applies": "restart", "default": "codex" },
64
+ { "key": "harness.dsh_command", "type": "string", "group": "harness", "label": "dsh 命令", "labelKey": "settings.runtime.harness.dshCommand", "description": "DeepSeek Harness 可执行文件(ACP 模式)", "applies": "restart", "default": "dsh" },
65
+ { "key": "harness.hitl_timeout_ms", "type": "number", "group": "harness", "label": "引擎审批超时(ms)", "labelKey": "settings.runtime.harness.hitlTimeoutMs", "description": "codex/opencode/dsh 权限审批无人应答的自动拒绝时限(0=无限等待)", "applies": "restart", "default": 300000, "min": 0, "max": 3600000 },
66
+
62
67
  { "key": "dcw.rollback_cooldown_ms", "type": "number", "group": "dcw", "label": "回退冷却(ms)", "labelKey": "settings.runtime.dcw.rollbackCooldownMs", "description": "回退执行后的同向冷却窗", "applies": "restart", "default": 300000, "min": 0, "max": 3600000 },
63
68
  { "key": "dcw.rollback_min_window_ms", "type": "number", "group": "dcw", "label": "回退最小观察窗(ms)", "labelKey": "settings.runtime.dcw.rollbackMinWindowMs", "description": "开记录后允许判定的最小观察窗", "applies": "restart", "default": 120000, "min": 0, "max": 3600000 },
64
69
  { "key": "dcw.rollback_baseline_ms", "type": "number", "group": "dcw", "label": "基线稳定窗(ms)", "labelKey": "settings.runtime.dcw.rollbackBaselineMs", "description": "上一稳定锚的稳定时间要求", "applies": "restart", "default": 600000, "min": 0, "max": 7200000 },
@@ -1,86 +1,133 @@
1
- // ============================================================
2
- // 单实例互斥(hardening ST-1)—— 零依赖,CLI / 启动脚本通用。
3
- // 锁文件 <configRoot>/.runtime/aw.lock 原子创建(wx):
4
- // { pid, startedAt, mode, port }
5
- // 已存在且 PID 存活 → 视为已有实例(返回冲突信息,调用方以退出码 2 退出);
6
- // PID 已死(崩溃/强杀残留) → 自动接管重写。进程退出时 releaseLock 兜底清理。
7
- // ============================================================
8
- import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
9
- import { join } from 'node:path'
10
-
11
- function pidAlive(pid) {
12
- if (!Number.isInteger(pid) || pid <= 0) return false
13
- try {
14
- // signal 0 探活:进程存在但不发信号;ESRCH=不存在,EPERM=存在(他人进程)
15
- process.kill(pid, 0)
16
- return true
17
- }
18
- catch (err) {
19
- return err?.code === 'EPERM'
20
- }
21
- }
22
-
23
- /**
24
- * 尝试获取单实例锁。
25
- * @returns {{ ok: true, lockPath: string, release: () => void }
26
- * | { ok: false, lockPath: string, holder: { pid: number, startedAt: string, mode: string, port: number | null } }}
27
- */
28
- export function acquireLock(configRoot, { mode = 'prod', port = null } = {}) {
29
- const runtimeDir = join(configRoot, '.runtime')
30
- const lockPath = join(runtimeDir, 'aw.lock')
31
- mkdirSync(runtimeDir, { recursive: true })
32
- if (existsSync(lockPath)) {
33
- let holder = null
34
- try {
35
- holder = JSON.parse(readFileSync(lockPath, 'utf8'))
36
- }
37
- catch { /* 损坏锁文件按残留处理 */ }
38
- if (holder && pidAlive(holder.pid)) {
39
- return { ok: false, lockPath, holder: { ...holder, port: holder.port ?? null } }
40
- }
41
- try { rmSync(lockPath) } catch { /* 抢不掉则下方 wx 再失败 */ }
42
- }
43
- const me = { pid: process.pid, startedAt: new Date().toISOString(), mode, port }
44
- try {
45
- writeFileSync(lockPath, JSON.stringify(me, null, 2), { flag: 'wx' })
46
- }
47
- catch (err) {
48
- // 与并发启动者竞态:按冲突处理
49
- let holder = null
50
- try { holder = JSON.parse(readFileSync(lockPath, 'utf8')) } catch { /* ignore */ }
51
- if (holder && pidAlive(holder.pid)) {
52
- return { ok: false, lockPath, holder: { ...holder, port: holder.port ?? null } }
53
- }
54
- throw err
55
- }
56
- let released = false
57
- const release = () => {
58
- if (released) return
59
- released = true
60
- try {
61
- const cur = JSON.parse(readFileSync(lockPath, 'utf8'))
62
- if (cur?.pid !== process.pid) return // 锁已被他人接管,不误删
63
- rmSync(lockPath)
64
- }
65
- catch { /* 已不存在/损坏,忽略 */ }
66
- }
67
- process.once('exit', release)
68
- process.once('SIGINT', () => { release(); process.exit(130) })
69
- process.once('SIGTERM', () => { release(); process.exit(143) })
70
- return { ok: true, lockPath, release }
71
- }
72
-
73
- /** 端口占用探测:返回占用进程 PID(未占用返回 null)。TCP try-listen 后立刻释放。 */
74
- export async function checkPort(host, port) {
75
- const net = await import('node:net')
76
- return new Promise((resolveProbe) => {
77
- const srv = net.createServer()
78
- srv.once('error', (err) => {
79
- resolveProbe(err?.code === 'EADDRINUSE' ? port : null)
80
- srv.close()
81
- })
82
- srv.listen(port, host, () => {
83
- srv.close(() => resolveProbe(null))
84
- })
85
- })
86
- }
1
+ // ============================================================
2
+ // 单实例互斥(hardening ST-1)—— 零依赖,CLI / 启动脚本通用。
3
+ // 锁文件 <configRoot>/.runtime/aw.lock 原子创建(wx):
4
+ // { pid, startedAt, mode, port }
5
+ // 已存在且 PID 存活 → 视为已有实例(返回冲突信息,调用方以退出码 2 退出);
6
+ // PID 已死(崩溃/强杀残留) → 自动接管重写。进程退出时 releaseLock 兜底清理。
7
+ // ============================================================
8
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
9
+ import { join } from 'node:path'
10
+
11
+ function pidAlive(pid) {
12
+ if (!Number.isInteger(pid) || pid <= 0) return false
13
+ try {
14
+ // signal 0 探活:进程存在但不发信号;ESRCH=不存在,EPERM=存在(他人进程)
15
+ process.kill(pid, 0)
16
+ return true
17
+ }
18
+ catch (err) {
19
+ return err?.code === 'EPERM'
20
+ }
21
+ }
22
+
23
+ const waitSync = ms => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)
24
+
25
+ /**
26
+ * 终止进程树并等待其死亡(供 `aw stop` 与 start 的"顶掉旧实例"共用)。
27
+ * Windows:taskkill /T /F;POSIX:SIGTERM 宽限 5s → SIGKILL。
28
+ * @returns {Promise<boolean>} 是否已确认死亡
29
+ */
30
+ export async function terminatePid(pid) {
31
+ if (!pidAlive(pid)) return true
32
+ if (process.platform === 'win32') {
33
+ const { spawnSync } = await import('node:child_process')
34
+ const r = spawnSync('taskkill', ['/PID', String(pid), '/T', '/F'], { encoding: 'utf8' })
35
+ if (r.status !== 0) return !pidAlive(pid)
36
+ }
37
+ else {
38
+ try {
39
+ process.kill(pid, 'SIGTERM')
40
+ }
41
+ catch { /* 已死 */ }
42
+ const deadline = Date.now() + 5000
43
+ while (Date.now() < deadline && pidAlive(pid)) waitSync(200)
44
+ if (pidAlive(pid)) {
45
+ try {
46
+ process.kill(pid, 'SIGKILL')
47
+ }
48
+ catch { /* 已死 */ }
49
+ }
50
+ }
51
+ const deadline = Date.now() + 5000
52
+ while (Date.now() < deadline && pidAlive(pid)) waitSync(200)
53
+ return !pidAlive(pid)
54
+ }
55
+
56
+ /**
57
+ * 尝试获取单实例锁。
58
+ * @returns {{ ok: true, lockPath: string, release: () => void }
59
+ * | { ok: false, lockPath: string, holder: { pid: number, startedAt: string, mode: string, port: number | null } }}
60
+ */
61
+ export function acquireLock(configRoot, { mode = 'prod', port = null } = {}) {
62
+ const runtimeDir = join(configRoot, '.runtime')
63
+ const lockPath = join(runtimeDir, 'aw.lock')
64
+ mkdirSync(runtimeDir, { recursive: true })
65
+ if (existsSync(lockPath)) {
66
+ let holder = null
67
+ try {
68
+ holder = JSON.parse(readFileSync(lockPath, 'utf8'))
69
+ }
70
+ catch { /* 损坏锁文件按残留处理 */ }
71
+ if (holder && pidAlive(holder.pid)) {
72
+ return { ok: false, lockPath, holder: { ...holder, port: holder.port ?? null } }
73
+ }
74
+ try {
75
+ rmSync(lockPath)
76
+ }
77
+ catch { /* 抢不掉则下方 wx 再失败 */ }
78
+ }
79
+ const me = { pid: process.pid, startedAt: new Date().toISOString(), mode, port }
80
+ try {
81
+ writeFileSync(lockPath, JSON.stringify(me, null, 2), { flag: 'wx' })
82
+ }
83
+ catch (err) {
84
+ // 与并发启动者竞态:按冲突处理
85
+ let holder = null
86
+ try {
87
+ holder = JSON.parse(readFileSync(lockPath, 'utf8'))
88
+ }
89
+ catch { /* ignore */ }
90
+ if (holder && pidAlive(holder.pid)) {
91
+ return { ok: false, lockPath, holder: { ...holder, port: holder.port ?? null } }
92
+ }
93
+ throw err
94
+ }
95
+ let released = false
96
+ const release = () => {
97
+ if (released) return
98
+ released = true
99
+ try {
100
+ const cur = JSON.parse(readFileSync(lockPath, 'utf8'))
101
+ if (cur?.pid !== process.pid) return // 锁已被他人接管,不误删
102
+ rmSync(lockPath)
103
+ }
104
+ catch { /* 已不存在/损坏,忽略 */ }
105
+ }
106
+ const releaseAndExit = (code) => {
107
+ release()
108
+ process.exit(code)
109
+ }
110
+ process.once('exit', release)
111
+ process.once('SIGINT', () => releaseAndExit(130))
112
+ process.once('SIGTERM', () => releaseAndExit(143))
113
+ return { ok: true, lockPath, release }
114
+ }
115
+
116
+ /** 端口占用探测:TCP try-listen 后立刻释放。EADDRINUSE → 端口号;其余 error code →
117
+ * 绑定状态未知(Windows 保留段 EACCES 等),按"未占用"放行但显式告警,不静默。 */
118
+ export async function checkPort(host, port) {
119
+ const net = await import('node:net')
120
+ return new Promise((resolveProbe) => {
121
+ const srv = net.createServer()
122
+ srv.once('error', (err) => {
123
+ if (err?.code !== 'EADDRINUSE') {
124
+ console.warn(`[checkPort] 端口 ${port} 探测异常(${err?.code ?? err}),绑定状态未知,按未占用继续`)
125
+ }
126
+ resolveProbe(err?.code === 'EADDRINUSE' ? port : null)
127
+ srv.close()
128
+ })
129
+ srv.listen(port, host, () => {
130
+ srv.close(() => resolveProbe(null))
131
+ })
132
+ })
133
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 本地时间呈现(单点收口):全项目 ISO 时间输出统一为本地系统时区(如北京时间 +08:00)。
3
+ *
4
+ * 背景:Node `Date.toISOString()` 恒输出 UTC(`Z` 后缀)。本项目所有时间字段
5
+ * (日志 t / DB createdAt / WS 帧 at / Agent 记录)此前均为 UTC 字符串,用户要求
6
+ * 全部以本地系统时间呈现。
7
+ *
8
+ * 机制:installLocalIso() 把 Date.prototype.toISOString 改写为输出
9
+ * `YYYY-MM-DDTHH:mm:ss.sss±HH:MM`(本地偏移)。性质:
10
+ * - 同一绝对时刻(仅表示形式变化),Date.parse/new Date(str) 完全兼容;
11
+ * - 偏移后缀恒定(无 DST 时区如 +08:00),字符串字典序排序与时间序一致;
12
+ * - 覆盖显式调用与 JSON.stringify(Date)(toJSON 默认走 toISOString)。
13
+ * - 时区动态取自系统(getTimezoneOffset),跟随宿主,不硬编码。
14
+ *
15
+ * 幂等:重复安装跳过;原始实现保留在 __origToISOString 供诊断。
16
+ */
17
+ export function installLocalIso() {
18
+ const proto = Date.prototype
19
+ if (proto.__origToISOString) return
20
+ const orig = proto.toISOString
21
+ proto.__origToISOString = orig
22
+ const pad = (n, w) => String(n).padStart(w, '0')
23
+ proto.toISOString = function () {
24
+ const t = this.getTime()
25
+ if (Number.isNaN(t)) throw new RangeError('Invalid time value')
26
+ // getTimezoneOffset:UTC 比本地慢的分钟数(UTC+8 → -480);取负得本地相对 UTC 偏移
27
+ const offMin = -this.getTimezoneOffset()
28
+ const sign = offMin >= 0 ? '+' : '-'
29
+ const abs = Math.abs(offMin)
30
+ // 平移后用 UTC getter 读出本地分量(整分偏移,毫秒不变)
31
+ const shifted = new Date(t + offMin * 60_000)
32
+ return `${pad(shifted.getUTCFullYear(), 4)}-${pad(shifted.getUTCMonth() + 1, 2)}-${pad(shifted.getUTCDate(), 2)}`
33
+ + `T${pad(shifted.getUTCHours(), 2)}:${pad(shifted.getUTCMinutes(), 2)}:${pad(shifted.getUTCSeconds(), 2)}`
34
+ + `.${pad(this.getMilliseconds(), 3)}${sign}${pad(Math.floor(abs / 60), 2)}:${pad(abs % 60, 2)}`
35
+ }
36
+ }
@@ -118,20 +118,26 @@ export interface AepSceneLayout {
118
118
  rotationY: number
119
119
  }
120
120
 
121
- /** hitl.request payload:待人工处理条目(omp ask 对话框与 dcw 工具审批的统一视图) */
121
+ /**
122
+ * hitl.request payload:待人工处理条目的统一视图。
123
+ * kind:omp 对话框(rpc-ui ask)/ dcw 工具审批 / codex 命令与文件审批 /
124
+ * opencode 权限与提问 / dsh 权限请求。
125
+ */
126
+ export type AepHitlKind = 'omp-dialog' | 'dcw-approval' | 'codex-approval' | 'opencode-permission' | 'dsh-permission'
127
+
122
128
  export interface AepHitlItem {
123
- kind: 'omp-dialog' | 'dcw-approval'
124
- /** omp:对话框 id;dcw:审批 id(ap-*) */
129
+ kind: AepHitlKind
130
+ /** omp:对话框 id;dcw:审批 id(ap-*);其余:引擎请求 id(应答路由用) */
125
131
  id: string
126
132
  channelId: string
127
133
  agentId: string
128
134
  agentName: string
129
135
  /** omp 子进程 pid(应答路由 respondTerminalUi 用) */
130
136
  pid?: number
131
- /** omp-dialog 专属:对话框形态 */
137
+ /** 对话框形态(codex requestUserInput/opencode question 为 input/select;权限类为 confirm) */
132
138
  method?: 'select' | 'confirm' | 'input' | 'editor'
133
139
  title: string
134
- /** dcw-approval 专属:人读摘要(节点/物理量/目标值) */
140
+ /** dcw-approval 专属:人读摘要(节点/物理量/目标值);其余:命令/路径/权限详情 */
135
141
  detail?: string
136
142
  /** select 的选项列表 */
137
143
  options?: string[]
package/tui/aw-tui.mjs CHANGED
@@ -9,7 +9,7 @@
9
9
  // 命令系统(/help)+ 监控面板(终端 WS)+ HITL 统一作答(/hitl)。
10
10
  // --headless:VirtualTerminal 驱动(无 TTY;scripts/tui-smoke.mjs 用)。
11
11
  // ============================================================
12
- import { TuiMainScreen, Editor, CombinedAutocompleteProvider, ProcessTerminal } from '@earendil-works/pi-tui'
12
+ import { TuiMainScreen, Editor, CombinedAutocompleteProvider, ProcessTerminal, truncateToWidth } from '@earendil-works/pi-tui'
13
13
  import { theme } from './theme.mjs'
14
14
  import { loadAuth, saveAuth, configRoot } from './lib/config.mjs'
15
15
  import { createApi } from './lib/api.mjs'
@@ -221,10 +221,14 @@ export async function main(argv = process.argv.slice(2)) {
221
221
  }
222
222
  }
223
223
  else {
224
- // dcw-approval:confirm 语义(y=批准/n=拒绝)+ 备注
224
+ // dcw-approval:显式 y/n。此前"非 y 开头一律落定为拒绝"对中文用户是逆向
225
+ // 陷阱(输入"同意/ok/批准"全部变成静默拒绝高危下发),必须重输。
225
226
  const norm = text.trim().toLowerCase()
227
+ if (!['y', 'n', 'yes', 'no'].includes(norm)) {
228
+ push('error', '下发审批请输入 y(批准)或 n(拒绝)')
229
+ return true
230
+ }
226
231
  body.confirmed = norm.startsWith('y')
227
- if (norm.length > 1) body.comment = text
228
232
  }
229
233
  try {
230
234
  await api.hitlRespond(body)
@@ -234,7 +238,11 @@ export async function main(argv = process.argv.slice(2)) {
234
238
  }
235
239
  catch (err) {
236
240
  push('error', `应答失败:${err.message}`)
237
- if (String(err.code) === 'ALREADY_RESOLVED') state.hitlAnswering = null
241
+ if (String(err.code) === 'ALREADY_RESOLVED') {
242
+ // 该待办已在别处(WebUI/另一端)解决:同步清除列表项,避免幽灵待办
243
+ state.hitl = state.hitl.filter(i => !(i.kind === item.kind && i.id === item.id))
244
+ state.hitlAnswering = null
245
+ }
238
246
  }
239
247
  store.notify()
240
248
  return true
@@ -262,21 +270,23 @@ export async function main(argv = process.argv.slice(2)) {
262
270
  }
263
271
  const ctx = { state, store, api, echo, push, actions }
264
272
 
265
- // ── 编辑器提交路由:HITL 作答 → 命令 → 普通文本按目标分流 ──
273
+ // ── 编辑器提交路由:命令 → HITL 作答 → 普通文本按目标分流 ──
266
274
  editor.onSubmit = async (text) => {
267
275
  const trimmed = text.trim()
268
276
  editor.setText('')
269
277
  editor.addToHistory?.(text)
270
278
  if (!trimmed) return
271
- if (state.hitlAnswering) {
272
- await actions.submitHitlAnswer(trimmed)
273
- return
274
- }
279
+ // 斜杠命令优先于作答分支:否则作答卡里输入 /hitl off(卡片提示的放弃方式)
280
+ // 会被当作答案文本提交给 Agent —— 与文档承诺行为相反。
275
281
  if (trimmed.startsWith('/')) {
276
282
  await dispatchCommand(ctx, trimmed)
277
283
  store.notify()
278
284
  return
279
285
  }
286
+ if (state.hitlAnswering) {
287
+ await actions.submitHitlAnswer(trimmed)
288
+ return
289
+ }
280
290
  if (!state.activeChannelId) {
281
291
  push('error', '未选择频道:Tab 或 /channel use 打开选择器')
282
292
  return
@@ -346,8 +356,16 @@ export async function main(argv = process.argv.slice(2)) {
346
356
 
347
357
  store.onChange(() => tui.requestRender())
348
358
 
359
+ // 兜底:未处理的 rejection 只记日志,不让 TUI 进程静默死亡(重连窗口内
360
+ // ws.send 之类的瞬态异常不应终止整个工作台)。
361
+ process.on('unhandledRejection', (err) => {
362
+ push('error', `未处理的异步错误:${err?.message ?? err}`)
363
+ })
364
+
349
365
  // ── 组装视图 ──
350
- tui.addChild({ render: width => [...stack.render(width), '', ...editor.render(width)] })
366
+ // 出口统一按终端宽度夹断:pi-tui 对超宽行直接 stop()+throw(进程崩溃),
367
+ // 组合行(左栏+44 列监控右栏)在窄终端必然溢出,必须在进入渲染前截断。
368
+ tui.addChild({ render: width => [...stack.render(width), '', ...editor.render(width)].map(l => truncateToWidth(l, width)) })
351
369
  editor.setAutocompleteProvider?.(new CombinedAutocompleteProvider(slashCommandCompletions(), process.cwd()))
352
370
  tui.setFocus(editor)
353
371
 
@@ -1,36 +1,47 @@
1
- // ============================================================
2
- // HitlCard —— 作答模式卡片(state.hitlAnswering 非空时渲染于输入框上方)。
3
- // 作答约定:confirm → y/n;select → 选项序号;input/editor → 自由文本;
4
- // /hitl off 放弃作答(等价 Esc)。提交经 POST /api/workshop/hitl/respond。
5
- // ============================================================
6
- import { theme } from '../theme.mjs'
7
- import { wrapTextWithAnsi, truncateToWidth } from '@earendil-works/pi-tui'
8
-
9
- const HINT = {
10
- confirm: '输入 y 批准 / n 拒绝',
11
- select: '输入选项序号(如 1)',
12
- input: '输入回答文本',
13
- editor: '输入回答文本',
14
- }
15
-
16
- export class HitlCard {
17
- constructor(state) {
18
- this.state = state
19
- }
20
-
21
- render(width) {
22
- const item = this.state.hitlAnswering
23
- if (!item) return []
24
- const w = Math.max(width - 4, 20)
25
- const lines = []
26
- lines.push(theme.warn(`⏸ HITL 作答 · ${item.agentName} · ${item.kind === 'omp-dialog' ? 'omp 对话框' : '下发审批'}`))
27
- lines.push(truncateToWidth(theme.bold(String(item.title ?? '')), w))
28
- if (item.detail) lines.push(...wrapTextWithAnsi(theme.faint(item.detail), w))
29
- if (item.message) lines.push(...wrapTextWithAnsi(String(item.message), w))
30
- if (item.method === 'select' && Array.isArray(item.options)) {
31
- item.options.forEach((opt, i) => lines.push(` ${theme.accent(`${i + 1}.`)} ${opt}`))
32
- }
33
- lines.push(theme.faint(`${HINT[item.method] ?? '输入回答'} · /hitl off 放弃`))
34
- return lines.map(l => truncateToWidth(l, Math.max(width, 20)))
35
- }
36
- }
1
+ // ============================================================
2
+ // HitlCard —— 作答模式卡片(state.hitlAnswering 非空时渲染于输入框上方)。
3
+ // 作答约定:confirm → y/n;select → 选项序号;input/editor → 自由文本;
4
+ // /hitl off 放弃作答(等价 Esc)。提交经 POST /api/workshop/hitl/respond。
5
+ // ============================================================
6
+ import { theme } from '../theme.mjs'
7
+ import { wrapTextWithAnsi, truncateToWidth } from '@earendil-works/pi-tui'
8
+
9
+ const HINT = {
10
+ confirm: '输入 y 批准 / n 拒绝',
11
+ select: '输入选项序号(如 1)',
12
+ input: '输入回答文本',
13
+ editor: '输入回答文本',
14
+ }
15
+
16
+ const KIND_LABEL = {
17
+ 'omp-dialog': 'omp 对话框',
18
+ 'dcw-approval': '下发审批',
19
+ 'codex-approval': 'codex 审批',
20
+ 'opencode-permission': 'opencode 权限',
21
+ 'dsh-permission': 'dsh 权限',
22
+ }
23
+
24
+ export class HitlCard {
25
+ constructor(state) {
26
+ this.state = state
27
+ }
28
+
29
+ render(width) {
30
+ const item = this.state.hitlAnswering
31
+ if (!item) return []
32
+ const w = Math.max(width - 4, 20)
33
+ const lines = []
34
+ lines.push(theme.warn(`⏸ HITL 作答 · ${item.agentName} · ${KIND_LABEL[item.kind] ?? '引擎待办'}`))
35
+ lines.push(truncateToWidth(theme.bold(String(item.title ?? '')), w))
36
+ if (item.detail) lines.push(...wrapTextWithAnsi(theme.faint(item.detail), w))
37
+ if (item.message) lines.push(...wrapTextWithAnsi(String(item.message), w))
38
+ if (item.method === 'select' && Array.isArray(item.options)) {
39
+ item.options.forEach((opt, i) => lines.push(` ${theme.accent(`${i + 1}.`)} ${opt}`))
40
+ }
41
+ // 下发审批(dcw-approval)无 method 字段,必须显式告知 y/n 约定,
42
+ // 否则中文确认词会触发"非 y 即拒绝"的静默拒绝。
43
+ const hint = item.kind === 'omp-dialog' ? (HINT[item.method] ?? '输入回答') : '输入 y 批准 / n 拒绝'
44
+ lines.push(theme.faint(`${hint} · /hitl off 放弃`))
45
+ return lines.map(l => truncateToWidth(l, Math.max(width, 20)))
46
+ }
47
+ }