agentworkshop 0.7.22 → 0.7.24

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 (208) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/0jKrzLuM.js +19 -0
  3. package/.output/public/_nuxt/{Cor9siSf.js → 6PZPfFcO.js} +1 -1
  4. package/.output/public/_nuxt/BAfp6tmu.js +14 -0
  5. package/.output/public/_nuxt/{B-xskWta.js → BCJFMBQ6.js} +1 -1
  6. package/.output/public/_nuxt/{DNxVTfhe.js → BMb80_tm.js} +1 -1
  7. package/.output/public/_nuxt/{n3vMFfrv.js → Bc-_IsBP.js} +3 -3
  8. package/.output/public/_nuxt/BvNJUu3s.js +1 -0
  9. package/.output/public/_nuxt/C1CSiSBN.js +1 -0
  10. package/.output/public/_nuxt/CAGL7TNK.js +1 -0
  11. package/.output/public/_nuxt/{ed5qX-x5.js → CDLv-n51.js} +1 -1
  12. package/.output/public/_nuxt/CJviSvm-.js +1 -0
  13. package/.output/public/_nuxt/CLZWFhZC.js +1 -0
  14. package/.output/public/_nuxt/{Cr9DkD1d.js → CYzpZzB_.js} +1 -1
  15. package/.output/public/_nuxt/Cb3SnTM8.js +1 -0
  16. package/.output/public/_nuxt/CjXIpPMR.js +1 -0
  17. package/.output/public/_nuxt/CmHzfVc5.js +3 -0
  18. package/.output/public/_nuxt/Cn3J3NXR.js +23 -0
  19. package/.output/public/_nuxt/Coik560n.js +1 -0
  20. package/.output/public/_nuxt/{DA4lxCWC2.js → Ct68Z0232.js} +1 -1
  21. package/.output/public/_nuxt/CuVGPuP1.js +1 -0
  22. package/.output/public/_nuxt/CxY6LfeN.js +1 -0
  23. package/.output/public/_nuxt/{CfVAr2nf.js → Cz9gD2Yo.js} +1 -1
  24. package/.output/public/_nuxt/D6HDb-vN2.js +1 -0
  25. package/.output/public/_nuxt/{E88a-JCG.js → DGAOugLt.js} +1 -1
  26. package/.output/public/_nuxt/DKHcFE1i.js +1 -0
  27. package/.output/public/_nuxt/{BxtpDtzC.js → DNQF_TXX.js} +1 -1
  28. package/.output/public/_nuxt/DSa2O56y.js +1 -0
  29. package/.output/public/_nuxt/DUToq-k_.js +1 -0
  30. package/.output/public/_nuxt/Dfe8vXdG.js +1 -0
  31. package/.output/public/_nuxt/{0exC4jVL.js → Djir5rSD.js} +2 -2
  32. package/.output/public/_nuxt/DjtE7AYt.js +1 -0
  33. package/.output/public/_nuxt/{BBwMH_hG.js → DoAlYsiF.js} +1 -1
  34. package/.output/public/_nuxt/{DWcEk1ur2.js → DvgKXPgu2.js} +1 -1
  35. package/.output/public/_nuxt/JOwsShod.js +2 -0
  36. package/.output/public/_nuxt/X6IraCTB.js +1 -0
  37. package/.output/public/_nuxt/_id_.C-YXjn8Q.css +1 -0
  38. package/.output/public/_nuxt/_id_.MbzdFygI.css +1 -0
  39. package/.output/public/_nuxt/_wsId_.BqWBlY7X.css +1 -0
  40. package/.output/public/_nuxt/{CYBq3kS7.js → b50gYVZl.js} +1 -1
  41. package/.output/public/_nuxt/builds/latest.json +1 -1
  42. package/.output/public/_nuxt/builds/meta/024de5f7-6a10-4f53-82ab-bc65f3ec9e35.json +1 -0
  43. package/.output/public/_nuxt/daq.3OKj58HH.css +1 -0
  44. package/.output/public/_nuxt/dcw.rXH2fc2Z.css +1 -0
  45. package/.output/public/_nuxt/entry.AZM1Culo.css +1 -0
  46. package/.output/public/_nuxt/logs.DMOM-iHe.css +1 -0
  47. package/.output/public/_nuxt/monitor.B--1dPzs.css +1 -0
  48. package/.output/public/_nuxt/permissions.B1pjGChZ.css +1 -0
  49. package/.output/public/_nuxt/plugins.DpCuwaJt.css +1 -0
  50. package/.output/public/_nuxt/tokens.xRb1fSPU.css +1 -0
  51. package/.output/public/_nuxt/users.DuAt_Zwf.css +1 -0
  52. package/.output/public/_nuxt/workshop.BJg84pOK.css +1 -0
  53. package/.output/server/chunks/_/nitro.mjs +777 -798
  54. package/.output/server/chunks/build/{OmpTerminalPanel-Ban3yJZ4.mjs → OmpTerminalPanel-Cw_Vw9oO.mjs} +3 -3
  55. package/.output/server/chunks/build/{OmpTerminalPanel-Ban3yJZ4.mjs.map → OmpTerminalPanel-Cw_Vw9oO.mjs.map} +1 -1
  56. package/.output/server/chunks/build/{_id_-B9RvEQFC.mjs → _id_-DQDqj-cZ.mjs} +31 -31
  57. package/.output/server/chunks/build/{_id_-B9RvEQFC.mjs.map → _id_-DQDqj-cZ.mjs.map} +1 -1
  58. package/.output/server/chunks/build/{_id_-CqF0R5W5.mjs → _id_-DY6v6sqB.mjs} +135 -135
  59. package/.output/server/chunks/build/{_id_-CqF0R5W5.mjs.map → _id_-DY6v6sqB.mjs.map} +1 -1
  60. package/.output/server/chunks/build/{_wsId_-YC2t_fRt.mjs → _wsId_-D38Vx6Ky.mjs} +11 -13
  61. package/.output/server/chunks/build/{_wsId_-YC2t_fRt.mjs.map → _wsId_-D38Vx6Ky.mjs.map} +1 -1
  62. package/.output/server/chunks/build/{agents--6bzGtES.mjs → agents-GnmUGZir.mjs} +6 -8
  63. package/.output/server/chunks/build/agents-GnmUGZir.mjs.map +1 -0
  64. package/.output/server/chunks/build/button-DEcZFcqN.mjs +1 -1
  65. package/.output/server/chunks/build/{card-CCPQoKlh.mjs → card-Dipvaykh.mjs} +4 -4
  66. package/.output/server/chunks/build/{card-CCPQoKlh.mjs.map → card-Dipvaykh.mjs.map} +1 -1
  67. package/.output/server/chunks/build/{channel-templates-C1Bb-U75.mjs → channel-templates-B4z6v8Z5.mjs} +4 -6
  68. package/.output/server/chunks/build/channel-templates-B4z6v8Z5.mjs.map +1 -0
  69. package/.output/server/chunks/build/{checkbox-Dv1kjaUZ.mjs → checkbox-dzcpU_Cd.mjs} +2 -2
  70. package/.output/server/chunks/build/{checkbox-Dv1kjaUZ.mjs.map → checkbox-dzcpU_Cd.mjs.map} +1 -1
  71. package/.output/server/chunks/build/{daq-Bhwwz9vp.mjs → daq-B-3xCp_2.mjs} +103 -103
  72. package/.output/server/chunks/build/{daq-Bhwwz9vp.mjs.map → daq-B-3xCp_2.mjs.map} +1 -1
  73. package/.output/server/chunks/build/{dcw-CBPaFj2f.mjs → dcw-BL2dhuz7.mjs} +43 -43
  74. package/.output/server/chunks/build/{dcw-CBPaFj2f.mjs.map → dcw-BL2dhuz7.mjs.map} +1 -1
  75. package/.output/server/chunks/build/{default-DdV642BY.mjs → default-CLf5m0NE.mjs} +2 -3
  76. package/.output/server/chunks/build/{default-DdV642BY.mjs.map → default-CLf5m0NE.mjs.map} +1 -1
  77. package/.output/server/chunks/build/dropdown-vhn1NPFs.mjs +1 -1
  78. package/.output/server/chunks/build/{input-number-CZ3ZrCsy.mjs → input-number-Bd55elNN.mjs} +3 -3
  79. package/.output/server/chunks/build/{input-number-CZ3ZrCsy.mjs.map → input-number-Bd55elNN.mjs.map} +1 -1
  80. package/.output/server/chunks/build/{input-DxDqeyQW.mjs → input-sf_BT6o6.mjs} +553 -5
  81. package/.output/server/chunks/build/input-sf_BT6o6.mjs.map +1 -0
  82. package/.output/server/chunks/build/{logs-Bz1p6x_5.mjs → logs-Dto_umFY.mjs} +44 -38
  83. package/.output/server/chunks/build/logs-Dto_umFY.mjs.map +1 -0
  84. package/.output/server/chunks/build/menu-WCrlpYVh.mjs +2 -2
  85. package/.output/server/chunks/build/modal-yvUquPj5.mjs +2 -2
  86. package/.output/server/chunks/build/{monitor-miqq9xHB.mjs → monitor-Cp4V-H2n.mjs} +70 -192
  87. package/.output/server/chunks/build/monitor-Cp4V-H2n.mjs.map +1 -0
  88. package/.output/server/chunks/build/{pages-D9tOoJsf.mjs → pages-Dc2H1QFu.mjs} +2 -3
  89. package/.output/server/chunks/build/pages-Dc2H1QFu.mjs.map +1 -0
  90. package/.output/server/chunks/build/{permissions-CxEgXic0.mjs → permissions-BTRW2CVd.mjs} +288 -194
  91. package/.output/server/chunks/build/permissions-BTRW2CVd.mjs.map +1 -0
  92. package/.output/server/chunks/build/{plugins-wLIKHcIE.mjs → plugins-DZR0T4Mh.mjs} +17 -17
  93. package/.output/server/chunks/build/{plugins-wLIKHcIE.mjs.map → plugins-DZR0T4Mh.mjs.map} +1 -1
  94. package/.output/server/chunks/build/popconfirm-CRaHcz5O.mjs +1 -1
  95. package/.output/server/chunks/build/{segmented-ChmQZwz6.mjs → segmented-LPPREMtZ.mjs} +336 -5
  96. package/.output/server/chunks/build/{segmented-ChmQZwz6.mjs.map → segmented-LPPREMtZ.mjs.map} +1 -1
  97. package/.output/server/chunks/build/{settings-BPBll_7K.mjs → settings-UfGyDgM7.mjs} +6 -8
  98. package/.output/server/chunks/build/settings-UfGyDgM7.mjs.map +1 -0
  99. package/.output/server/chunks/build/space-CCBYAkXt.mjs +1 -1
  100. package/.output/server/chunks/build/switch-CelRXpcy.mjs +1 -1
  101. package/.output/server/chunks/build/{table-BtksyDlQ.mjs → table-Cswq-l2r.mjs} +5 -5
  102. package/.output/server/chunks/build/{table-BtksyDlQ.mjs.map → table-Cswq-l2r.mjs.map} +1 -1
  103. package/.output/server/chunks/build/{tabs-DQv-_-R6.mjs → tabs-BM3tAh_J.mjs} +2 -2
  104. package/.output/server/chunks/build/{tabs-DQv-_-R6.mjs.map → tabs-BM3tAh_J.mjs.map} +1 -1
  105. package/.output/server/chunks/build/{tag-A0tZ2Ouq.mjs → tag-NO9jEqKy.mjs} +3 -3
  106. package/.output/server/chunks/build/{tag-A0tZ2Ouq.mjs.map → tag-NO9jEqKy.mjs.map} +1 -1
  107. package/.output/server/chunks/build/{teams-DD8ZXTKL.mjs → teams-Cbg27MWW.mjs} +4 -6
  108. package/.output/server/chunks/build/teams-Cbg27MWW.mjs.map +1 -0
  109. package/.output/server/chunks/build/{tokens-Dxnuw96_.mjs → tokens-Bmm6rDfj.mjs} +296 -200
  110. package/.output/server/chunks/build/tokens-Bmm6rDfj.mjs.map +1 -0
  111. package/.output/server/chunks/build/{users-D6RNylrW.mjs → users-B50HHrfi.mjs} +12 -13
  112. package/.output/server/chunks/build/users-B50HHrfi.mjs.map +1 -0
  113. package/.output/server/chunks/build/{workshop-CTcYDq2i.mjs → workshop-81xhz368.mjs} +21 -22
  114. package/.output/server/chunks/build/workshop-81xhz368.mjs.map +1 -0
  115. package/.output/server/chunks/routes/renderer.mjs +2 -2
  116. package/.output/server/chunks/virtual/entry.mjs +53 -21
  117. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  118. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  119. package/.output/server/package.json +1 -1
  120. package/app/app.vue +7 -0
  121. package/app/assets/css/main.css +318 -162
  122. package/app/components/workshop/blocks/ClusterArtifact.vue +0 -16
  123. package/app/pages/daq/[id].vue +919 -938
  124. package/app/pages/daq/index.vue +1 -22
  125. package/app/pages/dcw/[id].vue +1 -4
  126. package/app/pages/dcw/index.vue +1 -30
  127. package/app/pages/logs/index.vue +99 -87
  128. package/app/pages/monitor.vue +56 -68
  129. package/app/pages/permissions/index.vue +86 -82
  130. package/app/pages/plugins/index.vue +12 -7
  131. package/app/pages/tokens.vue +94 -96
  132. package/app/pages/users.vue +10 -18
  133. package/app/pages/workshop/index.vue +34 -5
  134. package/i18n/locales/en.ts +4 -1
  135. package/i18n/locales/zh-CN.ts +6 -1
  136. package/package.json +1 -1
  137. package/scripts/_dbg-logs-ui-e2e.py +126 -0
  138. package/scripts/_dbg-ui-survey.py +52 -0
  139. package/server/data/daqs.json +101 -101
  140. package/server/data/dcw-lines.json +7 -0
  141. package/server/data/dcw-products.json +7 -0
  142. package/server/data/dcw-recipes.json +22 -0
  143. package/server/data/dcw-rollback.json +84 -10
  144. package/server/data/dcw-runs.json +52 -54
  145. package/server/data/dcw-writes.json +36 -0
  146. package/server/data/dcws.json +533 -216
  147. package/server/data/line-runs.json +18 -18
  148. package/.output/public/_nuxt/BAbAEW0D.js +0 -1
  149. package/.output/public/_nuxt/BWC4HQHQ.js +0 -1
  150. package/.output/public/_nuxt/BbZAzXjZ2.js +0 -1
  151. package/.output/public/_nuxt/BgOhoDTI.js +0 -1
  152. package/.output/public/_nuxt/BuiGDfMB.js +0 -1
  153. package/.output/public/_nuxt/BxPPAkGA.js +0 -3
  154. package/.output/public/_nuxt/C_2bTK0C.js +0 -1
  155. package/.output/public/_nuxt/CcwJ2mrD2.js +0 -1
  156. package/.output/public/_nuxt/Ci0uX4c4.js +0 -1
  157. package/.output/public/_nuxt/D6B0xnjk.js +0 -1
  158. package/.output/public/_nuxt/DTYBfjRY.js +0 -1
  159. package/.output/public/_nuxt/DVoWWlUW.js +0 -1
  160. package/.output/public/_nuxt/Dhqra7NB.js +0 -1
  161. package/.output/public/_nuxt/DlRO_q5L.js +0 -1
  162. package/.output/public/_nuxt/DsUUYP292.js +0 -1
  163. package/.output/public/_nuxt/Dsdy4Ua-.js +0 -1
  164. package/.output/public/_nuxt/QT54MQV9.js +0 -1
  165. package/.output/public/_nuxt/RzXYI9FM.js +0 -23
  166. package/.output/public/_nuxt/UtviM1bg.js +0 -1
  167. package/.output/public/_nuxt/_id_.C2VHq_vT.css +0 -1
  168. package/.output/public/_nuxt/_id_.Dswy2p0I.css +0 -1
  169. package/.output/public/_nuxt/_wsId_.BFyCuUwS.css +0 -1
  170. package/.output/public/_nuxt/bAFueD6a.js +0 -1
  171. package/.output/public/_nuxt/builds/meta/e2341fc0-6f3f-4680-abf8-935a7c9fb912.json +0 -1
  172. package/.output/public/_nuxt/c3mwkHWP.js +0 -14
  173. package/.output/public/_nuxt/daq.BTdEun-8.css +0 -1
  174. package/.output/public/_nuxt/dbi5bHkY.js +0 -2
  175. package/.output/public/_nuxt/dcw.rpqpOYQ8.css +0 -1
  176. package/.output/public/_nuxt/eHYnGew0.js +0 -19
  177. package/.output/public/_nuxt/entry.DRUzDwmX.css +0 -1
  178. package/.output/public/_nuxt/jyQyulh-.js +0 -1
  179. package/.output/public/_nuxt/logs.BarkrvUp.css +0 -1
  180. package/.output/public/_nuxt/monitor.CmwpEUCI.css +0 -1
  181. package/.output/public/_nuxt/permissions.DTRtZeTw.css +0 -1
  182. package/.output/public/_nuxt/plugins.BcSEwwGb.css +0 -1
  183. package/.output/public/_nuxt/tokens.BVXU1jOK.css +0 -1
  184. package/.output/public/_nuxt/users.D8lcLE62.css +0 -1
  185. package/.output/public/_nuxt/workshop.CbymC2LY.css +0 -1
  186. package/.output/public/_nuxt/zVkqCZ78.js +0 -1
  187. package/.output/server/chunks/build/Col-biaNnEPf.mjs +0 -338
  188. package/.output/server/chunks/build/Col-biaNnEPf.mjs.map +0 -1
  189. package/.output/server/chunks/build/agents--6bzGtES.mjs.map +0 -1
  190. package/.output/server/chunks/build/channel-templates-C1Bb-U75.mjs.map +0 -1
  191. package/.output/server/chunks/build/hasIn-vQ9LWt-J.mjs +0 -554
  192. package/.output/server/chunks/build/hasIn-vQ9LWt-J.mjs.map +0 -1
  193. package/.output/server/chunks/build/input-DxDqeyQW.mjs.map +0 -1
  194. package/.output/server/chunks/build/logs-Bz1p6x_5.mjs.map +0 -1
  195. package/.output/server/chunks/build/monitor-miqq9xHB.mjs.map +0 -1
  196. package/.output/server/chunks/build/pages-D9tOoJsf.mjs.map +0 -1
  197. package/.output/server/chunks/build/permissions-CxEgXic0.mjs.map +0 -1
  198. package/.output/server/chunks/build/settings-BPBll_7K.mjs.map +0 -1
  199. package/.output/server/chunks/build/teams-DD8ZXTKL.mjs.map +0 -1
  200. package/.output/server/chunks/build/tokens-Dxnuw96_.mjs.map +0 -1
  201. package/.output/server/chunks/build/useSiteConfig-DJe_KMVr.mjs +0 -27
  202. package/.output/server/chunks/build/useSiteConfig-DJe_KMVr.mjs.map +0 -1
  203. package/.output/server/chunks/build/users-D6RNylrW.mjs.map +0 -1
  204. package/.output/server/chunks/build/workshop-CTcYDq2i.mjs.map +0 -1
  205. /package/.output/public/_nuxt/{CNs_Ozdc.js → CNs_Ozdc2.js} +0 -0
  206. /package/.output/public/_nuxt/{Cno6kYiO.js → Cno6kYiO2.js} +0 -0
  207. /package/.output/public/_nuxt/{DAR70Lf5.js → DAR70Lf52.js} +0 -0
  208. /package/.output/public/_nuxt/{ORt9oDIy2.js → ORt9oDIy.js} +0 -0
@@ -129,12 +129,12 @@ onMounted(load)
129
129
 
130
130
  <template>
131
131
  <div class="perm-page">
132
- <header class="pg-head">
132
+ <header class="aw-page-head">
133
133
  <div>
134
134
  <p class="aw-kicker">
135
135
  agentworkshop / permissions
136
136
  </p>
137
- <h1 class="pg-title">
137
+ <h1>
138
138
  {{ $t('permissions.title') }}
139
139
  </h1>
140
140
  <p class="pg-sub">
@@ -149,85 +149,90 @@ onMounted(load)
149
149
  />
150
150
  </header>
151
151
 
152
- <a-table
153
- :data-source="filteredUsers"
154
- :loading="loading"
155
- row-key="id"
156
- size="middle"
157
- :pagination="{ pageSize: 12, showSizeChanger: false }"
152
+ <a-card
153
+ :bordered="false"
154
+ class="table-card"
158
155
  >
159
- <a-table-column
160
- :title="$t('permissions.colUser')"
161
- data-index="name"
156
+ <a-table
157
+ :data-source="filteredUsers"
158
+ :loading="loading"
159
+ row-key="id"
160
+ size="middle"
161
+ :pagination="{ pageSize: 12, showSizeChanger: false }"
162
162
  >
163
- <template #default="{ record }">
164
- <a @click.prevent="openDetail(record)">{{ record.name }}</a>
165
- </template>
166
- </a-table-column>
167
- <a-table-column
168
- :title="$t('permissions.colEmail')"
169
- data-index="email"
170
- />
171
- <a-table-column
172
- :title="$t('permissions.colRole')"
173
- data-index="role"
174
- >
175
- <template #default="{ record }">
176
- <a-tag :color="record.role === 'admin' ? 'green' : record.role === 'editor' ? 'blue' : 'default'">
177
- {{ record.role }}
178
- </a-tag>
179
- </template>
180
- </a-table-column>
181
- <a-table-column
182
- :title="$t('permissions.colStatus')"
183
- data-index="status"
184
- >
185
- <template #default="{ record }">
186
- <a-tag :color="record.status === 'active' ? 'cyan' : 'red'">
187
- {{ record.status === 'active' ? $t('permissions.active') : record.status }}
188
- </a-tag>
189
- </template>
190
- </a-table-column>
191
- <a-table-column
192
- :title="$t('permissions.colChannels')"
193
- data-index="channels"
194
- >
195
- <template #default="{ record }">
196
- {{ record.channels.length }}
197
- </template>
198
- </a-table-column>
199
- <a-table-column
200
- :title="$t('permissions.colGrants')"
201
- data-index="grants"
202
- >
203
- <template #default="{ record }">
204
- <a-tag
205
- v-for="g in record.grants"
206
- :key="g.lineId"
207
- style="margin-bottom: 2px"
208
- >
209
- {{ (lines.find(l => l.id === g.lineId)?.name ?? g.lineId).slice(0, 14) }} · {{ modeTag(g.mode) }}
210
- </a-tag>
211
- <span
212
- v-if="!record.grants.length"
213
- class="dim"
214
- >—</span>
215
- </template>
216
- </a-table-column>
217
- <a-table-column
218
- :title="$t('permissions.colOps')"
219
- :width="90"
220
- >
221
- <template #default="{ record }">
222
- <a-button
223
- size="small"
224
- @click="openDetail(record)"
225
- >
226
- {{ $t('permissions.manage') }}
227
- </a-button>
228
- </template>
229
- </a-table-column>
230
- </a-table>
163
+ <a-table-column
164
+ :title="$t('permissions.colUser')"
165
+ data-index="name"
166
+ >
167
+ <template #default="{ record }">
168
+ <a @click.prevent="openDetail(record)">{{ record.name }}</a>
169
+ </template>
170
+ </a-table-column>
171
+ <a-table-column
172
+ :title="$t('permissions.colEmail')"
173
+ data-index="email"
174
+ />
175
+ <a-table-column
176
+ :title="$t('permissions.colRole')"
177
+ data-index="role"
178
+ >
179
+ <template #default="{ record }">
180
+ <a-tag :color="record.role === 'admin' ? 'green' : record.role === 'editor' ? 'blue' : 'default'">
181
+ {{ record.role }}
182
+ </a-tag>
183
+ </template>
184
+ </a-table-column>
185
+ <a-table-column
186
+ :title="$t('permissions.colStatus')"
187
+ data-index="status"
188
+ >
189
+ <template #default="{ record }">
190
+ <a-tag :color="record.status === 'active' ? 'cyan' : 'red'">
191
+ {{ record.status === 'active' ? $t('permissions.active') : record.status }}
192
+ </a-tag>
193
+ </template>
194
+ </a-table-column>
195
+ <a-table-column
196
+ :title="$t('permissions.colChannels')"
197
+ data-index="channels"
198
+ >
199
+ <template #default="{ record }">
200
+ {{ record.channels.length }}
201
+ </template>
202
+ </a-table-column>
203
+ <a-table-column
204
+ :title="$t('permissions.colGrants')"
205
+ data-index="grants"
206
+ >
207
+ <template #default="{ record }">
208
+ <a-tag
209
+ v-for="g in record.grants"
210
+ :key="g.lineId"
211
+ style="margin-bottom: 2px"
212
+ >
213
+ {{ (lines.find(l => l.id === g.lineId)?.name ?? g.lineId).slice(0, 14) }} · {{ modeTag(g.mode) }}
214
+ </a-tag>
215
+ <span
216
+ v-if="!record.grants.length"
217
+ class="dim"
218
+ >—</span>
219
+ </template>
220
+ </a-table-column>
221
+ <a-table-column
222
+ :title="$t('permissions.colOps')"
223
+ :width="90"
224
+ >
225
+ <template #default="{ record }">
226
+ <a-button
227
+ size="small"
228
+ @click="openDetail(record)"
229
+ >
230
+ {{ $t('permissions.manage') }}
231
+ </a-button>
232
+ </template>
233
+ </a-table-column>
234
+ </a-table>
235
+ </a-card>
231
236
 
232
237
  <a-drawer
233
238
  v-model:open="drawerOpen"
@@ -313,9 +318,8 @@ onMounted(load)
313
318
 
314
319
  <style scoped lang="css">
315
320
  .perm-page { max-width: 1180px; margin: 0 auto; padding: 24px 20px 48px; }
316
- .pg-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 18px; }
317
- .pg-title { margin: 0; font-size: 22px; font-weight: 700; letter-spacing: .5px; }
318
- .pg-sub { margin: 4px 0 0; opacity: .6; font-size: 12px; }
321
+ .pg-sub { margin: 8px 0 0; font-size: 12.5px; color: var(--ink-faint); }
322
+ .table-card { margin-bottom: 16px; }
319
323
  .dim { opacity: .45; }
320
324
  .sec { margin: 20px 0 8px; font-size: 13px; font-weight: 700; }
321
325
  .detail dt { margin-top: 8px; font-size: 11px; opacity: .5; }
@@ -88,12 +88,12 @@ onMounted(load)
88
88
 
89
89
  <template>
90
90
  <div class="plugins-page">
91
- <header class="pg-head">
91
+ <header class="aw-page-head">
92
92
  <div>
93
93
  <p class="aw-kicker">
94
94
  agentworkshop / plugins
95
95
  </p>
96
- <h1 class="pg-title">
96
+ <h1>
97
97
  {{ $t('plugins.title') }}
98
98
  </h1>
99
99
  <p class="pg-sub">
@@ -136,7 +136,10 @@ onMounted(load)
136
136
  v-if="!plugins.length && !loading"
137
137
  class="pg-empty"
138
138
  >
139
- {{ $t('plugins.empty') }}
139
+ <span class="i-tabler-puzzle pg-empty-ico" />
140
+ <p class="pg-empty-t">
141
+ {{ $t('plugins.empty') }}
142
+ </p>
140
143
  </div>
141
144
 
142
145
  <div class="pg-grid aw-stagger">
@@ -232,14 +235,16 @@ onMounted(load)
232
235
 
233
236
  <style scoped lang="css">
234
237
  .plugins-page { max-width: 1080px; margin: 0 auto; padding: 24px 20px 48px; }
235
- .pg-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 18px; }
236
- .pg-title { margin: 0; font-size: 22px; font-weight: 700; letter-spacing: .5px; }
237
- .pg-sub { margin: 4px 0 0; opacity: .6; font-size: 12px; }
238
+ .pg-sub { margin: 8px 0 0; opacity: .6; font-size: 12.5px; }
238
239
  .pg-stats { display: flex; align-items: center; gap: 14px; font-size: 12px; opacity: .85; }
239
240
  .pg-stats b { font-size: 15px; }
240
241
  .pg-failures { margin-bottom: 16px; }
241
242
  .fail-line { font-family: ui-monospace, monospace; font-size: 11px; }
242
- .pg-empty { padding: 48px 0; text-align: center; opacity: .55; }
243
+ .pg-empty { display: flex; flex-direction: column; align-items: center; gap: 10px; padding: 56px 24px;
244
+ text-align: center; border: 1px dashed var(--line-strong); border-radius: var(--radius-panel);
245
+ background: var(--paper-deep); }
246
+ .pg-empty-ico { font-size: 30px; color: var(--ink-fainter); }
247
+ .pg-empty-t { margin: 0; font-size: 12.5px; color: var(--ink-faint); }
243
248
  .pg-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 14px; }
244
249
  .pg-card { position: relative; padding: 14px 16px; border: 1px solid var(--aw-border, rgba(128, 152, 199, .25));
245
250
  border-radius: 12px; background: var(--aw-card, rgba(255, 255, 255, .04)); cursor: pointer;
@@ -270,17 +270,17 @@ useHead({ title: () => tt('titles.tokens') })
270
270
  </div>
271
271
 
272
272
  <template v-else>
273
- <div class="head">
273
+ <div class="aw-page-head">
274
274
  <div>
275
275
  <p class="aw-kicker">
276
276
  agentworkshop / api tokens
277
277
  </p>
278
- <h2>API Token</h2>
278
+ <h1>API Token</h1>
279
279
  <p class="sub">
280
280
  {{ userStore.user?.name }} · {{ $t('tokens.k1upppaw026') }}
281
281
  </p>
282
282
  </div>
283
- <a-space>
283
+ <a-space class="head-actions">
284
284
  <a-tag
285
285
  v-if="userStore.user?.tokenId"
286
286
  color="green"
@@ -297,95 +297,100 @@ useHead({ title: () => tt('titles.tokens') })
297
297
  </a-space>
298
298
  </div>
299
299
 
300
- <a-spin :spinning="loading">
301
- <a-table
302
- :columns="columns"
303
- :data-source="tokens"
304
- :pagination="false"
305
- row-key="id"
306
- >
307
- <template #bodyCell="{ column, record }">
308
- <template v-if="column.key === 'label'">
309
- <a-space>
310
- <span class="i-tabler-key text-primary" />
311
- <span class="font-medium">{{ record.label || $t('tokens.kj3mklm028') }}</span>
312
- <a-tag
313
- v-if="record.id === userStore.user?.tokenId"
314
- color="green"
315
- >
316
- {{ $t('tokens.k1defr98007') }}
317
- </a-tag>
318
- </a-space>
319
- </template>
320
- <template v-else-if="column.key === 'token'">
321
- <div class="tok-cell">
322
- <code
323
- class="tok-val"
324
- :class="{ revealed: isRevealed(record.id) }"
325
- :title="isRevealed(record.id) ? '已显示明文,点击眼睛遮回' : '掩码预览'"
326
- >{{ rowDisplay(record as TokenMeta) }}</code>
327
- <a-button
328
- v-if="record.hasPlain"
329
- type="text"
330
- size="small"
331
- class="tok-op"
332
- :loading="revealingId === record.id"
333
- :title="isRevealed(record.id) ? '遮回' : '查看明文'"
334
- @click="toggleRowReveal(record as TokenMeta)"
335
- >
336
- <span :class="isRevealed(record.id) ? 'i-tabler-eye-off' : 'i-tabler-eye'" />
337
- </a-button>
338
- <a-button
339
- v-if="record.hasPlain"
340
- type="text"
341
- size="small"
342
- class="tok-op"
343
- :class="{ ok: copyId === record.id }"
344
- :title="copyId === record.id ? '已复制' : '复制明文'"
345
- @click="copyRow(record as TokenMeta)"
346
- >
347
- <span :class="copyId === record.id ? 'i-tabler-check' : 'i-tabler-copy'" />
348
- </a-button>
349
- <!-- 0.7.10 起 token 只存哈希:无明文是常态,不再打「旧版不可见」标签 -->
350
- </div>
351
- </template>
352
- <template v-else-if="column.key === 'createdAt'">
353
- {{ fmt(record.createdAt) }}
354
- </template>
355
- <template v-else-if="column.key === 'lastUsedAt'">
356
- {{ fmt(record.lastUsedAt) }}
357
- </template>
358
- <template v-else-if="column.key === 'action'">
359
- <a-space>
360
- <a-button
361
- type="link"
362
- size="small"
363
- @click="openRename(record)"
364
- >
365
- <span class="i-tabler-edit" />
366
- {{ $t('tokens.k3vrpcs009') }}
367
- </a-button>
368
- <a-popconfirm
369
- :title="record.id === userStore.user?.tokenId ? '吊销当前会话 token 将退出登录' : '吊销后立即失效'"
370
- :ok-text="'吊销'"
371
- :cancel-text="'取消'"
372
- @confirm="doRevoke(record)"
373
- >
374
- <!-- 安静文本按钮:常态墨灰,悬停转红 —— 红色只留给真实确认瞬间,不再整行批发 -->
300
+ <a-card
301
+ :bordered="false"
302
+ class="table-card"
303
+ >
304
+ <a-spin :spinning="loading">
305
+ <a-table
306
+ :columns="columns"
307
+ :data-source="tokens"
308
+ :pagination="false"
309
+ row-key="id"
310
+ >
311
+ <template #bodyCell="{ column, record }">
312
+ <template v-if="column.key === 'label'">
313
+ <a-space>
314
+ <span class="i-tabler-key text-primary" />
315
+ <span class="font-medium">{{ record.label || $t('tokens.kj3mklm028') }}</span>
316
+ <a-tag
317
+ v-if="record.id === userStore.user?.tokenId"
318
+ color="green"
319
+ >
320
+ {{ $t('tokens.k1defr98007') }}
321
+ </a-tag>
322
+ </a-space>
323
+ </template>
324
+ <template v-else-if="column.key === 'token'">
325
+ <div class="tok-cell">
326
+ <code
327
+ class="tok-val"
328
+ :class="{ revealed: isRevealed(record.id) }"
329
+ :title="isRevealed(record.id) ? '已显示明文,点击眼睛遮回' : '掩码预览'"
330
+ >{{ rowDisplay(record as TokenMeta) }}</code>
331
+ <a-button
332
+ v-if="record.hasPlain"
333
+ type="text"
334
+ size="small"
335
+ class="tok-op"
336
+ :loading="revealingId === record.id"
337
+ :title="isRevealed(record.id) ? '遮回' : '查看明文'"
338
+ @click="toggleRowReveal(record as TokenMeta)"
339
+ >
340
+ <span :class="isRevealed(record.id) ? 'i-tabler-eye-off' : 'i-tabler-eye'" />
341
+ </a-button>
375
342
  <a-button
343
+ v-if="record.hasPlain"
376
344
  type="text"
377
345
  size="small"
378
- class="tok-revoke"
346
+ class="tok-op"
347
+ :class="{ ok: copyId === record.id }"
348
+ :title="copyId === record.id ? '已复制' : '复制明文'"
349
+ @click="copyRow(record as TokenMeta)"
379
350
  >
380
- <span class="i-tabler-trash" />
381
- {{ $t('tokens.k3xmrz010') }}
351
+ <span :class="copyId === record.id ? 'i-tabler-check' : 'i-tabler-copy'" />
382
352
  </a-button>
383
- </a-popconfirm>
384
- </a-space>
353
+ <!-- 0.7.10 起 token 只存哈希:无明文是常态,不再打「旧版不可见」标签 -->
354
+ </div>
355
+ </template>
356
+ <template v-else-if="column.key === 'createdAt'">
357
+ {{ fmt(record.createdAt) }}
358
+ </template>
359
+ <template v-else-if="column.key === 'lastUsedAt'">
360
+ {{ fmt(record.lastUsedAt) }}
361
+ </template>
362
+ <template v-else-if="column.key === 'action'">
363
+ <a-space>
364
+ <a-button
365
+ type="link"
366
+ size="small"
367
+ @click="openRename(record)"
368
+ >
369
+ <span class="i-tabler-edit" />
370
+ {{ $t('tokens.k3vrpcs009') }}
371
+ </a-button>
372
+ <a-popconfirm
373
+ :title="record.id === userStore.user?.tokenId ? '吊销当前会话 token 将退出登录' : '吊销后立即失效'"
374
+ :ok-text="'吊销'"
375
+ :cancel-text="'取消'"
376
+ @confirm="doRevoke(record)"
377
+ >
378
+ <!-- 安静文本按钮:常态墨灰,悬停转红 —— 红色只留给真实确认瞬间,不再整行批发 -->
379
+ <a-button
380
+ type="text"
381
+ size="small"
382
+ class="tok-revoke"
383
+ >
384
+ <span class="i-tabler-trash" />
385
+ {{ $t('tokens.k3xmrz010') }}
386
+ </a-button>
387
+ </a-popconfirm>
388
+ </a-space>
389
+ </template>
385
390
  </template>
386
- </template>
387
- </a-table>
388
- </a-spin>
391
+ </a-table>
392
+ </a-spin>
393
+ </a-card>
389
394
 
390
395
  <!-- 创建 Token -->
391
396
  <a-modal
@@ -477,16 +482,9 @@ useHead({ title: () => tt('titles.tokens') })
477
482
 
478
483
  .auth-card { width: 460px; max-width: 92vw; }
479
484
  .auth-card h2 { margin: 0 0 8px; font-family: var(--font-display); }
480
- .sub { margin: 0 0 12px; font-size: 12px; opacity: 0.6; }
481
-
482
- .head {
483
- display: flex;
484
- align-items: center;
485
- justify-content: space-between;
486
- margin-bottom: 16px;
487
- }
488
-
489
- h2 { margin: 0 0 4px; font-family: var(--font-display); }
485
+ .sub { margin: 8px 0 0; font-size: 12.5px; color: var(--ink-faint); }
486
+ .head-actions { padding-bottom: 4px; }
487
+ .table-card { margin-bottom: 16px; }
490
488
 
491
489
  .once-banner {
492
490
  display: flex;
@@ -116,9 +116,12 @@ useHead({ title: () => t('titles.users') })
116
116
 
117
117
  <template>
118
118
  <div class="page-wrap">
119
- <div class="page-head">
119
+ <div class="aw-page-head">
120
120
  <div>
121
- <h2 class="page-title">
121
+ <p class="aw-kicker">
122
+ agentworkshop / identity
123
+ </p>
124
+ <h1>
122
125
  {{ t('users.title') }}
123
126
  <a-tag
124
127
  color="volcano"
@@ -127,8 +130,8 @@ useHead({ title: () => t('titles.users') })
127
130
  <span class="i-tabler-shield-check" />
128
131
  admin
129
132
  </a-tag>
130
- </h2>
131
- <p class="page-sub">
133
+ </h1>
134
+ <p class="sub">
132
135
  {{ $t('users.k1flpho5002') }}
133
136
  </p>
134
137
  </div>
@@ -228,21 +231,10 @@ useHead({ title: () => t('titles.users') })
228
231
  max-width: 1080px;
229
232
  margin: 0 auto;
230
233
  }
231
- .page-head {
232
- display: flex;
233
- align-items: flex-end;
234
- justify-content: space-between;
235
- margin-bottom: 16px;
236
- }
237
- .page-title {
238
- display: flex;
239
- gap: 8px;
240
- align-items: center;
241
- margin: 0 0 4px;
242
- font-size: 24px;
234
+ .admin-tag {
235
+ transform: translateY(-3px);
243
236
  }
244
- .admin-tag { transform: translateY(-2px); }
245
- .page-sub { margin: 0; font-size: 12.5px; opacity: 0.55; }
237
+ .sub { margin: 8px 0 0; font-size: 12.5px; color: var(--ink-faint); }
246
238
  .gate-card {
247
239
  display: flex;
248
240
  flex-direction: column;
@@ -413,16 +413,19 @@ useHead({ title: () => t('titles.workshop') })
413
413
  </div>
414
414
  </div>
415
415
 
416
- <div
416
+ <button
417
417
  v-if="wsStore.workspaces.length === 0 && ready"
418
- class="card placeholder aw-empty"
418
+ class="ws-empty"
419
419
  @click="createOpen = true"
420
420
  >
421
+ <span class="i-tabler-layout-2 ws-empty-ico" />
421
422
  <span class="aw-empty-title">从一条产线、一个 Agent 开始</span>
422
423
  <span class="aw-empty-sub">Workspace 是频道与任务的容器 —— 建立第一个工作区后,你的 Agent 团队即可上线作业。</span>
423
- <span class="i-tabler-plus big" />
424
- <span>新建第一个 Workspace</span>
425
- </div>
424
+ <span class="pill-btn ws-empty-cta">
425
+ <span class="i-tabler-plus" />
426
+ 新建第一个 Workspace
427
+ </span>
428
+ </button>
426
429
  </div>
427
430
  </a-spin>
428
431
 
@@ -560,6 +563,32 @@ useHead({ title: () => t('titles.workshop') })
560
563
  border-style: dashed;
561
564
  }
562
565
 
566
+ /* 空态:整幅居中构图(跨全部网格列,代替左上角一张小幽灵卡) */
567
+ .ws-empty {
568
+ grid-column: 1 / -1;
569
+ display: flex;
570
+ flex-direction: column;
571
+ gap: 12px;
572
+ align-items: center;
573
+ justify-content: center;
574
+ min-height: min(480px, calc(100vh - 320px));
575
+ padding: 40px 24px;
576
+ text-align: center;
577
+ cursor: pointer;
578
+ background: transparent;
579
+ border: 1px dashed var(--line-strong);
580
+ border-radius: var(--radius-panel);
581
+ transition: background var(--transition-fast), border-color var(--transition-fast);
582
+ }
583
+ .ws-empty:hover {
584
+ background: var(--hover-tint);
585
+ border-color: var(--ink-fainter);
586
+ }
587
+ .ws-empty-ico { font-size: 34px; color: var(--ink-fainter); }
588
+ .aw-empty-title { font-size: 16px; font-weight: 600; color: var(--ink); }
589
+ .aw-empty-sub { max-width: 420px; font-size: 12.5px; line-height: 1.7; color: var(--ink-faint); }
590
+ .ws-empty-cta { margin-top: 6px; pointer-events: none; }
591
+
563
592
  .big { font-size: 28px; }
564
593
 
565
594
  .card-head {
@@ -748,6 +748,7 @@ export default {
748
748
  'thDetail': 'Detail',
749
749
  'expand': 'Detail',
750
750
  'fold': 'Fold',
751
+ 'noDetail': 'None',
751
752
  'loading': 'Querying…',
752
753
  'empty': 'No matching log entries',
753
754
  'src': {
@@ -766,6 +767,8 @@ export default {
766
767
  },
767
768
  'mSummary': 'Entry content',
768
769
  'mSummaryPh': 'e.g. Replaced heater coil of oven #3; extended soaking for current batch by 10 min',
770
+ 'mDetail': 'Detail (optional)',
771
+ 'mDetailPh': 'Context, handling notes, related ticket… (stored in the log detail)',
769
772
  'mSubmit': 'Record',
770
773
  'mOk': 'Recorded',
771
774
  },
@@ -1918,7 +1921,7 @@ export default {
1918
1921
  loadFail: 'Failed to load plugin list',
1919
1922
  hasClient: 'Client enhancer',
1920
1923
  routes: 'API routes',
1921
- empty: 'No plugins yet — aw plugin create <name>, or aw plugin enable to turn on examples',
1924
+ empty: 'No plugins yet — run aw plugin create my-plugin, or aw plugin enable to turn on examples',
1922
1925
  failures: 'Load failures',
1923
1926
  loadFailures: '{n} plugin(s) failed to load, see server startup log',
1924
1927
  enableFail: 'Toggle failed',
@@ -705,6 +705,8 @@ export default {
705
705
  'kind.system': '系统',
706
706
  'mSummary': '记录内容',
707
707
  'mSummaryPh': '如:更换 3 号烘箱加热丝,当前批次延长保温 10 分钟',
708
+ 'mDetail': '详情(可选)',
709
+ 'mDetailPh': '补充说明、处置过程、关联单号等(将存入日志详情)',
708
710
  'mSubmit': '入册',
709
711
  'mOk': '已入册',
710
712
  'src.user': '用户',
@@ -748,6 +750,7 @@ export default {
748
750
  'thDetail': '详情',
749
751
  'expand': '详情',
750
752
  'fold': '收起',
753
+ 'noDetail': '无',
751
754
  'loading': '查询中…',
752
755
  'empty': '无匹配日志',
753
756
  'src': {
@@ -766,6 +769,8 @@ export default {
766
769
  },
767
770
  'mSummary': '记录内容',
768
771
  'mSummaryPh': '如:更换 3 号烘箱加热丝,当前批次延长保温 10 分钟',
772
+ 'mDetail': '详情(可选)',
773
+ 'mDetailPh': '补充说明、处置过程、关联单号等(将存入日志详情)',
769
774
  'mSubmit': '入册',
770
775
  'mOk': '已入册',
771
776
  },
@@ -1917,7 +1922,7 @@ export default {
1917
1922
  loadFail: '插件列表加载失败',
1918
1923
  hasClient: '浏览器增强',
1919
1924
  routes: 'API 路由',
1920
- empty: '暂无插件 —— aw plugin create <name> 创建,或 aw plugin enable 开启示例',
1925
+ empty: '暂无插件 —— 执行 aw plugin create my-plugin 创建,或 aw plugin enable 开启内置示例',
1921
1926
  failures: '装载失败',
1922
1927
  loadFailures: '{n} 个插件装载失败,详情见服务启动日志',
1923
1928
  enableFail: '启停操作失败',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentworkshop",
3
- "version": "0.7.22",
3
+ "version": "0.7.24",
4
4
  "type": "module",
5
5
  "description": "AgentWorkShop 软件开发系统 - 基于 Nuxt 4 的配置驱动运行范式",
6
6
  "license": "PolyForm-Noncommercial-1.0.0",