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

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);
@@ -1305,9 +1414,12 @@ const OUTPUT_KIND_BY_COMMAND = {
1305
1414
  'create video-fee': 'fee_estimate',
1306
1415
  'create video': 'task_submission',
1307
1416
  'create video-batch': 'batch_task_submission',
1417
+ 'create video-super-resolution-fee': 'fee_estimate',
1418
+ 'create video-super-resolution': 'task_submission',
1308
1419
  'task video-status': 'task_status',
1309
1420
  'create video-subtitle-removal': 'subtitle_task_submission',
1310
1421
  'task video-subtitle-status': 'subtitle_task_status',
1422
+ 'task video-super-resolution-status': 'task_status',
1311
1423
  'task list': 'task_list',
1312
1424
  'task wait': 'task_status',
1313
1425
  'task records': 'local_task_records',
@@ -1376,6 +1488,7 @@ const OUTPUT_KIND_BY_COMMAND = {
1376
1488
  'create subject-voice': 'subject_voice_create_result',
1377
1489
  'create subject-voice-wait': 'subject_voice_status',
1378
1490
  'create subject-batch': 'batch_subject_publish_result',
1491
+ update: 'update_result',
1379
1492
  };
1380
1493
 
1381
1494
  const KIND_TITLES = {
@@ -1424,13 +1537,16 @@ const KIND_TITLES = {
1424
1537
  task_status: '任务状态',
1425
1538
  task_submission: '任务提交结果',
1426
1539
  team_list: '团队列表',
1540
+ update_result: 'CLI 更新',
1427
1541
  upload_result: '上传结果',
1428
1542
  };
1429
1543
 
1430
1544
  const COMMAND_TITLES = {
1431
1545
  doctor: '环境体检',
1432
1546
  schema: '命令 Schema',
1547
+ update: 'CLI 更新',
1433
1548
  'auth clear': '清空认证结果',
1549
+ 'auth logout': '退出登录结果',
1434
1550
  'account switch-team': '团队切换结果',
1435
1551
  'project use': '项目组切换结果',
1436
1552
  'project create': '项目组创建结果',
@@ -1440,6 +1556,8 @@ const COMMAND_TITLES = {
1440
1556
  'create video': '生视频任务提交结果',
1441
1557
  'create image-batch': '批量生图提交结果',
1442
1558
  'create video-batch': '批量生视频提交结果',
1559
+ 'create video-super-resolution-fee': '视频超分积分预估',
1560
+ 'create video-super-resolution': '视频超分任务提交结果',
1443
1561
  'create video-subtitle-removal': '去字幕任务提交结果',
1444
1562
  'create subject': '主体创建结果',
1445
1563
  'create subject-wait': '主体状态',
@@ -1460,6 +1578,17 @@ const FIELD_LABELS = {
1460
1578
  assetKind: '素材类型',
1461
1579
  assetName: '素材名',
1462
1580
  assetPath: '素材路径',
1581
+ assetType: '素材类型',
1582
+ converted: '已转码',
1583
+ conversionReason: '转码原因',
1584
+ conversionRequired: '需要转码',
1585
+ conversionTargetDuration: '目标时长',
1586
+ conversionTargetFormat: '目标格式',
1587
+ conversionTargetFps: '目标帧率',
1588
+ conversionTargetHeight: '目标高度',
1589
+ conversionTargetPixels: '目标像素',
1590
+ conversionTargetWidth: '目标宽度',
1591
+ validationLegal: '规格合法',
1463
1592
  authType: '认证方式',
1464
1593
  backendPath: '后端路径',
1465
1594
  batchCount: '批次数',
@@ -1467,6 +1596,8 @@ const FIELD_LABELS = {
1467
1596
  billingPointRemainingAfter: '扣除后可扣积分',
1468
1597
  checkedAt: '检查时间',
1469
1598
  cleared: '已清空',
1599
+ loggedOut: '已退出登录',
1600
+ authPath: '认证文件',
1470
1601
  clipCount: 'Clip 数',
1471
1602
  clipId: 'Clip ID',
1472
1603
  command: '命令',
@@ -1518,6 +1649,7 @@ const FIELD_LABELS = {
1518
1649
  nextCommand: '下一步命令',
1519
1650
  nextRefSubject: '主体引用参数',
1520
1651
  nextVoiceArg: '音色参数',
1652
+ objectName: '对象路径',
1521
1653
  originUrls: '原始素材',
1522
1654
  parentKey: '父级 Key',
1523
1655
  platform: '平台',
@@ -1558,6 +1690,7 @@ const FIELD_LABELS = {
1558
1690
  sourceTaskId: '来源任务 ID',
1559
1691
  stateKey: '状态 Key',
1560
1692
  status: '状态',
1693
+ statusCommand: '状态查询命令',
1561
1694
  statusCommandTaskType: '状态任务类型',
1562
1695
  submitted: '已提交',
1563
1696
  successRate: '成功率',
@@ -1570,6 +1703,7 @@ const FIELD_LABELS = {
1570
1703
  timedOut: '已超时',
1571
1704
  title: '标题',
1572
1705
  updated: '已更新',
1706
+ userDisplay: '用户',
1573
1707
  userId: '用户 ID',
1574
1708
  userName: '用户名',
1575
1709
  verification: '验证方式',
@@ -1587,11 +1721,18 @@ const FIELD_LABELS = {
1587
1721
  commandCount: '命令数',
1588
1722
  commandFilter: '命令过滤',
1589
1723
  commonFieldCount: '通用字段数',
1724
+ currentVersion: '当前版本',
1590
1725
  domainFilter: '领域过滤',
1726
+ latestVersion: '最新版本',
1591
1727
  nodeVersion: 'Node 版本',
1728
+ packageName: '包名',
1729
+ previousVersion: '更新前版本',
1592
1730
  resourceFieldCount: '资源字段数',
1593
1731
  resourceRuleCount: '资源规则数',
1732
+ restartRecommended: '建议重启',
1594
1733
  schemaVersion: 'Schema 版本',
1734
+ skillUpdated: 'Skill 已更新',
1735
+ updateAvailable: '有新版本',
1595
1736
  version: '版本',
1596
1737
  type: '类型',
1597
1738
  message: '消息',
@@ -1617,8 +1758,8 @@ const DETAIL_FIELDS_BY_KIND = {
1617
1758
  artifact_write_result: ['id', 'projectId', 'rowKind', 'entityKey', 'parentKey', 'actorKey', 'propKey', 'locationKey', 'stateKey', 'episodeId', 'sceneId', 'clipId', 'videoEpisodeId', 'status', 'title', 'name', 'displayName'],
1618
1759
  asset_group_detail: ['groupId', 'platform', 'name', 'projectName', 'description', 'status', 'assetCount'],
1619
1760
  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'],
1761
+ 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'],
1762
+ auth_result: ['userDisplay', 'loggedOut', 'saved', 'verified', 'accessKey', 'source', 'dryRun', 'groupName', 'authPath'],
1622
1763
  auth_status: ['configured', 'authType', 'accessKey', 'source', 'verified', 'verification', 'verifyCommand', 'userId', 'userName', 'groupId', 'groupName'],
1623
1764
  batch_subject_publish_result: ['dryRun', 'submitted', 'count', 'successCount', 'failureCount', 'modelCode', 'projectGroupNo'],
1624
1765
  batch_task_status: ['count', 'taskCount', 'successTaskCount', 'resultCount', 'pointTotal', 'timedOut', 'waitedMs'],
@@ -1626,7 +1767,7 @@ const DETAIL_FIELDS_BY_KIND = {
1626
1767
  credits_balance: ['billingPointBalance', 'currentProjectGroupNo', 'currentProjectGroupName', 'projectBudgetBalance', 'projectBudgetMax'],
1627
1768
  credits_usage: ['projectGroupNo', 'sinceText', 'untilText', 'scannedTaskCount', 'pointTotal'],
1628
1769
  environment_report: ['doctorStatus', 'verify'],
1629
- fee_estimate: ['modelGroupCode', 'projectGroupNo', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter'],
1770
+ fee_estimate: ['objectName', 'modelGroupCode', 'projectGroupNo', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter'],
1630
1771
  generic: ['cleared', 'selected', 'created', 'updated', 'reused', 'dryRun', 'action', 'projectGroupNo', 'projectGroupName', 'groupId', 'groupName', 'projectGroupName', 'point', 'memberCount', 'note'],
1631
1772
  local_task_records: ['count', 'taskCount', 'successTaskCount', 'resultCount', 'pointTotal'],
1632
1773
  project_summary: ['selected', 'created', 'updated', 'reused', 'projectGroupNo', 'projectGroupName', 'isSelected', 'projectBudgetBalance', 'projectBudgetMax', 'memberCount'],
@@ -1637,7 +1778,8 @@ const DETAIL_FIELDS_BY_KIND = {
1637
1778
  subtitle_task_status: ['taskId', 'publicId', 'remoteTaskId', 'taskType', 'taskStatus', 'isTerminal', 'projectGroupNo', 'resultCount', 'errorMessage', 'timedOut', 'waitedMs'],
1638
1779
  subtitle_task_submission: ['submitted', 'taskId', 'taskType', 'sourceTaskId', 'projectGroupNo', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter', 'nextCommand'],
1639
1780
  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'],
1781
+ task_submission: ['taskId', 'taskType', 'objectName', 'modelGroupCode', 'projectGroupNo', 'pointNo', 'points', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter', 'uploadCount', 'nextCommand', 'statusCommand'],
1782
+ update_result: ['checked', 'updated', 'updateAvailable', 'packageName', 'previousVersion', 'currentVersion', 'latestVersion', 'command', 'skillUpdated', 'restartRecommended', 'message'],
1641
1783
  upload_result: ['dryRun', 'fileCount', 'assetCount', 'localFileCount', 'resourceConversionCount'],
1642
1784
  };
1643
1785
 
@@ -1654,10 +1796,12 @@ const DRY_RUN_FIELDS_BY_COMMAND = {
1654
1796
  'create video': ['dryRun', 'action', 'modelGroupCode', 'projectGroupNo', 'prompt', 'duration', 'ratio', 'quality', 'needAudio', 'resourceCount', 'localFileCount', 'assetCount'],
1655
1797
  'create image-batch': ['dryRun', 'count', 'modelGroupCode', 'projectGroupNo'],
1656
1798
  'create video-batch': ['dryRun', 'count', 'modelGroupCode', 'projectGroupNo'],
1799
+ 'create video-super-resolution-fee': ['dryRun', 'action', 'objectName', 'projectGroupNo', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter'],
1800
+ 'create video-super-resolution': ['dryRun', 'action', 'objectName', 'projectGroupNo', 'taskId', 'pointCost', 'billingPointBalance', 'billingPointRemainingAfter', 'projectBudgetBalance', 'projectBudgetMax', 'projectBudgetRemainingAfter', 'nextCommand'],
1657
1801
  'create video-subtitle-removal': ['dryRun', 'action', 'sourceTaskId', 'projectGroupNo'],
1658
1802
  'create asset-group': ['dryRun', 'action', 'platform', 'name', 'projectName'],
1659
1803
  'create asset-group-update': ['dryRun', 'action', 'groupId', 'platform', 'name', 'projectName'],
1660
- 'create asset': ['dryRun', 'action', 'groupId', 'platform', 'name', 'assetPath', 'localFileCount', 'fileCount'],
1804
+ 'create asset': ['dryRun', 'action', 'groupId', 'platform', 'assetType', 'name', 'assetPath', 'validationLegal', 'conversionRequired', 'converted', 'conversionReason', 'conversionTargetFormat', 'conversionTargetWidth', 'conversionTargetHeight', 'conversionTargetPixels', 'conversionTargetFps', 'conversionTargetDuration', 'localFileCount', 'fileCount'],
1661
1805
  'create subject': ['dryRun', 'action', 'name', 'modelCode', 'elementFrontalImage', 'assetCount', 'localFileCount', 'nextRefSubject'],
1662
1806
  'create subject-voice': ['dryRun', 'action', 'name', 'voiceName', 'voiceUrl', 'remoteUrl', 'remoteUpload', 'localFileCount', 'nextVoiceArg'],
1663
1807
  'create subject-batch': ['dryRun', 'count', 'modelCode'],
@@ -2332,7 +2476,7 @@ function cliFlagForParam(key) {
2332
2476
  need_audio: '--need-audio',
2333
2477
  prompt: '--prompt',
2334
2478
  };
2335
- return flags[key];
2479
+ return flags[key] || (key ? `--model-param ${key}=...` : '');
2336
2480
  }
2337
2481
 
2338
2482
  function localizedResourceParam(value) {
@@ -2737,6 +2881,7 @@ function collectPrettyActions(commandName, normalized, context = {}) {
2737
2881
  actions.push({ label, value: rewriteCommandPrefix(value) });
2738
2882
  };
2739
2883
  if (normalized?.nextCommand) add('继续查询', normalized.nextCommand);
2884
+ if (normalized?.statusCommand) add('状态查询', normalized.statusCommand);
2740
2885
  if (normalized?.nextRefSubject) add('主体引用', normalized.nextRefSubject);
2741
2886
  if (normalized?.nextVoiceArg) add('音色参数', normalized.nextVoiceArg);
2742
2887
  if (normalized?.dryRun && context.confirmCommand) add('确认执行', context.confirmCommand);
@@ -2852,6 +2997,11 @@ function formatPrettyModelCreateSpec(data = {}, context = {}) {
2852
2997
  column('素材用途', (row) => localizedList(row.resourceUsages, localizedUsage), { minWidth: 10, maxWidth: 24 }),
2853
2998
  column('Prompt 绑定', (row) => localizedPromptBinding(row.promptBinding), { maxWidth: 14 }),
2854
2999
  ]);
3000
+ renderArraySection(lines, '可控参数', data.parameterControls?.userParams, [
3001
+ column('参数', (row) => localizedParamKey(row.key), { minWidth: 10, maxWidth: 20 }),
3002
+ column('写法', 'cliArg', { minWidth: 12, maxWidth: 34 }),
3003
+ column('可选值', (row) => Array.isArray(row.allowedValues) ? row.allowedValues.join('、') : '', { minWidth: 12, maxWidth: 36 }),
3004
+ ]);
2855
3005
  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
3006
  const actions = [];
2857
3007
  if (data.optionsCommand) actions.push({ label: '查看参数', value: `${commandPrefix()} ${data.optionsCommand}` });
@@ -3081,6 +3231,12 @@ export function formatTextOutput(commandName, data, context = {}) {
3081
3231
  'parentKey',
3082
3232
  'assetKind',
3083
3233
  'assetKey',
3234
+ 'assetType',
3235
+ 'assetPath',
3236
+ 'validationLegal',
3237
+ 'conversionRequired',
3238
+ 'converted',
3239
+ 'conversionReason',
3084
3240
  'actorKey',
3085
3241
  'propKey',
3086
3242
  'locationKey',
@@ -3103,7 +3259,7 @@ export function formatTextOutput(commandName, data, context = {}) {
3103
3259
  'dryRun',
3104
3260
  'action',
3105
3261
  ],
3106
- ['nextCommand', 'nextRefSubject', ...(list ? ['count'] : []), ...(isModelList ? ['usage'] : [])],
3262
+ ['nextCommand', 'statusCommand', 'nextRefSubject', ...(list ? ['count'] : []), ...(isModelList ? ['usage'] : [])],
3107
3263
  );
3108
3264
  if (scalarLine) lines.push(scalarLine);
3109
3265
  if (list) {
@@ -3130,6 +3286,7 @@ export function formatTextOutput(commandName, data, context = {}) {
3130
3286
  }
3131
3287
  }
3132
3288
  if (normalized.nextCommand) lines.push(`next=${normalized.nextCommand}`);
3289
+ if (normalized.statusCommand) lines.push(`statusCommand=${normalized.statusCommand}`);
3133
3290
  if (normalized.nextRefSubject) lines.push(`nextRefSubject=${normalized.nextRefSubject}`);
3134
3291
  if (normalized.dryRun && context.confirmCommand) lines.push(`nextAfterConfirm=${context.confirmCommand}`);
3135
3292
  if (normalized.dryRun && !context.confirmCommand && context.executeCommand) lines.push(`next=${context.executeCommand}`);