@lingjingai/lj-awb-cli-pre 0.4.0 → 0.4.6

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.
@@ -52,6 +52,7 @@ function requestSummary(request = {}) {
52
52
  const promptParams = request.promptParams || {};
53
53
  return compactRecord({
54
54
  requestSource: request.requestSource,
55
+ objectName: request.objectName,
55
56
  modelCode: request.modelCode,
56
57
  modelGroupCode: request.modelGroupCode,
57
58
  projectGroupNo: request.projectGroupNo,
@@ -121,16 +122,38 @@ function normalizeAuthStatus(data = {}) {
121
122
  }
122
123
 
123
124
  function normalizeAuthLogin(data = {}) {
125
+ const userId = data.user?.userId;
126
+ const userName = data.user?.userName;
127
+ const userDisplay = userName
128
+ ? (userId ? `${userName} (${userId})` : userName)
129
+ : (userId || undefined);
124
130
  return compactRecord({
131
+ loginMethod: data.loginMethod,
132
+ status: data.status,
125
133
  saved: data.saved ?? Boolean(data.auth || data.accessKey),
126
134
  verified: data.verified,
127
135
  accessKey: data.accessKey || data.auth?.accessKey,
128
136
  source: data.auth ? [data.auth.accessKeySource, data.auth.accessKeySourceName].filter(Boolean).join('/') : undefined,
137
+ userDisplay,
138
+ userId,
139
+ userName,
140
+ groupId: data.user?.groupId,
141
+ groupName: data.user?.groupName,
129
142
  user: data.user,
143
+ flowId: data.flowId,
144
+ verifyUrl: data.verifyUrl,
145
+ nextCommand: data.nextCommand,
130
146
  dryRun: data.dryRun,
131
147
  });
132
148
  }
133
149
 
150
+ function normalizeAuthLogout(data = {}) {
151
+ return compactRecord({
152
+ loggedOut: data.loggedOut,
153
+ authPath: data.authPath,
154
+ });
155
+ }
156
+
134
157
  function normalizeDryRunResult(row = {}) {
135
158
  if (!isPlainObject(row) || !row.dryRun) return cleanNested(row);
136
159
  const localFiles = Array.isArray(row.localFiles) ? row.localFiles : (row.localFile ? [row.localFile] : []);
@@ -158,6 +181,26 @@ function normalizeDryRun(data = {}) {
158
181
  resourceConversion: Array.isArray(resourceConversions) && resourceConversions.length === 1
159
182
  ? `${resourceConversions[0].resource || 'resource'} ${resourceConversions[0].fromFormat}->${resourceConversions[0].toFormat}`
160
183
  : undefined,
184
+ validationLegal: data.validation?.legal,
185
+ conversionRequired: Boolean(data.conversionPlan),
186
+ converted: Boolean(data.conversion?.converted),
187
+ conversionReason: data.conversionPlan?.reason ?? data.conversion?.reason ?? (Array.isArray(data.validation?.violations) ? data.validation.violations.map((item) => item.message).join(';') : undefined),
188
+ conversionTargetFormat: data.conversionPlan?.toFormat ?? data.conversion?.toFormat,
189
+ conversionTargetWidth: data.conversionPlan?.targetWidth ?? data.conversion?.targetWidth,
190
+ conversionTargetHeight: data.conversionPlan?.targetHeight ?? data.conversion?.targetHeight,
191
+ conversionTargetPixels: data.conversionPlan?.targetPixels ?? data.conversion?.targetPixels,
192
+ conversionTargetFps: data.conversionPlan?.targetFps ?? data.conversion?.targetFps,
193
+ conversionTargetDuration: data.conversionPlan?.targetDuration ?? data.conversion?.targetDuration,
194
+ conversionTarget: data.conversionPlan
195
+ ? compactRecord({
196
+ format: data.conversionPlan.toFormat,
197
+ width: data.conversionPlan.targetWidth,
198
+ height: data.conversionPlan.targetHeight,
199
+ pixels: data.conversionPlan.targetPixels,
200
+ fps: data.conversionPlan.targetFps,
201
+ duration: data.conversionPlan.targetDuration,
202
+ })
203
+ : undefined,
161
204
  fileCount: Array.isArray(data.files) ? data.files.length : undefined,
162
205
  assetCount: Array.isArray(data.assets) ? data.assets.length : undefined,
163
206
  files: data.files,
@@ -168,10 +211,19 @@ function normalizeDryRun(data = {}) {
168
211
  });
169
212
  }
170
213
 
171
- function normalizeTaskSubmission(data = {}) {
214
+ function submissionStatusCommand(commandName, data = {}) {
215
+ if (!data?.taskId) return null;
216
+ if (commandName === 'create image') return `${commandPrefix()} task image-status --task-id ${data.taskId}`;
217
+ if (commandName === 'create video') return `${commandPrefix()} task video-status --task-id ${data.taskId}`;
218
+ return null;
219
+ }
220
+
221
+ function normalizeTaskSubmission(commandName, data = {}) {
222
+ const statusCommand = rewriteCommandPrefix(data.statusCommand || submissionStatusCommand(commandName, data));
172
223
  return compactRecord({
173
224
  taskId: data.taskId,
174
225
  taskType: data.taskType,
226
+ objectName: data.objectName,
175
227
  modelGroupCode: data.modelGroupCode,
176
228
  projectGroupNo: data.projectGroupNo,
177
229
  pointNo: data.pointNo,
@@ -184,6 +236,7 @@ function normalizeTaskSubmission(data = {}) {
184
236
  projectBudgetRemainingAfter: data.projectBudgetRemainingAfter ?? data.projectPointRemainingAfter,
185
237
  uploadCount: Array.isArray(data.uploads) ? data.uploads.length : undefined,
186
238
  nextCommand: rewriteCommandPrefix(data.nextCommand),
239
+ statusCommand,
187
240
  waited: data.waited ? normalizeTaskStatus(data.waited) : undefined,
188
241
  });
189
242
  }
@@ -207,6 +260,7 @@ function normalizeSubtitleSubmission(data = {}) {
207
260
 
208
261
  function normalizeFee(data = {}) {
209
262
  return compactRecord({
263
+ objectName: data.objectName,
210
264
  modelGroupCode: data.modelGroupCode,
211
265
  projectGroupNo: data.projectGroupNo,
212
266
  pointCost: data.pointCost,
@@ -334,6 +388,7 @@ function normalizeSubjectVoice(data = {}) {
334
388
  }
335
389
 
336
390
  function normalizeAsset(data = {}) {
391
+ const conversion = data.conversionPlan ?? data.conversion ?? null;
337
392
  return compactRecord({
338
393
  created: data.created,
339
394
  updated: data.updated,
@@ -341,9 +396,30 @@ function normalizeAsset(data = {}) {
341
396
  groupId: data.groupId,
342
397
  assetId: data.assetId,
343
398
  platform: data.platform,
399
+ assetType: data.assetType,
344
400
  name: data.name,
345
401
  projectName: data.projectName,
346
402
  assetPath: data.assetPath,
403
+ validationLegal: data.validation?.legal ?? (data.conversion ? true : undefined),
404
+ conversionRequired: Boolean(data.conversionPlan ?? data.conversion),
405
+ converted: Boolean(data.conversion?.converted),
406
+ conversionReason: conversion?.reason,
407
+ conversionTargetFormat: conversion?.toFormat,
408
+ conversionTargetWidth: conversion?.targetWidth,
409
+ conversionTargetHeight: conversion?.targetHeight,
410
+ conversionTargetPixels: conversion?.targetPixels,
411
+ conversionTargetFps: conversion?.targetFps,
412
+ conversionTargetDuration: conversion?.targetDuration,
413
+ conversionTarget: conversion
414
+ ? compactRecord({
415
+ format: conversion.toFormat,
416
+ width: conversion.targetWidth,
417
+ height: conversion.targetHeight,
418
+ pixels: conversion.targetPixels,
419
+ fps: conversion.targetFps,
420
+ duration: conversion.targetDuration,
421
+ })
422
+ : undefined,
347
423
  uploadBackendPath: data.upload?.backendPath,
348
424
  uploadUrl: data.upload?.url,
349
425
  });
@@ -497,6 +573,8 @@ export function normalizeOutputData(commandName, data) {
497
573
  return normalizeAuthStatus(data);
498
574
  case 'auth login':
499
575
  return normalizeAuthLogin(data);
576
+ case 'auth logout':
577
+ return normalizeAuthLogout(data);
500
578
  default:
501
579
  break;
502
580
  }
@@ -504,11 +582,13 @@ export function normalizeOutputData(commandName, data) {
504
582
  switch (commandName) {
505
583
  case 'create image':
506
584
  case 'create video':
507
- return normalizeTaskSubmission(data);
585
+ case 'create video-super-resolution':
586
+ return normalizeTaskSubmission(commandName, data);
508
587
  case 'create video-subtitle-removal':
509
588
  return normalizeSubtitleSubmission(data);
510
589
  case 'create image-fee':
511
590
  case 'create video-fee':
591
+ case 'create video-super-resolution-fee':
512
592
  return normalizeFee(data);
513
593
  case 'account info':
514
594
  return normalizeAccountInfo(data);
@@ -526,6 +606,7 @@ export function normalizeOutputData(commandName, data) {
526
606
  case 'task video-status':
527
607
  case 'task wait':
528
608
  case 'task video-subtitle-status':
609
+ case 'task video-super-resolution-status':
529
610
  return normalizeTaskStatus(data);
530
611
  case 'create subject':
531
612
  case 'create subject-wait':
@@ -559,6 +640,8 @@ export function normalizeOutputData(commandName, data) {
559
640
  return normalizeList(data, ['subjects']);
560
641
  case 'create subject-voice-list':
561
642
  return normalizeList(data, ['voices']);
643
+ case 'update':
644
+ return normalizeUpdateResult(data);
562
645
  default:
563
646
  break;
564
647
  }
@@ -647,6 +730,22 @@ function normalizeArtifactByCommand(commandName, data) {
647
730
  return cleanNested(data);
648
731
  }
649
732
 
733
+ function normalizeUpdateResult(data = {}) {
734
+ return compactRecord({
735
+ checked: data.checked,
736
+ updated: data.updated,
737
+ updateAvailable: data.updateAvailable,
738
+ packageName: data.packageName,
739
+ previousVersion: data.previousVersion,
740
+ currentVersion: data.currentVersion,
741
+ latestVersion: data.latestVersion,
742
+ command: rewriteCommandPrefix(data.command),
743
+ skillUpdated: data.skillUpdated,
744
+ restartRecommended: data.restartRecommended,
745
+ message: data.message,
746
+ });
747
+ }
748
+
650
749
  export function normalizeJsonData(commandName, data) {
651
750
  if (!isPlainObject(data)) return rewriteNested(data);
652
751
  if (data.dryRun) return rewriteNested(data);
@@ -1200,6 +1299,16 @@ function formatModelCreateSpecOutput(data = {}) {
1200
1299
  }
1201
1300
  pushSectionCount(lines, 'examples', examples.length);
1202
1301
  for (const [index, example] of examples.entries()) pushSectionItem(lines, index, rewriteCommandPrefix(example));
1302
+ const userParams = Array.isArray(data.parameterControls?.userParams) ? data.parameterControls.userParams : [];
1303
+ pushSectionCount(lines, 'params', userParams.length);
1304
+ for (const [index, param] of userParams.entries()) {
1305
+ pushSectionRecordItem(lines, index, {
1306
+ key: param.key,
1307
+ cliArg: param.cliArg,
1308
+ values: valueList(param.allowedValues),
1309
+ generic: param.genericModelParam,
1310
+ }, ['key', 'cliArg', 'values', 'generic']);
1311
+ }
1203
1312
  lines.push('next:');
1204
1313
  if (data.optionsCommand) pushSectionKeyValue(lines, 'options', `${commandPrefix()} ${data.optionsCommand}`);
1205
1314
  const feeNext = modelFeeNextCommand(data);
@@ -1291,6 +1400,8 @@ const OUTPUT_KIND_BY_COMMAND = {
1291
1400
  'project ensure': 'generic',
1292
1401
  'credits balance': 'credits_balance',
1293
1402
  'credits usage': 'credits_usage',
1403
+ 'credits buy': 'purchase_guide',
1404
+ 'credits redeem': 'redeem_result',
1294
1405
  'model image-models': 'model_list',
1295
1406
  'model video-models': 'model_list',
1296
1407
  'model asset-review-models': 'asset_review_model_list',
@@ -1305,9 +1416,12 @@ const OUTPUT_KIND_BY_COMMAND = {
1305
1416
  'create video-fee': 'fee_estimate',
1306
1417
  'create video': 'task_submission',
1307
1418
  'create video-batch': 'batch_task_submission',
1419
+ 'create video-super-resolution-fee': 'fee_estimate',
1420
+ 'create video-super-resolution': 'task_submission',
1308
1421
  'task video-status': 'task_status',
1309
1422
  'create video-subtitle-removal': 'subtitle_task_submission',
1310
1423
  'task video-subtitle-status': 'subtitle_task_status',
1424
+ 'task video-super-resolution-status': 'task_status',
1311
1425
  'task list': 'task_list',
1312
1426
  'task wait': 'task_status',
1313
1427
  'task records': 'local_task_records',
@@ -1376,6 +1490,7 @@ const OUTPUT_KIND_BY_COMMAND = {
1376
1490
  'create subject-voice': 'subject_voice_create_result',
1377
1491
  'create subject-voice-wait': 'subject_voice_status',
1378
1492
  'create subject-batch': 'batch_subject_publish_result',
1493
+ update: 'update_result',
1379
1494
  };
1380
1495
 
1381
1496
  const KIND_TITLES = {
@@ -1412,6 +1527,8 @@ const KIND_TITLES = {
1412
1527
  project_list: '项目组列表',
1413
1528
  project_summary: '项目组摘要',
1414
1529
  project_user_list: '项目组成员',
1530
+ purchase_guide: '购买引导',
1531
+ redeem_result: '兑换结果',
1415
1532
  subject_list: '主体列表',
1416
1533
  subject_publish_result: '主体创建结果',
1417
1534
  subject_status: '主体状态',
@@ -1424,13 +1541,16 @@ const KIND_TITLES = {
1424
1541
  task_status: '任务状态',
1425
1542
  task_submission: '任务提交结果',
1426
1543
  team_list: '团队列表',
1544
+ update_result: 'CLI 更新',
1427
1545
  upload_result: '上传结果',
1428
1546
  };
1429
1547
 
1430
1548
  const COMMAND_TITLES = {
1431
1549
  doctor: '环境体检',
1432
1550
  schema: '命令 Schema',
1551
+ update: 'CLI 更新',
1433
1552
  'auth clear': '清空认证结果',
1553
+ 'auth logout': '退出登录结果',
1434
1554
  'account switch-team': '团队切换结果',
1435
1555
  'project use': '项目组切换结果',
1436
1556
  'project create': '项目组创建结果',
@@ -1440,6 +1560,8 @@ const COMMAND_TITLES = {
1440
1560
  'create video': '生视频任务提交结果',
1441
1561
  'create image-batch': '批量生图提交结果',
1442
1562
  'create video-batch': '批量生视频提交结果',
1563
+ 'create video-super-resolution-fee': '视频超分积分预估',
1564
+ 'create video-super-resolution': '视频超分任务提交结果',
1443
1565
  'create video-subtitle-removal': '去字幕任务提交结果',
1444
1566
  'create subject': '主体创建结果',
1445
1567
  'create subject-wait': '主体状态',
@@ -1460,6 +1582,17 @@ const FIELD_LABELS = {
1460
1582
  assetKind: '素材类型',
1461
1583
  assetName: '素材名',
1462
1584
  assetPath: '素材路径',
1585
+ assetType: '素材类型',
1586
+ converted: '已转码',
1587
+ conversionReason: '转码原因',
1588
+ conversionRequired: '需要转码',
1589
+ conversionTargetDuration: '目标时长',
1590
+ conversionTargetFormat: '目标格式',
1591
+ conversionTargetFps: '目标帧率',
1592
+ conversionTargetHeight: '目标高度',
1593
+ conversionTargetPixels: '目标像素',
1594
+ conversionTargetWidth: '目标宽度',
1595
+ validationLegal: '规格合法',
1463
1596
  authType: '认证方式',
1464
1597
  backendPath: '后端路径',
1465
1598
  batchCount: '批次数',
@@ -1467,6 +1600,11 @@ const FIELD_LABELS = {
1467
1600
  billingPointRemainingAfter: '扣除后可扣积分',
1468
1601
  checkedAt: '检查时间',
1469
1602
  cleared: '已清空',
1603
+ loggedOut: '已退出登录',
1604
+ authPath: '认证文件',
1605
+ purchaseUrl: '购买链接',
1606
+ redeemed: '已兑换',
1607
+ redemptionCode: '兑换码',
1470
1608
  clipCount: 'Clip 数',
1471
1609
  clipId: 'Clip ID',
1472
1610
  command: '命令',
@@ -1518,6 +1656,7 @@ const FIELD_LABELS = {
1518
1656
  nextCommand: '下一步命令',
1519
1657
  nextRefSubject: '主体引用参数',
1520
1658
  nextVoiceArg: '音色参数',
1659
+ objectName: '对象路径',
1521
1660
  originUrls: '原始素材',
1522
1661
  parentKey: '父级 Key',
1523
1662
  platform: '平台',
@@ -1558,6 +1697,7 @@ const FIELD_LABELS = {
1558
1697
  sourceTaskId: '来源任务 ID',
1559
1698
  stateKey: '状态 Key',
1560
1699
  status: '状态',
1700
+ statusCommand: '状态查询命令',
1561
1701
  statusCommandTaskType: '状态任务类型',
1562
1702
  submitted: '已提交',
1563
1703
  successRate: '成功率',
@@ -1570,6 +1710,7 @@ const FIELD_LABELS = {
1570
1710
  timedOut: '已超时',
1571
1711
  title: '标题',
1572
1712
  updated: '已更新',
1713
+ userDisplay: '用户',
1573
1714
  userId: '用户 ID',
1574
1715
  userName: '用户名',
1575
1716
  verification: '验证方式',
@@ -1587,11 +1728,18 @@ const FIELD_LABELS = {
1587
1728
  commandCount: '命令数',
1588
1729
  commandFilter: '命令过滤',
1589
1730
  commonFieldCount: '通用字段数',
1731
+ currentVersion: '当前版本',
1590
1732
  domainFilter: '领域过滤',
1733
+ latestVersion: '最新版本',
1591
1734
  nodeVersion: 'Node 版本',
1735
+ packageName: '包名',
1736
+ previousVersion: '更新前版本',
1592
1737
  resourceFieldCount: '资源字段数',
1593
1738
  resourceRuleCount: '资源规则数',
1739
+ restartRecommended: '建议重启',
1594
1740
  schemaVersion: 'Schema 版本',
1741
+ skillUpdated: 'Skill 已更新',
1742
+ updateAvailable: '有新版本',
1595
1743
  version: '版本',
1596
1744
  type: '类型',
1597
1745
  message: '消息',
@@ -1617,8 +1765,8 @@ const DETAIL_FIELDS_BY_KIND = {
1617
1765
  artifact_write_result: ['id', 'projectId', 'rowKind', 'entityKey', 'parentKey', 'actorKey', 'propKey', 'locationKey', 'stateKey', 'episodeId', 'sceneId', 'clipId', 'videoEpisodeId', 'status', 'title', 'name', 'displayName'],
1618
1766
  asset_group_detail: ['groupId', 'platform', 'name', 'projectName', 'description', 'status', 'assetCount'],
1619
1767
  asset_group_write_result: ['created', 'updated', 'groupId', 'platform', 'name', 'projectName', 'assetPath'],
1620
- asset_register_result: ['created', 'updated', 'registered', 'assetId', 'groupId', 'platform', 'name', 'projectName', 'assetPath', 'uploadBackendPath', 'uploadUrl'],
1621
- auth_result: ['saved', 'verified', 'accessKey', 'source', 'dryRun', 'userId', 'userName', 'groupId', 'groupName'],
1768
+ asset_register_result: ['created', 'updated', 'registered', 'assetId', 'groupId', 'platform', 'assetType', 'name', 'projectName', 'assetPath', 'validationLegal', 'conversionRequired', 'converted', 'conversionReason', 'conversionTargetFormat', 'conversionTargetWidth', 'conversionTargetHeight', 'conversionTargetPixels', 'conversionTargetFps', 'conversionTargetDuration', 'uploadBackendPath', 'uploadUrl'],
1769
+ auth_result: ['userDisplay', 'loggedOut', 'saved', 'verified', 'accessKey', 'source', 'dryRun', 'groupName', 'authPath'],
1622
1770
  auth_status: ['configured', 'authType', 'accessKey', 'source', 'verified', 'verification', 'verifyCommand', 'userId', 'userName', 'groupId', 'groupName'],
1623
1771
  batch_subject_publish_result: ['dryRun', 'submitted', 'count', 'successCount', 'failureCount', 'modelCode', 'projectGroupNo'],
1624
1772
  batch_task_status: ['count', 'taskCount', 'successTaskCount', 'resultCount', 'pointTotal', 'timedOut', 'waitedMs'],
@@ -1626,10 +1774,12 @@ const DETAIL_FIELDS_BY_KIND = {
1626
1774
  credits_balance: ['billingPointBalance', 'currentProjectGroupNo', 'currentProjectGroupName', 'projectBudgetBalance', 'projectBudgetMax'],
1627
1775
  credits_usage: ['projectGroupNo', 'sinceText', 'untilText', 'scannedTaskCount', 'pointTotal'],
1628
1776
  environment_report: ['doctorStatus', 'verify'],
1629
- fee_estimate: ['modelGroupCode', 'projectGroupNo', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter'],
1777
+ fee_estimate: ['objectName', 'modelGroupCode', 'projectGroupNo', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter'],
1630
1778
  generic: ['cleared', 'selected', 'created', 'updated', 'reused', 'dryRun', 'action', 'projectGroupNo', 'projectGroupName', 'groupId', 'groupName', 'projectGroupName', 'point', 'memberCount', 'note'],
1631
1779
  local_task_records: ['count', 'taskCount', 'successTaskCount', 'resultCount', 'pointTotal'],
1632
1780
  project_summary: ['selected', 'created', 'updated', 'reused', 'projectGroupNo', 'projectGroupName', 'isSelected', 'projectBudgetBalance', 'projectBudgetMax', 'memberCount'],
1781
+ purchase_guide: ['purchaseUrl'],
1782
+ redeem_result: ['redeemed', 'redemptionCode', 'billingPointBalance', 'currentProjectGroupNo', 'currentProjectGroupName', 'projectBudgetBalance', 'projectBudgetMax'],
1633
1783
  subject_publish_result: ['created', 'name', 'elementId', 'subjectId', 'externalId', 'modelCode', 'status', 'taskStatus', 'errorMessage', 'nextRefSubject'],
1634
1784
  subject_status: ['name', 'elementId', 'subjectId', 'externalId', 'modelCode', 'status', 'taskStatus', 'errorMessage', 'isTerminal', 'nextRefSubject'],
1635
1785
  subject_voice_create_result: ['created', 'name', 'voiceRecordId', 'reqTaskId', 'voiceId', 'externalId', 'status', 'taskStatus', 'errorMessage', 'nextVoiceArg'],
@@ -1637,7 +1787,8 @@ const DETAIL_FIELDS_BY_KIND = {
1637
1787
  subtitle_task_status: ['taskId', 'publicId', 'remoteTaskId', 'taskType', 'taskStatus', 'isTerminal', 'projectGroupNo', 'resultCount', 'errorMessage', 'timedOut', 'waitedMs'],
1638
1788
  subtitle_task_submission: ['submitted', 'taskId', 'taskType', 'sourceTaskId', 'projectGroupNo', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter', 'nextCommand'],
1639
1789
  task_status: ['taskId', 'publicId', 'remoteTaskId', 'taskType', 'taskStatus', 'isTerminal', 'modelGroupCode', 'projectGroupNo', 'pointNo', 'gmtCreate', 'resultCount', 'errorMessage', 'timedOut', 'waitedMs'],
1640
- task_submission: ['taskId', 'taskType', 'modelGroupCode', 'projectGroupNo', 'pointNo', 'points', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter', 'uploadCount', 'nextCommand'],
1790
+ task_submission: ['taskId', 'taskType', 'objectName', 'modelGroupCode', 'projectGroupNo', 'pointNo', 'points', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter', 'uploadCount', 'nextCommand', 'statusCommand'],
1791
+ update_result: ['checked', 'updated', 'updateAvailable', 'packageName', 'previousVersion', 'currentVersion', 'latestVersion', 'command', 'skillUpdated', 'restartRecommended', 'message'],
1641
1792
  upload_result: ['dryRun', 'fileCount', 'assetCount', 'localFileCount', 'resourceConversionCount'],
1642
1793
  };
1643
1794
 
@@ -1649,15 +1800,18 @@ const DRY_RUN_FIELDS_BY_COMMAND = {
1649
1800
  'project create': ['dryRun', 'action', 'projectGroupName', 'point', 'memberCount', 'note'],
1650
1801
  'project update': ['dryRun', 'action', 'projectGroupNo', 'projectGroupName', 'point', 'memberCount'],
1651
1802
  'project ensure': ['dryRun', 'action', 'projectGroupName', 'point', 'memberCount', 'note'],
1803
+ 'credits redeem': ['dryRun', 'action', 'redemptionCode'],
1652
1804
  'upload files': ['dryRun', 'fileCount', 'localFileCount', 'resourceConversionCount'],
1653
1805
  'create image': ['dryRun', 'action', 'modelGroupCode', 'projectGroupNo', 'prompt', 'ratio', 'quality', 'generateNum', 'resourceCount', 'localFileCount', 'assetCount'],
1654
1806
  'create video': ['dryRun', 'action', 'modelGroupCode', 'projectGroupNo', 'prompt', 'duration', 'ratio', 'quality', 'needAudio', 'resourceCount', 'localFileCount', 'assetCount'],
1655
1807
  'create image-batch': ['dryRun', 'count', 'modelGroupCode', 'projectGroupNo'],
1656
1808
  'create video-batch': ['dryRun', 'count', 'modelGroupCode', 'projectGroupNo'],
1809
+ 'create video-super-resolution-fee': ['dryRun', 'action', 'objectName', 'projectGroupNo', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter'],
1810
+ 'create video-super-resolution': ['dryRun', 'action', 'objectName', 'projectGroupNo', 'taskId', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter', 'nextCommand'],
1657
1811
  'create video-subtitle-removal': ['dryRun', 'action', 'sourceTaskId', 'projectGroupNo'],
1658
1812
  'create asset-group': ['dryRun', 'action', 'platform', 'name', 'projectName'],
1659
1813
  'create asset-group-update': ['dryRun', 'action', 'groupId', 'platform', 'name', 'projectName'],
1660
- 'create asset': ['dryRun', 'action', 'groupId', 'platform', 'name', 'assetPath', 'localFileCount', 'fileCount'],
1814
+ 'create asset': ['dryRun', 'action', 'groupId', 'platform', 'assetType', 'name', 'assetPath', 'validationLegal', 'conversionRequired', 'converted', 'conversionReason', 'conversionTargetFormat', 'conversionTargetWidth', 'conversionTargetHeight', 'conversionTargetPixels', 'conversionTargetFps', 'conversionTargetDuration', 'localFileCount', 'fileCount'],
1661
1815
  'create subject': ['dryRun', 'action', 'name', 'modelCode', 'elementFrontalImage', 'assetCount', 'localFileCount', 'nextRefSubject'],
1662
1816
  'create subject-voice': ['dryRun', 'action', 'name', 'voiceName', 'voiceUrl', 'remoteUrl', 'remoteUpload', 'localFileCount', 'nextVoiceArg'],
1663
1817
  'create subject-batch': ['dryRun', 'count', 'modelCode'],
@@ -2332,7 +2486,7 @@ function cliFlagForParam(key) {
2332
2486
  need_audio: '--need-audio',
2333
2487
  prompt: '--prompt',
2334
2488
  };
2335
- return flags[key];
2489
+ return flags[key] || (key ? `--model-param ${key}=...` : '');
2336
2490
  }
2337
2491
 
2338
2492
  function localizedResourceParam(value) {
@@ -2737,6 +2891,7 @@ function collectPrettyActions(commandName, normalized, context = {}) {
2737
2891
  actions.push({ label, value: rewriteCommandPrefix(value) });
2738
2892
  };
2739
2893
  if (normalized?.nextCommand) add('继续查询', normalized.nextCommand);
2894
+ if (normalized?.statusCommand) add('状态查询', normalized.statusCommand);
2740
2895
  if (normalized?.nextRefSubject) add('主体引用', normalized.nextRefSubject);
2741
2896
  if (normalized?.nextVoiceArg) add('音色参数', normalized.nextVoiceArg);
2742
2897
  if (normalized?.dryRun && context.confirmCommand) add('确认执行', context.confirmCommand);
@@ -2852,6 +3007,11 @@ function formatPrettyModelCreateSpec(data = {}, context = {}) {
2852
3007
  column('素材用途', (row) => localizedList(row.resourceUsages, localizedUsage), { minWidth: 10, maxWidth: 24 }),
2853
3008
  column('Prompt 绑定', (row) => localizedPromptBinding(row.promptBinding), { maxWidth: 14 }),
2854
3009
  ]);
3010
+ renderArraySection(lines, '可控参数', data.parameterControls?.userParams, [
3011
+ column('参数', (row) => localizedParamKey(row.key), { minWidth: 10, maxWidth: 20 }),
3012
+ column('写法', 'cliArg', { minWidth: 12, maxWidth: 34 }),
3013
+ column('可选值', (row) => Array.isArray(row.allowedValues) ? row.allowedValues.join('、') : '', { minWidth: 12, maxWidth: 36 }),
3014
+ ]);
2855
3015
  renderScalarList(lines, '示例', (data.examples || []).map((example) => modelCreateExampleWithCode(example, data.modelGroupCode)).map((item) => item.replaceAll('--model-group-code <code>', `--model-group-code ${data.modelGroupCode || '<code>'}`)), 8);
2856
3016
  const actions = [];
2857
3017
  if (data.optionsCommand) actions.push({ label: '查看参数', value: `${commandPrefix()} ${data.optionsCommand}` });
@@ -3081,6 +3241,12 @@ export function formatTextOutput(commandName, data, context = {}) {
3081
3241
  'parentKey',
3082
3242
  'assetKind',
3083
3243
  'assetKey',
3244
+ 'assetType',
3245
+ 'assetPath',
3246
+ 'validationLegal',
3247
+ 'conversionRequired',
3248
+ 'converted',
3249
+ 'conversionReason',
3084
3250
  'actorKey',
3085
3251
  'propKey',
3086
3252
  'locationKey',
@@ -3103,7 +3269,7 @@ export function formatTextOutput(commandName, data, context = {}) {
3103
3269
  'dryRun',
3104
3270
  'action',
3105
3271
  ],
3106
- ['nextCommand', 'nextRefSubject', ...(list ? ['count'] : []), ...(isModelList ? ['usage'] : [])],
3272
+ ['nextCommand', 'statusCommand', 'nextRefSubject', ...(list ? ['count'] : []), ...(isModelList ? ['usage'] : [])],
3107
3273
  );
3108
3274
  if (scalarLine) lines.push(scalarLine);
3109
3275
  if (list) {
@@ -3130,6 +3296,7 @@ export function formatTextOutput(commandName, data, context = {}) {
3130
3296
  }
3131
3297
  }
3132
3298
  if (normalized.nextCommand) lines.push(`next=${normalized.nextCommand}`);
3299
+ if (normalized.statusCommand) lines.push(`statusCommand=${normalized.statusCommand}`);
3133
3300
  if (normalized.nextRefSubject) lines.push(`nextRefSubject=${normalized.nextRefSubject}`);
3134
3301
  if (normalized.dryRun && context.confirmCommand) lines.push(`nextAfterConfirm=${context.confirmCommand}`);
3135
3302
  if (normalized.dryRun && !context.confirmCommand && context.executeCommand) lines.push(`next=${context.executeCommand}`);