democut 0.6.42 → 0.6.46

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 +2428 -147
  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 = "0.6.42";
6919
+ var VERSION = "0.6.46";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -26264,7 +26264,7 @@ var GENERATED_TOOLS = [
26264
26264
  "additionalProperties": false
26265
26265
  },
26266
26266
  "outputSchema": {
26267
- "description": "``GET /api/workspaces/{id}/credits`` \u2014 \uBA64\uBC84\uC5D0\uAC8C \uBCF4\uC774\uB294 \uC794\uC561(2026-09-11 REST \uC815\uD569, \uC124\uACC4 \xA7\uD06C\uB808\uB527 \uBAA8\uC591).\n\n\u2605 ``enabled`` \uB294 **\uCC28\uB2E8(\uACFC\uAE08) \uD65C\uC131 \uC5EC\uBD80**\uC774\uACE0 \uC794\uC561 \uD45C\uC2DC\uC640\uB294 \uBD84\uB9AC\uB2E4(2026-08-27 \uC0AC\uC6A9\uC790 \uACB0\uC815) \u2014 \uCC28\uB2E8\uC774 \uAEBC\uC838 \uC788\uC5B4\uB3C4\n DB \uC5D0 \uC794\uC561\uC774 \uC788\uC73C\uBA74 \uBCF4\uC5EC\uC900\uB2E4(\uD65C\uC131\uD654 \uC804 \uB3C4\uADF8\uD478\uB529\xB7\uC9C0\uAE09 \uD655\uC778\uC6A9). \uC124\uACC4 \uD45C\uC5D0\uB294 \uC5C6\uB358 \uD544\uB4DC\uC9C0\uB9CC MCP \uC0B0\uBB38\uC774 \u300C\uAE30\uB2A5 \uC5C6\uC74C\u300D \uACFC\n \u300C\uCC28\uB2E8\uB9CC \uAEBC\uC9D0\u300D \uC744 \uAC00\uB974\uB294 \uC720\uC77C\uD55C \uADFC\uAC70\uB77C \uACC4\uC57D\uC5D0 \uC62C\uB838\uB2E4.\n\u2605 \uC794\uC561 \uD544\uB4DC\uAC00 **\uC804\uBD80 None** \uC778 \uACBD\uC6B0\uB294 DB \uC790\uCCB4\uAC00 \uC5C6\uB294 \uBC30\uD3EC(file \uBAA8\uB4DC)\uBFD0\uC774\uB2E4 \u2014 \u300C0\uC6D0\u300D \uC774 \uC544\uB2C8\uB77C \u300C\uAC1C\uB150 \uC5C6\uC74C\u300D \uC774\uB2E4.\n \uADF8\uB798\uC11C \uC124\uACC4 \uD45C\uC758 int \uB97C Optional \uB85C \uB113\uD614\uB2E4(0 \uC73C\uB85C \uB0B4\uBA74 \uBAA8\uB378\uC774 \uC794\uC561 \uBD80\uC871\uC73C\uB85C \uC624\uD574\uD55C\uB2E4).\n\u2605 ``total_krw`` \uB294 \uC61B \uC774\uB984(= ``balance_krw``) \u2014 web\xB7CLI \uAC00 ``balance_krw`` \uB85C \uC62E\uAE34 \uB4A4 **\uD55C \uBC30\uD3EC \uC9C0\uB098** \uC9C0\uC6B4\uB2E4(\uB864\uB9C1 \uCC3D).\n\u2605 ``reserved_krw``(\uD65C\uC131 \uC7A1\uC758 \uCCAD\uAD6C \uD569)\uB294 \uC124\uACC4\uC5D0 \uC788\uC73C\uB098 **\uC544\uC9C1 \uC7AC\uC9C0 \uC54A\uB294\uB2E4** \u2014 None \uC740 \u300C\uBBF8\uCE21\uC815\u300D \uC774\uACE0 0 \uC774 \uC544\uB2C8\uB2E4\n (\uC6D0\uC7A5 ``units``/``measured_cost_usd`` \uC758 NULL \uADDC\uC57D\uACFC \uAC19\uB2E4).",
26267
+ "description": "``GET /api/workspaces/{id}/credits`` \u2014 \uBA64\uBC84\uC5D0\uAC8C \uBCF4\uC774\uB294 \uC794\uC561(2026-09-11 REST \uC815\uD569, \uC124\uACC4 \xA7\uD06C\uB808\uB527 \uBAA8\uC591).\n\n\u2605 ``enabled`` \uB294 **\uCC28\uB2E8(\uACFC\uAE08) \uD65C\uC131 \uC5EC\uBD80**\uC774\uACE0 \uC794\uC561 \uD45C\uC2DC\uC640\uB294 \uBD84\uB9AC\uB2E4(2026-08-27 \uC0AC\uC6A9\uC790 \uACB0\uC815) \u2014 \uCC28\uB2E8\uC774 \uAEBC\uC838 \uC788\uC5B4\uB3C4\n DB \uC5D0 \uC794\uC561\uC774 \uC788\uC73C\uBA74 \uBCF4\uC5EC\uC900\uB2E4(\uD65C\uC131\uD654 \uC804 \uB3C4\uADF8\uD478\uB529\xB7\uC9C0\uAE09 \uD655\uC778\uC6A9). \uC124\uACC4 \uD45C\uC5D0\uB294 \uC5C6\uB358 \uD544\uB4DC\uC9C0\uB9CC MCP \uC0B0\uBB38\uC774 \u300C\uAE30\uB2A5 \uC5C6\uC74C\u300D \uACFC\n \u300C\uCC28\uB2E8\uB9CC \uAEBC\uC9D0\u300D \uC744 \uAC00\uB974\uB294 \uC720\uC77C\uD55C \uADFC\uAC70\uB77C \uACC4\uC57D\uC5D0 \uC62C\uB838\uB2E4.\n\u2605 \uC794\uC561 \uD544\uB4DC\uAC00 **\uC804\uBD80 None** \uC778 \uACBD\uC6B0\uB294 DB \uC790\uCCB4\uAC00 \uC5C6\uB294 \uBC30\uD3EC(file \uBAA8\uB4DC)\uBFD0\uC774\uB2E4 \u2014 \u300C0\uC6D0\u300D \uC774 \uC544\uB2C8\uB77C \u300C\uAC1C\uB150 \uC5C6\uC74C\u300D \uC774\uB2E4.\n \uADF8\uB798\uC11C \uC124\uACC4 \uD45C\uC758 int \uB97C Optional \uB85C \uB113\uD614\uB2E4(0 \uC73C\uB85C \uB0B4\uBA74 \uBAA8\uB378\uC774 \uC794\uC561 \uBD80\uC871\uC73C\uB85C \uC624\uD574\uD55C\uB2E4).\n\u2605 ``reserved_krw``(\uD65C\uC131 \uC7A1\uC758 \uCCAD\uAD6C \uD569)\uB294 \uC124\uACC4\uC5D0 \uC788\uC73C\uB098 **\uC544\uC9C1 \uC7AC\uC9C0 \uC54A\uB294\uB2E4** \u2014 None \uC740 \u300C\uBBF8\uCE21\uC815\u300D \uC774\uACE0 0 \uC774 \uC544\uB2C8\uB2E4\n (\uC6D0\uC7A5 ``units``/``measured_cost_usd`` \uC758 NULL \uADDC\uC57D\uACFC \uAC19\uB2E4).",
26268
26268
  "properties": {
26269
26269
  "workspace_id": {
26270
26270
  "title": "Workspace Id",
@@ -26323,19 +26323,6 @@ var GENERATED_TOOLS = [
26323
26323
  "description": "\uAD6C\uB3C5 + \uCDA9\uC804 \uC794\uC561(\uC6D0)",
26324
26324
  "title": "Balance Krw"
26325
26325
  },
26326
- "total_krw": {
26327
- "anyOf": [
26328
- {
26329
- "type": "integer"
26330
- },
26331
- {
26332
- "type": "null"
26333
- }
26334
- ],
26335
- "default": null,
26336
- "description": "\uC61B \uC774\uB984 \u2014 balance_krw \uC640 \uAC19\uC740 \uAC12(\uD55C \uBC30\uD3EC \uB4A4 \uC81C\uAC70)",
26337
- "title": "Total Krw"
26338
- },
26339
26326
  "period_key": {
26340
26327
  "anyOf": [
26341
26328
  {
@@ -26530,7 +26517,7 @@ var GENERATED_TOOLS = [
26530
26517
  "type": "object"
26531
26518
  }
26532
26519
  },
26533
- "description": "``GET /api/workspaces/{id}/credits/ledger`` \u2014 \uCD5C\uC2E0\uC21C keyset \uD398\uC774\uC9C0.\n\n\u2605 \uCEE4\uC11C \uC774\uB984\uC774 **\uB458\uC774\uB2E4 \u2014 \uAC19\uC740 \uAC12\uC774\uB2E4**: \uB9AC\uB274\uC5BC \uADDC\uC57D\uC740 \uBB38\uC790\uC5F4 ``cursor``/``next_cursor`` \uC774\uACE0 \uC61B \uC774\uB984\n ``next_before_id``(\uC815\uC218)\uB294 web \uC774 \uC62E\uAE34 \uB4A4 **\uD55C \uBC30\uD3EC \uC9C0\uB098** \uC9C0\uC6B4\uB2E4(\uB864\uB9C1 \uCC3D).",
26520
+ "description": "``GET /api/workspaces/{id}/credits/ledger`` \u2014 \uCD5C\uC2E0\uC21C keyset \uD398\uC774\uC9C0.\n\n\u2605 \uCEE4\uC11C\uB294 \uB9AC\uB274\uC5BC \uADDC\uC57D\uC758 \uBB38\uC790\uC5F4 ``cursor``/``next_cursor`` \uD558\uB098\uB2E4 \u2014 \uC61B \uC815\uC218 \uC774\uB984 ``next_before_id`` \uB294 2026-09-14 \uC5D0\n \uC9C0\uC6E0\uB2E4(\uC694\uCCAD \uCFFC\uB9AC ``before_id`` \uB294 ``cursor`` \uC758 \uBCC4\uCE6D\uC73C\uB85C \uB0A8\uB294\uB2E4).",
26534
26521
  "properties": {
26535
26522
  "entries": {
26536
26523
  "items": {
@@ -26552,19 +26539,6 @@ var GENERATED_TOOLS = [
26552
26539
  "description": "\uB2E4\uC74C \uD398\uC774\uC9C0 \uCEE4\uC11C(keyset). None = \uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0",
26553
26540
  "title": "Next Cursor"
26554
26541
  },
26555
- "next_before_id": {
26556
- "anyOf": [
26557
- {
26558
- "type": "integer"
26559
- },
26560
- {
26561
- "type": "null"
26562
- }
26563
- ],
26564
- "default": null,
26565
- "description": "\uC61B \uC774\uB984 \u2014 next_cursor \uC640 \uAC19\uC740 \uAC12(\uD55C \uBC30\uD3EC \uB4A4 \uC81C\uAC70)",
26566
- "title": "Next Before Id"
26567
- },
26568
26542
  "enabled": {
26569
26543
  "default": false,
26570
26544
  "description": "\uACFC\uAE08 \uCC28\uB2E8\uC774 \uCF1C\uC838 \uC788\uB294\uAC00 \u2014 \uC794\uC561 \uCE69\uACFC \uAC19\uC740 \uC758\uBBF8(\uD45C\uC2DC \uC5EC\uBD80 \uD310\uB2E8\uC6A9)",
@@ -28478,7 +28452,7 @@ var GENERATED_TOOLS = [
28478
28452
  },
28479
28453
  {
28480
28454
  "name": "democut_get_storyboard",
28481
- "description": "\uC2A4\uD1A0\uB9AC\uBCF4\uB4DC \u2014 rev\xB7\uC21C\uC11C\xB7\uCEF7(\uD30C\uC0DD \uD544\uB4DC)\xB7\uB300\uAE30 \uC81C\uC548\xB7\uC0AC\uC6A9\uB7C9. If-Match \uC5D0 \uC4F8 rev \uAC00 \uC5EC\uAE30 \uC788\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_add_cut, democut_put_cut_draft, democut_reorder_cuts.",
28455
+ "description": "\uC2A4\uD1A0\uB9AC\uBCF4\uB4DC \u2014 rev\xB7\uC21C\uC11C\xB7\uCEF7(\uD30C\uC0DD \uD544\uB4DC)\xB7\uB300\uAE30 \uC81C\uC548\xB7\uC0AC\uC6A9\uB7C9. If-Match \uC5D0 \uC4F8 rev \uAC00 \uC5EC\uAE30 \uC788\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_add_cut, democut_put_cut_draft, democut_reorder_cuts, democut_make_export.",
28482
28456
  "inputSchema": {
28483
28457
  "type": "object",
28484
28458
  "properties": {
@@ -39640,7 +39614,7 @@ var GENERATED_TOOLS = [
39640
39614
  },
39641
39615
  {
39642
39616
  "name": "democut_reorder_cuts",
39643
- "description": "\uC5F0\uACB0 \uC21C\uC11C\uB97C \uD1B5\uC9F8\uB85C \uB2E4\uC2DC \uC4F4\uB2E4(If-Match rev). \uBE60\uC9C4 \uCEF7\uC740 \uB5BC\uC5B4 \uB454 \uCEF7\uC774 \uB41C\uB2E4.",
39617
+ "description": "\uC5F0\uACB0 \uC21C\uC11C\uB97C \uD1B5\uC9F8\uB85C \uB2E4\uC2DC \uC4F4\uB2E4(If-Match rev). \uBE60\uC9C4 \uCEF7\uC740 \uB5BC\uC5B4 \uB454 \uCEF7\uC774 \uB41C\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_make_export.",
39644
39618
  "inputSchema": {
39645
39619
  "type": "object",
39646
39620
  "properties": {
@@ -41671,121 +41645,2166 @@ var GENERATED_TOOLS = [
41671
41645
  "idempotentHint": true,
41672
41646
  "openWorldHint": false
41673
41647
  }
41674
- }
41675
- ];
41676
-
41677
- // src/api-errors.ts
41678
- var TOOL_BASE_NAMES = GENERATED_TOOLS.map((t) => t.name.replace(/^democut_/, "")).sort((a, b) => b.length - a.length);
41679
- var escapeRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
41680
- var NAME_PATTERNS = TOOL_BASE_NAMES.map((name) => [
41681
- new RegExp(`(?<!democut_)(?<![\\w.])${escapeRe(name)}(?![\\w{(])`, "g"),
41682
- `democut_${name}`
41683
- ]);
41684
- function callableToolNames(text) {
41685
- let out2 = text;
41686
- for (const [re, replacement] of NAME_PATTERNS) out2 = out2.replace(re, replacement);
41687
- return out2;
41688
- }
41689
- function callableStructured(value) {
41690
- if (Array.isArray(value)) return value.map((v) => callableStructured(v));
41691
- if (value && typeof value === "object") {
41692
- const out2 = {};
41693
- for (const [k, v] of Object.entries(value)) {
41694
- out2[k] = k === "next_calls" && Array.isArray(v) ? v.map((x) => typeof x === "string" ? callableToolNames(x) : x) : callableStructured(v);
41695
- }
41696
- return out2;
41697
- }
41698
- return value;
41699
- }
41700
- function usd(v) {
41701
- return v < 0.01 ? `$${v.toFixed(4)}` : `$${v.toFixed(2)}`;
41702
- }
41703
- function classifyApiError(e, ctx) {
41704
- const hint = ctx.statusHint ?? "\uC0C1\uD0DC \uC870\uD68C";
41705
- const contractHint = typeof e.extra.hint === "string" ? callableToolNames(e.extra.hint) : null;
41706
- if (contractHint) {
41707
- const lines = [contractHint];
41708
- if (ctx.submitted) {
41709
- lines.push(
41710
- e.status < 500 ? "\uC544\uC9C1 \uC544\uBB34\uAC83\uB3C4 \uC81C\uCD9C\uB418\uC9C0 \uC54A\uC558\uACE0 \uACFC\uAE08\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC694\uCCAD\uC744 \uACE0\uCCD0 \uB2E4\uC2DC \uD638\uCD9C\uD558\uC138\uC694." : `\u26A0\uFE0F \uC81C\uCD9C\uC774 \uC811\uC218\uB410\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uBCF4\uB0B4\uC9C0 \uB9D0\uACE0 ${hint} \uB85C \uC0C1\uD0DC\uB97C \uBA3C\uC800 \uD655\uC778\uD558\uC138\uC694.`
41711
- );
41712
- }
41713
- return {
41714
- safety: e.status >= 500 && ctx.submitted ? "unsafe" : e.retriable === false ? "fixable" : "safe",
41715
- notCharged: e.status < 500,
41716
- lines
41717
- };
41718
- }
41719
- if (e.status === 422 && e.code === "VIDEOGEN_UPSTREAM_REJECTED") {
41720
- return {
41721
- safety: "unsafe",
41722
- // 돈이 나갔다가 돌아왔다 — "애초에 과금이 없었다" 와는 다르다. 그 구분을 흐리면
41723
- // 원장을 보는 사람이 이 거래를 설명하지 못한다.
41724
- notCharged: false,
41725
- lines: [
41726
- "\uC5C5\uC2A4\uD2B8\uB9BC\uC774 \uC774 \uC791\uC5C5\uC744 \uC601\uAD6C \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC870\uD68C\uD574\uB3C4 \uBCF5\uAD6C\uB418\uC9C0 \uC54A\uC73C\uBA70, \uACFC\uAE08\uC740 \uD658\uBD88\uB410\uC2B5\uB2C8\uB2E4.",
41727
- "\uACE0\uCE60 \uD30C\uB77C\uBBF8\uD130\uAC00 \uC788\uB294 \uC624\uB958\uAC00 \uC544\uB2D9\uB2C8\uB2E4 \u2014 \uC0C8\uB85C \uB9CC\uB4E4\uB824\uBA74 \uD504\uB86C\uD504\uD2B8\xB7\uC124\uC815\uC744 \uBC14\uAFD4 **\uC0C8\uB85C \uC81C\uCD9C**\uD574\uC57C \uD558\uACE0, \uADF8\uAC74 \uB2E4\uC2DC \uACFC\uAE08\uB429\uB2C8\uB2E4(\uC0AC\uC6A9\uC790 \uB3D9\uC758\uB97C \uBC1B\uC73C\uC138\uC694)."
41728
- ]
41729
- };
41730
- }
41731
- if (e.status === 404 && e.code === "VIDEOGEN_JOB_NOT_FOUND") {
41732
- return {
41733
- safety: "unsafe",
41734
- notCharged: false,
41735
- lines: [
41736
- "\uADF8 \uC791\uC5C5\uC744 \uD655\uC778\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. job_id \uAC00 \uB9DE\uB294\uC9C0 \uBA3C\uC800 \uD655\uC778\uD558\uC138\uC694.",
41737
- "\u26A0\uFE0F \uC791\uC5C5\uC774 \uC0B4\uC544 \uC788\uB294\uB370 \uC870\uD68C\uB9CC \uC5B4\uAE0B\uB0AC\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4 \u2014 \uC0C8\uB85C \uC81C\uCD9C\uD558\uBA74 **\uBCC4\uB3C4 \uC791\uC5C5\uC73C\uB85C \uB2E4\uC2DC \uACFC\uAE08**\uB429\uB2C8\uB2E4."
41738
- ]
41739
- };
41740
- }
41741
- if (e.status === 402) {
41742
- const lines = [];
41743
- const limit = e.extra.limit_usd;
41744
- const would = e.extra.would_cost_usd;
41745
- if (typeof limit === "number" && typeof would === "number") {
41746
- lines.push(`\uC0C1\uD55C ${usd(limit)} \xB7 \uC774 \uC694\uCCAD ${usd(would)}`);
41648
+ },
41649
+ {
41650
+ "name": "democut_estimate_export",
41651
+ "description": "\uC644\uC131\uBCF8 \uACAC\uC801(0\uC6D0 \uD589).",
41652
+ "inputSchema": {
41653
+ "type": "object",
41654
+ "properties": {
41655
+ "slug": {
41656
+ "type": "string",
41657
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(list_projects)"
41658
+ },
41659
+ "quality": {
41660
+ "default": "1080p",
41661
+ "enum": [
41662
+ "720p",
41663
+ "1080p"
41664
+ ],
41665
+ "title": "Quality",
41666
+ "type": "string"
41667
+ }
41668
+ },
41669
+ "required": [
41670
+ "slug"
41671
+ ],
41672
+ "additionalProperties": false
41673
+ },
41674
+ "outputSchema": {
41675
+ "$defs": {
41676
+ "EstimateItemResult": {
41677
+ "properties": {
41678
+ "cut_id": {
41679
+ "anyOf": [
41680
+ {
41681
+ "type": "string"
41682
+ },
41683
+ {
41684
+ "type": "null"
41685
+ }
41686
+ ],
41687
+ "default": null,
41688
+ "title": "Cut Id"
41689
+ },
41690
+ "rows": {
41691
+ "items": {
41692
+ "$ref": "#/$defs/QuoteRow"
41693
+ },
41694
+ "title": "Rows",
41695
+ "type": "array"
41696
+ },
41697
+ "total_krw": {
41698
+ "default": 0,
41699
+ "title": "Total Krw",
41700
+ "type": "integer"
41701
+ },
41702
+ "blocked_reason": {
41703
+ "anyOf": [
41704
+ {
41705
+ "type": "string"
41706
+ },
41707
+ {
41708
+ "type": "null"
41709
+ }
41710
+ ],
41711
+ "default": null,
41712
+ "description": "\uD544\uC218 \uB204\uB77D \uB4F1\uC73C\uB85C \uACAC\uC801 \uBD88\uAC00 \u2014 \uCF54\uB4DC(HOST_REQUIRED \u2026)",
41713
+ "title": "Blocked Reason"
41714
+ },
41715
+ "notes": {
41716
+ "description": "\uB9C9\uC9C0 \uC54A\uB294 \uC8FC\uC758 \u2014 \uADF8\uB300\uB85C \uC9C4\uD589\uD574\uB3C4 \uB41C\uB2E4",
41717
+ "items": {
41718
+ "$ref": "#/$defs/EstimateNote"
41719
+ },
41720
+ "title": "Notes",
41721
+ "type": "array"
41722
+ }
41723
+ },
41724
+ "title": "EstimateItemResult",
41725
+ "type": "object"
41726
+ },
41727
+ "EstimateNote": {
41728
+ "description": "\uACAC\uC801 \uD56D\uBAA9\uC758 **\uC8FC\uC758** \u2014 \uB9C9\uC9C0\uB294 \uC54A\uC9C0\uB9CC \uADF8\uB300\uB85C \uC9C4\uD589\uD558\uBA74 \uACB0\uACFC\uAC00 \uC758\uB3C4\uC640 \uB2E4\uB97C \uC218 \uC788\uB294 \uAC83.\n\n\u2605\u2605 `blocked_reason`(\uACAC\uC801 \uBD88\uAC00)\uACFC **\uB2E4\uB978 \uC790\uB9AC**\uB2E4: \uADF8\uCABD\uC740 \uB9CC\uB4E4 \uC218 \uC5C6\uB2E4\uB294 \uB73B\uC774\uACE0 \uC774\uCABD\uC740\n\u300C\uB9CC\uB4E4 \uC218\uB294 \uC788\uB294\uB370 \uC774\uAC78 \uC54C\uACE0 \uACE0\uB974\uB77C\u300D \uB2E4. \uCC28\uB2E8\uC73C\uB85C \uBC14\uAFB8\uBA74 \uC815\uB2F9\uD55C \uC120\uD0DD(\uB85C\uACE0\xB7\uCD94\uC0C1 \uC7A5\uBA74\uC758 t2v)\uC774\n\uB9C9\uD788\uACE0, \uC548\uB0B4\uAC00 \uC5C6\uC73C\uBA74 \uC0AC\uC6A9\uC790\uAC00 \uACE0\uB978 \uC801 \uC5C6\uB294 \uBC29\uC2DD\uC73C\uB85C **\uC870\uC6A9\uD788** \uB098\uAC04\uB2E4.\n\u2605 \uCF54\uB4DC\uC640 \uBB38\uC7A5\uC744 \uD568\uAED8 \uC2E3\uB294\uB2E4 \u2014 \uC6F9\uC740 \uCF54\uB4DC\uB85C \uC790\uAE30 \uBB38\uAD6C\uB97C \uC4F8 \uC218 \uC788\uACE0, \uC5D0\uC774\uC804\uD2B8\uB294 \uBB38\uC7A5\uC744 \uADF8\uB300\uB85C \uC77D\uB294\uB2E4.\n \u26A0\uFE0F \uBB38\uC7A5 \uC18D \uB3C4\uAD6C \uC774\uB984\uC740 **\uC804\uC1A1 \uACC4\uCE35\uC774 \uC811\uB450\uC0AC\uB97C \uBD99\uC778\uB2E4**(\uC6D0\uACA9 `upload_asset` / stdio\n `democut_upload_asset`) \u2014 \uC5EC\uAE30\uC11C \uC811\uB450\uC0AC\uB97C \uBC15\uC73C\uBA74 \uD55C\uCABD\uC5D0\uC11C \uBD80\uB97C \uC218 \uC5C6\uB294 \uC774\uB984\uC774 \uB41C\uB2E4.",
41729
+ "properties": {
41730
+ "code": {
41731
+ "description": "\uC8FC\uC758 \uCF54\uB4DC \u2014 T2V_NO_REFERENCE_IMAGE \u2026",
41732
+ "title": "Code",
41733
+ "type": "string"
41734
+ },
41735
+ "message": {
41736
+ "title": "Message",
41737
+ "type": "string"
41738
+ },
41739
+ "cut_id": {
41740
+ "anyOf": [
41741
+ {
41742
+ "type": "string"
41743
+ },
41744
+ {
41745
+ "type": "null"
41746
+ }
41747
+ ],
41748
+ "default": null,
41749
+ "title": "Cut Id"
41750
+ }
41751
+ },
41752
+ "required": [
41753
+ "code",
41754
+ "message"
41755
+ ],
41756
+ "title": "EstimateNote",
41757
+ "type": "object"
41758
+ },
41759
+ "QuoteRow": {
41760
+ "properties": {
41761
+ "key": {
41762
+ "description": "\uC7A1 \uC548\uC5D0\uC11C \uC720\uC77C\uD55C \uD589 \uD0A4 \u2014 tts:<line_id> \xB7 videogen:i2v \xB7 lipsync \xB7 render:\u2026",
41763
+ "title": "Key",
41764
+ "type": "string"
41765
+ },
41766
+ "ref_type": {
41767
+ "description": "\uC6D0\uAC00\uD45C \uD0A4(credits/pricing.BASE_PRICES)",
41768
+ "title": "Ref Type",
41769
+ "type": "string"
41770
+ },
41771
+ "units": {
41772
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
41773
+ "title": "Units",
41774
+ "type": "string"
41775
+ },
41776
+ "unit_kind": {
41777
+ "title": "Unit Kind",
41778
+ "type": "string"
41779
+ },
41780
+ "display_name": {
41781
+ "title": "Display Name",
41782
+ "type": "string"
41783
+ },
41784
+ "krw": {
41785
+ "minimum": 0,
41786
+ "title": "Krw",
41787
+ "type": "integer"
41788
+ },
41789
+ "provisional": {
41790
+ "default": false,
41791
+ "title": "Provisional",
41792
+ "type": "boolean"
41793
+ }
41794
+ },
41795
+ "required": [
41796
+ "key",
41797
+ "ref_type",
41798
+ "units",
41799
+ "unit_kind",
41800
+ "display_name",
41801
+ "krw"
41802
+ ],
41803
+ "title": "QuoteRow",
41804
+ "type": "object"
41805
+ }
41806
+ },
41807
+ "properties": {
41808
+ "items": {
41809
+ "items": {
41810
+ "$ref": "#/$defs/EstimateItemResult"
41811
+ },
41812
+ "title": "Items",
41813
+ "type": "array"
41814
+ },
41815
+ "notes": {
41816
+ "items": {
41817
+ "$ref": "#/$defs/EstimateNote"
41818
+ },
41819
+ "title": "Notes",
41820
+ "type": "array"
41821
+ },
41822
+ "total_krw": {
41823
+ "title": "Total Krw",
41824
+ "type": "integer"
41825
+ },
41826
+ "rate_version": {
41827
+ "title": "Rate Version",
41828
+ "type": "integer"
41829
+ },
41830
+ "balance_krw": {
41831
+ "title": "Balance Krw",
41832
+ "type": "integer"
41833
+ },
41834
+ "balance_after_krw": {
41835
+ "title": "Balance After Krw",
41836
+ "type": "integer"
41837
+ },
41838
+ "can_afford": {
41839
+ "title": "Can Afford",
41840
+ "type": "boolean"
41841
+ },
41842
+ "mock": {
41843
+ "default": false,
41844
+ "title": "Mock",
41845
+ "type": "boolean"
41846
+ },
41847
+ "provisional": {
41848
+ "default": false,
41849
+ "title": "Provisional",
41850
+ "type": "boolean"
41851
+ }
41852
+ },
41853
+ "required": [
41854
+ "total_krw",
41855
+ "rate_version",
41856
+ "balance_krw",
41857
+ "balance_after_krw",
41858
+ "can_afford"
41859
+ ],
41860
+ "title": "EstimateResponse",
41861
+ "type": "object"
41862
+ },
41863
+ "annotations": {
41864
+ "readOnlyHint": false,
41865
+ "destructiveHint": false,
41866
+ "idempotentHint": false,
41867
+ "openWorldHint": false
41747
41868
  }
41748
- lines.push("\uD574\uC0C1\uB3C4\uB098 \uAE38\uC774\uB97C \uB0AE\uCDB0 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694. \uC544\uC9C1 \uACFC\uAE08\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.");
41749
- return { safety: "fixable", notCharged: true, lines };
41750
- }
41751
- if (e.status === 422) {
41752
- const unknown2 = e.extra.unknownFields;
41753
- if (Array.isArray(unknown2) && unknown2.length) {
41754
- return {
41755
- safety: "fixable",
41756
- notCharged: true,
41757
- lines: [
41758
- `\uC11C\uBC84\uAC00 \uC544\uC9C1 \uBAA8\uB974\uB294 \uC778\uC790\uC785\uB2C8\uB2E4: ${unknown2.join(", ")} \u2014 \uBC30\uD3EC\uAC00 \uACB9\uCE58\uB294 \uC911\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4.`,
41759
- "\uADF8 \uC778\uC790\uB9CC \uBE7C\uACE0 \uB098\uBA38\uC9C0\uB294 \uADF8\uB300\uB85C \uB2E4\uC2DC \uBCF4\uB0B4\uC138\uC694. \uC544\uC9C1 \uACFC\uAE08\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."
41760
- ]
41761
- };
41869
+ },
41870
+ {
41871
+ "name": "democut_make_export",
41872
+ "description": "\uC5F0\uACB0 \uC21C\uC11C\xB7\uC7AC\uC0DD \uAD6C\uAC04\uB300\uB85C \uC774\uC5B4 \uBD99\uC778 \uC644\uC131\uBCF8\uC744 \uB9CC\uB4E0\uB2E4(0\uC6D0, \uC7A1). 0\uC6D0\uC774\uC5B4\uB3C4 \uC81C\uCD9C\uC774 \uD544\uC694\uD55C \uB3C4\uAD6C\uB2E4: democut_estimate_export \uB85C \uACAC\uC801\uACFC rate_version \uC744 \uD655\uC778\uD55C \uB4A4 confirmed_cost_krw \uC640 rate_version \uC744 \uADF8\uB300\uB85C \uB123\uC5B4\uB77C. \uC5B4\uAE0B\uB098\uBA74 409 QUOTE_MISMATCH \uB85C \uC0C8 \uACAC\uC801\uC744 \uC900\uB2E4(\uACFC\uAE08 \uC5C6\uC74C \u2014 \uADF8 \uC0AC\uC774 \uC2A4\uD1A0\uB9AC\uBCF4\uB4DC\uAC00 \uBC14\uB010 \uACBD\uC6B0\uB3C4 \uAC19\uB2E4). \uC2E4\uD328\uD574\uB3C4 \uC7AC\uC81C\uCD9C\uD558\uC9C0 \uB9C8\uB77C \u2014 \uAC19\uC740 \uC2A4\uB0C5\uC0F7\uC774 \uD65C\uC131\uC774\uBA74 \uC11C\uBC84\uAC00 \uAE30\uC874 \uC7A1\uC744 \uB3CC\uB824\uC900\uB2E4(deduplicated=true). \uC751\uB2F5\uC740 202 \u2014 \uACB0\uACFC\uB294 democut_wait_jobs \uB85C \uBC1B\uB294\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs, democut_list_exports.",
41873
+ "inputSchema": {
41874
+ "type": "object",
41875
+ "properties": {
41876
+ "slug": {
41877
+ "type": "string",
41878
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(list_projects)"
41879
+ },
41880
+ "quality": {
41881
+ "default": "1080p",
41882
+ "enum": [
41883
+ "720p",
41884
+ "1080p"
41885
+ ],
41886
+ "title": "Quality",
41887
+ "type": "string"
41888
+ },
41889
+ "confirmed_cost_krw": {
41890
+ "minimum": 0,
41891
+ "title": "Confirmed Cost Krw",
41892
+ "type": "integer"
41893
+ },
41894
+ "rate_version": {
41895
+ "minimum": 1,
41896
+ "title": "Rate Version",
41897
+ "type": "integer"
41898
+ }
41899
+ },
41900
+ "required": [
41901
+ "slug",
41902
+ "confirmed_cost_krw",
41903
+ "rate_version"
41904
+ ],
41905
+ "additionalProperties": false
41906
+ },
41907
+ "outputSchema": {
41908
+ "$defs": {
41909
+ "Quote": {
41910
+ "properties": {
41911
+ "rows": {
41912
+ "items": {
41913
+ "$ref": "#/$defs/QuoteRow"
41914
+ },
41915
+ "title": "Rows",
41916
+ "type": "array"
41917
+ },
41918
+ "total_krw": {
41919
+ "minimum": 0,
41920
+ "title": "Total Krw",
41921
+ "type": "integer"
41922
+ },
41923
+ "rate_version": {
41924
+ "description": "pricing_config.version \u2014 make \uAC00 \uAC19\uC740 \uAC12\uC744 \uC694\uAD6C\uD55C\uB2E4",
41925
+ "minimum": 1,
41926
+ "title": "Rate Version",
41927
+ "type": "integer"
41928
+ },
41929
+ "mock": {
41930
+ "default": false,
41931
+ "title": "Mock",
41932
+ "type": "boolean"
41933
+ },
41934
+ "provisional": {
41935
+ "default": false,
41936
+ "description": "\uD589 \uC911 \uD558\uB098\uB77C\uB3C4 \uC784\uC2DC \uB2E8\uAC00\uBA74 True",
41937
+ "title": "Provisional",
41938
+ "type": "boolean"
41939
+ }
41940
+ },
41941
+ "required": [
41942
+ "total_krw",
41943
+ "rate_version"
41944
+ ],
41945
+ "title": "Quote",
41946
+ "type": "object"
41947
+ },
41948
+ "QuoteRow": {
41949
+ "properties": {
41950
+ "key": {
41951
+ "description": "\uC7A1 \uC548\uC5D0\uC11C \uC720\uC77C\uD55C \uD589 \uD0A4 \u2014 tts:<line_id> \xB7 videogen:i2v \xB7 lipsync \xB7 render:\u2026",
41952
+ "title": "Key",
41953
+ "type": "string"
41954
+ },
41955
+ "ref_type": {
41956
+ "description": "\uC6D0\uAC00\uD45C \uD0A4(credits/pricing.BASE_PRICES)",
41957
+ "title": "Ref Type",
41958
+ "type": "string"
41959
+ },
41960
+ "units": {
41961
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
41962
+ "title": "Units",
41963
+ "type": "string"
41964
+ },
41965
+ "unit_kind": {
41966
+ "title": "Unit Kind",
41967
+ "type": "string"
41968
+ },
41969
+ "display_name": {
41970
+ "title": "Display Name",
41971
+ "type": "string"
41972
+ },
41973
+ "krw": {
41974
+ "minimum": 0,
41975
+ "title": "Krw",
41976
+ "type": "integer"
41977
+ },
41978
+ "provisional": {
41979
+ "default": false,
41980
+ "title": "Provisional",
41981
+ "type": "boolean"
41982
+ }
41983
+ },
41984
+ "required": [
41985
+ "key",
41986
+ "ref_type",
41987
+ "units",
41988
+ "unit_kind",
41989
+ "display_name",
41990
+ "krw"
41991
+ ],
41992
+ "title": "QuoteRow",
41993
+ "type": "object"
41994
+ }
41995
+ },
41996
+ "properties": {
41997
+ "job_id": {
41998
+ "title": "Job Id",
41999
+ "type": "string"
42000
+ },
42001
+ "quote": {
42002
+ "anyOf": [
42003
+ {
42004
+ "$ref": "#/$defs/Quote"
42005
+ },
42006
+ {
42007
+ "type": "null"
42008
+ }
42009
+ ],
42010
+ "default": null
42011
+ },
42012
+ "next_calls": {
42013
+ "items": {
42014
+ "type": "string"
42015
+ },
42016
+ "title": "Next Calls",
42017
+ "type": "array"
42018
+ }
42019
+ },
42020
+ "required": [
42021
+ "job_id"
42022
+ ],
42023
+ "title": "JobAccepted",
42024
+ "type": "object"
42025
+ },
42026
+ "annotations": {
42027
+ "readOnlyHint": false,
42028
+ "destructiveHint": false,
42029
+ "idempotentHint": false,
42030
+ "openWorldHint": false
41762
42031
  }
41763
- return {
41764
- safety: "fixable",
41765
- notCharged: true,
41766
- lines: ["\uD30C\uB77C\uBBF8\uD130\uB97C \uACE0\uCCD0 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694. \uC544\uC9C1 \uACFC\uAE08\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."]
41767
- };
41768
- }
41769
- if (e.status === 503) {
41770
- return {
41771
- safety: "safe",
41772
- notCharged: true,
41773
- lines: ["\uC77C\uC2DC\uC801\uC778 \uC624\uB958\uC785\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uADF8\uB300\uB85C \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uB3C4 \uC548\uC804\uD569\uB2C8\uB2E4."]
41774
- };
41775
- }
41776
- if (e.status === 502) {
41777
- return ctx.submitted ? {
41778
- safety: "unsafe",
41779
- notCharged: false,
41780
- lines: [
41781
- "\u26A0\uFE0F \uC81C\uCD9C\uC774 \uC774\uBBF8 \uC811\uC218\uB410\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC81C\uCD9C\uD558\uBA74 \uB450 \uBC88 \uACFC\uAE08\uB429\uB2C8\uB2E4 \u2014",
41782
- `\uC7AC\uC2DC\uB3C4\uD558\uC9C0 \uB9D0\uACE0 ${hint} \uB85C \uD655\uC778\uD558\uAC70\uB098 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC138\uC694.`
41783
- ]
41784
- } : {
41785
- safety: "safe",
41786
- notCharged: true,
41787
- lines: [
41788
- "\uC5C5\uC2A4\uD2B8\uB9BC \uC624\uB958\uC785\uB2C8\uB2E4. \uC774 \uC694\uCCAD\uC740 \uBD80\uC791\uC6A9\uC774 \uC5C6\uC73C\uBBC0\uB85C \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uB3C4 \uC548\uC804\uD569\uB2C8\uB2E4."
42032
+ },
42033
+ {
42034
+ "name": "democut_list_exports",
42035
+ "description": "\uC644\uC131\uBCF8 \uBAA9\uB85D(\uB2E4\uC6B4\uB85C\uB4DC URL \uB3D9\uBD09).",
42036
+ "inputSchema": {
42037
+ "type": "object",
42038
+ "properties": {
42039
+ "slug": {
42040
+ "type": "string",
42041
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(list_projects)"
42042
+ }
42043
+ },
42044
+ "required": [
42045
+ "slug"
42046
+ ],
42047
+ "additionalProperties": false
42048
+ },
42049
+ "outputSchema": {
42050
+ "$defs": {
42051
+ "DownloadUrls": {
42052
+ "description": "\uBC84\uC804\uC758 \uC5ED\uD560\uBCC4 \uC0B0\uCD9C\uBB3C \uC11C\uBA85 URL. \uC5C6\uB294 \uC5ED\uD560\uC740 ``None``.\n\n``timing`` \uC740 **\uD56D\uC0C1 None** \uC774\uB2E4 \u2014 \uC790\uC0B0\uC774 \uC544\uB2C8\uB77C \uD589 \uC548\uC758 JSON \uC774\uB77C \uC11C\uBA85\uD560 blob \uC774 \uC5C6\uB2E4. \uC2E4\uC81C \uAC12\uC740 \uAC19\uC740 \uC751\uB2F5\uC758\n``CutVersionView.timing`` \uC5D0 \uC778\uB77C\uC778\uC73C\uB85C \uC2E4\uB9B0\uB2E4. \uD544\uB4DC\uB97C \uC9C0\uC6B0\uC9C0 \uC54A\uB294 \uAC83\uC740 \uC5ED\uD560 \uD45C\uB97C \uD55C\uC790\uB9AC\uC5D0 \uBCF4\uC774\uAC8C \uB450\uAE30 \uC704\uD568\uC774\uB2E4.",
42053
+ "properties": {
42054
+ "video": {
42055
+ "anyOf": [
42056
+ {
42057
+ "type": "string"
42058
+ },
42059
+ {
42060
+ "type": "null"
42061
+ }
42062
+ ],
42063
+ "default": null,
42064
+ "title": "Video"
42065
+ },
42066
+ "audio": {
42067
+ "anyOf": [
42068
+ {
42069
+ "type": "string"
42070
+ },
42071
+ {
42072
+ "type": "null"
42073
+ }
42074
+ ],
42075
+ "default": null,
42076
+ "title": "Audio"
42077
+ },
42078
+ "subtitle": {
42079
+ "anyOf": [
42080
+ {
42081
+ "type": "string"
42082
+ },
42083
+ {
42084
+ "type": "null"
42085
+ }
42086
+ ],
42087
+ "default": null,
42088
+ "title": "Subtitle"
42089
+ },
42090
+ "still": {
42091
+ "anyOf": [
42092
+ {
42093
+ "type": "string"
42094
+ },
42095
+ {
42096
+ "type": "null"
42097
+ }
42098
+ ],
42099
+ "default": null,
42100
+ "title": "Still"
42101
+ },
42102
+ "timing": {
42103
+ "anyOf": [
42104
+ {
42105
+ "type": "string"
42106
+ },
42107
+ {
42108
+ "type": "null"
42109
+ }
42110
+ ],
42111
+ "default": null,
42112
+ "title": "Timing"
42113
+ }
42114
+ },
42115
+ "title": "DownloadUrls",
42116
+ "type": "object"
42117
+ },
42118
+ "ExportView": {
42119
+ "properties": {
42120
+ "number": {
42121
+ "minimum": 1,
42122
+ "title": "Number",
42123
+ "type": "integer"
42124
+ },
42125
+ "project_slug": {
42126
+ "title": "Project Slug",
42127
+ "type": "string"
42128
+ },
42129
+ "storyboard_rev": {
42130
+ "title": "Storyboard Rev",
42131
+ "type": "integer"
42132
+ },
42133
+ "snapshot": {
42134
+ "additionalProperties": true,
42135
+ "description": "{order_all, order_rendered, cut_versions{}, cut_edits{}, subtitles_by_cut{}, quality}",
42136
+ "title": "Snapshot",
42137
+ "type": "object"
42138
+ },
42139
+ "job_id": {
42140
+ "title": "Job Id",
42141
+ "type": "string"
42142
+ },
42143
+ "state": {
42144
+ "enum": [
42145
+ "queued",
42146
+ "running",
42147
+ "done",
42148
+ "error",
42149
+ "cancelled"
42150
+ ],
42151
+ "title": "State",
42152
+ "type": "string"
42153
+ },
42154
+ "video_asset_id": {
42155
+ "anyOf": [
42156
+ {
42157
+ "type": "string"
42158
+ },
42159
+ {
42160
+ "type": "null"
42161
+ }
42162
+ ],
42163
+ "default": null,
42164
+ "title": "Video Asset Id"
42165
+ },
42166
+ "subtitle_asset_id": {
42167
+ "anyOf": [
42168
+ {
42169
+ "type": "string"
42170
+ },
42171
+ {
42172
+ "type": "null"
42173
+ }
42174
+ ],
42175
+ "default": null,
42176
+ "title": "Subtitle Asset Id"
42177
+ },
42178
+ "duration_ms": {
42179
+ "anyOf": [
42180
+ {
42181
+ "type": "integer"
42182
+ },
42183
+ {
42184
+ "type": "null"
42185
+ }
42186
+ ],
42187
+ "default": null,
42188
+ "title": "Duration Ms"
42189
+ },
42190
+ "download": {
42191
+ "$ref": "#/$defs/DownloadUrls"
42192
+ },
42193
+ "thumbnails": {
42194
+ "items": {
42195
+ "$ref": "#/$defs/ThumbnailView"
42196
+ },
42197
+ "title": "Thumbnails",
42198
+ "type": "array"
42199
+ },
42200
+ "selected_thumbnail_id": {
42201
+ "anyOf": [
42202
+ {
42203
+ "type": "string"
42204
+ },
42205
+ {
42206
+ "type": "null"
42207
+ }
42208
+ ],
42209
+ "default": null,
42210
+ "title": "Selected Thumbnail Id"
42211
+ },
42212
+ "youtube_meta": {
42213
+ "anyOf": [
42214
+ {
42215
+ "$ref": "#/$defs/YoutubeMeta"
42216
+ },
42217
+ {
42218
+ "type": "null"
42219
+ }
42220
+ ],
42221
+ "default": null
42222
+ },
42223
+ "youtube": {
42224
+ "anyOf": [
42225
+ {
42226
+ "$ref": "#/$defs/YoutubePublished"
42227
+ },
42228
+ {
42229
+ "type": "null"
42230
+ }
42231
+ ],
42232
+ "default": null
42233
+ },
42234
+ "created_at": {
42235
+ "title": "Created At",
42236
+ "type": "string"
42237
+ }
42238
+ },
42239
+ "required": [
42240
+ "number",
42241
+ "project_slug",
42242
+ "storyboard_rev",
42243
+ "snapshot",
42244
+ "job_id",
42245
+ "state",
42246
+ "created_at"
42247
+ ],
42248
+ "title": "ExportView",
42249
+ "type": "object"
42250
+ },
42251
+ "ThumbnailView": {
42252
+ "properties": {
42253
+ "asset_id": {
42254
+ "title": "Asset Id",
42255
+ "type": "string"
42256
+ },
42257
+ "url": {
42258
+ "anyOf": [
42259
+ {
42260
+ "type": "string"
42261
+ },
42262
+ {
42263
+ "type": "null"
42264
+ }
42265
+ ],
42266
+ "default": null,
42267
+ "title": "Url"
42268
+ }
42269
+ },
42270
+ "required": [
42271
+ "asset_id"
42272
+ ],
42273
+ "title": "ThumbnailView",
42274
+ "type": "object"
42275
+ },
42276
+ "YoutubeMeta": {
42277
+ "description": "\uC720\uD29C\uBE0C \uC81C\uBAA9\xB7\uC124\uBA85\xB7\uD0DC\uADF8 \u2014 \uD55C\uB3C4\uB294 YouTube Data API \uC758 \uAC83(\uC81C\uBAA9 100\xB7\uC124\uBA85 5000\xB7\uD0DC\uADF8 15\uAC1C, \uD0DC\uADF8 \uD558\uB098 30\uC790). \u2605 \uACC4\uC57D\uC774 \uC5EC\uAE30\uC11C \uB9C9\uC9C0 \uC54A\uC73C\uBA74\n\uBC1C\uD589(18c-2)\uC774 400 \uC73C\uB85C \uC8FD\uACE0 \uADF8\uB54C\uB294 \uC6D0\uC778\uC5D0\uC11C \uBA40\uB2E4. \uC0DD\uC131\uAE30 \uC0B0\uCD9C\uBB3C\uC740 \uC2E4\uD589\uAE30\uAC00 \uAC19\uC740 \uD55C\uB3C4\uB85C \uBA3C\uC800 \uB2E4\uB4EC\uB294\uB2E4(`executors/youtube_meta.sanitize_meta`).",
42278
+ "properties": {
42279
+ "title": {
42280
+ "maxLength": 100,
42281
+ "minLength": 1,
42282
+ "title": "Title",
42283
+ "type": "string"
42284
+ },
42285
+ "description": {
42286
+ "default": "",
42287
+ "maxLength": 5e3,
42288
+ "title": "Description",
42289
+ "type": "string"
42290
+ },
42291
+ "tags": {
42292
+ "items": {
42293
+ "maxLength": 30,
42294
+ "minLength": 1,
42295
+ "type": "string"
42296
+ },
42297
+ "maxItems": 15,
42298
+ "title": "Tags",
42299
+ "type": "array"
42300
+ }
42301
+ },
42302
+ "required": [
42303
+ "title"
42304
+ ],
42305
+ "title": "YoutubeMeta",
42306
+ "type": "object"
42307
+ },
42308
+ "YoutubePublished": {
42309
+ "properties": {
42310
+ "video_id": {
42311
+ "title": "Video Id",
42312
+ "type": "string"
42313
+ },
42314
+ "url": {
42315
+ "title": "Url",
42316
+ "type": "string"
42317
+ },
42318
+ "privacy": {
42319
+ "enum": [
42320
+ "private",
42321
+ "unlisted",
42322
+ "public"
42323
+ ],
42324
+ "title": "Privacy",
42325
+ "type": "string"
42326
+ },
42327
+ "uploaded_at": {
42328
+ "title": "Uploaded At",
42329
+ "type": "string"
42330
+ },
42331
+ "account_id": {
42332
+ "title": "Account Id",
42333
+ "type": "string"
42334
+ }
42335
+ },
42336
+ "required": [
42337
+ "video_id",
42338
+ "url",
42339
+ "privacy",
42340
+ "uploaded_at",
42341
+ "account_id"
42342
+ ],
42343
+ "title": "YoutubePublished",
42344
+ "type": "object"
42345
+ }
42346
+ },
42347
+ "properties": {
42348
+ "exports": {
42349
+ "items": {
42350
+ "$ref": "#/$defs/ExportView"
42351
+ },
42352
+ "title": "Exports",
42353
+ "type": "array"
42354
+ }
42355
+ },
42356
+ "required": [
42357
+ "exports"
42358
+ ],
42359
+ "title": "ExportListResponse",
42360
+ "type": "object"
42361
+ },
42362
+ "annotations": {
42363
+ "readOnlyHint": true,
42364
+ "destructiveHint": false,
42365
+ "idempotentHint": true,
42366
+ "openWorldHint": false
42367
+ }
42368
+ },
42369
+ {
42370
+ "name": "democut_get_export",
42371
+ "description": "\uC644\uC131\uBCF8 \uD558\uB098.",
42372
+ "inputSchema": {
42373
+ "type": "object",
42374
+ "properties": {
42375
+ "slug": {
42376
+ "type": "string",
42377
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(list_projects)"
42378
+ },
42379
+ "number": {
42380
+ "type": "string",
42381
+ "description": "\uC644\uC131\uBCF8 \uBC88\uD638(1\uBD80\uD130)"
42382
+ }
42383
+ },
42384
+ "required": [
42385
+ "slug",
42386
+ "number"
42387
+ ],
42388
+ "additionalProperties": false
42389
+ },
42390
+ "outputSchema": {
42391
+ "$defs": {
42392
+ "DownloadUrls": {
42393
+ "description": "\uBC84\uC804\uC758 \uC5ED\uD560\uBCC4 \uC0B0\uCD9C\uBB3C \uC11C\uBA85 URL. \uC5C6\uB294 \uC5ED\uD560\uC740 ``None``.\n\n``timing`` \uC740 **\uD56D\uC0C1 None** \uC774\uB2E4 \u2014 \uC790\uC0B0\uC774 \uC544\uB2C8\uB77C \uD589 \uC548\uC758 JSON \uC774\uB77C \uC11C\uBA85\uD560 blob \uC774 \uC5C6\uB2E4. \uC2E4\uC81C \uAC12\uC740 \uAC19\uC740 \uC751\uB2F5\uC758\n``CutVersionView.timing`` \uC5D0 \uC778\uB77C\uC778\uC73C\uB85C \uC2E4\uB9B0\uB2E4. \uD544\uB4DC\uB97C \uC9C0\uC6B0\uC9C0 \uC54A\uB294 \uAC83\uC740 \uC5ED\uD560 \uD45C\uB97C \uD55C\uC790\uB9AC\uC5D0 \uBCF4\uC774\uAC8C \uB450\uAE30 \uC704\uD568\uC774\uB2E4.",
42394
+ "properties": {
42395
+ "video": {
42396
+ "anyOf": [
42397
+ {
42398
+ "type": "string"
42399
+ },
42400
+ {
42401
+ "type": "null"
42402
+ }
42403
+ ],
42404
+ "default": null,
42405
+ "title": "Video"
42406
+ },
42407
+ "audio": {
42408
+ "anyOf": [
42409
+ {
42410
+ "type": "string"
42411
+ },
42412
+ {
42413
+ "type": "null"
42414
+ }
42415
+ ],
42416
+ "default": null,
42417
+ "title": "Audio"
42418
+ },
42419
+ "subtitle": {
42420
+ "anyOf": [
42421
+ {
42422
+ "type": "string"
42423
+ },
42424
+ {
42425
+ "type": "null"
42426
+ }
42427
+ ],
42428
+ "default": null,
42429
+ "title": "Subtitle"
42430
+ },
42431
+ "still": {
42432
+ "anyOf": [
42433
+ {
42434
+ "type": "string"
42435
+ },
42436
+ {
42437
+ "type": "null"
42438
+ }
42439
+ ],
42440
+ "default": null,
42441
+ "title": "Still"
42442
+ },
42443
+ "timing": {
42444
+ "anyOf": [
42445
+ {
42446
+ "type": "string"
42447
+ },
42448
+ {
42449
+ "type": "null"
42450
+ }
42451
+ ],
42452
+ "default": null,
42453
+ "title": "Timing"
42454
+ }
42455
+ },
42456
+ "title": "DownloadUrls",
42457
+ "type": "object"
42458
+ },
42459
+ "ThumbnailView": {
42460
+ "properties": {
42461
+ "asset_id": {
42462
+ "title": "Asset Id",
42463
+ "type": "string"
42464
+ },
42465
+ "url": {
42466
+ "anyOf": [
42467
+ {
42468
+ "type": "string"
42469
+ },
42470
+ {
42471
+ "type": "null"
42472
+ }
42473
+ ],
42474
+ "default": null,
42475
+ "title": "Url"
42476
+ }
42477
+ },
42478
+ "required": [
42479
+ "asset_id"
42480
+ ],
42481
+ "title": "ThumbnailView",
42482
+ "type": "object"
42483
+ },
42484
+ "YoutubeMeta": {
42485
+ "description": "\uC720\uD29C\uBE0C \uC81C\uBAA9\xB7\uC124\uBA85\xB7\uD0DC\uADF8 \u2014 \uD55C\uB3C4\uB294 YouTube Data API \uC758 \uAC83(\uC81C\uBAA9 100\xB7\uC124\uBA85 5000\xB7\uD0DC\uADF8 15\uAC1C, \uD0DC\uADF8 \uD558\uB098 30\uC790). \u2605 \uACC4\uC57D\uC774 \uC5EC\uAE30\uC11C \uB9C9\uC9C0 \uC54A\uC73C\uBA74\n\uBC1C\uD589(18c-2)\uC774 400 \uC73C\uB85C \uC8FD\uACE0 \uADF8\uB54C\uB294 \uC6D0\uC778\uC5D0\uC11C \uBA40\uB2E4. \uC0DD\uC131\uAE30 \uC0B0\uCD9C\uBB3C\uC740 \uC2E4\uD589\uAE30\uAC00 \uAC19\uC740 \uD55C\uB3C4\uB85C \uBA3C\uC800 \uB2E4\uB4EC\uB294\uB2E4(`executors/youtube_meta.sanitize_meta`).",
42486
+ "properties": {
42487
+ "title": {
42488
+ "maxLength": 100,
42489
+ "minLength": 1,
42490
+ "title": "Title",
42491
+ "type": "string"
42492
+ },
42493
+ "description": {
42494
+ "default": "",
42495
+ "maxLength": 5e3,
42496
+ "title": "Description",
42497
+ "type": "string"
42498
+ },
42499
+ "tags": {
42500
+ "items": {
42501
+ "maxLength": 30,
42502
+ "minLength": 1,
42503
+ "type": "string"
42504
+ },
42505
+ "maxItems": 15,
42506
+ "title": "Tags",
42507
+ "type": "array"
42508
+ }
42509
+ },
42510
+ "required": [
42511
+ "title"
42512
+ ],
42513
+ "title": "YoutubeMeta",
42514
+ "type": "object"
42515
+ },
42516
+ "YoutubePublished": {
42517
+ "properties": {
42518
+ "video_id": {
42519
+ "title": "Video Id",
42520
+ "type": "string"
42521
+ },
42522
+ "url": {
42523
+ "title": "Url",
42524
+ "type": "string"
42525
+ },
42526
+ "privacy": {
42527
+ "enum": [
42528
+ "private",
42529
+ "unlisted",
42530
+ "public"
42531
+ ],
42532
+ "title": "Privacy",
42533
+ "type": "string"
42534
+ },
42535
+ "uploaded_at": {
42536
+ "title": "Uploaded At",
42537
+ "type": "string"
42538
+ },
42539
+ "account_id": {
42540
+ "title": "Account Id",
42541
+ "type": "string"
42542
+ }
42543
+ },
42544
+ "required": [
42545
+ "video_id",
42546
+ "url",
42547
+ "privacy",
42548
+ "uploaded_at",
42549
+ "account_id"
42550
+ ],
42551
+ "title": "YoutubePublished",
42552
+ "type": "object"
42553
+ }
42554
+ },
42555
+ "properties": {
42556
+ "number": {
42557
+ "minimum": 1,
42558
+ "title": "Number",
42559
+ "type": "integer"
42560
+ },
42561
+ "project_slug": {
42562
+ "title": "Project Slug",
42563
+ "type": "string"
42564
+ },
42565
+ "storyboard_rev": {
42566
+ "title": "Storyboard Rev",
42567
+ "type": "integer"
42568
+ },
42569
+ "snapshot": {
42570
+ "additionalProperties": true,
42571
+ "description": "{order_all, order_rendered, cut_versions{}, cut_edits{}, subtitles_by_cut{}, quality}",
42572
+ "title": "Snapshot",
42573
+ "type": "object"
42574
+ },
42575
+ "job_id": {
42576
+ "title": "Job Id",
42577
+ "type": "string"
42578
+ },
42579
+ "state": {
42580
+ "enum": [
42581
+ "queued",
42582
+ "running",
42583
+ "done",
42584
+ "error",
42585
+ "cancelled"
42586
+ ],
42587
+ "title": "State",
42588
+ "type": "string"
42589
+ },
42590
+ "video_asset_id": {
42591
+ "anyOf": [
42592
+ {
42593
+ "type": "string"
42594
+ },
42595
+ {
42596
+ "type": "null"
42597
+ }
42598
+ ],
42599
+ "default": null,
42600
+ "title": "Video Asset Id"
42601
+ },
42602
+ "subtitle_asset_id": {
42603
+ "anyOf": [
42604
+ {
42605
+ "type": "string"
42606
+ },
42607
+ {
42608
+ "type": "null"
42609
+ }
42610
+ ],
42611
+ "default": null,
42612
+ "title": "Subtitle Asset Id"
42613
+ },
42614
+ "duration_ms": {
42615
+ "anyOf": [
42616
+ {
42617
+ "type": "integer"
42618
+ },
42619
+ {
42620
+ "type": "null"
42621
+ }
42622
+ ],
42623
+ "default": null,
42624
+ "title": "Duration Ms"
42625
+ },
42626
+ "download": {
42627
+ "$ref": "#/$defs/DownloadUrls"
42628
+ },
42629
+ "thumbnails": {
42630
+ "items": {
42631
+ "$ref": "#/$defs/ThumbnailView"
42632
+ },
42633
+ "title": "Thumbnails",
42634
+ "type": "array"
42635
+ },
42636
+ "selected_thumbnail_id": {
42637
+ "anyOf": [
42638
+ {
42639
+ "type": "string"
42640
+ },
42641
+ {
42642
+ "type": "null"
42643
+ }
42644
+ ],
42645
+ "default": null,
42646
+ "title": "Selected Thumbnail Id"
42647
+ },
42648
+ "youtube_meta": {
42649
+ "anyOf": [
42650
+ {
42651
+ "$ref": "#/$defs/YoutubeMeta"
42652
+ },
42653
+ {
42654
+ "type": "null"
42655
+ }
42656
+ ],
42657
+ "default": null
42658
+ },
42659
+ "youtube": {
42660
+ "anyOf": [
42661
+ {
42662
+ "$ref": "#/$defs/YoutubePublished"
42663
+ },
42664
+ {
42665
+ "type": "null"
42666
+ }
42667
+ ],
42668
+ "default": null
42669
+ },
42670
+ "created_at": {
42671
+ "title": "Created At",
42672
+ "type": "string"
42673
+ }
42674
+ },
42675
+ "required": [
42676
+ "number",
42677
+ "project_slug",
42678
+ "storyboard_rev",
42679
+ "snapshot",
42680
+ "job_id",
42681
+ "state",
42682
+ "created_at"
42683
+ ],
42684
+ "title": "ExportView",
42685
+ "type": "object"
42686
+ },
42687
+ "annotations": {
42688
+ "readOnlyHint": true,
42689
+ "destructiveHint": false,
42690
+ "idempotentHint": true,
42691
+ "openWorldHint": false
42692
+ }
42693
+ },
42694
+ {
42695
+ "name": "democut_make_thumbnails",
42696
+ "description": "\uC378\uB124\uC77C 3\uC7A5(\uCCAD\uAD6C, \uD589 3\uAC1C \u2014 \uC2E4\uD328 \uBCC0\uD615\uB9CC \uD658\uBD88). \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 3\uC7A5 \uD569\uACC4\uB97C confirmed_cost_krw \uC5D0 \uADF8\uB300\uB85C \uB123\uC5B4\uB77C. \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.",
42697
+ "inputSchema": {
42698
+ "type": "object",
42699
+ "properties": {
42700
+ "slug": {
42701
+ "type": "string",
42702
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(list_projects)"
42703
+ },
42704
+ "number": {
42705
+ "type": "string",
42706
+ "description": "\uC644\uC131\uBCF8 \uBC88\uD638(1\uBD80\uD130)"
42707
+ },
42708
+ "confirmed_cost_krw": {
42709
+ "minimum": 0,
42710
+ "title": "Confirmed Cost Krw",
42711
+ "type": "integer"
42712
+ },
42713
+ "rate_version": {
42714
+ "minimum": 1,
42715
+ "title": "Rate Version",
42716
+ "type": "integer"
42717
+ }
42718
+ },
42719
+ "required": [
42720
+ "slug",
42721
+ "number",
42722
+ "confirmed_cost_krw",
42723
+ "rate_version"
42724
+ ],
42725
+ "additionalProperties": false
42726
+ },
42727
+ "outputSchema": {
42728
+ "$defs": {
42729
+ "Quote": {
42730
+ "properties": {
42731
+ "rows": {
42732
+ "items": {
42733
+ "$ref": "#/$defs/QuoteRow"
42734
+ },
42735
+ "title": "Rows",
42736
+ "type": "array"
42737
+ },
42738
+ "total_krw": {
42739
+ "minimum": 0,
42740
+ "title": "Total Krw",
42741
+ "type": "integer"
42742
+ },
42743
+ "rate_version": {
42744
+ "description": "pricing_config.version \u2014 make \uAC00 \uAC19\uC740 \uAC12\uC744 \uC694\uAD6C\uD55C\uB2E4",
42745
+ "minimum": 1,
42746
+ "title": "Rate Version",
42747
+ "type": "integer"
42748
+ },
42749
+ "mock": {
42750
+ "default": false,
42751
+ "title": "Mock",
42752
+ "type": "boolean"
42753
+ },
42754
+ "provisional": {
42755
+ "default": false,
42756
+ "description": "\uD589 \uC911 \uD558\uB098\uB77C\uB3C4 \uC784\uC2DC \uB2E8\uAC00\uBA74 True",
42757
+ "title": "Provisional",
42758
+ "type": "boolean"
42759
+ }
42760
+ },
42761
+ "required": [
42762
+ "total_krw",
42763
+ "rate_version"
42764
+ ],
42765
+ "title": "Quote",
42766
+ "type": "object"
42767
+ },
42768
+ "QuoteRow": {
42769
+ "properties": {
42770
+ "key": {
42771
+ "description": "\uC7A1 \uC548\uC5D0\uC11C \uC720\uC77C\uD55C \uD589 \uD0A4 \u2014 tts:<line_id> \xB7 videogen:i2v \xB7 lipsync \xB7 render:\u2026",
42772
+ "title": "Key",
42773
+ "type": "string"
42774
+ },
42775
+ "ref_type": {
42776
+ "description": "\uC6D0\uAC00\uD45C \uD0A4(credits/pricing.BASE_PRICES)",
42777
+ "title": "Ref Type",
42778
+ "type": "string"
42779
+ },
42780
+ "units": {
42781
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
42782
+ "title": "Units",
42783
+ "type": "string"
42784
+ },
42785
+ "unit_kind": {
42786
+ "title": "Unit Kind",
42787
+ "type": "string"
42788
+ },
42789
+ "display_name": {
42790
+ "title": "Display Name",
42791
+ "type": "string"
42792
+ },
42793
+ "krw": {
42794
+ "minimum": 0,
42795
+ "title": "Krw",
42796
+ "type": "integer"
42797
+ },
42798
+ "provisional": {
42799
+ "default": false,
42800
+ "title": "Provisional",
42801
+ "type": "boolean"
42802
+ }
42803
+ },
42804
+ "required": [
42805
+ "key",
42806
+ "ref_type",
42807
+ "units",
42808
+ "unit_kind",
42809
+ "display_name",
42810
+ "krw"
42811
+ ],
42812
+ "title": "QuoteRow",
42813
+ "type": "object"
42814
+ }
42815
+ },
42816
+ "properties": {
42817
+ "job_id": {
42818
+ "title": "Job Id",
42819
+ "type": "string"
42820
+ },
42821
+ "quote": {
42822
+ "anyOf": [
42823
+ {
42824
+ "$ref": "#/$defs/Quote"
42825
+ },
42826
+ {
42827
+ "type": "null"
42828
+ }
42829
+ ],
42830
+ "default": null
42831
+ },
42832
+ "next_calls": {
42833
+ "items": {
42834
+ "type": "string"
42835
+ },
42836
+ "title": "Next Calls",
42837
+ "type": "array"
42838
+ }
42839
+ },
42840
+ "required": [
42841
+ "job_id"
42842
+ ],
42843
+ "title": "JobAccepted",
42844
+ "type": "object"
42845
+ },
42846
+ "annotations": {
42847
+ "readOnlyHint": false,
42848
+ "destructiveHint": false,
42849
+ "idempotentHint": false,
42850
+ "openWorldHint": false
42851
+ }
42852
+ },
42853
+ {
42854
+ "name": "democut_select_thumbnail",
42855
+ "description": "\uC378\uB124\uC77C\uC744 \uACE0\uB978\uB2E4(\uC62C\uB9B0 \uC774\uBBF8\uC9C0\uB3C4 \uB428).",
42856
+ "inputSchema": {
42857
+ "type": "object",
42858
+ "properties": {
42859
+ "slug": {
42860
+ "type": "string",
42861
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(list_projects)"
42862
+ },
42863
+ "number": {
42864
+ "type": "string",
42865
+ "description": "\uC644\uC131\uBCF8 \uBC88\uD638(1\uBD80\uD130)"
42866
+ },
42867
+ "asset_id": {
42868
+ "title": "Asset Id",
42869
+ "type": "string"
42870
+ }
42871
+ },
42872
+ "required": [
42873
+ "slug",
42874
+ "number",
42875
+ "asset_id"
42876
+ ],
42877
+ "additionalProperties": false
42878
+ },
42879
+ "outputSchema": {
42880
+ "$defs": {
42881
+ "DownloadUrls": {
42882
+ "description": "\uBC84\uC804\uC758 \uC5ED\uD560\uBCC4 \uC0B0\uCD9C\uBB3C \uC11C\uBA85 URL. \uC5C6\uB294 \uC5ED\uD560\uC740 ``None``.\n\n``timing`` \uC740 **\uD56D\uC0C1 None** \uC774\uB2E4 \u2014 \uC790\uC0B0\uC774 \uC544\uB2C8\uB77C \uD589 \uC548\uC758 JSON \uC774\uB77C \uC11C\uBA85\uD560 blob \uC774 \uC5C6\uB2E4. \uC2E4\uC81C \uAC12\uC740 \uAC19\uC740 \uC751\uB2F5\uC758\n``CutVersionView.timing`` \uC5D0 \uC778\uB77C\uC778\uC73C\uB85C \uC2E4\uB9B0\uB2E4. \uD544\uB4DC\uB97C \uC9C0\uC6B0\uC9C0 \uC54A\uB294 \uAC83\uC740 \uC5ED\uD560 \uD45C\uB97C \uD55C\uC790\uB9AC\uC5D0 \uBCF4\uC774\uAC8C \uB450\uAE30 \uC704\uD568\uC774\uB2E4.",
42883
+ "properties": {
42884
+ "video": {
42885
+ "anyOf": [
42886
+ {
42887
+ "type": "string"
42888
+ },
42889
+ {
42890
+ "type": "null"
42891
+ }
42892
+ ],
42893
+ "default": null,
42894
+ "title": "Video"
42895
+ },
42896
+ "audio": {
42897
+ "anyOf": [
42898
+ {
42899
+ "type": "string"
42900
+ },
42901
+ {
42902
+ "type": "null"
42903
+ }
42904
+ ],
42905
+ "default": null,
42906
+ "title": "Audio"
42907
+ },
42908
+ "subtitle": {
42909
+ "anyOf": [
42910
+ {
42911
+ "type": "string"
42912
+ },
42913
+ {
42914
+ "type": "null"
42915
+ }
42916
+ ],
42917
+ "default": null,
42918
+ "title": "Subtitle"
42919
+ },
42920
+ "still": {
42921
+ "anyOf": [
42922
+ {
42923
+ "type": "string"
42924
+ },
42925
+ {
42926
+ "type": "null"
42927
+ }
42928
+ ],
42929
+ "default": null,
42930
+ "title": "Still"
42931
+ },
42932
+ "timing": {
42933
+ "anyOf": [
42934
+ {
42935
+ "type": "string"
42936
+ },
42937
+ {
42938
+ "type": "null"
42939
+ }
42940
+ ],
42941
+ "default": null,
42942
+ "title": "Timing"
42943
+ }
42944
+ },
42945
+ "title": "DownloadUrls",
42946
+ "type": "object"
42947
+ },
42948
+ "ThumbnailView": {
42949
+ "properties": {
42950
+ "asset_id": {
42951
+ "title": "Asset Id",
42952
+ "type": "string"
42953
+ },
42954
+ "url": {
42955
+ "anyOf": [
42956
+ {
42957
+ "type": "string"
42958
+ },
42959
+ {
42960
+ "type": "null"
42961
+ }
42962
+ ],
42963
+ "default": null,
42964
+ "title": "Url"
42965
+ }
42966
+ },
42967
+ "required": [
42968
+ "asset_id"
42969
+ ],
42970
+ "title": "ThumbnailView",
42971
+ "type": "object"
42972
+ },
42973
+ "YoutubeMeta": {
42974
+ "description": "\uC720\uD29C\uBE0C \uC81C\uBAA9\xB7\uC124\uBA85\xB7\uD0DC\uADF8 \u2014 \uD55C\uB3C4\uB294 YouTube Data API \uC758 \uAC83(\uC81C\uBAA9 100\xB7\uC124\uBA85 5000\xB7\uD0DC\uADF8 15\uAC1C, \uD0DC\uADF8 \uD558\uB098 30\uC790). \u2605 \uACC4\uC57D\uC774 \uC5EC\uAE30\uC11C \uB9C9\uC9C0 \uC54A\uC73C\uBA74\n\uBC1C\uD589(18c-2)\uC774 400 \uC73C\uB85C \uC8FD\uACE0 \uADF8\uB54C\uB294 \uC6D0\uC778\uC5D0\uC11C \uBA40\uB2E4. \uC0DD\uC131\uAE30 \uC0B0\uCD9C\uBB3C\uC740 \uC2E4\uD589\uAE30\uAC00 \uAC19\uC740 \uD55C\uB3C4\uB85C \uBA3C\uC800 \uB2E4\uB4EC\uB294\uB2E4(`executors/youtube_meta.sanitize_meta`).",
42975
+ "properties": {
42976
+ "title": {
42977
+ "maxLength": 100,
42978
+ "minLength": 1,
42979
+ "title": "Title",
42980
+ "type": "string"
42981
+ },
42982
+ "description": {
42983
+ "default": "",
42984
+ "maxLength": 5e3,
42985
+ "title": "Description",
42986
+ "type": "string"
42987
+ },
42988
+ "tags": {
42989
+ "items": {
42990
+ "maxLength": 30,
42991
+ "minLength": 1,
42992
+ "type": "string"
42993
+ },
42994
+ "maxItems": 15,
42995
+ "title": "Tags",
42996
+ "type": "array"
42997
+ }
42998
+ },
42999
+ "required": [
43000
+ "title"
43001
+ ],
43002
+ "title": "YoutubeMeta",
43003
+ "type": "object"
43004
+ },
43005
+ "YoutubePublished": {
43006
+ "properties": {
43007
+ "video_id": {
43008
+ "title": "Video Id",
43009
+ "type": "string"
43010
+ },
43011
+ "url": {
43012
+ "title": "Url",
43013
+ "type": "string"
43014
+ },
43015
+ "privacy": {
43016
+ "enum": [
43017
+ "private",
43018
+ "unlisted",
43019
+ "public"
43020
+ ],
43021
+ "title": "Privacy",
43022
+ "type": "string"
43023
+ },
43024
+ "uploaded_at": {
43025
+ "title": "Uploaded At",
43026
+ "type": "string"
43027
+ },
43028
+ "account_id": {
43029
+ "title": "Account Id",
43030
+ "type": "string"
43031
+ }
43032
+ },
43033
+ "required": [
43034
+ "video_id",
43035
+ "url",
43036
+ "privacy",
43037
+ "uploaded_at",
43038
+ "account_id"
43039
+ ],
43040
+ "title": "YoutubePublished",
43041
+ "type": "object"
43042
+ }
43043
+ },
43044
+ "properties": {
43045
+ "number": {
43046
+ "minimum": 1,
43047
+ "title": "Number",
43048
+ "type": "integer"
43049
+ },
43050
+ "project_slug": {
43051
+ "title": "Project Slug",
43052
+ "type": "string"
43053
+ },
43054
+ "storyboard_rev": {
43055
+ "title": "Storyboard Rev",
43056
+ "type": "integer"
43057
+ },
43058
+ "snapshot": {
43059
+ "additionalProperties": true,
43060
+ "description": "{order_all, order_rendered, cut_versions{}, cut_edits{}, subtitles_by_cut{}, quality}",
43061
+ "title": "Snapshot",
43062
+ "type": "object"
43063
+ },
43064
+ "job_id": {
43065
+ "title": "Job Id",
43066
+ "type": "string"
43067
+ },
43068
+ "state": {
43069
+ "enum": [
43070
+ "queued",
43071
+ "running",
43072
+ "done",
43073
+ "error",
43074
+ "cancelled"
43075
+ ],
43076
+ "title": "State",
43077
+ "type": "string"
43078
+ },
43079
+ "video_asset_id": {
43080
+ "anyOf": [
43081
+ {
43082
+ "type": "string"
43083
+ },
43084
+ {
43085
+ "type": "null"
43086
+ }
43087
+ ],
43088
+ "default": null,
43089
+ "title": "Video Asset Id"
43090
+ },
43091
+ "subtitle_asset_id": {
43092
+ "anyOf": [
43093
+ {
43094
+ "type": "string"
43095
+ },
43096
+ {
43097
+ "type": "null"
43098
+ }
43099
+ ],
43100
+ "default": null,
43101
+ "title": "Subtitle Asset Id"
43102
+ },
43103
+ "duration_ms": {
43104
+ "anyOf": [
43105
+ {
43106
+ "type": "integer"
43107
+ },
43108
+ {
43109
+ "type": "null"
43110
+ }
43111
+ ],
43112
+ "default": null,
43113
+ "title": "Duration Ms"
43114
+ },
43115
+ "download": {
43116
+ "$ref": "#/$defs/DownloadUrls"
43117
+ },
43118
+ "thumbnails": {
43119
+ "items": {
43120
+ "$ref": "#/$defs/ThumbnailView"
43121
+ },
43122
+ "title": "Thumbnails",
43123
+ "type": "array"
43124
+ },
43125
+ "selected_thumbnail_id": {
43126
+ "anyOf": [
43127
+ {
43128
+ "type": "string"
43129
+ },
43130
+ {
43131
+ "type": "null"
43132
+ }
43133
+ ],
43134
+ "default": null,
43135
+ "title": "Selected Thumbnail Id"
43136
+ },
43137
+ "youtube_meta": {
43138
+ "anyOf": [
43139
+ {
43140
+ "$ref": "#/$defs/YoutubeMeta"
43141
+ },
43142
+ {
43143
+ "type": "null"
43144
+ }
43145
+ ],
43146
+ "default": null
43147
+ },
43148
+ "youtube": {
43149
+ "anyOf": [
43150
+ {
43151
+ "$ref": "#/$defs/YoutubePublished"
43152
+ },
43153
+ {
43154
+ "type": "null"
43155
+ }
43156
+ ],
43157
+ "default": null
43158
+ },
43159
+ "created_at": {
43160
+ "title": "Created At",
43161
+ "type": "string"
43162
+ }
43163
+ },
43164
+ "required": [
43165
+ "number",
43166
+ "project_slug",
43167
+ "storyboard_rev",
43168
+ "snapshot",
43169
+ "job_id",
43170
+ "state",
43171
+ "created_at"
43172
+ ],
43173
+ "title": "ExportView",
43174
+ "type": "object"
43175
+ },
43176
+ "annotations": {
43177
+ "readOnlyHint": false,
43178
+ "destructiveHint": false,
43179
+ "idempotentHint": true,
43180
+ "openWorldHint": false
43181
+ }
43182
+ },
43183
+ {
43184
+ "name": "democut_generate_youtube_meta",
43185
+ "description": "\uC81C\uBAA9\xB7\uC124\uBA85\xB7\uD0DC\uADF8 AI \uC0DD\uC131(\uC18C\uC561 \u2014 \uC644\uC131\uBCF8 \uCEF7\uC758 \uB300\uC0AC\uC5D0\uC11C; \uB300\uC0AC\uAC00 \uC5C6\uC73C\uBA74 422). \uB300\uCCB4: democut_set_youtube_meta. \uC815\uC561 \uC18C\uC561 \uCCAD\uAD6C \u2014 \uACAC\uC801 \uB2E8\uACC4 \uC5C6\uC774 \uC81C\uCD9C \uC2DC \uCCAD\uAD6C\uD55C\uB2E4(\uB2E8\uAC00\uB294 democut_get_options.rates, \uC794\uC561 \uBD80\uC871\uC774\uBA74 402 INSUFFICIENT_CREDITS). \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.",
43186
+ "inputSchema": {
43187
+ "type": "object",
43188
+ "properties": {
43189
+ "slug": {
43190
+ "type": "string",
43191
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(list_projects)"
43192
+ },
43193
+ "number": {
43194
+ "type": "string",
43195
+ "description": "\uC644\uC131\uBCF8 \uBC88\uD638(1\uBD80\uD130)"
43196
+ }
43197
+ },
43198
+ "required": [
43199
+ "slug",
43200
+ "number"
43201
+ ],
43202
+ "additionalProperties": false
43203
+ },
43204
+ "outputSchema": {
43205
+ "$defs": {
43206
+ "Quote": {
43207
+ "properties": {
43208
+ "rows": {
43209
+ "items": {
43210
+ "$ref": "#/$defs/QuoteRow"
43211
+ },
43212
+ "title": "Rows",
43213
+ "type": "array"
43214
+ },
43215
+ "total_krw": {
43216
+ "minimum": 0,
43217
+ "title": "Total Krw",
43218
+ "type": "integer"
43219
+ },
43220
+ "rate_version": {
43221
+ "description": "pricing_config.version \u2014 make \uAC00 \uAC19\uC740 \uAC12\uC744 \uC694\uAD6C\uD55C\uB2E4",
43222
+ "minimum": 1,
43223
+ "title": "Rate Version",
43224
+ "type": "integer"
43225
+ },
43226
+ "mock": {
43227
+ "default": false,
43228
+ "title": "Mock",
43229
+ "type": "boolean"
43230
+ },
43231
+ "provisional": {
43232
+ "default": false,
43233
+ "description": "\uD589 \uC911 \uD558\uB098\uB77C\uB3C4 \uC784\uC2DC \uB2E8\uAC00\uBA74 True",
43234
+ "title": "Provisional",
43235
+ "type": "boolean"
43236
+ }
43237
+ },
43238
+ "required": [
43239
+ "total_krw",
43240
+ "rate_version"
43241
+ ],
43242
+ "title": "Quote",
43243
+ "type": "object"
43244
+ },
43245
+ "QuoteRow": {
43246
+ "properties": {
43247
+ "key": {
43248
+ "description": "\uC7A1 \uC548\uC5D0\uC11C \uC720\uC77C\uD55C \uD589 \uD0A4 \u2014 tts:<line_id> \xB7 videogen:i2v \xB7 lipsync \xB7 render:\u2026",
43249
+ "title": "Key",
43250
+ "type": "string"
43251
+ },
43252
+ "ref_type": {
43253
+ "description": "\uC6D0\uAC00\uD45C \uD0A4(credits/pricing.BASE_PRICES)",
43254
+ "title": "Ref Type",
43255
+ "type": "string"
43256
+ },
43257
+ "units": {
43258
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
43259
+ "title": "Units",
43260
+ "type": "string"
43261
+ },
43262
+ "unit_kind": {
43263
+ "title": "Unit Kind",
43264
+ "type": "string"
43265
+ },
43266
+ "display_name": {
43267
+ "title": "Display Name",
43268
+ "type": "string"
43269
+ },
43270
+ "krw": {
43271
+ "minimum": 0,
43272
+ "title": "Krw",
43273
+ "type": "integer"
43274
+ },
43275
+ "provisional": {
43276
+ "default": false,
43277
+ "title": "Provisional",
43278
+ "type": "boolean"
43279
+ }
43280
+ },
43281
+ "required": [
43282
+ "key",
43283
+ "ref_type",
43284
+ "units",
43285
+ "unit_kind",
43286
+ "display_name",
43287
+ "krw"
43288
+ ],
43289
+ "title": "QuoteRow",
43290
+ "type": "object"
43291
+ }
43292
+ },
43293
+ "properties": {
43294
+ "job_id": {
43295
+ "title": "Job Id",
43296
+ "type": "string"
43297
+ },
43298
+ "quote": {
43299
+ "anyOf": [
43300
+ {
43301
+ "$ref": "#/$defs/Quote"
43302
+ },
43303
+ {
43304
+ "type": "null"
43305
+ }
43306
+ ],
43307
+ "default": null
43308
+ },
43309
+ "next_calls": {
43310
+ "items": {
43311
+ "type": "string"
43312
+ },
43313
+ "title": "Next Calls",
43314
+ "type": "array"
43315
+ }
43316
+ },
43317
+ "required": [
43318
+ "job_id"
43319
+ ],
43320
+ "title": "JobAccepted",
43321
+ "type": "object"
43322
+ },
43323
+ "annotations": {
43324
+ "readOnlyHint": false,
43325
+ "destructiveHint": false,
43326
+ "idempotentHint": false,
43327
+ "openWorldHint": false
43328
+ }
43329
+ },
43330
+ {
43331
+ "name": "democut_set_youtube_meta",
43332
+ "description": "\uC81C\uBAA9\xB7\uC124\uBA85\xB7\uD0DC\uADF8\uB97C \uC9C1\uC811 \uB123\uB294\uB2E4.",
43333
+ "inputSchema": {
43334
+ "type": "object",
43335
+ "properties": {
43336
+ "slug": {
43337
+ "type": "string",
43338
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(list_projects)"
43339
+ },
43340
+ "number": {
43341
+ "type": "string",
43342
+ "description": "\uC644\uC131\uBCF8 \uBC88\uD638(1\uBD80\uD130)"
43343
+ },
43344
+ "meta": {
43345
+ "$ref": "#/$defs/YoutubeMeta"
43346
+ }
43347
+ },
43348
+ "required": [
43349
+ "slug",
43350
+ "number",
43351
+ "meta"
43352
+ ],
43353
+ "additionalProperties": false,
43354
+ "$defs": {
43355
+ "YoutubeMeta": {
43356
+ "additionalProperties": false,
43357
+ "description": "\uC720\uD29C\uBE0C \uC81C\uBAA9\xB7\uC124\uBA85\xB7\uD0DC\uADF8 \u2014 \uD55C\uB3C4\uB294 YouTube Data API \uC758 \uAC83(\uC81C\uBAA9 100\xB7\uC124\uBA85 5000\xB7\uD0DC\uADF8 15\uAC1C, \uD0DC\uADF8 \uD558\uB098 30\uC790). \u2605 \uACC4\uC57D\uC774 \uC5EC\uAE30\uC11C \uB9C9\uC9C0 \uC54A\uC73C\uBA74\n\uBC1C\uD589(18c-2)\uC774 400 \uC73C\uB85C \uC8FD\uACE0 \uADF8\uB54C\uB294 \uC6D0\uC778\uC5D0\uC11C \uBA40\uB2E4. \uC0DD\uC131\uAE30 \uC0B0\uCD9C\uBB3C\uC740 \uC2E4\uD589\uAE30\uAC00 \uAC19\uC740 \uD55C\uB3C4\uB85C \uBA3C\uC800 \uB2E4\uB4EC\uB294\uB2E4(`executors/youtube_meta.sanitize_meta`).",
43358
+ "properties": {
43359
+ "title": {
43360
+ "maxLength": 100,
43361
+ "minLength": 1,
43362
+ "title": "Title",
43363
+ "type": "string"
43364
+ },
43365
+ "description": {
43366
+ "default": "",
43367
+ "maxLength": 5e3,
43368
+ "title": "Description",
43369
+ "type": "string"
43370
+ },
43371
+ "tags": {
43372
+ "items": {
43373
+ "maxLength": 30,
43374
+ "minLength": 1,
43375
+ "type": "string"
43376
+ },
43377
+ "maxItems": 15,
43378
+ "title": "Tags",
43379
+ "type": "array"
43380
+ }
43381
+ },
43382
+ "required": [
43383
+ "title"
43384
+ ],
43385
+ "title": "YoutubeMeta",
43386
+ "type": "object"
43387
+ }
43388
+ }
43389
+ },
43390
+ "outputSchema": {
43391
+ "$defs": {
43392
+ "DownloadUrls": {
43393
+ "description": "\uBC84\uC804\uC758 \uC5ED\uD560\uBCC4 \uC0B0\uCD9C\uBB3C \uC11C\uBA85 URL. \uC5C6\uB294 \uC5ED\uD560\uC740 ``None``.\n\n``timing`` \uC740 **\uD56D\uC0C1 None** \uC774\uB2E4 \u2014 \uC790\uC0B0\uC774 \uC544\uB2C8\uB77C \uD589 \uC548\uC758 JSON \uC774\uB77C \uC11C\uBA85\uD560 blob \uC774 \uC5C6\uB2E4. \uC2E4\uC81C \uAC12\uC740 \uAC19\uC740 \uC751\uB2F5\uC758\n``CutVersionView.timing`` \uC5D0 \uC778\uB77C\uC778\uC73C\uB85C \uC2E4\uB9B0\uB2E4. \uD544\uB4DC\uB97C \uC9C0\uC6B0\uC9C0 \uC54A\uB294 \uAC83\uC740 \uC5ED\uD560 \uD45C\uB97C \uD55C\uC790\uB9AC\uC5D0 \uBCF4\uC774\uAC8C \uB450\uAE30 \uC704\uD568\uC774\uB2E4.",
43394
+ "properties": {
43395
+ "video": {
43396
+ "anyOf": [
43397
+ {
43398
+ "type": "string"
43399
+ },
43400
+ {
43401
+ "type": "null"
43402
+ }
43403
+ ],
43404
+ "default": null,
43405
+ "title": "Video"
43406
+ },
43407
+ "audio": {
43408
+ "anyOf": [
43409
+ {
43410
+ "type": "string"
43411
+ },
43412
+ {
43413
+ "type": "null"
43414
+ }
43415
+ ],
43416
+ "default": null,
43417
+ "title": "Audio"
43418
+ },
43419
+ "subtitle": {
43420
+ "anyOf": [
43421
+ {
43422
+ "type": "string"
43423
+ },
43424
+ {
43425
+ "type": "null"
43426
+ }
43427
+ ],
43428
+ "default": null,
43429
+ "title": "Subtitle"
43430
+ },
43431
+ "still": {
43432
+ "anyOf": [
43433
+ {
43434
+ "type": "string"
43435
+ },
43436
+ {
43437
+ "type": "null"
43438
+ }
43439
+ ],
43440
+ "default": null,
43441
+ "title": "Still"
43442
+ },
43443
+ "timing": {
43444
+ "anyOf": [
43445
+ {
43446
+ "type": "string"
43447
+ },
43448
+ {
43449
+ "type": "null"
43450
+ }
43451
+ ],
43452
+ "default": null,
43453
+ "title": "Timing"
43454
+ }
43455
+ },
43456
+ "title": "DownloadUrls",
43457
+ "type": "object"
43458
+ },
43459
+ "ThumbnailView": {
43460
+ "properties": {
43461
+ "asset_id": {
43462
+ "title": "Asset Id",
43463
+ "type": "string"
43464
+ },
43465
+ "url": {
43466
+ "anyOf": [
43467
+ {
43468
+ "type": "string"
43469
+ },
43470
+ {
43471
+ "type": "null"
43472
+ }
43473
+ ],
43474
+ "default": null,
43475
+ "title": "Url"
43476
+ }
43477
+ },
43478
+ "required": [
43479
+ "asset_id"
43480
+ ],
43481
+ "title": "ThumbnailView",
43482
+ "type": "object"
43483
+ },
43484
+ "YoutubeMeta": {
43485
+ "description": "\uC720\uD29C\uBE0C \uC81C\uBAA9\xB7\uC124\uBA85\xB7\uD0DC\uADF8 \u2014 \uD55C\uB3C4\uB294 YouTube Data API \uC758 \uAC83(\uC81C\uBAA9 100\xB7\uC124\uBA85 5000\xB7\uD0DC\uADF8 15\uAC1C, \uD0DC\uADF8 \uD558\uB098 30\uC790). \u2605 \uACC4\uC57D\uC774 \uC5EC\uAE30\uC11C \uB9C9\uC9C0 \uC54A\uC73C\uBA74\n\uBC1C\uD589(18c-2)\uC774 400 \uC73C\uB85C \uC8FD\uACE0 \uADF8\uB54C\uB294 \uC6D0\uC778\uC5D0\uC11C \uBA40\uB2E4. \uC0DD\uC131\uAE30 \uC0B0\uCD9C\uBB3C\uC740 \uC2E4\uD589\uAE30\uAC00 \uAC19\uC740 \uD55C\uB3C4\uB85C \uBA3C\uC800 \uB2E4\uB4EC\uB294\uB2E4(`executors/youtube_meta.sanitize_meta`).",
43486
+ "properties": {
43487
+ "title": {
43488
+ "maxLength": 100,
43489
+ "minLength": 1,
43490
+ "title": "Title",
43491
+ "type": "string"
43492
+ },
43493
+ "description": {
43494
+ "default": "",
43495
+ "maxLength": 5e3,
43496
+ "title": "Description",
43497
+ "type": "string"
43498
+ },
43499
+ "tags": {
43500
+ "items": {
43501
+ "maxLength": 30,
43502
+ "minLength": 1,
43503
+ "type": "string"
43504
+ },
43505
+ "maxItems": 15,
43506
+ "title": "Tags",
43507
+ "type": "array"
43508
+ }
43509
+ },
43510
+ "required": [
43511
+ "title"
43512
+ ],
43513
+ "title": "YoutubeMeta",
43514
+ "type": "object"
43515
+ },
43516
+ "YoutubePublished": {
43517
+ "properties": {
43518
+ "video_id": {
43519
+ "title": "Video Id",
43520
+ "type": "string"
43521
+ },
43522
+ "url": {
43523
+ "title": "Url",
43524
+ "type": "string"
43525
+ },
43526
+ "privacy": {
43527
+ "enum": [
43528
+ "private",
43529
+ "unlisted",
43530
+ "public"
43531
+ ],
43532
+ "title": "Privacy",
43533
+ "type": "string"
43534
+ },
43535
+ "uploaded_at": {
43536
+ "title": "Uploaded At",
43537
+ "type": "string"
43538
+ },
43539
+ "account_id": {
43540
+ "title": "Account Id",
43541
+ "type": "string"
43542
+ }
43543
+ },
43544
+ "required": [
43545
+ "video_id",
43546
+ "url",
43547
+ "privacy",
43548
+ "uploaded_at",
43549
+ "account_id"
43550
+ ],
43551
+ "title": "YoutubePublished",
43552
+ "type": "object"
43553
+ }
43554
+ },
43555
+ "properties": {
43556
+ "number": {
43557
+ "minimum": 1,
43558
+ "title": "Number",
43559
+ "type": "integer"
43560
+ },
43561
+ "project_slug": {
43562
+ "title": "Project Slug",
43563
+ "type": "string"
43564
+ },
43565
+ "storyboard_rev": {
43566
+ "title": "Storyboard Rev",
43567
+ "type": "integer"
43568
+ },
43569
+ "snapshot": {
43570
+ "additionalProperties": true,
43571
+ "description": "{order_all, order_rendered, cut_versions{}, cut_edits{}, subtitles_by_cut{}, quality}",
43572
+ "title": "Snapshot",
43573
+ "type": "object"
43574
+ },
43575
+ "job_id": {
43576
+ "title": "Job Id",
43577
+ "type": "string"
43578
+ },
43579
+ "state": {
43580
+ "enum": [
43581
+ "queued",
43582
+ "running",
43583
+ "done",
43584
+ "error",
43585
+ "cancelled"
43586
+ ],
43587
+ "title": "State",
43588
+ "type": "string"
43589
+ },
43590
+ "video_asset_id": {
43591
+ "anyOf": [
43592
+ {
43593
+ "type": "string"
43594
+ },
43595
+ {
43596
+ "type": "null"
43597
+ }
43598
+ ],
43599
+ "default": null,
43600
+ "title": "Video Asset Id"
43601
+ },
43602
+ "subtitle_asset_id": {
43603
+ "anyOf": [
43604
+ {
43605
+ "type": "string"
43606
+ },
43607
+ {
43608
+ "type": "null"
43609
+ }
43610
+ ],
43611
+ "default": null,
43612
+ "title": "Subtitle Asset Id"
43613
+ },
43614
+ "duration_ms": {
43615
+ "anyOf": [
43616
+ {
43617
+ "type": "integer"
43618
+ },
43619
+ {
43620
+ "type": "null"
43621
+ }
43622
+ ],
43623
+ "default": null,
43624
+ "title": "Duration Ms"
43625
+ },
43626
+ "download": {
43627
+ "$ref": "#/$defs/DownloadUrls"
43628
+ },
43629
+ "thumbnails": {
43630
+ "items": {
43631
+ "$ref": "#/$defs/ThumbnailView"
43632
+ },
43633
+ "title": "Thumbnails",
43634
+ "type": "array"
43635
+ },
43636
+ "selected_thumbnail_id": {
43637
+ "anyOf": [
43638
+ {
43639
+ "type": "string"
43640
+ },
43641
+ {
43642
+ "type": "null"
43643
+ }
43644
+ ],
43645
+ "default": null,
43646
+ "title": "Selected Thumbnail Id"
43647
+ },
43648
+ "youtube_meta": {
43649
+ "anyOf": [
43650
+ {
43651
+ "$ref": "#/$defs/YoutubeMeta"
43652
+ },
43653
+ {
43654
+ "type": "null"
43655
+ }
43656
+ ],
43657
+ "default": null
43658
+ },
43659
+ "youtube": {
43660
+ "anyOf": [
43661
+ {
43662
+ "$ref": "#/$defs/YoutubePublished"
43663
+ },
43664
+ {
43665
+ "type": "null"
43666
+ }
43667
+ ],
43668
+ "default": null
43669
+ },
43670
+ "created_at": {
43671
+ "title": "Created At",
43672
+ "type": "string"
43673
+ }
43674
+ },
43675
+ "required": [
43676
+ "number",
43677
+ "project_slug",
43678
+ "storyboard_rev",
43679
+ "snapshot",
43680
+ "job_id",
43681
+ "state",
43682
+ "created_at"
43683
+ ],
43684
+ "title": "ExportView",
43685
+ "type": "object"
43686
+ },
43687
+ "annotations": {
43688
+ "readOnlyHint": false,
43689
+ "destructiveHint": false,
43690
+ "idempotentHint": true,
43691
+ "openWorldHint": false
43692
+ }
43693
+ }
43694
+ ];
43695
+
43696
+ // src/api-errors.ts
43697
+ var TOOL_BASE_NAMES = GENERATED_TOOLS.map((t) => t.name.replace(/^democut_/, "")).sort((a, b) => b.length - a.length);
43698
+ var escapeRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
43699
+ var NAME_PATTERNS = TOOL_BASE_NAMES.map((name) => [
43700
+ new RegExp(`(?<!democut_)(?<![\\w.])${escapeRe(name)}(?![\\w{(])`, "g"),
43701
+ `democut_${name}`
43702
+ ]);
43703
+ function callableToolNames(text) {
43704
+ let out2 = text;
43705
+ for (const [re, replacement] of NAME_PATTERNS) out2 = out2.replace(re, replacement);
43706
+ return out2;
43707
+ }
43708
+ function callableStructured(value) {
43709
+ if (Array.isArray(value)) return value.map((v) => callableStructured(v));
43710
+ if (value && typeof value === "object") {
43711
+ const out2 = {};
43712
+ for (const [k, v] of Object.entries(value)) {
43713
+ out2[k] = k === "next_calls" && Array.isArray(v) ? v.map((x) => typeof x === "string" ? callableToolNames(x) : x) : callableStructured(v);
43714
+ }
43715
+ return out2;
43716
+ }
43717
+ return value;
43718
+ }
43719
+ function usd(v) {
43720
+ return v < 0.01 ? `$${v.toFixed(4)}` : `$${v.toFixed(2)}`;
43721
+ }
43722
+ function classifyApiError(e, ctx) {
43723
+ const hint = ctx.statusHint ?? "\uC0C1\uD0DC \uC870\uD68C";
43724
+ const contractHint = typeof e.extra.hint === "string" ? callableToolNames(e.extra.hint) : null;
43725
+ if (contractHint) {
43726
+ const lines = [contractHint];
43727
+ if (ctx.submitted) {
43728
+ lines.push(
43729
+ e.status < 500 ? "\uC544\uC9C1 \uC544\uBB34\uAC83\uB3C4 \uC81C\uCD9C\uB418\uC9C0 \uC54A\uC558\uACE0 \uACFC\uAE08\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC694\uCCAD\uC744 \uACE0\uCCD0 \uB2E4\uC2DC \uD638\uCD9C\uD558\uC138\uC694." : `\u26A0\uFE0F \uC81C\uCD9C\uC774 \uC811\uC218\uB410\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uBCF4\uB0B4\uC9C0 \uB9D0\uACE0 ${hint} \uB85C \uC0C1\uD0DC\uB97C \uBA3C\uC800 \uD655\uC778\uD558\uC138\uC694.`
43730
+ );
43731
+ }
43732
+ return {
43733
+ safety: e.status >= 500 && ctx.submitted ? "unsafe" : e.retriable === false ? "fixable" : "safe",
43734
+ notCharged: e.status < 500,
43735
+ lines
43736
+ };
43737
+ }
43738
+ if (e.status === 422 && e.code === "VIDEOGEN_UPSTREAM_REJECTED") {
43739
+ return {
43740
+ safety: "unsafe",
43741
+ // 돈이 나갔다가 돌아왔다 — "애초에 과금이 없었다" 와는 다르다. 그 구분을 흐리면
43742
+ // 원장을 보는 사람이 이 거래를 설명하지 못한다.
43743
+ notCharged: false,
43744
+ lines: [
43745
+ "\uC5C5\uC2A4\uD2B8\uB9BC\uC774 \uC774 \uC791\uC5C5\uC744 \uC601\uAD6C \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC870\uD68C\uD574\uB3C4 \uBCF5\uAD6C\uB418\uC9C0 \uC54A\uC73C\uBA70, \uACFC\uAE08\uC740 \uD658\uBD88\uB410\uC2B5\uB2C8\uB2E4.",
43746
+ "\uACE0\uCE60 \uD30C\uB77C\uBBF8\uD130\uAC00 \uC788\uB294 \uC624\uB958\uAC00 \uC544\uB2D9\uB2C8\uB2E4 \u2014 \uC0C8\uB85C \uB9CC\uB4E4\uB824\uBA74 \uD504\uB86C\uD504\uD2B8\xB7\uC124\uC815\uC744 \uBC14\uAFD4 **\uC0C8\uB85C \uC81C\uCD9C**\uD574\uC57C \uD558\uACE0, \uADF8\uAC74 \uB2E4\uC2DC \uACFC\uAE08\uB429\uB2C8\uB2E4(\uC0AC\uC6A9\uC790 \uB3D9\uC758\uB97C \uBC1B\uC73C\uC138\uC694)."
43747
+ ]
43748
+ };
43749
+ }
43750
+ if (e.status === 404 && e.code === "VIDEOGEN_JOB_NOT_FOUND") {
43751
+ return {
43752
+ safety: "unsafe",
43753
+ notCharged: false,
43754
+ lines: [
43755
+ "\uADF8 \uC791\uC5C5\uC744 \uD655\uC778\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. job_id \uAC00 \uB9DE\uB294\uC9C0 \uBA3C\uC800 \uD655\uC778\uD558\uC138\uC694.",
43756
+ "\u26A0\uFE0F \uC791\uC5C5\uC774 \uC0B4\uC544 \uC788\uB294\uB370 \uC870\uD68C\uB9CC \uC5B4\uAE0B\uB0AC\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4 \u2014 \uC0C8\uB85C \uC81C\uCD9C\uD558\uBA74 **\uBCC4\uB3C4 \uC791\uC5C5\uC73C\uB85C \uB2E4\uC2DC \uACFC\uAE08**\uB429\uB2C8\uB2E4."
43757
+ ]
43758
+ };
43759
+ }
43760
+ if (e.status === 402) {
43761
+ const lines = [];
43762
+ const limit = e.extra.limit_usd;
43763
+ const would = e.extra.would_cost_usd;
43764
+ if (typeof limit === "number" && typeof would === "number") {
43765
+ lines.push(`\uC0C1\uD55C ${usd(limit)} \xB7 \uC774 \uC694\uCCAD ${usd(would)}`);
43766
+ }
43767
+ lines.push("\uD574\uC0C1\uB3C4\uB098 \uAE38\uC774\uB97C \uB0AE\uCDB0 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694. \uC544\uC9C1 \uACFC\uAE08\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.");
43768
+ return { safety: "fixable", notCharged: true, lines };
43769
+ }
43770
+ if (e.status === 422) {
43771
+ const unknown2 = e.extra.unknownFields;
43772
+ if (Array.isArray(unknown2) && unknown2.length) {
43773
+ return {
43774
+ safety: "fixable",
43775
+ notCharged: true,
43776
+ lines: [
43777
+ `\uC11C\uBC84\uAC00 \uC544\uC9C1 \uBAA8\uB974\uB294 \uC778\uC790\uC785\uB2C8\uB2E4: ${unknown2.join(", ")} \u2014 \uBC30\uD3EC\uAC00 \uACB9\uCE58\uB294 \uC911\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4.`,
43778
+ "\uADF8 \uC778\uC790\uB9CC \uBE7C\uACE0 \uB098\uBA38\uC9C0\uB294 \uADF8\uB300\uB85C \uB2E4\uC2DC \uBCF4\uB0B4\uC138\uC694. \uC544\uC9C1 \uACFC\uAE08\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."
43779
+ ]
43780
+ };
43781
+ }
43782
+ return {
43783
+ safety: "fixable",
43784
+ notCharged: true,
43785
+ lines: ["\uD30C\uB77C\uBBF8\uD130\uB97C \uACE0\uCCD0 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694. \uC544\uC9C1 \uACFC\uAE08\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."]
43786
+ };
43787
+ }
43788
+ if (e.status === 503) {
43789
+ return {
43790
+ safety: "safe",
43791
+ notCharged: true,
43792
+ lines: ["\uC77C\uC2DC\uC801\uC778 \uC624\uB958\uC785\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uADF8\uB300\uB85C \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uB3C4 \uC548\uC804\uD569\uB2C8\uB2E4."]
43793
+ };
43794
+ }
43795
+ if (e.status === 502) {
43796
+ return ctx.submitted ? {
43797
+ safety: "unsafe",
43798
+ notCharged: false,
43799
+ lines: [
43800
+ "\u26A0\uFE0F \uC81C\uCD9C\uC774 \uC774\uBBF8 \uC811\uC218\uB410\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC81C\uCD9C\uD558\uBA74 \uB450 \uBC88 \uACFC\uAE08\uB429\uB2C8\uB2E4 \u2014",
43801
+ `\uC7AC\uC2DC\uB3C4\uD558\uC9C0 \uB9D0\uACE0 ${hint} \uB85C \uD655\uC778\uD558\uAC70\uB098 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC138\uC694.`
43802
+ ]
43803
+ } : {
43804
+ safety: "safe",
43805
+ notCharged: true,
43806
+ lines: [
43807
+ "\uC5C5\uC2A4\uD2B8\uB9BC \uC624\uB958\uC785\uB2C8\uB2E4. \uC774 \uC694\uCCAD\uC740 \uBD80\uC791\uC6A9\uC774 \uC5C6\uC73C\uBBC0\uB85C \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uB3C4 \uC548\uC804\uD569\uB2C8\uB2E4."
41789
43808
  ]
41790
43809
  };
41791
43810
  }
@@ -42065,7 +44084,7 @@ function creditBalance(deps = {}) {
42065
44084
  const ws = await resolveWorkspace(base, deps);
42066
44085
  if (!ws) return NO_WORKSPACE;
42067
44086
  const b = await balance(base, ws, deps);
42068
- const total = b.balance_krw ?? b.total_krw;
44087
+ const total = b.balance_krw;
42069
44088
  const view = { ...b, workspace_id: b.workspace_id ?? ws, balance_krw: total ?? null };
42070
44089
  if (total == null) {
42071
44090
  return {
@@ -42095,8 +44114,7 @@ function creditBalance(deps = {}) {
42095
44114
  });
42096
44115
  }
42097
44116
  function nextPage(out2) {
42098
- if (out2.next_cursor != null) return out2.next_cursor;
42099
- return out2.next_before_id != null ? String(out2.next_before_id) : null;
44117
+ return out2.next_cursor ?? null;
42100
44118
  }
42101
44119
  function creditLedger(a = {}, deps = {}) {
42102
44120
  return guarded(READ_ONLY, async () => {
@@ -43328,6 +45346,253 @@ function deleteCharacter(a = {}, deps = {}) {
43328
45346
  };
43329
45347
  });
43330
45348
  }
45349
+ function estimateExport(a = {}, deps = {}) {
45350
+ return guarded(READ_ONLY, async () => {
45351
+ const slug = needSlug(a);
45352
+ if (typeof slug !== "string") return slug;
45353
+ const base = resolveBaseUrl(deps.baseUrl);
45354
+ const out2 = await apiRequest(
45355
+ base,
45356
+ projectPath(slug, "/exports/estimate"),
45357
+ { method: "POST", body: { quality: a.quality ?? "1080p" } },
45358
+ deps
45359
+ );
45360
+ const lines = [`\uC644\uC131\uBCF8 \uACAC\uC801 (\uC694\uC728 v${out2.rate_version}) \u2014 \uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4`];
45361
+ for (const item of out2.items ?? []) {
45362
+ const label = item.cut_id ?? "(\uC644\uC131\uBCF8)";
45363
+ if (item.blocked_reason) {
45364
+ lines.push(` ${label}: \uACAC\uC801 \uBD88\uAC00 \u2014 ${item.blocked_reason}`);
45365
+ continue;
45366
+ }
45367
+ const rows = (item.rows ?? []).map((r) => `${r.display_name || r.key} ${krw(r.krw)}`).join(", ") || "\uD589 \uC5C6\uC74C";
45368
+ lines.push(` ${label}: ${krw(item.total_krw ?? 0)} (${rows})`);
45369
+ }
45370
+ lines.push(
45371
+ `\uCD1D\uC561 ${krw(out2.total_krw)} \xB7 \uC794\uC561 ${krw(out2.balance_krw)} \u2192 \uB0A8\uC744 \uC794\uC561 ${krw(out2.balance_after_krw)}`,
45372
+ out2.can_afford ? "\uCDA9\uBD84\uD569\uB2C8\uB2E4." : "\u26A0\uFE0F \uC794\uC561\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4 \u2014 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uAD00\uB9AC\uC790\uC5D0\uAC8C \uCDA9\uC804\uC744 \uC694\uCCAD\uD558\uC138\uC694.",
45373
+ "\uC774 total_krw\xB7rate_version \uC744 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBCF4\uC5EC \uC8FC\uACE0 **\uADF8\uB300\uB85C** democut_make_export \uC5D0 \uB123\uC73C\uC138\uC694."
45374
+ );
45375
+ if (out2.mock) lines.push("(mock \uB2E8\uAC00\uC785\uB2C8\uB2E4 \u2014 \uC2E4\uC81C \uCCAD\uAD6C\uC640 \uB2E4\uB97C \uC218 \uC788\uC2B5\uB2C8\uB2E4.)");
45376
+ for (const note of out2.notes ?? []) {
45377
+ lines.push(`\u258E ${note.cut_id ? `${note.cut_id}: ` : ""}${callableToolNames(note.message)}`);
45378
+ }
45379
+ return { text: lines.join("\n"), structured: callableStructured(out2) };
45380
+ });
45381
+ }
45382
+ function makeExport(a = {}, deps = {}) {
45383
+ return guarded(SUBMITTING, async () => {
45384
+ const slug = needSlug(a);
45385
+ if (typeof slug !== "string") return slug;
45386
+ const base = resolveBaseUrl(deps.baseUrl);
45387
+ const out2 = await apiRequest(
45388
+ base,
45389
+ projectPath(slug, "/exports"),
45390
+ {
45391
+ method: "POST",
45392
+ body: {
45393
+ quality: a.quality ?? "1080p",
45394
+ confirmed_cost_krw: a.confirmed_cost_krw,
45395
+ rate_version: a.rate_version
45396
+ }
45397
+ },
45398
+ deps
45399
+ );
45400
+ const lines = [
45401
+ `\uC644\uC131\uBCF8\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out2.job_id} (${krw(out2.quote?.total_krw ?? 0)})`,
45402
+ "\uC21C\uC11C\uC5D0 \uB193\uC778 \uCEF7\uC758 \uB300\uD45C \uBC84\uC804\uC744 \uADF8 \uC21C\uC11C\xB7\uC7AC\uC0DD \uAD6C\uAC04\uB300\uB85C \uC774\uC5B4 \uBD99\uC774\uACE0 \uC790\uB9C9\uC744 \uC785\uD799\uB2C8\uB2E4(\uC21C\uC11C\uC5D0\uC11C \uBE80 \uCEF7\uC740 \uC81C\uC678).",
45403
+ "\uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs \uB85C \uB05D\uB098\uBA74 democut_list_exports \uC5D0\uC11C \uBC88\uD638\uC640 \uB0B4\uB824\uBC1B\uAE30 \uC8FC\uC18C\uB97C \uBD05\uB2C8\uB2E4."
45404
+ ];
45405
+ return { text: lines.join("\n"), structured: callableStructured(out2) };
45406
+ });
45407
+ }
45408
+ function snapshotOrder(snapshot) {
45409
+ const order = snapshot?.order;
45410
+ return Array.isArray(order) ? order.filter((x) => typeof x === "string") : [];
45411
+ }
45412
+ function snapshotQuality(snapshot) {
45413
+ const q = snapshot?.quality;
45414
+ return typeof q === "string" ? q : "?";
45415
+ }
45416
+ function listExports(a = {}, deps = {}) {
45417
+ return guarded(READ_ONLY, async () => {
45418
+ const slug = needSlug(a);
45419
+ if (typeof slug !== "string") return slug;
45420
+ const base = resolveBaseUrl(deps.baseUrl);
45421
+ const out2 = await apiRequest(base, projectPath(slug, "/exports"), {}, deps);
45422
+ const exports = out2.exports ?? [];
45423
+ if (exports.length === 0) {
45424
+ return {
45425
+ text: callableToolNames(
45426
+ "\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0\uB294 \uC544\uC9C1 \uC644\uC131\uBCF8\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uB9CC\uB4E4\uB824\uBA74 democut_estimate_export \u2192 democut_make_export."
45427
+ ),
45428
+ structured: callableStructured(out2)
45429
+ };
45430
+ }
45431
+ const lines = [
45432
+ `\uC644\uC131\uBCF8 ${exports.length}\uAC1C (\uCD5C\uC2E0 \uBC88\uD638\uBD80\uD130) \u2014 \uBC88\uD638 [\uC0C1\uD0DC] \uAE38\uC774 \xB7 \uCEF7 \uC218 \xB7 \uD488\uC9C8 \xB7 \uC601\uC0C1 \uC8FC\uC18C`
45433
+ ];
45434
+ lines.push(
45435
+ ...listing(
45436
+ exports.map((e) => {
45437
+ const bits = [`#${e.number} [${e.state}]`];
45438
+ if (e.duration_ms) {
45439
+ bits.push(`${(e.duration_ms / 1e3).toFixed(1)}\uCD08`);
45440
+ } else {
45441
+ bits.push("\uAE38\uC774 \uBBF8\uC815");
45442
+ }
45443
+ bits.push(`\xB7 \uCEF7 ${snapshotOrder(e.snapshot).length}`);
45444
+ bits.push(`\xB7 ${snapshotQuality(e.snapshot)}`);
45445
+ bits.push(`\xB7 ${e.download?.video ?? "(\uC544\uC9C1 \uC5C6\uC74C)"}`);
45446
+ return ` ${bits.join(" ")}`;
45447
+ })
45448
+ )
45449
+ );
45450
+ lines.push(
45451
+ callableToolNames("\uD558\uB098\uB9CC \uC790\uC138\uD788 \uBCF4\uB824\uBA74 democut_get_export. \uC8FC\uC18C\uB294 1\uC2DC\uAC04 \uB3D9\uC548\uB9CC \uC720\uD6A8\uD569\uB2C8\uB2E4.")
45452
+ );
45453
+ return { text: lines.join("\n"), structured: callableStructured(out2) };
45454
+ });
45455
+ }
45456
+ function needExportNumber(a) {
45457
+ if (a.number === void 0 || a.number === "" || typeof a.number === "boolean" || !Number.isInteger(Number(a.number)) || Number(a.number) < 1) {
45458
+ return {
45459
+ isError: true,
45460
+ text: `number \uB294 1 \uC774\uC0C1\uC758 \uC815\uC218\uC5EC\uC57C \uD569\uB2C8\uB2E4 \u2014 democut_list_exports \uB85C \uBC88\uD638\uB97C \uD655\uC778\uD558\uC138\uC694: ${JSON.stringify(a.number)}`
45461
+ };
45462
+ }
45463
+ return Number(a.number);
45464
+ }
45465
+ function getExport(a = {}, deps = {}) {
45466
+ return guarded(READ_ONLY, async () => {
45467
+ const slug = needSlug(a);
45468
+ if (typeof slug !== "string") return slug;
45469
+ const number3 = needExportNumber(a);
45470
+ if (typeof number3 !== "number") return number3;
45471
+ const base = resolveBaseUrl(deps.baseUrl);
45472
+ const out2 = await apiRequest(
45473
+ base,
45474
+ projectPath(slug, `/exports/${number3}`),
45475
+ {},
45476
+ deps
45477
+ );
45478
+ const lines = [
45479
+ `\uC644\uC131\uBCF8 #${out2.number} [${out2.state}] \u2014 \uC2A4\uD1A0\uB9AC\uBCF4\uB4DC rev ${out2.storyboard_rev} \xB7 \uCEF7 ${snapshotOrder(out2.snapshot).length} \xB7 ${snapshotQuality(out2.snapshot)}`
45480
+ ];
45481
+ if (out2.download?.video) {
45482
+ lines.push(`\uC601\uC0C1: ${out2.download.video}`);
45483
+ if (out2.download.subtitle) {
45484
+ lines.push(`\uC790\uB9C9(SRT): ${out2.download.subtitle}`);
45485
+ }
45486
+ const thumbs = out2.thumbnails ?? [];
45487
+ if (thumbs.length > 0) {
45488
+ lines.push(
45489
+ `\uC378\uB124\uC77C \uD6C4\uBCF4 ${thumbs.length}\uC7A5 \u2014 \uB300\uD45C ${out2.selected_thumbnail_id ?? "(\uC5C6\uC74C)"}: ` + thumbs.map((t) => `${t.asset_id}${t.asset_id === out2.selected_thumbnail_id ? "\u2605" : ""}${t.url ? ` ${t.url}` : ""}`).join(" \xB7 ")
45490
+ );
45491
+ lines.push("\uB300\uD45C\uB97C \uBC14\uAFB8\uB824\uBA74 democut_select_thumbnail(asset_id).");
45492
+ } else {
45493
+ lines.push("\uC378\uB124\uC77C\uC740 \uC544\uC9C1 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 democut_make_thumbnails(3\uC7A5, \uCCAD\uAD6C) \uB610\uB294 democut_upload_asset \uB4A4 democut_select_thumbnail.");
45494
+ }
45495
+ if (out2.youtube_meta) {
45496
+ lines.push(`\uC720\uD29C\uBE0C \uBA54\uD0C0: \u300C${out2.youtube_meta.title}\u300D \xB7 \uD0DC\uADF8 ${out2.youtube_meta.tags?.length ?? 0}\uAC1C \u2014 \uACE0\uCE58\uB824\uBA74 democut_set_youtube_meta.`);
45497
+ } else {
45498
+ lines.push("\uC720\uD29C\uBE0C \uBA54\uD0C0\uB294 \uC544\uC9C1 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 democut_generate_youtube_meta(\uC18C\uC561) \uB610\uB294 democut_set_youtube_meta(0\uC6D0).");
45499
+ }
45500
+ lines.push("\uC8FC\uC18C\uB294 1\uC2DC\uAC04 \uB3D9\uC548\uB9CC \uC720\uD6A8\uD569\uB2C8\uB2E4.");
45501
+ } else if (["queued", "running"].includes(out2.state)) {
45502
+ lines.push(
45503
+ `\uC544\uC9C1 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 democut_wait_jobs \uC5D0 ${out2.job_id} \uB97C \uB123\uC5B4 \uAE30\uB2E4\uB9AC\uC138\uC694.`
45504
+ );
45505
+ } else if (out2.state === "cancelled") {
45506
+ lines.push(
45507
+ "\uCDE8\uC18C\uB41C \uC644\uC131\uBCF8\uC785\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uB9CC\uB4E4\uB824\uBA74 democut_estimate_export \u2192 democut_make_export."
45508
+ );
45509
+ } else {
45510
+ lines.push(
45511
+ `\uC2E4\uD328\uD55C \uC644\uC131\uBCF8\uC785\uB2C8\uB2E4 \u2014 democut_wait_jobs \uC5D0 ${out2.job_id} \uB97C \uB123\uC73C\uBA74 \uC0AC\uC720\uAC00 \uB098\uC635\uB2C8\uB2E4. \uB2E4\uC2DC \uB9CC\uB4E4\uB824\uBA74 democut_estimate_export \u2192 democut_make_export.`
45512
+ );
45513
+ }
45514
+ return { text: lines.join("\n"), structured: callableStructured(out2) };
45515
+ });
45516
+ }
45517
+ function makeThumbnails(a = {}, deps = {}) {
45518
+ return guarded(SUBMITTING, async () => {
45519
+ const slug = needSlug(a);
45520
+ if (typeof slug !== "string") return slug;
45521
+ const number3 = needExportNumber(a);
45522
+ if (typeof number3 !== "number") return number3;
45523
+ const base = resolveBaseUrl(deps.baseUrl);
45524
+ const out2 = await apiRequest(
45525
+ base,
45526
+ projectPath(slug, `/exports/${number3}/thumbnails`),
45527
+ { method: "POST", body: { confirmed_cost_krw: a.confirmed_cost_krw, rate_version: a.rate_version } },
45528
+ deps
45529
+ );
45530
+ const lines = [
45531
+ `\uC644\uC131\uBCF8 #${number3} \uC758 \uC378\uB124\uC77C 3\uC7A5\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out2.job_id} (${krw(out2.quote?.total_krw ?? 0)}, \uC794\uC561\uC5D0\uC11C \uCC28\uAC10\uB410\uC2B5\uB2C8\uB2E4)`,
45532
+ "\uC644\uC131\uBCF8 \uC601\uC0C1\uC758 \uD55C \uC7A5\uBA74\uC744 \uC694\uC57D\uD574 \uC11C\uB85C \uB2E4\uB978 \uC2A4\uD0C0\uC77C 3\uC7A5\uC744 \uB9CC\uB4ED\uB2C8\uB2E4. \uC2E4\uD328\uD55C \uC7A5\uB9CC \uD658\uBD88\uB418\uACE0 \uC131\uACF5\uD55C \uC7A5\uC740 \uB0A8\uC2B5\uB2C8\uB2E4.",
45533
+ "\uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs \uB85C \uB05D\uB098\uBA74 democut_get_export \uC758 thumbnails \uC5D0 \uD6C4\uBCF4\uC640 \uC8FC\uC18C\uAC00 \uC2E4\uB9AC\uACE0 \uCCAB \uC7A5\uC774 \uB300\uD45C\uB85C \uC7A1\uD799\uB2C8\uB2E4. \uBC14\uAFB8\uB824\uBA74 democut_select_thumbnail."
45534
+ ];
45535
+ return { text: lines.join("\n"), structured: callableStructured(out2) };
45536
+ });
45537
+ }
45538
+ function selectThumbnail(a = {}, deps = {}) {
45539
+ return guarded(READ_ONLY, async () => {
45540
+ const slug = needSlug(a);
45541
+ if (typeof slug !== "string") return slug;
45542
+ const number3 = needExportNumber(a);
45543
+ if (typeof number3 !== "number") return number3;
45544
+ if (typeof a.asset_id !== "string" || a.asset_id.trim() === "") {
45545
+ return {
45546
+ isError: true,
45547
+ text: "asset_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4 \u2014 democut_get_export \uC758 thumbnails \uC5D0\uC11C \uACE0\uB974\uAC70\uB098, democut_upload_asset \uC73C\uB85C \uC62C\uB9B0 \uC774\uBBF8\uC9C0 \uC790\uC0B0\uC758 id \uB97C \uB123\uC73C\uC138\uC694."
45548
+ };
45549
+ }
45550
+ const base = resolveBaseUrl(deps.baseUrl);
45551
+ const out2 = await apiRequest(
45552
+ base,
45553
+ projectPath(slug, `/exports/${number3}/thumbnail`),
45554
+ { method: "PUT", body: { asset_id: a.asset_id } },
45555
+ deps
45556
+ );
45557
+ const thumbs = out2.thumbnails ?? [];
45558
+ const chosen = thumbs.find((t) => t.asset_id === out2.selected_thumbnail_id);
45559
+ const lines = [`\uC644\uC131\uBCF8 #${out2.number} \uC758 \uB300\uD45C \uC378\uB124\uC77C\uC744 ${out2.selected_thumbnail_id} \uB85C \uACE8\uB790\uC2B5\uB2C8\uB2E4(\uD6C4\uBCF4 ${thumbs.length}\uC7A5).`];
45560
+ if (chosen?.url) lines.push(`\uBBF8\uB9AC\uBCF4\uAE30: ${chosen.url} (1\uC2DC\uAC04 \uC720\uD6A8)`);
45561
+ return { text: lines.join("\n"), structured: callableStructured(out2) };
45562
+ });
45563
+ }
45564
+ function generateYoutubeMeta(a = {}, deps = {}) {
45565
+ return guarded(SUBMITTING, async () => {
45566
+ const slug = needSlug(a);
45567
+ if (typeof slug !== "string") return slug;
45568
+ const number3 = needExportNumber(a);
45569
+ if (typeof number3 !== "number") return number3;
45570
+ const base = resolveBaseUrl(deps.baseUrl);
45571
+ const out2 = await apiRequest(base, projectPath(slug, `/exports/${number3}/youtube_meta/generate`), { method: "POST", body: {} }, deps);
45572
+ const lines = [
45573
+ `\uC644\uC131\uBCF8 #${number3} \uC758 \uC720\uD29C\uBE0C \uC81C\uBAA9\xB7\uC124\uBA85\xB7\uD0DC\uADF8\uB97C \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out2.job_id} (${krw(out2.quote?.total_krw ?? 0)}, \uC794\uC561\uC5D0\uC11C \uCC28\uAC10\uB410\uC2B5\uB2C8\uB2E4)`,
45574
+ "\uC644\uC131\uBCF8 \uCEF7\uC758 \uB300\uC0AC \uC804\uBB38\uC744 \uC77D\uACE0 \uC2DC\uCCAD\uC790 \uAD00\uC810\uC758 \uC81C\uBAA9(100\uC790)\xB7\uC124\uBA85\xB7\uD0DC\uADF8\uB97C \uB9CC\uB4ED\uB2C8\uB2E4. \uB300\uC0AC\uAC00 \uC5C6\uC73C\uBA74 422 \uB85C \uAC70\uBD80\uB429\uB2C8\uB2E4(\uACFC\uAE08 \uC5C6\uC74C).",
45575
+ "\uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs \uB85C \uB05D\uB098\uBA74 democut_get_export \uC758 youtube_meta \uC5D0 \uC2E4\uB9BD\uB2C8\uB2E4. \uACE0\uCE58\uB824\uBA74 democut_set_youtube_meta."
45576
+ ];
45577
+ return { text: lines.join("\n"), structured: callableStructured(out2) };
45578
+ });
45579
+ }
45580
+ function setYoutubeMeta(a = {}, deps = {}) {
45581
+ return guarded(READ_ONLY, async () => {
45582
+ const slug = needSlug(a);
45583
+ if (typeof slug !== "string") return slug;
45584
+ const number3 = needExportNumber(a);
45585
+ if (typeof number3 !== "number") return number3;
45586
+ if (!a.meta || typeof a.meta !== "object" || typeof a.meta.title !== "string" || a.meta.title.trim() === "") {
45587
+ return { isError: true, text: "meta.title \uC774 \uD544\uC694\uD569\uB2C8\uB2E4 \u2014 meta: { title, description?, tags? } \uB85C \uB123\uC73C\uC138\uC694(\uC81C\uBAA9 100\uC790\xB7\uC124\uBA85 5000\uC790)." };
45588
+ }
45589
+ const base = resolveBaseUrl(deps.baseUrl);
45590
+ const out2 = await apiRequest(base, projectPath(slug, `/exports/${number3}/youtube_meta`), { method: "PUT", body: { meta: a.meta } }, deps);
45591
+ const meta2 = out2.youtube_meta;
45592
+ const lines = [`\uC644\uC131\uBCF8 #${out2.number} \uC758 \uC720\uD29C\uBE0C \uBA54\uD0C0\uB97C \uB123\uC5C8\uC2B5\uB2C8\uB2E4 \u2014 \uC81C\uBAA9 \u300C${meta2?.title ?? ""}\u300D, \uD0DC\uADF8 ${meta2?.tags?.length ?? 0}\uAC1C.`];
45593
+ return { text: lines.join("\n"), structured: callableStructured(out2) };
45594
+ });
45595
+ }
43331
45596
 
43332
45597
  // src/mcp/server.ts
43333
45598
  var TOOLS = GENERATED_TOOLS;
@@ -43395,6 +45660,22 @@ function dispatch(name, args, deps = {}) {
43395
45660
  return download(args, deps);
43396
45661
  case "democut_download_project":
43397
45662
  return downloadProject(args, deps);
45663
+ case "democut_estimate_export":
45664
+ return estimateExport(args, deps);
45665
+ case "democut_make_export":
45666
+ return makeExport(args, deps);
45667
+ case "democut_list_exports":
45668
+ return listExports(args, deps);
45669
+ case "democut_get_export":
45670
+ return getExport(args, deps);
45671
+ case "democut_make_thumbnails":
45672
+ return makeThumbnails(args, deps);
45673
+ case "democut_select_thumbnail":
45674
+ return selectThumbnail(args, deps);
45675
+ case "democut_generate_youtube_meta":
45676
+ return generateYoutubeMeta(args, deps);
45677
+ case "democut_set_youtube_meta":
45678
+ return setYoutubeMeta(args, deps);
43398
45679
  case "democut_import_cut":
43399
45680
  return importCut(args, deps);
43400
45681
  case "democut_cancel_job":