Commit 45b2c71d4a26c471a894c98494e16ab74a57b6c3

Authored by yibo
1 parent d89a0df4

feat: tool-aware idle timeout + system-level provision API

Architecture fix for long-running tool execution:

1. ClaudeCliProtocol: Two-tier idle timeout
   - Chat mode: 45s (detect API hang/silent rate limit)
   - Tool execution mode: 5min (Bash long tasks like pip install)
   - Automatically switches on tool_use_start / content_block_stop events

2. Provision API: POST /templates/:templateId/provision
   - Runs shell commands directly via child_process.exec
   - Bypasses Claude ACP entirely (no idle timeout issue)
   - 10min per-command timeout, security blocklist
   - Frontend button with prompt for custom commands

3. Template UI: Added 🔧 安装依赖 button (teal)
data/goals/_index.json 0 → 100644
  1 +[]
0 2 \ No newline at end of file
... ...
package.json
... ... @@ -59,14 +59,17 @@
59 59 "@sinclair/typebox": "^0.34.48",
60 60 "@whiskeysockets/baileys": "7.0.0-rc.9",
61 61 "adm-zip": "^0.5.16",
  62 + "ali-oss": "^6.23.0",
62 63 "archiver": "^7.0.1",
63 64 "better-sqlite3": "^12.8.0",
64 65 "express-fileupload": "^1.5.2",
65 66 "mammoth": "^1.11.0",
66 67 "module-alias": "^2.3.4",
67 68 "multer": "^2.1.1",
  69 + "mysql2": "^3.20.0",
68 70 "pdf-parse": "^2.4.5",
69   - "qrcode-terminal": "^0.12.0"
  71 + "qrcode-terminal": "^0.12.0",
  72 + "sequelize": "^6.37.8"
70 73 },
71 74 "_moduleAliases": {
72 75 "@server": "server"
... ...
packages/acp-core/protocol/ClaudeCliProtocol.js
... ... @@ -36,6 +36,8 @@ class ClaudeCliProtocol extends EventEmitter {
36 36 this._buffer = '';
37 37 this._promptResolve = null;
38 38 this._promptReject = null;
  39 + // 工具执行状态追踪(用于动态调整空闲超时)
  40 + this._inToolExecution = false;
39 41 }
40 42  
41 43 /**
... ... @@ -200,6 +202,10 @@ class ClaudeCliProtocol extends EventEmitter {
200 202 * @returns {Promise<void>}
201 203 */
202 204 sendPrompt(text) {
  205 + // 两级超时:对话态 45s (检测 API hang/静默限速),工具执行态 5min (Bash 长任务如 pip install)
  206 + const IDLE_TIMEOUT_CHAT_MS = 45_000; // 正常对话无活动上限
  207 + const IDLE_TIMEOUT_TOOL_MS = 5 * 60_000; // 工具执行无活动上限 (5分钟)
  208 +
203 209 return new Promise((resolve, reject) => {
204 210 if (!this._child || !this.isConnected) {
205 211 return reject(new Error('[ClaudeCliProtocol] 进程未启动'));
... ... @@ -207,35 +213,50 @@ class ClaudeCliProtocol extends EventEmitter {
207 213  
208 214 this._promptResolve = resolve;
209 215 this._promptReject = reject;
  216 + this._inToolExecution = false;
210 217  
211   - // 超时保护:如果 45 秒内没有任何 stdout 活动(API hang/rate limit 静默),自动 reject
212   - const IDLE_TIMEOUT_MS = 45_000;
213   - let idleTimer = setTimeout(() => {
  218 + // 统一的超时触发逻辑
  219 + const fireTimeout = () => {
214 220 if (this._promptReject) {
215   - const err = new Error(`Claude CLI 响应超时 (${IDLE_TIMEOUT_MS / 1000}s 无活动)`);
  221 + const mode = this._inToolExecution ? 'tool' : 'chat';
  222 + const ms = this._inToolExecution ? IDLE_TIMEOUT_TOOL_MS : IDLE_TIMEOUT_CHAT_MS;
  223 + const err = new Error(`Claude CLI 响应超时 (${ms / 1000}s 无活动, mode=${mode})`);
216 224 console.error('[ClaudeCliProtocol]', err.message);
217 225 this._promptReject(err);
218 226 this._promptResolve = null;
219 227 this._promptReject = null;
220 228 this._idleTimer = null;
221 229 }
222   - }, IDLE_TIMEOUT_MS);
  230 + };
  231 +
  232 + // 启动初始超时 (对话态)
  233 + const currentTimeoutMs = () => this._inToolExecution ? IDLE_TIMEOUT_TOOL_MS : IDLE_TIMEOUT_CHAT_MS;
  234 + this._idleTimer = setTimeout(fireTimeout, IDLE_TIMEOUT_CHAT_MS);
223 235  
224 236 // 每次收到 stdout 数据时重置超时(说明 CLI 还活着)
225   - this._idleTimer = idleTimer;
226 237 this._resetIdleTimer = () => {
227 238 if (this._idleTimer) {
228 239 clearTimeout(this._idleTimer);
229   - this._idleTimer = setTimeout(() => {
230   - if (this._promptReject) {
231   - const err = new Error(`Claude CLI 响应超时 (${IDLE_TIMEOUT_MS / 1000}s 无活动)`);
232   - console.error('[ClaudeCliProtocol]', err.message);
233   - this._promptReject(err);
234   - this._promptResolve = null;
235   - this._promptReject = null;
236   - this._idleTimer = null;
237   - }
238   - }, IDLE_TIMEOUT_MS);
  240 + this._idleTimer = setTimeout(fireTimeout, currentTimeoutMs());
  241 + }
  242 + };
  243 +
  244 + // 工具开始 → 切到长超时
  245 + this._onToolStart = () => {
  246 + this._inToolExecution = true;
  247 + if (this._idleTimer) {
  248 + clearTimeout(this._idleTimer);
  249 + this._idleTimer = setTimeout(fireTimeout, IDLE_TIMEOUT_TOOL_MS);
  250 + }
  251 + console.log(`[ClaudeCliProtocol] 🔧 工具执行中 → 超时切为 ${IDLE_TIMEOUT_TOOL_MS / 1000}s`);
  252 + };
  253 +
  254 + // 工具结束 → 切回短超时
  255 + this._onToolEnd = () => {
  256 + this._inToolExecution = false;
  257 + if (this._idleTimer) {
  258 + clearTimeout(this._idleTimer);
  259 + this._idleTimer = setTimeout(fireTimeout, IDLE_TIMEOUT_CHAT_MS);
239 260 }
240 261 };
241 262  
... ... @@ -249,12 +270,11 @@ class ClaudeCliProtocol extends EventEmitter {
249 270 };
250 271  
251 272 const jsonLine = JSON.stringify(message) + '\n';
252   - // console.log(`[ClaudeCliProtocol] 发送 prompt (${text.length} chars)`);
253 273  
254 274 try {
255 275 this._child.stdin.write(jsonLine);
256 276 } catch (e) {
257   - clearTimeout(idleTimer);
  277 + clearTimeout(this._idleTimer);
258 278 this._promptResolve = null;
259 279 this._promptReject = null;
260 280 this._idleTimer = null;
... ... @@ -432,6 +452,8 @@ class ClaudeCliProtocol extends EventEmitter {
432 452 case 'content_block_start':
433 453 // 可用于检测 tool_use 块开始
434 454 if (innerEvent.content_block?.type === 'tool_use') {
  455 + // 通知超时管理器:工具开始执行,切换到长超时
  456 + if (this._onToolStart) this._onToolStart();
435 457 this.emit('acp_event', {
436 458 type: 'notification',
437 459 method: 'claude/tool_use_start',
... ... @@ -448,6 +470,10 @@ class ClaudeCliProtocol extends EventEmitter {
448 470 case 'content_block_stop':
449 471 case 'message_delta':
450 472 case 'message_stop':
  473 + // 工具执行结束 → 恢复正常超时
  474 + if (innerEvent.type === 'content_block_stop' && this._inToolExecution) {
  475 + if (this._onToolEnd) this._onToolEnd();
  476 + }
451 477 // 透传为 acp_event
452 478 this.emit('acp_event', {
453 479 type: 'notification',
... ...
pnpm-lock.yaml
... ... @@ -23,6 +23,9 @@ importers:
23 23 adm-zip:
24 24 specifier: ^0.5.16
25 25 version: 0.5.16
  26 + ali-oss:
  27 + specifier: ^6.23.0
  28 + version: 6.23.0
26 29 archiver:
27 30 specifier: ^7.0.1
28 31 version: 7.0.1
... ... @@ -41,12 +44,18 @@ importers:
41 44 multer:
42 45 specifier: ^2.1.1
43 46 version: 2.1.1
  47 + mysql2:
  48 + specifier: ^3.20.0
  49 + version: 3.20.0(@types/node@25.3.2)
44 50 pdf-parse:
45 51 specifier: ^2.4.5
46 52 version: 2.4.5
47 53 qrcode-terminal:
48 54 specifier: ^0.12.0
49 55 version: 0.12.0
  56 + sequelize:
  57 + specifier: ^6.37.8
  58 + version: 6.37.8(mysql2@3.20.0(@types/node@25.3.2))
50 59 devDependencies:
51 60 concurrently:
52 61 specifier: ^8.2.2
... ... @@ -925,6 +934,9 @@ packages:
925 934 '@types/chai@5.2.3':
926 935 resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
927 936  
  937 + '@types/debug@4.1.13':
  938 + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==}
  939 +
928 940 '@types/deep-eql@4.0.2':
929 941 resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
930 942  
... ... @@ -934,12 +946,18 @@ packages:
934 946 '@types/long@4.0.2':
935 947 resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
936 948  
  949 + '@types/ms@2.1.0':
  950 + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
  951 +
937 952 '@types/node@10.17.60':
938 953 resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==}
939 954  
940 955 '@types/node@25.3.2':
941 956 resolution: {integrity: sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q==}
942 957  
  958 + '@types/validator@13.15.10':
  959 + resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==}
  960 +
943 961 '@vitejs/plugin-vue@5.2.4':
944 962 resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==}
945 963 engines: {node: ^18.0.0 || >=20.0.0}
... ... @@ -1040,10 +1058,22 @@ packages:
1040 1058 resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
1041 1059 engines: {node: '>= 0.6'}
1042 1060  
  1061 + address@1.2.2:
  1062 + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==}
  1063 + engines: {node: '>= 10.0.0'}
  1064 +
1043 1065 adm-zip@0.5.16:
1044 1066 resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==}
1045 1067 engines: {node: '>=12.0'}
1046 1068  
  1069 + agentkeepalive@3.5.3:
  1070 + resolution: {integrity: sha512-yqXL+k5rr8+ZRpOAntkaaRgWgE5o8ESAj5DyRmVTCSoZxXmqemb9Dd7T4i5UzwuERdLAJUy6XzR9zFVuf0kzkw==}
  1071 + engines: {node: '>= 4.0.0'}
  1072 +
  1073 + ali-oss@6.23.0:
  1074 + resolution: {integrity: sha512-FipRmyd16Pr/tEey/YaaQ/24Pc3HEpLM9S1DRakEuXlSLXNIJnu1oJtHM53eVYpvW3dXapSjrip3xylZUTIZVQ==}
  1075 + engines: {node: '>=8'}
  1076 +
1047 1077 ansi-regex@5.0.1:
1048 1078 resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
1049 1079 engines: {node: '>=8'}
... ... @@ -1066,6 +1096,9 @@ packages:
1066 1096 peerDependencies:
1067 1097 vue: '>=3.2.0'
1068 1098  
  1099 + any-promise@1.3.0:
  1100 + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
  1101 +
1069 1102 append-field@1.0.0:
1070 1103 resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==}
1071 1104  
... ... @@ -1106,6 +1139,10 @@ packages:
1106 1139 resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
1107 1140 engines: {node: '>=8.0.0'}
1108 1141  
  1142 + aws-ssl-profiles@1.1.2:
  1143 + resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==}
  1144 + engines: {node: '>= 6.0.0'}
  1145 +
1109 1146 axios@1.13.5:
1110 1147 resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==}
1111 1148  
... ... @@ -1182,6 +1219,9 @@ packages:
1182 1219 resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==}
1183 1220 engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
1184 1221  
  1222 + bowser@1.9.4:
  1223 + resolution: {integrity: sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==}
  1224 +
1185 1225 brace-expansion@2.0.2:
1186 1226 resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
1187 1227  
... ... @@ -1201,6 +1241,9 @@ packages:
1201 1241 buffer@6.0.3:
1202 1242 resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
1203 1243  
  1244 + builtin-status-codes@3.0.0:
  1245 + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==}
  1246 +
1204 1247 busboy@1.6.0:
1205 1248 resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
1206 1249 engines: {node: '>=10.16.0'}
... ... @@ -1291,6 +1334,9 @@ packages:
1291 1334 resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
1292 1335 engines: {node: '>= 0.6'}
1293 1336  
  1337 + copy-to@2.0.1:
  1338 + resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==}
  1339 +
1294 1340 core-js@3.48.0:
1295 1341 resolution: {integrity: sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==}
1296 1342  
... ... @@ -1324,6 +1370,9 @@ packages:
1324 1370 resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
1325 1371 engines: {node: '>=0.11'}
1326 1372  
  1373 + dateformat@2.2.0:
  1374 + resolution: {integrity: sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==}
  1375 +
1327 1376 dayjs@1.11.20:
1328 1377 resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==}
1329 1378  
... ... @@ -1356,10 +1405,18 @@ packages:
1356 1405 resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
1357 1406 engines: {node: '>=4.0.0'}
1358 1407  
  1408 + default-user-agent@1.0.0:
  1409 + resolution: {integrity: sha512-bDF7bg6OSNcSwFWPu4zYKpVkJZQYVrAANMYB8bc9Szem1D0yKdm4sa/rOCs2aC9+2GMqQ7KnwtZRvDhmLF0dXw==}
  1410 + engines: {node: '>= 0.10.0'}
  1411 +
1359 1412 delayed-stream@1.0.0:
1360 1413 resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
1361 1414 engines: {node: '>=0.4.0'}
1362 1415  
  1416 + denque@2.1.0:
  1417 + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
  1418 + engines: {node: '>=0.10'}
  1419 +
1363 1420 depd@2.0.0:
1364 1421 resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
1365 1422 engines: {node: '>= 0.8'}
... ... @@ -1372,6 +1429,10 @@ packages:
1372 1429 resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
1373 1430 engines: {node: '>=8'}
1374 1431  
  1432 + digest-header@1.1.0:
  1433 + resolution: {integrity: sha512-glXVh42vz40yZb9Cq2oMOt70FIoWiv+vxNvdKdU8CwjLad25qHM3trLxhl9bVjdr6WaslIXhWpn0NO8T/67Qjg==}
  1434 + engines: {node: '>= 8.0.0'}
  1435 +
1375 1436 dijkstrajs@1.0.3:
1376 1437 resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
1377 1438  
... ... @@ -1388,6 +1449,9 @@ packages:
1388 1449 resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
1389 1450 engines: {node: '>=12'}
1390 1451  
  1452 + dottie@2.0.7:
  1453 + resolution: {integrity: sha512-7lAK2A0b3zZr3UC5aE69CPdCFR4RHW1o2Dr74TqFykxkUCBXSRJum/yPc7g8zRHJqWKomPLHwFLLoUnn8PXXRg==}
  1454 +
1391 1455 duck@0.1.12:
1392 1456 resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==}
1393 1457  
... ... @@ -1417,6 +1481,10 @@ packages:
1417 1481 end-of-stream@1.4.5:
1418 1482 resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
1419 1483  
  1484 + end-or-error@1.0.1:
  1485 + resolution: {integrity: sha512-OclLMSug+k2A0JKuf494im25ANRBVW8qsjmwbgX7lQ8P82H21PQ1PWkoYwb9y5yMBS69BPlwtzdIFClo3+7kOQ==}
  1486 + engines: {node: '>= 0.11.14'}
  1487 +
1420 1488 entities@7.0.1:
1421 1489 resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
1422 1490 engines: {node: '>=0.12'}
... ... @@ -1497,6 +1565,10 @@ packages:
1497 1565 resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==}
1498 1566 engines: {node: '>= 0.10.0'}
1499 1567  
  1568 + extend-shallow@2.0.1:
  1569 + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
  1570 + engines: {node: '>=0.10.0'}
  1571 +
1500 1572 fast-fifo@1.3.2:
1501 1573 resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==}
1502 1574  
... ... @@ -1541,6 +1613,9 @@ packages:
1541 1613 resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
1542 1614 engines: {node: '>= 6'}
1543 1615  
  1616 + formstream@1.5.2:
  1617 + resolution: {integrity: sha512-NASf0lgxC1AyKNXQIrXTEYkiX99LhCEXTkiGObXAkpBui86a4u8FjH1o2bGb3PpqI3kafC+yw4zWeK6l6VHTgg==}
  1618 +
1544 1619 forwarded@0.2.0:
1545 1620 resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
1546 1621 engines: {node: '>= 0.6'}
... ... @@ -1565,6 +1640,9 @@ packages:
1565 1640 function-bind@1.1.2:
1566 1641 resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
1567 1642  
  1643 + generate-function@2.3.1:
  1644 + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==}
  1645 +
1568 1646 get-caller-file@2.0.5:
1569 1647 resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
1570 1648 engines: {node: 6.* || 8.* || >= 10.*}
... ... @@ -1577,6 +1655,9 @@ packages:
1577 1655 resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
1578 1656 engines: {node: '>= 0.4'}
1579 1657  
  1658 + get-ready@1.0.0:
  1659 + resolution: {integrity: sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==}
  1660 +
1580 1661 github-from-package@0.0.0:
1581 1662 resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==}
1582 1663  
... ... @@ -1623,16 +1704,31 @@ packages:
1623 1704 resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
1624 1705 engines: {node: '>= 0.8'}
1625 1706  
  1707 + humanize-ms@1.2.1:
  1708 + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
  1709 +
1626 1710 iconv-lite@0.4.24:
1627 1711 resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
1628 1712 engines: {node: '>=0.10.0'}
1629 1713  
  1714 + iconv-lite@0.6.3:
  1715 + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
  1716 + engines: {node: '>=0.10.0'}
  1717 +
  1718 + iconv-lite@0.7.2:
  1719 + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
  1720 + engines: {node: '>=0.10.0'}
  1721 +
1630 1722 ieee754@1.2.1:
1631 1723 resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
1632 1724  
1633 1725 immediate@3.0.6:
1634 1726 resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
1635 1727  
  1728 + inflection@1.13.4:
  1729 + resolution: {integrity: sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==}
  1730 + engines: {'0': node >= 0.4.0}
  1731 +
1636 1732 inherits@2.0.4:
1637 1733 resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1638 1734  
... ... @@ -1643,6 +1739,13 @@ packages:
1643 1739 resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
1644 1740 engines: {node: '>= 0.10'}
1645 1741  
  1742 + is-class-hotfix@0.0.6:
  1743 + resolution: {integrity: sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==}
  1744 +
  1745 + is-extendable@0.1.1:
  1746 + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
  1747 + engines: {node: '>=0.10.0'}
  1748 +
1646 1749 is-fullwidth-code-point@3.0.0:
1647 1750 resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
1648 1751 engines: {node: '>=8'}
... ... @@ -1651,19 +1754,31 @@ packages:
1651 1754 resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==}
1652 1755 engines: {node: '>=0.10.0'}
1653 1756  
  1757 + is-property@1.0.2:
  1758 + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==}
  1759 +
1654 1760 is-stream@2.0.1:
1655 1761 resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
1656 1762 engines: {node: '>=8'}
1657 1763  
  1764 + is-type-of@1.4.0:
  1765 + resolution: {integrity: sha512-EddYllaovi5ysMLMEN7yzHEKh8A850cZ7pykrY1aNRQGn/CDjRDE9qEWbIdt7xGEVJmjBXzU/fNnC4ABTm8tEQ==}
  1766 +
1658 1767 isarray@1.0.0:
1659 1768 resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
1660 1769  
1661 1770 isexe@2.0.0:
1662 1771 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1663 1772  
  1773 + isstream@0.1.2:
  1774 + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
  1775 +
1664 1776 jackspeak@3.4.3:
1665 1777 resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
1666 1778  
  1779 + js-base64@2.6.4:
  1780 + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==}
  1781 +
1667 1782 js-tokens@4.0.0:
1668 1783 resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
1669 1784  
... ... @@ -1671,6 +1786,9 @@ packages:
1671 1786 resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==}
1672 1787 engines: {node: '>=12', npm: '>=6'}
1673 1788  
  1789 + jstoxml@2.2.9:
  1790 + resolution: {integrity: sha512-OYWlK0j+roh+eyaMROlNbS5cd5R25Y+IUpdl7cNdB8HNrkgwQzIS7L9MegxOiWNBj9dQhA/yAxiMwCC5mwNoBw==}
  1791 +
1674 1792 jszip@3.10.1:
1675 1793 resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
1676 1794  
... ... @@ -1750,6 +1868,10 @@ packages:
1750 1868 resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==}
1751 1869 engines: {node: 20 || >=22}
1752 1870  
  1871 + lru.min@1.1.4:
  1872 + resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==}
  1873 + engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'}
  1874 +
1753 1875 magic-string@0.30.21:
1754 1876 resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
1755 1877  
... ... @@ -1795,6 +1917,11 @@ packages:
1795 1917 engines: {node: '>=4'}
1796 1918 hasBin: true
1797 1919  
  1920 + mime@2.6.0:
  1921 + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==}
  1922 + engines: {node: '>=4.0.0'}
  1923 + hasBin: true
  1924 +
1798 1925 mimic-response@3.1.0:
1799 1926 resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
1800 1927 engines: {node: '>=10'}
... ... @@ -1817,9 +1944,19 @@ packages:
1817 1944 mkdirp-classic@0.5.3:
1818 1945 resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
1819 1946  
  1947 + mkdirp@0.5.6:
  1948 + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
  1949 + hasBin: true
  1950 +
1820 1951 module-alias@2.3.4:
1821 1952 resolution: {integrity: sha512-bOclZt8hkpuGgSSoG07PKmvzTizROilUTvLNyrMqvlC9snhs7y7GzjNWAVbISIOlhCP1T14rH1PDAV9iNyBq/w==}
1822 1953  
  1954 + moment-timezone@0.5.48:
  1955 + resolution: {integrity: sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==}
  1956 +
  1957 + moment@2.30.1:
  1958 + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
  1959 +
1823 1960 ms@2.0.0:
1824 1961 resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
1825 1962  
... ... @@ -1834,6 +1971,19 @@ packages:
1834 1971 resolution: {integrity: sha512-j++ltLxHDb5VCXET9FzQ8bnueiLHwQKgCO7vcbkRH/3F7fRjPkv6qncGEJ47yFhmemcYtgvsOAlcQ1dRBTkDjg==}
1835 1972 engines: {node: '>=18'}
1836 1973  
  1974 + mysql2@3.20.0:
  1975 + resolution: {integrity: sha512-eCLUs7BNbgA6nf/MZXsaBO1SfGs0LtLVrJD3WeWq+jPLDWkSufTD+aGMwykfUVPdZnblaUK1a8G/P63cl9FkKg==}
  1976 + engines: {node: '>= 8.0'}
  1977 + peerDependencies:
  1978 + '@types/node': '>= 8'
  1979 +
  1980 + mz@2.7.0:
  1981 + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
  1982 +
  1983 + named-placeholders@1.1.6:
  1984 + resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==}
  1985 + engines: {node: '>=8.0.0'}
  1986 +
1837 1987 nanoid@3.3.11:
1838 1988 resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
1839 1989 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
... ... @@ -1853,6 +2003,10 @@ packages:
1853 2003 resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==}
1854 2004 engines: {node: '>=10'}
1855 2005  
  2006 + node-hex@1.0.1:
  2007 + resolution: {integrity: sha512-iwpZdvW6Umz12ICmu9IYPRxg0tOLGmU3Tq2tKetejCj3oZd7b2nUXwP3a7QA5M9glWy8wlPS1G3RwM/CdsUbdQ==}
  2008 + engines: {node: '>=8.0.0'}
  2009 +
1856 2010 normalize-path@3.0.0:
1857 2011 resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1858 2012 engines: {node: '>=0.10.0'}
... ... @@ -1882,6 +2036,16 @@ packages:
1882 2036 option@0.2.4:
1883 2037 resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==}
1884 2038  
  2039 + os-name@1.0.3:
  2040 + resolution: {integrity: sha512-f5estLO2KN8vgtTRaILIgEGBoBrMnZ3JQ7W9TMZCnOIGwHe8TRGSpcagnWDo+Dfhd/z08k9Xe75hvciJJ8Qaew==}
  2041 + engines: {node: '>=0.10.0'}
  2042 + hasBin: true
  2043 +
  2044 + osx-release@1.1.0:
  2045 + resolution: {integrity: sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==}
  2046 + engines: {node: '>=0.10.0'}
  2047 + hasBin: true
  2048 +
1885 2049 p-limit@2.3.0:
1886 2050 resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
1887 2051 engines: {node: '>=6'}
... ... @@ -1934,6 +2098,9 @@ packages:
1934 2098 pathe@2.0.3:
1935 2099 resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
1936 2100  
  2101 + pause-stream@0.0.11:
  2102 + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==}
  2103 +
1937 2104 pdf-parse@2.4.5:
1938 2105 resolution: {integrity: sha512-mHU89HGh7v+4u2ubfnevJ03lmPgQ5WU4CxAVmTSh/sxVTEDYd1er/dKS/A6vg77NX47KTEoihq8jZBLr8Cxuwg==}
1939 2106 engines: {node: '>=20.16.0 <21 || >=22.3.0'}
... ... @@ -1943,6 +2110,9 @@ packages:
1943 2110 resolution: {integrity: sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==}
1944 2111 engines: {node: '>=20.16.0 || >=22.3.0'}
1945 2112  
  2113 + pg-connection-string@2.12.0:
  2114 + resolution: {integrity: sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==}
  2115 +
1946 2116 picocolors@1.1.1:
1947 2117 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
1948 2118  
... ... @@ -1960,6 +2130,9 @@ packages:
1960 2130 resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==}
1961 2131 hasBin: true
1962 2132  
  2133 + platform@1.3.6:
  2134 + resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==}
  2135 +
1963 2136 playwright-core@1.58.1:
1964 2137 resolution: {integrity: sha512-bcWzOaTxcW+VOOGBCQgnaKToLJ65d6AqfLVKEWvexyS3AS6rbXl+xdpYRMGSRBClPvyj44njOWoxjNdL/H9UNg==}
1965 2138 engines: {node: '>=18'}
... ... @@ -2080,6 +2253,9 @@ packages:
2080 2253 resize-observer-polyfill@1.5.1:
2081 2254 resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
2082 2255  
  2256 + retry-as-promised@7.1.1:
  2257 + resolution: {integrity: sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw==}
  2258 +
2083 2259 rollup@4.57.1:
2084 2260 resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==}
2085 2261 engines: {node: '>=18.0.0', npm: '>=8.0.0'}
... ... @@ -2101,9 +2277,20 @@ packages:
2101 2277 safer-buffer@2.1.2:
2102 2278 resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
2103 2279  
  2280 + sax@1.6.0:
  2281 + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==}
  2282 + engines: {node: '>=11.0.0'}
  2283 +
2104 2284 scroll-into-view-if-needed@2.2.31:
2105 2285 resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==}
2106 2286  
  2287 + sdk-base@2.0.1:
  2288 + resolution: {integrity: sha512-eeG26wRwhtwYuKGCDM3LixCaxY27Pa/5lK4rLKhQa7HBjJ3U3Y+f81MMZQRsDw/8SC2Dao/83yJTXJ8aULuN8Q==}
  2289 +
  2290 + semver@5.7.2:
  2291 + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
  2292 + hasBin: true
  2293 +
2107 2294 semver@7.7.4:
2108 2295 resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
2109 2296 engines: {node: '>=10'}
... ... @@ -2113,6 +2300,43 @@ packages:
2113 2300 resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==}
2114 2301 engines: {node: '>= 0.8.0'}
2115 2302  
  2303 + sequelize-pool@7.1.0:
  2304 + resolution: {integrity: sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==}
  2305 + engines: {node: '>= 10.0.0'}
  2306 +
  2307 + sequelize@6.37.8:
  2308 + resolution: {integrity: sha512-HJ0IQFqcTsTiqbEgiuioYFMSD00TP6Cz7zoTti+zVVBwVe9fEhev9cH6WnM3XU31+ABS356durAb99ZuOthnKw==}
  2309 + engines: {node: '>=10.0.0'}
  2310 + peerDependencies:
  2311 + ibm_db: '*'
  2312 + mariadb: '*'
  2313 + mysql2: '*'
  2314 + oracledb: '*'
  2315 + pg: '*'
  2316 + pg-hstore: '*'
  2317 + snowflake-sdk: '*'
  2318 + sqlite3: '*'
  2319 + tedious: '*'
  2320 + peerDependenciesMeta:
  2321 + ibm_db:
  2322 + optional: true
  2323 + mariadb:
  2324 + optional: true
  2325 + mysql2:
  2326 + optional: true
  2327 + oracledb:
  2328 + optional: true
  2329 + pg:
  2330 + optional: true
  2331 + pg-hstore:
  2332 + optional: true
  2333 + snowflake-sdk:
  2334 + optional: true
  2335 + sqlite3:
  2336 + optional: true
  2337 + tedious:
  2338 + optional: true
  2339 +
2116 2340 serve-static@1.16.3:
2117 2341 resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==}
2118 2342 engines: {node: '>= 0.8.0'}
... ... @@ -2191,9 +2415,17 @@ packages:
2191 2415 sprintf-js@1.0.3:
2192 2416 resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
2193 2417  
  2418 + sql-escaper@1.3.3:
  2419 + resolution: {integrity: sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==}
  2420 + engines: {bun: '>=1.0.0', deno: '>=2.0.0', node: '>=12.0.0'}
  2421 +
2194 2422 stackback@0.0.2:
2195 2423 resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
2196 2424  
  2425 + statuses@1.5.0:
  2426 + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
  2427 + engines: {node: '>= 0.6'}
  2428 +
2197 2429 statuses@2.0.2:
2198 2430 resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
2199 2431 engines: {node: '>= 0.8'}
... ... @@ -2201,6 +2433,13 @@ packages:
2201 2433 std-env@3.10.0:
2202 2434 resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
2203 2435  
  2436 + stream-http@2.8.2:
  2437 + resolution: {integrity: sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==}
  2438 +
  2439 + stream-wormhole@1.1.0:
  2440 + resolution: {integrity: sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==}
  2441 + engines: {node: '>=4.0.0'}
  2442 +
2204 2443 streamsearch@1.1.0:
2205 2444 resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
2206 2445 engines: {node: '>=10.0.0'}
... ... @@ -2265,6 +2504,13 @@ packages:
2265 2504 text-decoder@1.2.7:
2266 2505 resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==}
2267 2506  
  2507 + thenify-all@1.6.0:
  2508 + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
  2509 + engines: {node: '>=0.8'}
  2510 +
  2511 + thenify@3.3.1:
  2512 + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
  2513 +
2268 2514 thread-stream@3.1.0:
2269 2515 resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==}
2270 2516  
... ... @@ -2272,6 +2518,9 @@ packages:
2272 2518 resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
2273 2519 engines: {node: '>=12.22'}
2274 2520  
  2521 + through@2.3.8:
  2522 + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
  2523 +
2275 2524 tinybench@2.9.0:
2276 2525 resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
2277 2526  
... ... @@ -2287,6 +2536,9 @@ packages:
2287 2536 resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==}
2288 2537 engines: {node: '>=14.0.0'}
2289 2538  
  2539 + to-arraybuffer@1.0.1:
  2540 + resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==}
  2541 +
2290 2542 toidentifier@1.0.1:
2291 2543 resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
2292 2544 engines: {node: '>=0.6'}
... ... @@ -2295,6 +2547,9 @@ packages:
2295 2547 resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==}
2296 2548 engines: {node: '>=14.16'}
2297 2549  
  2550 + toposort-class@1.0.1:
  2551 + resolution: {integrity: sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==}
  2552 +
2298 2553 tree-kill@1.2.2:
2299 2554 resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
2300 2555 hasBin: true
... ... @@ -2322,21 +2577,46 @@ packages:
2322 2577 undici-types@7.18.2:
2323 2578 resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
2324 2579  
  2580 + unescape@1.0.1:
  2581 + resolution: {integrity: sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==}
  2582 + engines: {node: '>=0.10.0'}
  2583 +
2325 2584 unpipe@1.0.0:
2326 2585 resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
2327 2586 engines: {node: '>= 0.8'}
2328 2587  
  2588 + urllib@2.44.0:
  2589 + resolution: {integrity: sha512-zRCJqdfYllRDA9bXUtx+vccyRqtJPKsw85f44zH7zPD28PIvjMqIgw9VwoTLV7xTBWZsbebUFVHU5ghQcWku2A==}
  2590 + engines: {node: '>= 0.10.0'}
  2591 + peerDependencies:
  2592 + proxy-agent: ^5.0.0
  2593 + peerDependenciesMeta:
  2594 + proxy-agent:
  2595 + optional: true
  2596 +
2329 2597 util-deprecate@1.0.2:
2330 2598 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
2331 2599  
  2600 + utility@1.18.0:
  2601 + resolution: {integrity: sha512-PYxZDA+6QtvRvm//++aGdmKG/cI07jNwbROz0Ql+VzFV1+Z0Dy55NI4zZ7RHc9KKpBePNFwoErqIuqQv/cjiTA==}
  2602 + engines: {node: '>= 0.12.0'}
  2603 +
2332 2604 utils-merge@1.0.1:
2333 2605 resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
2334 2606 engines: {node: '>= 0.4.0'}
2335 2607  
  2608 + uuid@8.3.2:
  2609 + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
  2610 + hasBin: true
  2611 +
2336 2612 uuid@9.0.1:
2337 2613 resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
2338 2614 hasBin: true
2339 2615  
  2616 + validator@13.15.26:
  2617 + resolution: {integrity: sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==}
  2618 + engines: {node: '>= 0.10'}
  2619 +
2340 2620 vary@1.1.2:
2341 2621 resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
2342 2622 engines: {node: '>= 0.8'}
... ... @@ -2491,6 +2771,13 @@ packages:
2491 2771 win-guid@0.2.1:
2492 2772 resolution: {integrity: sha512-gEIQU4mkgl2OPeoNrWflcJFJ3Ae2BPd4eCsHHA/XikslkIVms/nHhvnvzIZV7VLmBvtFlDOzLt9rrZT+n6D67A==}
2493 2773  
  2774 + win-release@1.1.1:
  2775 + resolution: {integrity: sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==}
  2776 + engines: {node: '>=0.10.0'}
  2777 +
  2778 + wkx@0.5.0:
  2779 + resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==}
  2780 +
2494 2781 wrap-ansi@6.2.0:
2495 2782 resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
2496 2783 engines: {node: '>=8'}
... ... @@ -2518,10 +2805,22 @@ packages:
2518 2805 utf-8-validate:
2519 2806 optional: true
2520 2807  
  2808 + xml2js@0.6.2:
  2809 + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==}
  2810 + engines: {node: '>=4.0.0'}
  2811 +
2521 2812 xmlbuilder@10.1.1:
2522 2813 resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==}
2523 2814 engines: {node: '>=4.0'}
2524 2815  
  2816 + xmlbuilder@11.0.1:
  2817 + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==}
  2818 + engines: {node: '>=4.0'}
  2819 +
  2820 + xtend@4.0.2:
  2821 + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
  2822 + engines: {node: '>=0.4'}
  2823 +
2525 2824 y18n@4.0.3:
2526 2825 resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
2527 2826  
... ... @@ -3077,18 +3376,26 @@ snapshots:
3077 3376 '@types/deep-eql': 4.0.2
3078 3377 assertion-error: 2.0.1
3079 3378  
  3379 + '@types/debug@4.1.13':
  3380 + dependencies:
  3381 + '@types/ms': 2.1.0
  3382 +
3080 3383 '@types/deep-eql@4.0.2': {}
3081 3384  
3082 3385 '@types/estree@1.0.8': {}
3083 3386  
3084 3387 '@types/long@4.0.2': {}
3085 3388  
  3389 + '@types/ms@2.1.0': {}
  3390 +
3086 3391 '@types/node@10.17.60': {}
3087 3392  
3088 3393 '@types/node@25.3.2':
3089 3394 dependencies:
3090 3395 undici-types: 7.18.2
3091 3396  
  3397 + '@types/validator@13.15.10': {}
  3398 +
3092 3399 '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@25.3.2))(vue@3.5.30)':
3093 3400 dependencies:
3094 3401 vite: 5.4.21(@types/node@25.3.2)
... ... @@ -3223,8 +3530,45 @@ snapshots:
3223 3530 mime-types: 2.1.35
3224 3531 negotiator: 0.6.3
3225 3532  
  3533 + address@1.2.2: {}
  3534 +
3226 3535 adm-zip@0.5.16: {}
3227 3536  
  3537 + agentkeepalive@3.5.3:
  3538 + dependencies:
  3539 + humanize-ms: 1.2.1
  3540 +
  3541 + ali-oss@6.23.0:
  3542 + dependencies:
  3543 + address: 1.2.2
  3544 + agentkeepalive: 3.5.3
  3545 + bowser: 1.9.4
  3546 + copy-to: 2.0.1
  3547 + dateformat: 2.2.0
  3548 + debug: 4.4.3
  3549 + destroy: 1.2.0
  3550 + end-or-error: 1.0.1
  3551 + get-ready: 1.0.0
  3552 + humanize-ms: 1.2.1
  3553 + is-type-of: 1.4.0
  3554 + js-base64: 2.6.4
  3555 + jstoxml: 2.2.9
  3556 + lodash: 4.17.23
  3557 + merge-descriptors: 1.0.3
  3558 + mime: 2.6.0
  3559 + platform: 1.3.6
  3560 + pump: 3.0.4
  3561 + qs: 6.15.0
  3562 + sdk-base: 2.0.1
  3563 + stream-http: 2.8.2
  3564 + stream-wormhole: 1.1.0
  3565 + urllib: 2.44.0
  3566 + utility: 1.18.0
  3567 + xml2js: 0.6.2
  3568 + transitivePeerDependencies:
  3569 + - proxy-agent
  3570 + - supports-color
  3571 +
3228 3572 ansi-regex@5.0.1: {}
3229 3573  
3230 3574 ansi-regex@6.2.2: {}
... ... @@ -3261,6 +3605,8 @@ snapshots:
3261 3605 vue-types: 3.0.2(vue@3.5.30)
3262 3606 warning: 4.0.3
3263 3607  
  3608 + any-promise@1.3.0: {}
  3609 +
3264 3610 append-field@1.0.0: {}
3265 3611  
3266 3612 archiver-utils@5.0.2:
... ... @@ -3309,6 +3655,8 @@ snapshots:
3309 3655  
3310 3656 atomic-sleep@1.0.0: {}
3311 3657  
  3658 + aws-ssl-profiles@1.1.2: {}
  3659 +
3312 3660 axios@1.13.5:
3313 3661 dependencies:
3314 3662 follow-redirects: 1.15.11
... ... @@ -3392,6 +3740,8 @@ snapshots:
3392 3740 transitivePeerDependencies:
3393 3741 - supports-color
3394 3742  
  3743 + bowser@1.9.4: {}
  3744 +
3395 3745 brace-expansion@2.0.2:
3396 3746 dependencies:
3397 3747 balanced-match: 1.0.2
... ... @@ -3412,6 +3762,8 @@ snapshots:
3412 3762 base64-js: 1.5.1
3413 3763 ieee754: 1.2.1
3414 3764  
  3765 + builtin-status-codes@3.0.0: {}
  3766 +
3415 3767 busboy@1.6.0:
3416 3768 dependencies:
3417 3769 streamsearch: 1.1.0
... ... @@ -3515,6 +3867,8 @@ snapshots:
3515 3867  
3516 3868 cookie@0.7.2: {}
3517 3869  
  3870 + copy-to@2.0.1: {}
  3871 +
3518 3872 core-js@3.48.0: {}
3519 3873  
3520 3874 core-util-is@1.0.3: {}
... ... @@ -3545,6 +3899,8 @@ snapshots:
3545 3899 dependencies:
3546 3900 '@babel/runtime': 7.28.6
3547 3901  
  3902 + dateformat@2.2.0: {}
  3903 +
3548 3904 dayjs@1.11.20: {}
3549 3905  
3550 3906 debug@2.6.9:
... ... @@ -3563,14 +3919,22 @@ snapshots:
3563 3919  
3564 3920 deep-extend@0.6.0: {}
3565 3921  
  3922 + default-user-agent@1.0.0:
  3923 + dependencies:
  3924 + os-name: 1.0.3
  3925 +
3566 3926 delayed-stream@1.0.0: {}
3567 3927  
  3928 + denque@2.1.0: {}
  3929 +
3568 3930 depd@2.0.0: {}
3569 3931  
3570 3932 destroy@1.2.0: {}
3571 3933  
3572 3934 detect-libc@2.1.2: {}
3573 3935  
  3936 + digest-header@1.1.0: {}
  3937 +
3574 3938 dijkstrajs@1.0.3: {}
3575 3939  
3576 3940 dingbat-to-unicode@1.0.1: {}
... ... @@ -3581,6 +3945,8 @@ snapshots:
3581 3945  
3582 3946 dotenv@16.6.1: {}
3583 3947  
  3948 + dottie@2.0.7: {}
  3949 +
3584 3950 duck@0.1.12:
3585 3951 dependencies:
3586 3952 underscore: 1.13.8
... ... @@ -3609,6 +3975,8 @@ snapshots:
3609 3975 dependencies:
3610 3976 once: 1.4.0
3611 3977  
  3978 + end-or-error@1.0.1: {}
  3979 +
3612 3980 entities@7.0.1: {}
3613 3981  
3614 3982 es-define-property@1.0.1: {}
... ... @@ -3751,6 +4119,10 @@ snapshots:
3751 4119 transitivePeerDependencies:
3752 4120 - supports-color
3753 4121  
  4122 + extend-shallow@2.0.1:
  4123 + dependencies:
  4124 + is-extendable: 0.1.1
  4125 +
3754 4126 fast-fifo@1.3.2: {}
3755 4127  
3756 4128 fdir@6.5.0(picomatch@4.0.3):
... ... @@ -3800,6 +4172,13 @@ snapshots:
3800 4172 hasown: 2.0.2
3801 4173 mime-types: 2.1.35
3802 4174  
  4175 + formstream@1.5.2:
  4176 + dependencies:
  4177 + destroy: 1.2.0
  4178 + mime: 2.6.0
  4179 + node-hex: 1.0.1
  4180 + pause-stream: 0.0.11
  4181 +
3803 4182 forwarded@0.2.0: {}
3804 4183  
3805 4184 fresh@0.5.2: {}
... ... @@ -3814,6 +4193,10 @@ snapshots:
3814 4193  
3815 4194 function-bind@1.1.2: {}
3816 4195  
  4196 + generate-function@2.3.1:
  4197 + dependencies:
  4198 + is-property: 1.0.2
  4199 +
3817 4200 get-caller-file@2.0.5: {}
3818 4201  
3819 4202 get-intrinsic@1.3.0:
... ... @@ -3834,6 +4217,8 @@ snapshots:
3834 4217 dunder-proto: 1.0.1
3835 4218 es-object-atoms: 1.1.1
3836 4219  
  4220 + get-ready@1.0.0: {}
  4221 +
3837 4222 github-from-package@0.0.0: {}
3838 4223  
3839 4224 glob@10.5.0:
... ... @@ -3877,36 +4262,66 @@ snapshots:
3877 4262 statuses: 2.0.2
3878 4263 toidentifier: 1.0.1
3879 4264  
  4265 + humanize-ms@1.2.1:
  4266 + dependencies:
  4267 + ms: 2.1.3
  4268 +
3880 4269 iconv-lite@0.4.24:
3881 4270 dependencies:
3882 4271 safer-buffer: 2.1.2
3883 4272  
  4273 + iconv-lite@0.6.3:
  4274 + dependencies:
  4275 + safer-buffer: 2.1.2
  4276 +
  4277 + iconv-lite@0.7.2:
  4278 + dependencies:
  4279 + safer-buffer: 2.1.2
  4280 +
3884 4281 ieee754@1.2.1: {}
3885 4282  
3886 4283 immediate@3.0.6: {}
3887 4284  
  4285 + inflection@1.13.4: {}
  4286 +
3888 4287 inherits@2.0.4: {}
3889 4288  
3890 4289 ini@1.3.8: {}
3891 4290  
3892 4291 ipaddr.js@1.9.1: {}
3893 4292  
  4293 + is-class-hotfix@0.0.6: {}
  4294 +
  4295 + is-extendable@0.1.1: {}
  4296 +
3894 4297 is-fullwidth-code-point@3.0.0: {}
3895 4298  
3896 4299 is-plain-object@3.0.1: {}
3897 4300  
  4301 + is-property@1.0.2: {}
  4302 +
3898 4303 is-stream@2.0.1: {}
3899 4304  
  4305 + is-type-of@1.4.0:
  4306 + dependencies:
  4307 + core-util-is: 1.0.3
  4308 + is-class-hotfix: 0.0.6
  4309 + isstream: 0.1.2
  4310 +
3900 4311 isarray@1.0.0: {}
3901 4312  
3902 4313 isexe@2.0.0: {}
3903 4314  
  4315 + isstream@0.1.2: {}
  4316 +
3904 4317 jackspeak@3.4.3:
3905 4318 dependencies:
3906 4319 '@isaacs/cliui': 8.0.2
3907 4320 optionalDependencies:
3908 4321 '@pkgjs/parseargs': 0.11.0
3909 4322  
  4323 + js-base64@2.6.4: {}
  4324 +
3910 4325 js-tokens@4.0.0: {}
3911 4326  
3912 4327 jsonwebtoken@9.0.3:
... ... @@ -3922,6 +4337,8 @@ snapshots:
3922 4337 ms: 2.1.3
3923 4338 semver: 7.7.4
3924 4339  
  4340 + jstoxml@2.2.9: {}
  4341 +
3925 4342 jszip@3.10.1:
3926 4343 dependencies:
3927 4344 lie: 3.3.0
... ... @@ -3998,6 +4415,8 @@ snapshots:
3998 4415  
3999 4416 lru-cache@11.2.6: {}
4000 4417  
  4418 + lru.min@1.1.4: {}
  4419 +
4001 4420 magic-string@0.30.21:
4002 4421 dependencies:
4003 4422 '@jridgewell/sourcemap-codec': 1.5.5
... ... @@ -4035,6 +4454,8 @@ snapshots:
4035 4454  
4036 4455 mime@1.6.0: {}
4037 4456  
  4457 + mime@2.6.0: {}
  4458 +
4038 4459 mimic-response@3.1.0: {}
4039 4460  
4040 4461 minimatch@5.1.9:
... ... @@ -4051,8 +4472,18 @@ snapshots:
4051 4472  
4052 4473 mkdirp-classic@0.5.3: {}
4053 4474  
  4475 + mkdirp@0.5.6:
  4476 + dependencies:
  4477 + minimist: 1.2.8
  4478 +
4054 4479 module-alias@2.3.4: {}
4055 4480  
  4481 + moment-timezone@0.5.48:
  4482 + dependencies:
  4483 + moment: 2.30.1
  4484 +
  4485 + moment@2.30.1: {}
  4486 +
4056 4487 ms@2.0.0: {}
4057 4488  
4058 4489 ms@2.1.3: {}
... ... @@ -4079,6 +4510,28 @@ snapshots:
4079 4510 transitivePeerDependencies:
4080 4511 - supports-color
4081 4512  
  4513 + mysql2@3.20.0(@types/node@25.3.2):
  4514 + dependencies:
  4515 + '@types/node': 25.3.2
  4516 + aws-ssl-profiles: 1.1.2
  4517 + denque: 2.1.0
  4518 + generate-function: 2.3.1
  4519 + iconv-lite: 0.7.2
  4520 + long: 5.3.2
  4521 + lru.min: 1.1.4
  4522 + named-placeholders: 1.1.6
  4523 + sql-escaper: 1.3.3
  4524 +
  4525 + mz@2.7.0:
  4526 + dependencies:
  4527 + any-promise: 1.3.0
  4528 + object-assign: 4.1.1
  4529 + thenify-all: 1.6.0
  4530 +
  4531 + named-placeholders@1.1.6:
  4532 + dependencies:
  4533 + lru.min: 1.1.4
  4534 +
4082 4535 nanoid@3.3.11: {}
4083 4536  
4084 4537 nanopop@2.4.2: {}
... ... @@ -4091,6 +4544,8 @@ snapshots:
4091 4544 dependencies:
4092 4545 semver: 7.7.4
4093 4546  
  4547 + node-hex@1.0.1: {}
  4548 +
4094 4549 normalize-path@3.0.0: {}
4095 4550  
4096 4551 object-assign@4.1.1: {}
... ... @@ -4111,6 +4566,15 @@ snapshots:
4111 4566  
4112 4567 option@0.2.4: {}
4113 4568  
  4569 + os-name@1.0.3:
  4570 + dependencies:
  4571 + osx-release: 1.1.0
  4572 + win-release: 1.1.1
  4573 +
  4574 + osx-release@1.1.0:
  4575 + dependencies:
  4576 + minimist: 1.2.8
  4577 +
4114 4578 p-limit@2.3.0:
4115 4579 dependencies:
4116 4580 p-try: 2.2.0
... ... @@ -4149,6 +4613,10 @@ snapshots:
4149 4613  
4150 4614 pathe@2.0.3: {}
4151 4615  
  4616 + pause-stream@0.0.11:
  4617 + dependencies:
  4618 + through: 2.3.8
  4619 +
4152 4620 pdf-parse@2.4.5:
4153 4621 dependencies:
4154 4622 '@napi-rs/canvas': 0.1.80
... ... @@ -4158,6 +4626,8 @@ snapshots:
4158 4626 optionalDependencies:
4159 4627 '@napi-rs/canvas': 0.1.80
4160 4628  
  4629 + pg-connection-string@2.12.0: {}
  4630 +
4161 4631 picocolors@1.1.1: {}
4162 4632  
4163 4633 picomatch@4.0.3: {}
... ... @@ -4182,6 +4652,8 @@ snapshots:
4182 4652 sonic-boom: 4.2.1
4183 4653 thread-stream: 3.1.0
4184 4654  
  4655 + platform@1.3.6: {}
  4656 +
4185 4657 playwright-core@1.58.1: {}
4186 4658  
4187 4659 playwright@1.58.1:
... ... @@ -4342,6 +4814,8 @@ snapshots:
4342 4814  
4343 4815 resize-observer-polyfill@1.5.1: {}
4344 4816  
  4817 + retry-as-promised@7.1.1: {}
  4818 +
4345 4819 rollup@4.57.1:
4346 4820 dependencies:
4347 4821 '@types/estree': 1.0.8
... ... @@ -4385,10 +4859,18 @@ snapshots:
4385 4859  
4386 4860 safer-buffer@2.1.2: {}
4387 4861  
  4862 + sax@1.6.0: {}
  4863 +
4388 4864 scroll-into-view-if-needed@2.2.31:
4389 4865 dependencies:
4390 4866 compute-scroll-into-view: 1.0.20
4391 4867  
  4868 + sdk-base@2.0.1:
  4869 + dependencies:
  4870 + get-ready: 1.0.0
  4871 +
  4872 + semver@5.7.2: {}
  4873 +
4392 4874 semver@7.7.4: {}
4393 4875  
4394 4876 send@0.19.2:
... ... @@ -4409,6 +4891,31 @@ snapshots:
4409 4891 transitivePeerDependencies:
4410 4892 - supports-color
4411 4893  
  4894 + sequelize-pool@7.1.0: {}
  4895 +
  4896 + sequelize@6.37.8(mysql2@3.20.0(@types/node@25.3.2)):
  4897 + dependencies:
  4898 + '@types/debug': 4.1.13
  4899 + '@types/validator': 13.15.10
  4900 + debug: 4.4.3
  4901 + dottie: 2.0.7
  4902 + inflection: 1.13.4
  4903 + lodash: 4.17.23
  4904 + moment: 2.30.1
  4905 + moment-timezone: 0.5.48
  4906 + pg-connection-string: 2.12.0
  4907 + retry-as-promised: 7.1.1
  4908 + semver: 7.7.4
  4909 + sequelize-pool: 7.1.0
  4910 + toposort-class: 1.0.1
  4911 + uuid: 8.3.2
  4912 + validator: 13.15.26
  4913 + wkx: 0.5.0
  4914 + optionalDependencies:
  4915 + mysql2: 3.20.0(@types/node@25.3.2)
  4916 + transitivePeerDependencies:
  4917 + - supports-color
  4918 +
4412 4919 serve-static@1.16.3:
4413 4920 dependencies:
4414 4921 encodeurl: 2.0.0
... ... @@ -4517,12 +5024,26 @@ snapshots:
4517 5024  
4518 5025 sprintf-js@1.0.3: {}
4519 5026  
  5027 + sql-escaper@1.3.3: {}
  5028 +
4520 5029 stackback@0.0.2: {}
4521 5030  
  5031 + statuses@1.5.0: {}
  5032 +
4522 5033 statuses@2.0.2: {}
4523 5034  
4524 5035 std-env@3.10.0: {}
4525 5036  
  5037 + stream-http@2.8.2:
  5038 + dependencies:
  5039 + builtin-status-codes: 3.0.0
  5040 + inherits: 2.0.4
  5041 + readable-stream: 2.3.8
  5042 + to-arraybuffer: 1.0.1
  5043 + xtend: 4.0.2
  5044 +
  5045 + stream-wormhole@1.1.0: {}
  5046 +
4526 5047 streamsearch@1.1.0: {}
4527 5048  
4528 5049 streamx@2.23.0:
... ... @@ -4617,12 +5138,22 @@ snapshots:
4617 5138 transitivePeerDependencies:
4618 5139 - react-native-b4a
4619 5140  
  5141 + thenify-all@1.6.0:
  5142 + dependencies:
  5143 + thenify: 3.3.1
  5144 +
  5145 + thenify@3.3.1:
  5146 + dependencies:
  5147 + any-promise: 1.3.0
  5148 +
4620 5149 thread-stream@3.1.0:
4621 5150 dependencies:
4622 5151 real-require: 0.2.0
4623 5152  
4624 5153 throttle-debounce@5.0.2: {}
4625 5154  
  5155 + through@2.3.8: {}
  5156 +
4626 5157 tinybench@2.9.0: {}
4627 5158  
4628 5159 tinyexec@1.0.2: {}
... ... @@ -4634,6 +5165,8 @@ snapshots:
4634 5165  
4635 5166 tinyrainbow@3.0.3: {}
4636 5167  
  5168 + to-arraybuffer@1.0.1: {}
  5169 +
4637 5170 toidentifier@1.0.1: {}
4638 5171  
4639 5172 token-types@6.1.2:
... ... @@ -4642,6 +5175,8 @@ snapshots:
4642 5175 '@tokenizer/token': 0.3.0
4643 5176 ieee754: 1.2.1
4644 5177  
  5178 + toposort-class@1.0.1: {}
  5179 +
4645 5180 tree-kill@1.2.2: {}
4646 5181  
4647 5182 tslib@2.8.1: {}
... ... @@ -4663,14 +5198,45 @@ snapshots:
4663 5198  
4664 5199 undici-types@7.18.2: {}
4665 5200  
  5201 + unescape@1.0.1:
  5202 + dependencies:
  5203 + extend-shallow: 2.0.1
  5204 +
4666 5205 unpipe@1.0.0: {}
4667 5206  
  5207 + urllib@2.44.0:
  5208 + dependencies:
  5209 + any-promise: 1.3.0
  5210 + content-type: 1.0.5
  5211 + default-user-agent: 1.0.0
  5212 + digest-header: 1.1.0
  5213 + ee-first: 1.1.1
  5214 + formstream: 1.5.2
  5215 + humanize-ms: 1.2.1
  5216 + iconv-lite: 0.6.3
  5217 + pump: 3.0.4
  5218 + qs: 6.15.0
  5219 + statuses: 1.5.0
  5220 + utility: 1.18.0
  5221 +
4668 5222 util-deprecate@1.0.2: {}
4669 5223  
  5224 + utility@1.18.0:
  5225 + dependencies:
  5226 + copy-to: 2.0.1
  5227 + escape-html: 1.0.3
  5228 + mkdirp: 0.5.6
  5229 + mz: 2.7.0
  5230 + unescape: 1.0.1
  5231 +
4670 5232 utils-merge@1.0.1: {}
4671 5233  
  5234 + uuid@8.3.2: {}
  5235 +
4672 5236 uuid@9.0.1: {}
4673 5237  
  5238 + validator@13.15.26: {}
  5239 +
4674 5240 vary@1.1.2: {}
4675 5241  
4676 5242 vite@5.4.21(@types/node@25.3.2):
... ... @@ -4774,6 +5340,14 @@ snapshots:
4774 5340  
4775 5341 win-guid@0.2.1: {}
4776 5342  
  5343 + win-release@1.1.1:
  5344 + dependencies:
  5345 + semver: 5.7.2
  5346 +
  5347 + wkx@0.5.0:
  5348 + dependencies:
  5349 + '@types/node': 25.3.2
  5350 +
4777 5351 wrap-ansi@6.2.0:
4778 5352 dependencies:
4779 5353 ansi-styles: 4.3.0
... ... @@ -4796,8 +5370,17 @@ snapshots:
4796 5370  
4797 5371 ws@8.19.0: {}
4798 5372  
  5373 + xml2js@0.6.2:
  5374 + dependencies:
  5375 + sax: 1.6.0
  5376 + xmlbuilder: 11.0.1
  5377 +
4799 5378 xmlbuilder@10.1.1: {}
4800 5379  
  5380 + xmlbuilder@11.0.1: {}
  5381 +
  5382 + xtend@4.0.2: {}
  5383 +
4801 5384 y18n@4.0.3: {}
4802 5385  
4803 5386 y18n@5.0.8: {}
... ...
server/routes/company.js
... ... @@ -341,6 +341,86 @@ router.post(&#39;/templates/:templateId/skills/upload&#39;, skillUpload.array(&#39;files&#39;, 5
341 341 }
342 342 });
343 343  
  344 +/**
  345 + * POST /api/company/templates/:templateId/provision
  346 + * 系统级依赖安装 — 绕过 ACP,直接 shell 执行
  347 + *
  348 + * Body: { commands: ["pip install rembg", "npm install ..."], agentDir?: string }
  349 + * - commands: 要执行的 shell 命令数组
  350 + * - agentDir: 可选,指定公司 agent 目录(不传则在 template 目录执行)
  351 + *
  352 + * 特点:
  353 + * 1. 不走 Claude CLI / ACP,不受 45s idle timeout 限制
  354 + * 2. 用 child_process.exec 同步执行,每个命令独立超时 10 分钟
  355 + * 3. 返回每个命令的 stdout/stderr 供前端展示
  356 + */
  357 +router.post('/templates/:templateId/provision', async (req, res) => {
  358 + try {
  359 + const { templateId } = req.params;
  360 + const { commands, agentDir } = req.body;
  361 + const { exec } = require('child_process');
  362 + const { promisify } = require('util');
  363 + const execAsync = promisify(exec);
  364 +
  365 + if (!commands || !Array.isArray(commands) || commands.length === 0) {
  366 + return res.status(400).json({ error: '请提供 commands 数组' });
  367 + }
  368 +
  369 + // 确定工作目录
  370 + const TEMPLATES_DIR = path.resolve(__dirname, '../../data/system/templates');
  371 + let workDir;
  372 + if (agentDir) {
  373 + // 公司 agent 目录
  374 + workDir = path.resolve(__dirname, '../../', agentDir);
  375 + } else {
  376 + workDir = path.join(TEMPLATES_DIR, templateId);
  377 + }
  378 +
  379 + if (!fs.existsSync(workDir)) {
  380 + return res.status(404).json({ error: `目录不存在: ${workDir}` });
  381 + }
  382 +
  383 + // 安全检查:禁止危险命令
  384 + const BLOCKED_PATTERNS = [/rm\s+-rf\s+\//, /mkfs/, /dd\s+if=/, />\s*\/dev\//];
  385 + for (const cmd of commands) {
  386 + if (BLOCKED_PATTERNS.some(p => p.test(cmd))) {
  387 + return res.status(400).json({ error: `命令被安全策略拒绝: ${cmd}` });
  388 + }
  389 + }
  390 +
  391 + console.log(`[Provision] 🔧 ${templateId}: 开始执行 ${commands.length} 个系统命令`);
  392 +
  393 + const results = [];
  394 + for (const cmd of commands) {
  395 + console.log(`[Provision] ▶ ${cmd}`);
  396 + try {
  397 + const { stdout, stderr } = await execAsync(cmd, {
  398 + cwd: workDir,
  399 + timeout: 10 * 60 * 1000, // 每个命令最多 10 分钟
  400 + maxBuffer: 10 * 1024 * 1024, // 10MB output buffer
  401 + env: { ...process.env, PIP_PROGRESS_BAR: 'off' },
  402 + });
  403 + results.push({ command: cmd, status: 'success', stdout: stdout.slice(-2000), stderr: stderr.slice(-1000) });
  404 + console.log(`[Provision] ✅ ${cmd} 完成`);
  405 + } catch (err) {
  406 + results.push({ command: cmd, status: 'error', error: err.message, stdout: err.stdout?.slice(-2000), stderr: err.stderr?.slice(-1000) });
  407 + console.error(`[Provision] ❌ ${cmd} 失败:`, err.message);
  408 + }
  409 + }
  410 +
  411 + const allOk = results.every(r => r.status === 'success');
  412 + res.json({
  413 + success: allOk,
  414 + templateId,
  415 + workDir,
  416 + results,
  417 + });
  418 + } catch (err) {
  419 + console.error('[Provision] Error:', err);
  420 + res.status(500).json({ error: err.message });
  421 + }
  422 +});
  423 +
344 424 // GET /api/company/templates/:templateId/logs — 获取模板相关的 agent-creator / innovator 执行日志
345 425 router.get('/templates/:templateId/logs', (req, res) => {
346 426 try {
... ...
web/src/views/TemplateAgents.vue
... ... @@ -114,6 +114,9 @@
114 114 <button class="action-btn action-upload" :disabled="actionStatus === 'uploading'" @click="$refs.skillFileInput.click()">
115 115 {{ actionStatus === 'uploading' ? '⏳ 导入中...' : '📥 导入 Skill (ZIP/文件)' }}
116 116 </button>
  117 + <button class="action-btn action-provision" :disabled="actionStatus === 'provisioning'" @click="triggerProvision">
  118 + {{ actionStatus === 'provisioning' ? '⏳ 安装中...' : '🔧 安装依赖' }}
  119 + </button>
117 120 <button class="action-btn action-generate" :disabled="actionStatus !== null" @click="triggerGenerate">
118 121 {{ actionStatus === 'generating' ? '⏳ 生成中...' : '🤖 Agent Creator 生成定义' }}
119 122 </button>
... ... @@ -129,6 +132,7 @@
129 132 <span v-if="actionStatus === 'generating'">🤖 Agent Creator 正在为该模板生成定义文件,请稍候后刷新文件树查看结果...</span>
130 133 <span v-else-if="actionStatus === 'training'">🎓 Innovator 正在训练该模板,训练完成后 Benchmark 评分将自动更新...</span>
131 134 <span v-else-if="actionStatus === 'uploading'">📥 正在导入 Skill 文件,请稍候...</span>
  135 + <span v-else-if="actionStatus === 'provisioning'">🔧 正在安装依赖,请稍候(可能需要几分钟)...</span>
132 136 <span v-else-if="actionStatus === 'done'">✅ {{ actionMessage }}</span>
133 137 <span v-else-if="actionStatus === 'error'">❌ {{ actionMessage }}</span>
134 138 <button class="status-close" @click="actionStatus = null">✕</button>
... ... @@ -509,6 +513,42 @@ async function loadTemplateLogs(id) {
509 513 } catch (e) { console.error(e) }
510 514 }
511 515  
  516 +async function triggerProvision() {
  517 + if (!selectedTemplateId.value) return;
  518 +
  519 + const input = window.prompt(
  520 + '请输入要执行的系统命令(每行一个):\n\n示例:\npip install rembg\nnpm install -g sequelize mysql2\npip install ali-oss sharp',
  521 + 'pip install rembg'
  522 + );
  523 + if (!input || !input.trim()) return;
  524 +
  525 + const commands = input.split('\n').map(l => l.trim()).filter(Boolean);
  526 + if (commands.length === 0) return;
  527 +
  528 + actionStatus.value = 'provisioning';
  529 + try {
  530 + const { data } = await axios.post(
  531 + `/api/company/templates/${selectedTemplateId.value}/provision`,
  532 + { commands }
  533 + );
  534 +
  535 + const successCount = data.results.filter(r => r.status === 'success').length;
  536 + const failCount = data.results.filter(r => r.status === 'error').length;
  537 +
  538 + if (data.success) {
  539 + actionStatus.value = 'done';
  540 + actionMessage.value = `依赖安装完成: ${successCount} 个命令全部成功`;
  541 + } else {
  542 + actionStatus.value = 'error';
  543 + const errors = data.results.filter(r => r.status === 'error').map(r => `${r.command}: ${r.error}`).join('\n');
  544 + actionMessage.value = `部分命令失败 (${successCount}成功/${failCount}失败): ${errors.slice(0, 200)}`;
  545 + }
  546 + } catch (e) {
  547 + actionStatus.value = 'error';
  548 + actionMessage.value = e.response?.data?.error || e.message;
  549 + }
  550 +}
  551 +
512 552 function formatLogTime(ts) {
513 553 if (!ts) return ''
514 554 const d = new Date(ts)
... ... @@ -743,6 +783,8 @@ onMounted(() =&gt; {
743 783 .action-train:hover:not(:disabled) { background: rgba(139,92,246,0.2); box-shadow: 0 3px 10px rgba(139,92,246,0.15); }
744 784 .action-upload { background: rgba(245,158,11,0.1); color: #f59e0b; border-color: rgba(245,158,11,0.2); }
745 785 .action-upload:hover:not(:disabled) { background: rgba(245,158,11,0.2); box-shadow: 0 3px 10px rgba(245,158,11,0.15); }
  786 +.action-provision { background: rgba(20,184,166,0.1); color: #14b8a6; border-color: rgba(20,184,166,0.2); }
  787 +.action-provision:hover:not(:disabled) { background: rgba(20,184,166,0.2); box-shadow: 0 3px 10px rgba(20,184,166,0.15); }
746 788  
747 789 /* Status Banner */
748 790 .status-banner {
... ...