democut 1.0.65 → 1.0.67

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 (2) hide show
  1. package/dist/cli.js +109 -3
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -6916,7 +6916,7 @@ import { realpathSync } from "fs";
6916
6916
  import { fileURLToPath } from "url";
6917
6917
 
6918
6918
  // src/version.ts
6919
- var VERSION = "1.0.65";
6919
+ var VERSION = "1.0.67";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -11648,6 +11648,62 @@ var GENERATED_TOOLS = [
11648
11648
  "openWorldHint": false
11649
11649
  }
11650
11650
  },
11651
+ {
11652
+ "name": "democut_download_export",
11653
+ "description": "\uC644\uC131\uBCF8 \uC0B0\uCD9C\uBB3C \uD558\uB098\uB97C \uB0B4\uB824\uBC1B\uB294\uB2E4(kind: video|subtitle). stdio \uB294 output_path \uC5D0 \uC800\uC7A5, \uC6D0\uACA9\uC740 \uC11C\uBA85 URL(1\uC2DC\uAC04). democut_make_export \uB4A4 democut_wait_jobs \uAC00 \uC900 result.export_number \uB97C \uADF8\uB300\uB85C \uB123\uC5B4\uB77C \u2014 democut_get_export \uB97C \uAC70\uCE60 \uD544\uC694\uAC00 \uC5C6\uB2E4(\uCEF7\uC758 democut_download \uC640 \uAC19\uC740 \uADDC\uC57D).",
11654
+ "inputSchema": {
11655
+ "type": "object",
11656
+ "properties": {
11657
+ "slug": {
11658
+ "type": "string",
11659
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
11660
+ },
11661
+ "number": {
11662
+ "type": "string",
11663
+ "description": "\uC644\uC131\uBCF8 \uBC88\uD638(1\uBD80\uD130)"
11664
+ },
11665
+ "kind": {
11666
+ "default": "video",
11667
+ "enum": [
11668
+ "video",
11669
+ "subtitle"
11670
+ ],
11671
+ "type": "string"
11672
+ },
11673
+ "output_path": {
11674
+ "type": "string",
11675
+ "description": "\uC800\uC7A5\uD560 \uB85C\uCEEC \uACBD\uB85C(stdio \uC804\uC6A9). \uC5C6\uC73C\uBA74 URL \uB9CC \uB3CC\uB824\uC900\uB2E4"
11676
+ }
11677
+ },
11678
+ "required": [
11679
+ "slug",
11680
+ "number"
11681
+ ],
11682
+ "additionalProperties": false
11683
+ },
11684
+ "outputSchema": {
11685
+ "type": "object",
11686
+ "properties": {
11687
+ "url": {
11688
+ "type": "string"
11689
+ },
11690
+ "expires_at": {
11691
+ "type": "string"
11692
+ },
11693
+ "saved_to": {}
11694
+ },
11695
+ "required": [
11696
+ "url",
11697
+ "expires_at"
11698
+ ]
11699
+ },
11700
+ "annotations": {
11701
+ "readOnlyHint": true,
11702
+ "destructiveHint": false,
11703
+ "idempotentHint": true,
11704
+ "openWorldHint": false
11705
+ }
11706
+ },
11651
11707
  {
11652
11708
  "name": "democut_make_thumbnails",
11653
11709
  "description": "\uC378\uB124\uC77C \uB9CC\uB4E4\uAE30(\uCCAD\uAD6C) \u2014 styles \uB85C bold\xB7minimal\xB7dramatic \uC911 \uACE0\uB978 \uC2A4\uD0C0\uC77C\uB9CC(\uBE44\uC6B0\uBA74 \uC14B \uB2E4), \uC7A5\uB9C8\uB2E4 \uCCAD\uAD6C\xB7\uC2E4\uD328\uD55C \uC7A5\uB9CC \uD658\uBD88. \uB3D9\uC758\uC561 = thumbnail:variant \uB2E8\uAC00 \xD7 \uACE0\uB978 \uC218. \uC644\uC131\uBCF8 \uC601\uC0C1\uC774 \uC788\uC5B4\uC57C \uD55C\uB2E4(\uC5C6\uC73C\uBA74 409). \uB300\uCCB4: democut_upload_asset + democut_select_thumbnail. \uBCC4\uB3C4 \uACAC\uC801 \uB3C4\uAD6C\uAC00 \uC5C6\uB2E4: democut_get_options \uC758 rates \uC5D0\uC11C thumbnail:variant \uB2E8\uAC00\uC640 rate_version \uC744 \uC77D\uC5B4 **\uACE0\uB978 \uC2A4\uD0C0\uC77C \uC218**\uB9CC\uD07C \uACF1\uD574 confirmed_cost_krw \uC5D0 \uADF8\uB300\uB85C \uB123\uC5B4\uB77C(styles \uB97C \uBE44\uC6B0\uBA74 3\uC7A5). \uC5B4\uAE0B\uB098\uBA74 409 QUOTE_MISMATCH \uAC00 \uC7AC\uACC4\uC0B0 \uACAC\uC801(data.quote)\uC744 \uC900\uB2E4(\uACFC\uAE08 \uC5C6\uC74C). \uC751\uB2F5\uC740 202 \u2014 \uACB0\uACFC\uB294 democut_wait_jobs \uB85C \uBC1B\uB294\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs, democut_get_export.",
@@ -12878,6 +12934,12 @@ var TOOL_META = {
12878
12934
  "method": "GET",
12879
12935
  "path": "/api/projects/{slug}/exports/{number}"
12880
12936
  },
12937
+ "democut_download_export": {
12938
+ "cost": "none",
12939
+ "group": "export",
12940
+ "method": "GET",
12941
+ "path": "/api/projects/{slug}/exports/{number}/download"
12942
+ },
12881
12943
  "democut_make_thumbnails": {
12882
12944
  "cost": "charge",
12883
12945
  "group": "export",
@@ -13475,6 +13537,13 @@ function authStatus(deps = {}) {
13475
13537
  });
13476
13538
  }
13477
13539
  var krw = (v) => `${v.toLocaleString("ko-KR")}\uC6D0`;
13540
+ function refundBits(err4) {
13541
+ const refunded = Math.max(0, err4.refunded_krw ?? 0);
13542
+ const charged = Math.max(0, err4.charged_krw ?? 0);
13543
+ if (charged <= 0) return refunded > 0 ? [`\uD658\uBD88 ${krw(refunded)}`] : [];
13544
+ if (refunded >= charged) return [`\uD658\uBD88 ${krw(refunded)}`];
13545
+ return [`\uCCAD\uAD6C ${krw(charged)} \uC911 \uD658\uBD88 ${krw(refunded)}`, `${krw(charged - refunded)} \uC740 \uB3CC\uC544\uC624\uC9C0 \uC54A\uB294\uB2E4`];
13546
+ }
13478
13547
  var NO_WORKSPACE = {
13479
13548
  isError: true,
13480
13549
  text: "\uD65C\uC131 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. democut_auth_status \uB85C \uB85C\uADF8\uC778 \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uACE0, \uC18C\uC18D\uB41C \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uAC00 \uC5C6\uB2E4\uBA74 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uCD08\uB300\uB97C \uBC1B\uC544\uC57C \uD55C\uB2E4\uACE0 \uC54C\uB9AC\uC138\uC694."
@@ -14089,7 +14158,7 @@ function jobLine(j) {
14089
14158
  }
14090
14159
  if (j.error) {
14091
14160
  bits.push(`\uC624\uB958 ${j.error.code}: ${firstLine(j.error.message)}`);
14092
- if (j.error.refunded_krw) bits.push(`\uD658\uBD88 ${krw(j.error.refunded_krw)}`);
14161
+ bits.push(...refundBits(j.error));
14093
14162
  }
14094
14163
  if (j.result?.version != null) bits.push(`\u2192 v${j.result.version}`);
14095
14164
  const refunded = j.result?.extra?.refunded_krw;
@@ -14250,7 +14319,7 @@ function cutLine(cut) {
14250
14319
  if (cut.blocked_reason) bits.push(`\uB9C9\uD798: ${callableToolNames(cut.blocked_reason)}`);
14251
14320
  if (cut.last_error) {
14252
14321
  bits.push(`\uC2E4\uD328 ${cut.last_error.code}: ${firstLine(cut.last_error.message)}`);
14253
- if (cut.last_error.refunded_krw) bits.push(`\uD658\uBD88 ${krw(cut.last_error.refunded_krw)}`);
14322
+ bits.push(...refundBits(cut.last_error));
14254
14323
  }
14255
14324
  return bits.join(" \xB7 ");
14256
14325
  }
@@ -15365,6 +15434,41 @@ function needExportNumber(a) {
15365
15434
  }
15366
15435
  return Number(a.number);
15367
15436
  }
15437
+ function downloadExport(a = {}, deps = {}) {
15438
+ return guarded(READ_ONLY, async () => {
15439
+ const slug = needSlug(a);
15440
+ if (typeof slug !== "string") return slug;
15441
+ const number3 = needExportNumber(a);
15442
+ if (typeof number3 !== "number") return number3;
15443
+ const kind = a.kind ?? "video";
15444
+ const base = resolveBaseUrl(deps.baseUrl);
15445
+ const q = new URLSearchParams({ kind });
15446
+ let out4;
15447
+ try {
15448
+ out4 = await apiRequest(base, projectPath(slug, `/exports/${number3}/download?${q}`), {}, deps);
15449
+ } catch (e) {
15450
+ if (e instanceof ApiError && e.status === 404 && e.code === `HTTP_404`) {
15451
+ return {
15452
+ isError: true,
15453
+ text: "\uC774 \uC11C\uBC84\uC5D0\uB294 \uC544\uC9C1 \uC644\uC131\uBCF8 \uB0B4\uB824\uBC1B\uAE30\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 CLI \uAC00 \uC11C\uBC84\uBCF4\uB2E4 \uBA3C\uC800 \uC62C\uB77C\uAC00 \uC0DD\uAE30\uB294 \uC77C\uC2DC\uC801\uC778 \uCC28\uC774\uC785\uB2C8\uB2E4.\n\uC2AC\uB7EC\uADF8\uC640 \uBC88\uD638\uB294 \uBB38\uC81C\uAC00 \uC544\uB2C8\uB2C8 \uACE0\uCE58\uC9C0 \uB9C8\uC138\uC694. \uC11C\uBC84\uAC00 \uBC30\uD3EC\uB420 \uB54C\uAE4C\uC9C0\uB294 democut_get_export \uAC00 \uC8FC\uB294 download.video\xB7download.subtitle \uC8FC\uC18C\uB97C \uC4F0\uC138\uC694(\uC11C\uBA85\uC740 1\uC2DC\uAC04)."
15454
+ };
15455
+ }
15456
+ throw e;
15457
+ }
15458
+ if (a.output_path) {
15459
+ await (deps.downloadImpl ? deps.downloadImpl(out4.url, a.output_path) : saveUrlToFile(out4.url, a.output_path, deps.fetchImpl ?? fetch));
15460
+ return { text: `\uC644\uC131\uBCF8 #${number3} ${kind} \uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4: ${a.output_path}`, structured: callableStructured({ ...out4, saved_to: a.output_path }) };
15461
+ }
15462
+ return {
15463
+ text: [
15464
+ `\uC644\uC131\uBCF8 #${number3} ${kind} \uB0B4\uB824\uBC1B\uAE30 \uC8FC\uC18C (\uB9CC\uB8CC ${out4.expires_at}):`,
15465
+ out4.url,
15466
+ "output_path \uB97C \uC8FC\uBA74 \uC774 \uD30C\uC77C\uC744 \uADF8 \uACBD\uB85C\uC5D0 \uBC14\uB85C \uC800\uC7A5\uD569\uB2C8\uB2E4."
15467
+ ].join("\n"),
15468
+ structured: callableStructured(out4)
15469
+ };
15470
+ });
15471
+ }
15368
15472
  function getExport(a = {}, deps = {}) {
15369
15473
  return guarded(READ_ONLY, async () => {
15370
15474
  const slug = needSlug(a);
@@ -15648,6 +15752,8 @@ function dispatch(name, args, deps = {}) {
15648
15752
  return listExports(args, deps);
15649
15753
  case "democut_get_export":
15650
15754
  return getExport(args, deps);
15755
+ case "democut_download_export":
15756
+ return downloadExport(args, deps);
15651
15757
  case "democut_make_thumbnails":
15652
15758
  return makeThumbnails(args, deps);
15653
15759
  case "democut_select_thumbnail":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "democut",
3
- "version": "1.0.65",
3
+ "version": "1.0.67",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",