@lingjingai/lj-awb-cli-pre 0.3.18 → 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.
Files changed (35) hide show
  1. package/README.md +57 -8
  2. package/build/_shared.mjs +54 -5
  3. package/build/prod.mjs +12 -3
  4. package/package.json +6 -2
  5. package/packages/awb-cli/package.json +2 -2
  6. package/packages/awb-core/package.json +6 -2
  7. package/packages/awb-core/src/api.js +22 -0
  8. package/packages/awb-core/src/commands.js +112 -39
  9. package/packages/awb-core/src/common.js +8 -0
  10. package/packages/awb-core/src/output.js +2030 -8
  11. package/packages/awb-core/src/services.js +1835 -205
  12. package/packages/awb-core/src/standalone.js +472 -136
  13. package/packages/awb-core/src/update.js +327 -0
  14. package/skills/lj-awb/SKILL.md +35 -12
  15. package/skills/lj-awb/VERSION +1 -1
  16. package/skills/lj-awb/compat.json +3 -3
  17. package/skills/lj-awb/modules/artifact/asset.md +1 -1
  18. package/skills/lj-awb/modules/artifact/clip.md +1 -1
  19. package/skills/lj-awb/modules/artifact/script.md +1 -1
  20. package/skills/lj-awb/modules/artifact/video.md +1 -1
  21. package/skills/lj-awb/modules/asset.md +10 -1
  22. package/skills/lj-awb/modules/auth.md +9 -1
  23. package/skills/lj-awb/modules/create-contract.md +5 -2
  24. package/skills/lj-awb/modules/create.md +4 -2
  25. package/skills/lj-awb/modules/driver.md +12 -6
  26. package/skills/lj-awb/modules/image.md +3 -1
  27. package/skills/lj-awb/modules/model.md +12 -9
  28. package/skills/lj-awb/modules/task.md +4 -1
  29. package/skills/lj-awb/modules/upload.md +1 -1
  30. package/skills/lj-awb/modules/video.md +11 -2
  31. package/skills/lj-awb/modules/workflows.md +3 -1
  32. package/skills/lj-awb/references/error-codes.md +24 -0
  33. package/skills/lj-awb/references/model-options-read.md +16 -10
  34. package/skills/lj-awb/references/output-fields.md +10 -7
  35. package/skills/lj-awb/scripts/resolve-lj-awb-cmd.sh +106 -4
package/README.md CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  `lj-awb` 是灵境 AWB / 动漫创作平台的命令行客户端。它把平台底层能力封装成稳定、可脚本化、Agent 友好的命令,并随包分发一套 `lj-awb` skill,方便 Codex、Claude 等 Agent 把自然语言任务编排成确定性的 CLI 调用。
4
4
 
5
- CLI 本身只负责平台调用、参数校验、精简输出和安全确认;自然语言理解、任务规划、项目产物写回由上层 Agent / skill 完成。
5
+ CLI 本身只负责平台调用、参数校验、人类友好输出、机器可读输出和安全确认;自然语言理解、任务规划、项目产物写回由上层 Agent / skill 完成。
6
6
 
7
7
  ```text
8
8
  用户 / Agent / CI
9
9
  -> lj-awb
10
10
  -> 灵境 AWB / 动漫平台 API
11
- -> compact text / JSON 结果
11
+ -> pretty / text / JSON / YAML / CSV 结果
12
12
  ```
13
13
 
14
14
  ## 能力概览
@@ -63,6 +63,18 @@ lj-awb auth verify
63
63
 
64
64
  可用 `LINGJING_AWB_SKILL_INSTALL_DIR` 指定单一安装目录;如果传入的是以 `skills` 结尾的根目录,安装器会自动追加 `lj-awb`。也可用 `LINGJING_AWB_SKIP_SKILL_INSTALL=1` 跳过 skill 安装。
65
65
 
66
+ 只分发 skill 也可以作为完整入口:`skills/lj-awb/scripts/resolve-lj-awb-cmd.sh` 会在首次使用时检查 `lj-awb`,缺失或版本低于 `skills/lj-awb/compat.json` 的 `minCliVersion` 时自动执行:
67
+
68
+ ```bash
69
+ npm install -g @lingjingai/lj-awb-cli@<minCliVersion>
70
+ ```
71
+
72
+ 预发环境可在 bootstrap 前设置:
73
+
74
+ ```bash
75
+ export LINGJING_AWB_CLI_PACKAGE=@lingjingai/lj-awb-cli-pre
76
+ ```
77
+
66
78
  源码运行:
67
79
 
68
80
  ```bash
@@ -75,8 +87,37 @@ packages/awb-cli/bin/lj-awb auth status
75
87
 
76
88
  macOS 本地 wrapper `packages/awb-cli/bin/lj-awb` 会自动补充 Node 证书链,适合直接调试 HTTPS 平台接口。
77
89
 
90
+ 自动更新检查默认每天最多访问一次 npm registry,并会在源码 checkout、CI 或设置 `LINGJING_AWB_DISABLE_UPDATE_CHECK=1` / `AWB_DISABLE_UPDATE_CHECK=1` 时跳过。调试时可用 `LINGJING_AWB_UPDATE_CHECK=force` 强制检查。
91
+
78
92
  ## 认证
79
93
 
94
+ ### 浏览器授权登录(推荐)
95
+
96
+ 不需要手动复制 access key,直接登录:
97
+
98
+ ```bash
99
+ lj-awb auth login
100
+ ```
101
+
102
+ CLI 会创建登录任务、展示授权链接,等你在浏览器登录并确认授权后,自动拿到 access key 并保存到本地。命令默认阻塞轮询,最长约 10 分钟。
103
+
104
+ AI agent / 无法实时查看命令输出的场景,分两步走(避免阻塞):
105
+
106
+ ```bash
107
+ lj-awb auth login --no-wait --json # 返回 flowId / verifyUrl,把链接给用户去授权
108
+ lj-awb auth login --flow-id <flowId> # 用户授权后续轮询,拿到并保存 access key
109
+ ```
110
+
111
+ > 不要重复执行不带 `--flow-id` 的 login,否则会生成新的 flowId 导致旧授权链接失效。
112
+
113
+ 退出登录(清除本地 access key):
114
+
115
+ ```bash
116
+ lj-awb auth logout
117
+ ```
118
+
119
+ ### 直接使用 access key
120
+
80
121
  保存 access key 到本地认证文件:
81
122
 
82
123
  ```bash
@@ -110,6 +151,9 @@ lj-awb account info
110
151
  ```bash
111
152
  lj-awb doctor
112
153
  lj-awb doctor --verify
154
+ lj-awb update --check
155
+ lj-awb update
156
+ lj-awb schema --brief -f json
113
157
  lj-awb schema -f json
114
158
  lj-awb schema --domain create -f json
115
159
  lj-awb auth status
@@ -141,21 +185,24 @@ lj-awb create image ... --yes
141
185
 
142
186
  ## Agent 接入建议
143
187
 
144
- Agent 不应该靠记忆猜命令参数。进入任务前推荐先读取机器可读契约:
188
+ Agent 不应该靠记忆猜命令参数。进入任务前先读轻量能力摘要;执行具体命令前再按需读取精确契约:
145
189
 
146
190
  ```bash
147
- lj-awb schema -f json
148
- lj-awb schema --domain create -f json
191
+ lj-awb schema --brief -f json
149
192
  lj-awb schema --domain create --command video -f json
150
193
  ```
151
194
 
195
+ 只有做覆盖校验、生成脚本或调试 schema 本身时,才需要读取完整 `lj-awb schema -f json`。
196
+
152
197
  正式创作前推荐做一次体检:
153
198
 
154
199
  ```bash
155
200
  lj-awb doctor --verify
156
201
  ```
157
202
 
158
- `auth status` 只检查本地是否配置 access key;`auth verify` 会联网校验 key 是否远端有效。`doctor` 默认只做本地检查;追加 `--verify` 后会联网校验 access key、当前用户和项目组。`schema` 返回每个命令的 `options[].key`,Agent 应使用这些 key 生成 CLI 参数,而不是解析自然语言 help。
203
+ `auth status` 只检查本地是否配置 access key;`auth verify` 会联网校验 key 是否远端有效。`doctor` 默认只做本地检查;追加 `--verify` 后会联网校验 access key、当前用户和项目组。精确 `schema` 返回每个命令的 `options[].key`,Agent 应使用这些 key 生成 CLI 参数,而不是解析自然语言 help。
204
+
205
+ `lj-awb` 在普通命令结束后会做非阻塞更新检查;如果有新版本,JSON 输出会在 `meta._notice.update` 里带上更新提示。Skill / Agent 看到这个提示后,应在完成当前任务后告诉用户当前版本和最新版本,并建议或直接运行 `lj-awb update`。真正安装更新只走显式 `lj-awb update`,`--check` 只检查不安装。
159
206
 
160
207
  `schema` 还包含面向 Agent 的执行约束:
161
208
 
@@ -242,9 +289,11 @@ lj-awb create video \
242
289
  --yes
243
290
  ```
244
291
 
245
- ## JSON 输出契约
292
+ ## 输出契约
293
+
294
+ 默认输出是 `pretty`:面向人类阅读的彩色标题、摘要区、自动换行表格和下一步建议。表格由 `cli-table3` 做终端渲染,不是 CSV;颜色由 `chalk` 渲染,设置 `NO_COLOR=1` 可关闭,`FORCE_COLOR=1` 或 `LINGJING_AWB_COLOR=1` 可强制开启。Agent / 脚本不要依赖默认 pretty 解析字段:需要稳定 envelope 时显式追加 `-f json` 或 `--json`;需要低 token 的紧凑 key-value 兼容输出时传 `-f text`;列表导出可用 `-f csv`,可读结构化输出可用 `-f yaml`。
246
295
 
247
- 默认输出是 compact text,适合终端和 Agent 低 token 读取;复杂模型命令使用 `section:` + 缩进 `key=value` 的分区格式,避免 `params`、`resources`、`intents`、`next` 混在一屏里。只有需要完整嵌套结构、稳定 JSON envelope 或脚本严格解析时才追加 `-f json` 或 `--json`。`schema` 通常使用 JSON;`model options` 和 `model create-spec` 默认 text 先读,必要时再切 JSON。
296
+ `schema` 通常使用 JSON;`model options` 和 `model create-spec` 面向人类时可直接读默认 pretty,Agent 做参数决策时建议使用 `-f text`,脚本严格解析或需要完整嵌套结构时再切 `-f json`。
248
297
 
249
298
  输出字段只保留后续动作不可替代的信息。默认不返回平台原始 `raw`、COS 签名细节、重复的首个结果字段;任务结果统一使用 `resultUrls` 表达。
250
299
 
package/build/_shared.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { spawnSync } from 'node:child_process';
3
- import { cpSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { cpSync, mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
4
+ import os from 'node:os';
4
5
  import path from 'node:path';
5
6
  import { fileURLToPath } from 'node:url';
6
7
 
@@ -19,13 +20,16 @@ export function run(command, args, options = {}) {
19
20
  process.stderr.write(`$ ${[command, ...args].join(' ')}\n`);
20
21
  const result = spawnSync(command, args, {
21
22
  cwd: options.cwd || repoRoot,
23
+ env: options.env ? { ...process.env, ...options.env } : process.env,
22
24
  stdio: 'inherit',
23
25
  });
24
26
  if (result.error) {
27
+ options.beforeExit?.();
25
28
  process.stderr.write(`${result.error.message}\n`);
26
29
  process.exit(1);
27
30
  }
28
31
  if (result.status !== 0) {
32
+ options.beforeExit?.();
29
33
  process.exit(result.status || 1);
30
34
  }
31
35
  }
@@ -33,11 +37,53 @@ export function run(command, args, options = {}) {
33
37
  export function capture(command, args, options = {}) {
34
38
  return spawnSync(command, args, {
35
39
  cwd: options.cwd || repoRoot,
40
+ env: options.env ? { ...process.env, ...options.env } : process.env,
36
41
  encoding: 'utf8',
37
42
  stdio: ['inherit', 'pipe', 'pipe'],
38
43
  });
39
44
  }
40
45
 
46
+ export function createNpmPublishAuthConfig(registry) {
47
+ const tokenSource = ['NPM_PUBLISH_TOKEN', 'NPM_TOKEN', 'NODE_AUTH_TOKEN']
48
+ .find((name) => process.env[name]?.trim());
49
+ if (!tokenSource) {
50
+ return {
51
+ env: {},
52
+ cleanup() {},
53
+ tokenSource: null,
54
+ };
55
+ }
56
+
57
+ const token = process.env[tokenSource].trim();
58
+ const normalizedRegistry = registry.endsWith('/') ? registry : `${registry}/`;
59
+ const registryUrl = new URL(normalizedRegistry);
60
+ const registryPath = registryUrl.pathname.endsWith('/') ? registryUrl.pathname : `${registryUrl.pathname}/`;
61
+ const npmrcDir = mkdtempSync(path.join(os.tmpdir(), 'lj-awb-npm-'));
62
+ const npmrcPath = path.join(npmrcDir, '.npmrc');
63
+ writeFileSync(
64
+ npmrcPath,
65
+ [
66
+ `registry=${normalizedRegistry}`,
67
+ `//${registryUrl.host}${registryPath}:_authToken=${token}`,
68
+ 'strict-ssl=false',
69
+ 'always-auth=true',
70
+ '',
71
+ ].join('\n'),
72
+ { mode: 0o600 },
73
+ );
74
+
75
+ return {
76
+ env: {
77
+ NPM_CONFIG_USERCONFIG: npmrcPath,
78
+ NPM_CONFIG_REGISTRY: normalizedRegistry,
79
+ },
80
+ cleanup() {
81
+ rmSync(npmrcDir, { recursive: true, force: true });
82
+ },
83
+ tokenSource,
84
+ };
85
+ }
86
+
41
87
  export function packageFilePaths(cwd = repoRoot) {
42
88
  const result = capture('npm', ['pack', '--dry-run', '--json'], { cwd });
43
89
  if (result.error) {
@@ -101,12 +147,13 @@ export function packTarball(stageDir) {
101
147
  return path.join(stageDir, tarball);
102
148
  }
103
149
 
104
- export function ensureLoggedIn(registry) {
105
- const result = capture('npm', ['whoami', `--registry=${registry}`]);
150
+ export function ensureLoggedIn(registry, options = {}) {
151
+ const result = capture('npm', ['whoami', `--registry=${registry}`], { env: options.env });
106
152
  if (result.status === 0) {
107
153
  process.stderr.write(`npm user: ${result.stdout.trim()}\n`);
108
154
  return;
109
155
  }
156
+ options.beforeExit?.();
110
157
  process.stderr.write([
111
158
  `npm is not logged in for ${registry}.`,
112
159
  `Run: npm login --registry=${registry}`,
@@ -115,14 +162,16 @@ export function ensureLoggedIn(registry) {
115
162
  process.exit(1);
116
163
  }
117
164
 
118
- export function ensureVersionNotPublished({ name, version, registry }) {
165
+ export function ensureVersionNotPublished({ name, version, registry }, options = {}) {
119
166
  const spec = `${name}@${version}`;
120
- const result = capture('npm', ['view', spec, 'version', `--registry=${registry}`]);
167
+ const result = capture('npm', ['view', spec, 'version', `--registry=${registry}`], { env: options.env });
121
168
  if (result.status === 0) {
169
+ options.beforeExit?.();
122
170
  process.stderr.write(`${spec} already exists on npm. Bump the version before publishing.\n`);
123
171
  process.exit(1);
124
172
  }
125
173
  if (!/E404|404 Not Found|Not found/i.test(`${result.stderr}\n${result.stdout}`)) {
174
+ options.beforeExit?.();
126
175
  process.stderr.write(`Could not verify whether ${spec} exists on npm.\n`);
127
176
  process.stderr.write(result.stderr || result.stdout || '');
128
177
  process.exit(1);
package/build/prod.mjs CHANGED
@@ -2,6 +2,7 @@
2
2
  import { readFileSync } from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import {
5
+ createNpmPublishAuthConfig,
5
6
  ensureLoggedIn,
6
7
  ensureVersionNotPublished,
7
8
  findArgValue,
@@ -33,14 +34,21 @@ function ensureProductionDefaultApiOrigin() {
33
34
  ensureProductionDefaultApiOrigin();
34
35
 
35
36
  process.stderr.write(`Preparing ${pkg.name}@${pkg.version} for npm ${dryRun ? 'dry-run' : 'publish'} with default API origin ${PROD_API_ORIGIN}.\n`);
37
+ const publishAuth = createNpmPublishAuthConfig(registry);
38
+ if (!dryRun && publishAuth.tokenSource) {
39
+ process.stderr.write(`Using npm publish token from ${publishAuth.tokenSource}; NPM_CONFIG_USERCONFIG points to an isolated temporary npmrc.\n`);
40
+ }
36
41
 
37
42
  if (process.env.SKIP_CHECK !== '1') {
38
43
  run('npm', ['run', 'check:local']);
39
44
  }
40
45
 
41
- ensureVersionNotPublished({ name: pkg.name, version: pkg.version, registry });
46
+ ensureVersionNotPublished(
47
+ { name: pkg.name, version: pkg.version, registry },
48
+ { env: publishAuth.env, beforeExit: publishAuth.cleanup },
49
+ );
42
50
  if (!dryRun) {
43
- ensureLoggedIn(registry);
51
+ ensureLoggedIn(registry, { env: publishAuth.env, beforeExit: publishAuth.cleanup });
44
52
  }
45
53
 
46
54
  run('npm', [
@@ -49,4 +57,5 @@ run('npm', [
49
57
  'public',
50
58
  `--registry=${registry}`,
51
59
  ...passthroughArgs,
52
- ]);
60
+ ], { env: publishAuth.env, beforeExit: publishAuth.cleanup });
61
+ publishAuth.cleanup();
package/package.json CHANGED
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "name": "@lingjingai/lj-awb-cli-pre",
3
- "version": "0.3.18",
3
+ "version": "0.4.5",
4
4
  "description": "Lingjing AWB CLI monorepo with shared core, standalone CLI, and agent skills (pre-release build pointing to https://animeworkbench-pre.lingjingai.cn)",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "lj-awb": "packages/awb-cli/bin/lj-awb"
9
9
  },
10
+ "dependencies": {
11
+ "chalk": "^5.6.2",
12
+ "cli-table3": "^0.6.5"
13
+ },
10
14
  "engines": {
11
15
  "node": ">=20"
12
16
  },
@@ -19,7 +23,7 @@
19
23
  "build:pre-publish": "node build/pre-publish.mjs",
20
24
  "build:prod": "node build/prod.mjs",
21
25
  "check": "npm run check:local && npm run check:real",
22
- "check:local": "node --check install.mjs && node --check packages/awb-core/src/common.js && node --check packages/awb-core/src/api.js && node --check packages/awb-core/src/artifact.js && node --check packages/awb-core/src/auth.js && node --check packages/awb-core/src/output.js && node --check packages/awb-core/src/services.js && node --check packages/awb-core/src/commands.js && node --check packages/awb-core/src/standalone.js && sh -n packages/awb-cli/bin/lj-awb && node --check packages/awb-cli/bin/lj-awb.js && node --check build/build.mjs && node --check build/_shared.mjs && node --check build/pre.mjs && node --check build/pre-publish.mjs && node --check build/prod.mjs && node --check scripts/run-openapi-cli-examples-real.mjs && node --check scripts/validate-cli-schema.mjs && node --check scripts/validate-cli-output-contract.mjs && node --check scripts/validate-cli-command-coverage.mjs && node scripts/validate-skill-meta.mjs && node scripts/validate-cli-schema.mjs && node scripts/validate-cli-command-coverage.mjs",
26
+ "check:local": "node --check install.mjs && node --check packages/awb-core/src/common.js && node --check packages/awb-core/src/api.js && node --check packages/awb-core/src/artifact.js && node --check packages/awb-core/src/auth.js && node --check packages/awb-core/src/output.js && node --check packages/awb-core/src/update.js && node --check packages/awb-core/src/services.js && node --check packages/awb-core/src/commands.js && node --check packages/awb-core/src/standalone.js && sh -n packages/awb-cli/bin/lj-awb && bash -n skills/lj-awb/scripts/resolve-lj-awb-cmd.sh && node --check packages/awb-cli/bin/lj-awb.js && node --check build/build.mjs && node --check build/_shared.mjs && node --check build/pre.mjs && node --check build/pre-publish.mjs && node --check build/prod.mjs && node --check scripts/run-openapi-cli-examples-real.mjs && node --check scripts/validate-cli-schema.mjs && node --check scripts/validate-cli-output-contract.mjs && node --check scripts/validate-cli-command-coverage.mjs && node scripts/validate-skill-meta.mjs && node scripts/validate-cli-schema.mjs && node scripts/validate-cli-command-coverage.mjs",
23
27
  "check:real": "node scripts/validate-cli-output-contract.mjs && node scripts/validate-openapi-cli-examples.mjs",
24
28
  "test:openapi-real": "node scripts/run-openapi-cli-examples-real.mjs",
25
29
  "smoke": "packages/awb-cli/bin/lj-awb --help && packages/awb-cli/bin/lj-awb auth status -f json && packages/awb-cli/bin/lj-awb system && packages/awb-cli/bin/lj-awb auth && packages/awb-cli/bin/lj-awb account && packages/awb-cli/bin/lj-awb project && packages/awb-cli/bin/lj-awb credits && packages/awb-cli/bin/lj-awb upload && packages/awb-cli/bin/lj-awb model && packages/awb-cli/bin/lj-awb create && packages/awb-cli/bin/lj-awb task && packages/awb-cli/bin/lj-awb artifact && packages/awb-cli/bin/lj-awb schema -f json >/dev/null",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lingjingai/awb-cli-bin",
3
- "version": "0.3.18",
3
+ "version": "0.4.5",
4
4
  "description": "Standalone CLI for Lingjing AWB",
5
5
  "private": true,
6
6
  "license": "MIT",
@@ -13,6 +13,6 @@
13
13
  "README.md"
14
14
  ],
15
15
  "dependencies": {
16
- "@lingjingai/awb-core": "0.3.18"
16
+ "@lingjingai/awb-core": "0.4.5"
17
17
  }
18
18
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lingjingai/awb-core",
3
- "version": "0.3.18",
3
+ "version": "0.4.5",
4
4
  "description": "Shared core runtime for Lingjing AWB CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -17,5 +17,9 @@
17
17
  "files": [
18
18
  "src",
19
19
  "README.md"
20
- ]
20
+ ],
21
+ "dependencies": {
22
+ "chalk": "^5.6.2",
23
+ "cli-table3": "^0.6.5"
24
+ }
21
25
  }
@@ -109,6 +109,14 @@ export async function fetchUserInfo() {
109
109
  return await apiFetch('/api/anime/user/account/userInfo', { body: {} });
110
110
  }
111
111
 
112
+ export async function createLoginFlow() {
113
+ return await apiFetch('/api/anime/user/cli/createLoginFlow', { body: {}, auth: false });
114
+ }
115
+
116
+ export async function queryLoginFlowStatus(flowId) {
117
+ return await apiFetch('/api/anime/user/cli/queryFlowStatus', { body: { flowId }, auth: false });
118
+ }
119
+
112
120
  export async function fetchTeams() {
113
121
  return await apiFetch('/api/anime/user/group/getOwnGroupList', { body: {} });
114
122
  }
@@ -230,6 +238,20 @@ export async function createVideoSubtitleRemovalTask(payload = {}) {
230
238
  return await apiFetch('/api/material/creation/videoSubtitleRemoval', { body: payload });
231
239
  }
232
240
 
241
+ export async function fetchVideoSuperResolutionFee(payload = {}) {
242
+ return await apiFetch('/api/material/creation/videoUpResolutionCal', {
243
+ method: 'GET',
244
+ query: payload,
245
+ });
246
+ }
247
+
248
+ export async function createVideoSuperResolutionTask(payload = {}) {
249
+ return await apiFetch('/api/material/creation/videoUpResolution', {
250
+ method: 'POST',
251
+ query: payload,
252
+ });
253
+ }
254
+
233
255
  export async function fetchTaskFeed(payload = {}) {
234
256
  return await apiFetch('/api/material/creation/task/feedPull', {
235
257
  query: payload,