democut 1.0.83 → 1.0.86

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 +436 -28
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -6916,7 +6916,7 @@ import { realpathSync } from "fs";
6916
6916
  import { fileURLToPath } from "url";
6917
6917
 
6918
6918
  // src/version.ts
6919
- var VERSION = "1.0.83";
6919
+ var VERSION = "1.0.86";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -8252,6 +8252,7 @@ var GENERATED_TOOLS = [
8252
8252
  "canvas": {},
8253
8253
  "draft_spec": {},
8254
8254
  "edit": {},
8255
+ "bgm": {},
8255
8256
  "current_version": {},
8256
8257
  "current_image_id": {},
8257
8258
  "images": {
@@ -8637,6 +8638,7 @@ var GENERATED_TOOLS = [
8637
8638
  "canvas": {},
8638
8639
  "draft_spec": {},
8639
8640
  "edit": {},
8641
+ "bgm": {},
8640
8642
  "current_version": {},
8641
8643
  "current_image_id": {},
8642
8644
  "images": {
@@ -8748,6 +8750,7 @@ var GENERATED_TOOLS = [
8748
8750
  "canvas": {},
8749
8751
  "draft_spec": {},
8750
8752
  "edit": {},
8753
+ "bgm": {},
8751
8754
  "current_version": {},
8752
8755
  "current_image_id": {},
8753
8756
  "images": {
@@ -9640,7 +9643,7 @@ var GENERATED_TOOLS = [
9640
9643
  },
9641
9644
  {
9642
9645
  "name": "democut_select_character_photo",
9643
- "description": "\uB300\uD45C \uC0AC\uC9C4\uC744 \uACE0\uB978\uB2E4(\uC774\uBBF8 \uB9CC\uB4E0 \uCEF7\uC5D0\uB294 \uC18C\uAE09\uD558\uC9C0 \uC54A\uB294\uB2E4).",
9646
+ "description": "\uC0AC\uC9C4\uC744 \uC120\uD0DD\uD55C\uB2E4(\uC774\uBBF8 \uB9CC\uB4E0 \uCEF7\uC5D0\uB294 \uC18C\uAE09\uD558\uC9C0 \uC54A\uB294\uB2E4).",
9644
9647
  "inputSchema": {
9645
9648
  "type": "object",
9646
9649
  "properties": {
@@ -9803,7 +9806,7 @@ var GENERATED_TOOLS = [
9803
9806
  },
9804
9807
  {
9805
9808
  "name": "democut_make_character_photo",
9806
- "description": "\uC544\uBC14\uD0C0 \uC0AC\uC9C4\uC744 AI \uB85C \uB9CC\uB4E0\uB2E4(\uCCAD\uAD6C\xB7\uC0C1\uD55C). \uCE90\uB9AD\uD130 \uC2DC\uD2B8\uB3C4 \uAC19\uC740 \uC7A1\uC5D0\uC11C \uB9CC\uB4E4\uC5B4 \uADF8 \uC0AC\uC9C4\uC5D0 \uB2E8\uB2E4. \uB9CC\uB4E0 \uC0AC\uC9C4\uC774 \uB300\uD45C\uAC00 \uB41C\uB2E4. \uD06C\uAE30\uB294 \uC815\uC0AC\uAC01 \uACE0\uC815. prompt \uC5D0\uB294 \uB204\uAD6C\uC778\uC9C0(\uB098\uC774\xB7\uC131\uBCC4\xB7\uCD9C\uC2E0\xB7\uBA38\uB9AC\xB7\uC637 \uB4F1)\uB97C \uC801\uB294\uB2E4 \u2014 \uC0AC\uC2E4\uC801\uC778 \uC778\uBB3C \uC0AC\uC9C4\uC758 \uD2C0\uC740 \uC11C\uBC84\uAC00 \uC50C\uC6B4\uB2E4. \uB3C8\uC774 \uB098\uAC00\uB294 \uB3C4\uAD6C\uB2E4: estimate_cuts(\uB610\uB294 \uC9DD\uC774 \uB418\uB294 estimate \uB3C4\uAD6C)\uB85C \uAE08\uC561\uC744 \uBCF4\uACE0 \uC0AC\uC6A9\uC790 \uB3D9\uC758\uB97C \uBC1B\uC740 \uB4A4 confirmed_*_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). \uC2E4\uD328\uD574\uB3C4 \uC7AC\uC81C\uCD9C\uD558\uC9C0 \uB9C8\uB77C \u2014 \uAC19\uC740 spec \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.",
9809
+ "description": "\uC544\uBC14\uD0C0 \uC0AC\uC9C4\uC744 AI \uB85C \uB9CC\uB4E0\uB2E4(\uCCAD\uAD6C\xB7\uC0C1\uD55C). \uCE90\uB9AD\uD130 \uC2DC\uD2B8\uB3C4 \uAC19\uC740 \uC7A1\uC5D0\uC11C \uB9CC\uB4E4\uC5B4 \uADF8 \uC0AC\uC9C4\uC5D0 \uB2E8\uB2E4. \uB9CC\uB4E0 \uC0AC\uC9C4\uC774 \uC120\uD0DD\uB41C\uB2E4. \uD06C\uAE30\uB294 \uC815\uC0AC\uAC01 \uACE0\uC815. prompt \uC5D0\uB294 \uB204\uAD6C\uC778\uC9C0(\uB098\uC774\xB7\uC131\uBCC4\xB7\uCD9C\uC2E0\xB7\uBA38\uB9AC\xB7\uC637 \uB4F1)\uB97C \uC801\uB294\uB2E4 \u2014 \uC0AC\uC2E4\uC801\uC778 \uC778\uBB3C \uC0AC\uC9C4\uC758 \uD2C0\uC740 \uC11C\uBC84\uAC00 \uC50C\uC6B4\uB2E4. \uB3C8\uC774 \uB098\uAC00\uB294 \uB3C4\uAD6C\uB2E4: estimate_cuts(\uB610\uB294 \uC9DD\uC774 \uB418\uB294 estimate \uB3C4\uAD6C)\uB85C \uAE08\uC561\uC744 \uBCF4\uACE0 \uC0AC\uC6A9\uC790 \uB3D9\uC758\uB97C \uBC1B\uC740 \uB4A4 confirmed_*_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). \uC2E4\uD328\uD574\uB3C4 \uC7AC\uC81C\uCD9C\uD558\uC9C0 \uB9C8\uB77C \u2014 \uAC19\uC740 spec \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.",
9807
9810
  "inputSchema": {
9808
9811
  "type": "object",
9809
9812
  "properties": {
@@ -10306,6 +10309,7 @@ var GENERATED_TOOLS = [
10306
10309
  "canvas": {},
10307
10310
  "draft_spec": {},
10308
10311
  "edit": {},
10312
+ "bgm": {},
10309
10313
  "current_version": {},
10310
10314
  "current_image_id": {},
10311
10315
  "images": {
@@ -10405,6 +10409,7 @@ var GENERATED_TOOLS = [
10405
10409
  "canvas": {},
10406
10410
  "draft_spec": {},
10407
10411
  "edit": {},
10412
+ "bgm": {},
10408
10413
  "current_version": {},
10409
10414
  "current_image_id": {},
10410
10415
  "images": {
@@ -10551,6 +10556,7 @@ var GENERATED_TOOLS = [
10551
10556
  "canvas": {},
10552
10557
  "draft_spec": {},
10553
10558
  "edit": {},
10559
+ "bgm": {},
10554
10560
  "current_version": {},
10555
10561
  "current_image_id": {},
10556
10562
  "images": {
@@ -10606,7 +10612,7 @@ var GENERATED_TOOLS = [
10606
10612
  },
10607
10613
  {
10608
10614
  "name": "democut_set_cut_edit",
10609
- "description": "\uC55E\uB4A4 \uC790\uB974\uAE30(edit.trim_in_ms\xB7trim_out_ms)\uC640 \uBB34\uC74C \uC790\uB974\uAE30(edit.silence_removal)\uB97C \uC815\uD55C\uB2E4. 0\uC6D0\uC774\uACE0 \uB9CC\uB4E0 \uC601\uC0C1 \uD30C\uC77C\uC740 \uADF8\uB300\uB85C\uB2E4 \u2014 \uBBF8\uB9AC\uBCF4\uAE30\uC640 \uC644\uC131\uBCF8\uC5D0\uB9CC \uC801\uC6A9\uB41C\uB2E4. edit \uB294 \uD1B5\uC9F8\uB85C \uBC14\uB00C\uBBC0\uB85C \uC548 \uBC14\uAFC0 \uAC12\uB3C4 \uD568\uAED8 \uBCF4\uB0B8\uB2E4. \uC720\uD29C\uBE0C \uD074\uB9BD\uC758 \uC6D0\uBCF8 \uAD6C\uAC04(draft_spec.source.start_s\xB7end_s \u2014 \uBC14\uAFB8\uBA74 \uB2E4\uC2DC \uB9CC\uB4E4\uACE0 \uACFC\uAE08)\uACFC \uB2E4\uB978 \uAC12\uC774\uB2E4.",
10615
+ "description": "\uC55E\uB4A4 \uC790\uB974\uAE30(edit.trim_in_ms\xB7trim_out_ms)\uC640 \uBB34\uC74C \uC790\uB974\uAE30(edit.silence_removal), \uC7AC\uC0DD \uC18D\uB3C4(edit.speed \u2014 0.5~2.0\uBC30)\uB97C \uC815\uD55C\uB2E4. 0\uC6D0\uC774\uACE0 \uB9CC\uB4E0 \uC601\uC0C1 \uD30C\uC77C\uC740 \uADF8\uB300\uB85C\uB2E4 \u2014 \uBBF8\uB9AC\uBCF4\uAE30\uC640 \uC644\uC131\uBCF8\uC5D0\uB9CC \uC801\uC6A9\uB41C\uB2E4. \uB9D0\uC774 \uB290\uB9B4 \uB54C \uCEF7\uC744 \uB2E4\uC2DC \uB9CC\uB4E4\uC9C0 \uC54A\uACE0 speed \uB9CC \uC62C\uB9AC\uBA74 \uB41C\uB2E4. edit \uB294 \uD1B5\uC9F8\uB85C \uBC14\uB00C\uBBC0\uB85C \uC548 \uBC14\uAFC0 \uAC12\uB3C4 \uD568\uAED8 \uBCF4\uB0B8\uB2E4. \uC720\uD29C\uBE0C \uD074\uB9BD\uC758 \uC6D0\uBCF8 \uAD6C\uAC04(draft_spec.source.start_s\xB7end_s \u2014 \uBC14\uAFB8\uBA74 \uB2E4\uC2DC \uB9CC\uB4E4\uACE0 \uACFC\uAE08)\uACFC \uB2E4\uB978 \uAC12\uC774\uB2E4.",
10610
10616
  "inputSchema": {
10611
10617
  "type": "object",
10612
10618
  "properties": {
@@ -10655,6 +10661,7 @@ var GENERATED_TOOLS = [
10655
10661
  "canvas": {},
10656
10662
  "draft_spec": {},
10657
10663
  "edit": {},
10664
+ "bgm": {},
10658
10665
  "current_version": {},
10659
10666
  "current_image_id": {},
10660
10667
  "images": {
@@ -10759,6 +10766,7 @@ var GENERATED_TOOLS = [
10759
10766
  "canvas": {},
10760
10767
  "draft_spec": {},
10761
10768
  "edit": {},
10769
+ "bgm": {},
10762
10770
  "current_version": {},
10763
10771
  "current_image_id": {},
10764
10772
  "images": {
@@ -10812,6 +10820,252 @@ var GENERATED_TOOLS = [
10812
10820
  "openWorldHint": false
10813
10821
  }
10814
10822
  },
10823
+ {
10824
+ "name": "democut_set_cut_bgm",
10825
+ "description": "\uCEF7\uC5D0 \uAE54 \uBC30\uACBD\uC74C\uC545\uC744 \uC815\uD55C\uB2E4(0\uC6D0). \uCEF7 \uC601\uC0C1\uC740 \uADF8\uB300\uB85C\uC774\uACE0 \uC644\uC131\uBCF8\uC744 \uB9CC\uB4E4 \uB54C \uC11E\uC778\uB2E4 \u2014 \uBC14\uAFBC \uB4A4 democut_make_export \uB9CC \uB2E4\uC2DC \uD558\uBA74 \uB41C\uB2E4. bgm = {asset_id(\uC62C\uB824 \uB454 audio \uC790\uC0B0 \u2014 democut_upload_asset kind=audio), cut_start_ms\xB7cut_end_ms(\uCEF7\uC758 \uC5B4\uB514\uBD80\uD130 \uC5B4\uB514\uAE4C\uC9C0, \uBE44\uC6B0\uBA74 \uCEF7 \uC804\uCCB4), song_start_ms\xB7song_end_ms(\uACE1\uC758 \uC5B4\uB514\uBD80\uD130 \uC5B4\uB514\uAE4C\uC9C0), volume(0~2, \uAE30\uBCF8 1)}. song_start_ms \uB97C \uBE44\uC6B0\uBA74 \uC790\uB3D9\uC774\uB2E4: \uBC14\uB85C \uC55E \uCEF7\uC774 \uAC19\uC740 \uACE1\uC774\uBA74 \uADF8 \uACE1\uC774 \uB4E4\uB9B0 \uC790\uB9AC\uC5D0\uC11C \uC774\uC5B4\uC9C0\uACE0(\uD55C \uACE1\uC744 \uC5EC\uB7EC \uCEF7\uC5D0 \uAC78\uCCD0 \uAE54 \uB54C \uADF8\uB0E5 \uAC19\uC740 asset_id \uB9CC \uC8FC\uBA74 \uB41C\uB2E4), \uC544\uB2C8\uBA74 \uCC98\uC74C\uBD80\uD130\uB2E4. 0 \uC744 \uC8FC\uBA74 \uCC98\uC74C\uBD80\uD130 \uB2E4\uC2DC \uD2BC\uB2E4. \uACE1\uC774 \uBAA8\uC790\uB77C\uBA74 \uBC18\uBCF5\uD558\uC9C0 \uC54A\uACE0 \uC870\uC6A9\uD574\uC9C4\uB2E4. \uADF8 \uCEF7\uC758 \uC55E\uB4A4 \uC790\uB974\uAE30\xB7\uBB34\uC74C \uC790\uB974\uAE30(democut_set_cut_edit)\uB294 \uC74C\uC545\uC5D0\uB3C4 \uAC19\uC774 \uAC78\uB9B0\uB2E4(\uC798\uB9B0 \uD654\uBA74\uC758 \uC74C\uC545\uC740 \uD568\uAED8 \uBE60\uC9C4\uB2E4). \uBC30\uC18D\uC740 \uC601\uC0C1\uC5D0\uB9CC \uAC78\uB9AC\uACE0 \uC74C\uC545\uC740 \uC81C \uC18D\uB3C4\uB85C \uD750\uB978\uB2E4. \uB9D0\uC18C\uB9AC\uAC00 \uC788\uB294 \uAD6C\uAC04\uC5D0\uC11C\uB294 \uC74C\uC545\uC774 \uC790\uB3D9\uC73C\uB85C \uB0AE\uC544\uC9C4\uB2E4. bgm \uC744 null \uB85C \uC8FC\uBA74 \uC74C\uC545\uC744 \uBE80\uB2E4. democut_set_cut_edit\xB7democut_put_cut_draft \uC640 \uB2E4\uB978 \uAC12\uC774\uB77C \uC11C\uB85C \uC9C0\uC6B0\uC9C0 \uC54A\uB294\uB2E4.",
10826
+ "inputSchema": {
10827
+ "type": "object",
10828
+ "properties": {
10829
+ "slug": {
10830
+ "type": "string",
10831
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
10832
+ },
10833
+ "cut_id": {
10834
+ "type": "string",
10835
+ "description": "\uCEF7 id(cut_\u2026)"
10836
+ },
10837
+ "bgm": {
10838
+ "type": [
10839
+ "object",
10840
+ "null"
10841
+ ],
10842
+ "description": "\uBC30\uACBD\uC74C\uC545 \uC9C0\uC815(\uBAA8\uC591\uC740 CutBgm). null \uC774\uBA74 \uC74C\uC545\uC744 \uBE80\uB2E4 \u2014 \uBAA8\uB378 CutBgm \u2014 \uBAA8\uC591\uC740 \uC790\uC6D0 democut://guide \uC640 democut_get_options \uAC00 \uB9D0\uD55C\uB2E4(\uC5EC\uAE30\uC11C\uB294 \uC81C\uC57D\uC744 \uAC78\uC9C0 \uC54A\uB294\uB2E4)"
10843
+ }
10844
+ },
10845
+ "required": [
10846
+ "slug",
10847
+ "cut_id",
10848
+ "bgm"
10849
+ ],
10850
+ "additionalProperties": false
10851
+ },
10852
+ "outputSchema": {
10853
+ "type": "object",
10854
+ "properties": {
10855
+ "id": {
10856
+ "type": "string"
10857
+ },
10858
+ "project_slug": {
10859
+ "type": "string"
10860
+ },
10861
+ "mode": {
10862
+ "type": "string"
10863
+ },
10864
+ "title": {
10865
+ "type": "string"
10866
+ },
10867
+ "position": {},
10868
+ "chain_break": {
10869
+ "type": "boolean"
10870
+ },
10871
+ "enabled": {
10872
+ "type": "boolean"
10873
+ },
10874
+ "canvas": {},
10875
+ "draft_spec": {},
10876
+ "edit": {},
10877
+ "bgm": {},
10878
+ "current_version": {},
10879
+ "current_image_id": {},
10880
+ "images": {
10881
+ "type": "array"
10882
+ },
10883
+ "hook_candidates": {},
10884
+ "versions": {
10885
+ "type": "array"
10886
+ },
10887
+ "state": {
10888
+ "type": "string"
10889
+ },
10890
+ "dirty_fields": {
10891
+ "type": "array"
10892
+ },
10893
+ "estimated_cost_krw": {},
10894
+ "rows": {
10895
+ "type": "array"
10896
+ },
10897
+ "blocked_reason": {},
10898
+ "edit_adjusted": {
10899
+ "type": "boolean"
10900
+ },
10901
+ "active_job_id": {},
10902
+ "last_job_id": {},
10903
+ "last_error": {},
10904
+ "next_calls": {
10905
+ "type": "array"
10906
+ },
10907
+ "created_at": {
10908
+ "type": "string"
10909
+ },
10910
+ "updated_at": {
10911
+ "type": "string"
10912
+ }
10913
+ },
10914
+ "required": [
10915
+ "id",
10916
+ "project_slug",
10917
+ "mode",
10918
+ "draft_spec",
10919
+ "state",
10920
+ "created_at",
10921
+ "updated_at"
10922
+ ]
10923
+ },
10924
+ "annotations": {
10925
+ "readOnlyHint": false,
10926
+ "destructiveHint": false,
10927
+ "idempotentHint": true,
10928
+ "openWorldHint": false
10929
+ }
10930
+ },
10931
+ {
10932
+ "name": "democut_list_music",
10933
+ "description": "\uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uACE1 \uBAA9\uB85D(0\uC6D0) \u2014 \uBC30\uACBD\uC74C\uC545\uC73C\uB85C \uACE0\uB97C \uC218 \uC788\uB294 \uACE1. \uACE1\uB9C8\uB2E4 asset_id\xB7\uC774\uB984\xB7\uAE38\uC774(duration_ms)\xB7\uBBF8\uB9AC\uB4E3\uAE30 \uC8FC\uC18C\uC640 \uADF8 \uACE1\uC744 \uAE50 \uCEF7(used_by)\uC744 \uC900\uB2E4. \uCEF7\uC5D0 \uAE4C\uB294 \uAC83\uC740 democut_set_cut_bgm \uC774\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_set_cut_bgm.",
10934
+ "inputSchema": {
10935
+ "type": "object",
10936
+ "properties": {
10937
+ "slug": {
10938
+ "type": "string",
10939
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
10940
+ }
10941
+ },
10942
+ "required": [
10943
+ "slug"
10944
+ ],
10945
+ "additionalProperties": false
10946
+ },
10947
+ "outputSchema": {
10948
+ "type": "object",
10949
+ "properties": {
10950
+ "music": {
10951
+ "type": "array"
10952
+ }
10953
+ },
10954
+ "required": [
10955
+ "music"
10956
+ ]
10957
+ },
10958
+ "annotations": {
10959
+ "readOnlyHint": true,
10960
+ "destructiveHint": false,
10961
+ "idempotentHint": true,
10962
+ "openWorldHint": false
10963
+ }
10964
+ },
10965
+ {
10966
+ "name": "democut_add_music",
10967
+ "description": "\uC62C\uB824 \uB454 \uC18C\uB9AC \uC790\uC0B0(democut_upload_asset kind=audio \u2014 wav\xB7mp3\xB7m4a)\uC744 \uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uACE1\uC73C\uB85C \uB4F1\uB85D\uD55C\uB2E4(0\uC6D0). title \uC740 \uC0AC\uB78C\uC774 \uACE1\uC744 \uAD6C\uBCC4\uD558\uB294 \uC774\uB984\uC774\uB2E4. \uC774\uBBF8 \uB4F1\uB85D\uB41C \uACE1\uC774\uBA74 \uC774\uB984\uB9CC \uBC14\uAFBC\uB2E4. \uB4F1\uB85D\uD558\uC9C0 \uC54A\uC740 \uC790\uC0B0\uB3C4 democut_set_cut_bgm \uC5D0 \uC4F8 \uC218 \uC788\uC9C0\uB9CC, \uB4F1\uB85D\uD574 \uB450\uC5B4\uC57C \uD654\uBA74\uC758 \uACE1 \uBAA9\uB85D\uC5D0 \uBCF4\uC778\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_set_cut_bgm.",
10968
+ "inputSchema": {
10969
+ "type": "object",
10970
+ "properties": {
10971
+ "slug": {
10972
+ "type": "string",
10973
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
10974
+ },
10975
+ "asset_id": {
10976
+ "description": "upload_asset(kind=audio)\uAC00 \uC900 \uC790\uC0B0 id",
10977
+ "minLength": 1,
10978
+ "type": "string"
10979
+ },
10980
+ "title": {
10981
+ "default": "",
10982
+ "description": "\uACE1\uC758 \uC774\uB984(\uC120\uD0DD). \uC0AC\uB78C\uC774 \uACE1\uC744 \uAD6C\uBCC4\uD558\uB294 \uB370\uB9CC \uC4F4\uB2E4",
10983
+ "maxLength": 100,
10984
+ "type": "string"
10985
+ }
10986
+ },
10987
+ "required": [
10988
+ "slug",
10989
+ "asset_id"
10990
+ ],
10991
+ "additionalProperties": false
10992
+ },
10993
+ "outputSchema": {
10994
+ "type": "object",
10995
+ "properties": {
10996
+ "asset_id": {
10997
+ "type": "string"
10998
+ },
10999
+ "title": {
11000
+ "type": "string"
11001
+ },
11002
+ "duration_ms": {},
11003
+ "peaks": {
11004
+ "type": "array"
11005
+ },
11006
+ "url": {},
11007
+ "used_by": {
11008
+ "type": "array"
11009
+ }
11010
+ },
11011
+ "required": [
11012
+ "asset_id"
11013
+ ]
11014
+ },
11015
+ "annotations": {
11016
+ "readOnlyHint": false,
11017
+ "destructiveHint": false,
11018
+ "idempotentHint": false,
11019
+ "openWorldHint": false
11020
+ }
11021
+ },
11022
+ {
11023
+ "name": "democut_remove_music",
11024
+ "description": "\uACE1\uC744 \uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uBAA9\uB85D\uC5D0\uC11C \uBE80\uB2E4(0\uC6D0). \uADF8 \uACE1\uC744 \uBC30\uACBD\uC74C\uC545\uC73C\uB85C \uAE50 \uCEF7\uC774 \uC788\uC73C\uBA74 409 ASSET_IN_USE \uB85C \uB9C9\uACE0 data.cut_ids \uB85C \uC5B4\uB290 \uCEF7\uC778\uC9C0 \uB9D0\uD55C\uB2E4 \u2014 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uADF8 \uCEF7\uB4E4\uC758 \uC74C\uC545\uC774 \uBE60\uC9C4\uB2E4\uB294 \uAC83\uC744 \uC54C\uB9AC\uACE0 \uB3D9\uC758\uB97C \uBC1B\uC740 \uB4A4 force=true \uB85C \uB2E4\uC2DC \uBD80\uB974\uBA74 \uADF8 \uCEF7\uB4E4\uC758 \uC9C0\uC815\uC744 \uBE44\uC6B0\uACE0 \uBE80\uB2E4. \uBE80 \uB4A4 \uC544\uBB34\uB3C4 \uC4F0\uC9C0 \uC54A\uB294 \uC790\uC0B0\uC740 \uD568\uAED8 \uC9C0\uC6B4\uB2E4. \uC774\uBBF8 \uB9CC\uB4E0 \uC644\uC131\uBCF8\uC740 \uADF8\uB300\uB85C\uB2E4.",
11025
+ "inputSchema": {
11026
+ "type": "object",
11027
+ "properties": {
11028
+ "slug": {
11029
+ "type": "string",
11030
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
11031
+ },
11032
+ "asset_id": {
11033
+ "type": "string",
11034
+ "description": "\uC790\uC0B0 id(ast_\u2026)"
11035
+ },
11036
+ "force": {
11037
+ "default": false,
11038
+ "description": "\uC4F0\uB294 \uCEF7\uC774 \uC788\uC5B4\uB3C4 \uBE80\uB2E4 \u2014 \uADF8 \uCEF7\uB4E4\uC758 \uBC30\uACBD\uC74C\uC545 \uC9C0\uC815\uC744 \uBE44\uC6B4\uB2E4. \uC5C6\uC73C\uBA74 409 \uB85C \uB9C9\uACE0 \uB204\uAC00 \uC4F0\uB294\uC9C0 \uB9D0\uD55C\uB2E4",
11039
+ "type": "boolean"
11040
+ }
11041
+ },
11042
+ "required": [
11043
+ "slug",
11044
+ "asset_id"
11045
+ ],
11046
+ "additionalProperties": false
11047
+ },
11048
+ "outputSchema": {
11049
+ "type": "object",
11050
+ "properties": {
11051
+ "deleted": {
11052
+ "type": "boolean"
11053
+ },
11054
+ "cleared_cut_ids": {
11055
+ "type": "array"
11056
+ },
11057
+ "asset_deleted": {
11058
+ "type": "boolean"
11059
+ }
11060
+ }
11061
+ },
11062
+ "annotations": {
11063
+ "readOnlyHint": false,
11064
+ "destructiveHint": true,
11065
+ "idempotentHint": true,
11066
+ "openWorldHint": false
11067
+ }
11068
+ },
10815
11069
  {
10816
11070
  "name": "democut_reorder_cuts",
10817
11071
  "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.",
@@ -11076,7 +11330,7 @@ var GENERATED_TOOLS = [
11076
11330
  },
11077
11331
  {
11078
11332
  "name": "democut_get_silence",
11079
- "description": "\uB300\uD45C \uBC84\uC804\uC758 \uBB34\uC74C \uAD6C\uAC04 \uBBF8\uB9AC\uBCF4\uAE30(threshold_ms).",
11333
+ "description": "\uC120\uD0DD\uB41C \uBC84\uC804\uC758 \uBB34\uC74C \uAD6C\uAC04 \uBBF8\uB9AC\uBCF4\uAE30(threshold_ms).",
11080
11334
  "inputSchema": {
11081
11335
  "type": "object",
11082
11336
  "properties": {
@@ -11129,7 +11383,7 @@ var GENERATED_TOOLS = [
11129
11383
  },
11130
11384
  {
11131
11385
  "name": "democut_download_project",
11132
- "description": "\uD504\uB85C\uC81D\uD2B8 \uC804\uCCB4(\uB300\uD45C \uBC84\uC804 \uC0B0\uCD9C\uBB3C) zip \uC11C\uBA85 URL.",
11386
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC804\uCCB4(\uC120\uD0DD\uB41C \uBC84\uC804 \uC0B0\uCD9C\uBB3C) zip \uC11C\uBA85 URL.",
11133
11387
  "inputSchema": {
11134
11388
  "type": "object",
11135
11389
  "properties": {
@@ -11356,6 +11610,7 @@ var GENERATED_TOOLS = [
11356
11610
  "canvas": {},
11357
11611
  "draft_spec": {},
11358
11612
  "edit": {},
11613
+ "bgm": {},
11359
11614
  "current_version": {},
11360
11615
  "current_image_id": {},
11361
11616
  "images": {
@@ -11894,7 +12149,7 @@ var GENERATED_TOOLS = [
11894
12149
  },
11895
12150
  {
11896
12151
  "name": "democut_delete_thumbnail",
11897
- "description": "\uC378\uB124\uC77C \uD6C4\uBCF4\uB97C \uBE80\uB2E4(0\uC6D0). \uB300\uD45C\uC600\uC73C\uBA74 \uB300\uD45C\uAC00 \uBE44\uACE0, \uB2E4\uB978 \uACF3\uC774 \uC4F0\uC9C0 \uC54A\uB294 \uC774\uBBF8\uC9C0 \uD30C\uC77C\uC740 \uD568\uAED8 \uC9C0\uC6B4\uB2E4.",
12152
+ "description": "\uC378\uB124\uC77C \uD6C4\uBCF4\uB97C \uBE80\uB2E4(0\uC6D0). \uC120\uD0DD\uB3FC \uC788\uC5C8\uC73C\uBA74 \uC120\uD0DD\uC774 \uBE44\uACE0, \uB2E4\uB978 \uACF3\uC774 \uC4F0\uC9C0 \uC54A\uB294 \uC774\uBBF8\uC9C0 \uD30C\uC77C\uC740 \uD568\uAED8 \uC9C0\uC6B4\uB2E4.",
11898
12153
  "inputSchema": {
11899
12154
  "type": "object",
11900
12155
  "properties": {
@@ -12397,7 +12652,7 @@ var GENERATED_TOOLS = [
12397
12652
  },
12398
12653
  {
12399
12654
  "name": "democut_select_cut_version",
12400
- "description": "\uB300\uD45C \uBC84\uC804\uC744 \uBC14\uAFBC\uB2E4(0\uC6D0). draft_spec \uC740 \uADF8\uB300\uB85C\uB2E4.",
12655
+ "description": "\uC120\uD0DD\uB41C \uBC84\uC804\uC744 \uBC14\uAFBC\uB2E4(0\uC6D0). draft_spec \uC740 \uADF8\uB300\uB85C\uB2E4.",
12401
12656
  "inputSchema": {
12402
12657
  "type": "object",
12403
12658
  "properties": {
@@ -12446,6 +12701,7 @@ var GENERATED_TOOLS = [
12446
12701
  "canvas": {},
12447
12702
  "draft_spec": {},
12448
12703
  "edit": {},
12704
+ "bgm": {},
12449
12705
  "current_version": {},
12450
12706
  "current_image_id": {},
12451
12707
  "images": {
@@ -12501,7 +12757,7 @@ var GENERATED_TOOLS = [
12501
12757
  },
12502
12758
  {
12503
12759
  "name": "democut_delete_cut_version",
12504
- "description": "\uBC84\uC804 \uD558\uB098\uB97C \uC9C0\uC6B4\uB2E4(\uB300\uD45C\uBA74 \uB2E4\uB978 \uBC84\uC804\uC73C\uB85C \uC62E\uAE34 \uB4A4).",
12760
+ "description": "\uBC84\uC804 \uD558\uB098\uB97C \uC9C0\uC6B4\uB2E4(\uC120\uD0DD\uB3FC \uC788\uC73C\uBA74 \uB2E4\uB978 \uBC84\uC804\uC73C\uB85C \uC62E\uAE34 \uB4A4).",
12505
12761
  "inputSchema": {
12506
12762
  "type": "object",
12507
12763
  "properties": {
@@ -12882,6 +13138,30 @@ var TOOL_META = {
12882
13138
  "method": "PUT",
12883
13139
  "path": "/api/projects/{slug}/cuts/{cut_id}/title"
12884
13140
  },
13141
+ "democut_set_cut_bgm": {
13142
+ "cost": "none",
13143
+ "group": "storyboard",
13144
+ "method": "PUT",
13145
+ "path": "/api/projects/{slug}/cuts/{cut_id}/bgm"
13146
+ },
13147
+ "democut_list_music": {
13148
+ "cost": "none",
13149
+ "group": "storyboard",
13150
+ "method": "GET",
13151
+ "path": "/api/projects/{slug}/music"
13152
+ },
13153
+ "democut_add_music": {
13154
+ "cost": "none",
13155
+ "group": "storyboard",
13156
+ "method": "POST",
13157
+ "path": "/api/projects/{slug}/music"
13158
+ },
13159
+ "democut_remove_music": {
13160
+ "cost": "none",
13161
+ "group": "storyboard",
13162
+ "method": "DELETE",
13163
+ "path": "/api/projects/{slug}/music/{asset_id}"
13164
+ },
12885
13165
  "democut_reorder_cuts": {
12886
13166
  "cost": "none",
12887
13167
  "group": "storyboard",
@@ -14089,7 +14369,7 @@ function makeCutImage(a = {}, deps = {}) {
14089
14369
  `\uCEF7 \uC774\uBBF8\uC9C0\uB97C \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
14090
14370
  // ★★ 상한임을 제출 자리에서도 말한다 — 견적을 건너뛴 호출자는 이 문장만 본다.
14091
14371
  `\uCCAD\uAD6C ${krw(total)} \u2014 \uC0C1\uD55C\uC785\uB2C8\uB2E4. \uC2E4\uC81C \uC0AC\uC6A9\uB7C9\uC774 \uC801\uC73C\uBA74 \uCC28\uC561\uC744 \uC790\uB3D9\uC73C\uB85C \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4.`,
14092
- "democut_wait_jobs \uB85C \uB05D\uB098\uBA74 democut_get_cut \uC758 images \uC5D0 \uC0C8 \uC774\uBBF8\uC9C0\uAC00 \uC0DD\uAE41\uB2C8\uB2E4 \u2014 \uCCAB \uC774\uBBF8\uC9C0\uBA74 \uB300\uD45C\uAC00 \uB418\uC5B4 \uB2E4\uC74C \uC601\uC0C1\uC758 \uCCAB \uD504\uB808\uC784\uC774 \uB429\uB2C8\uB2E4."
14372
+ "democut_wait_jobs \uB85C \uB05D\uB098\uBA74 democut_get_cut \uC758 images \uC5D0 \uC0C8 \uC774\uBBF8\uC9C0\uAC00 \uC0DD\uAE41\uB2C8\uB2E4 \u2014 \uCCAB \uC774\uBBF8\uC9C0\uBA74 \uC120\uD0DD\uB418\uC5B4 \uB2E4\uC74C \uC601\uC0C1\uC758 \uCCAB \uD504\uB808\uC784\uC774 \uB429\uB2C8\uB2E4."
14093
14373
  ].join("\n"),
14094
14374
  structured: callableStructured(out4)
14095
14375
  };
@@ -14099,7 +14379,7 @@ function cutImageLine(cut) {
14099
14379
  const n = cut.images?.length ?? 0;
14100
14380
  const firstFrame = (cut.mode ?? "ai_video") === "ai_video";
14101
14381
  if (!n) return `${cut.id}: \uC774\uBBF8\uC9C0 \uC5C6\uC74C${firstFrame ? " \u2014 \uB2E4\uC74C \uC601\uC0C1\uC740 \uD14D\uC2A4\uD2B8\uB9CC\uC73C\uB85C \uB9CC\uB4ED\uB2C8\uB2E4(t2v)." : "."}`;
14102
- let cover = cut.current_image_id ? `\uB300\uD45C ${cut.current_image_id}` : "\uB300\uD45C \uC5C6\uC74C";
14382
+ let cover = cut.current_image_id ? `\uC120\uD0DD\uB41C \uC774\uBBF8\uC9C0 ${cut.current_image_id}` : "\uC120\uD0DD\uB41C \uC774\uBBF8\uC9C0 \uC5C6\uC74C";
14103
14383
  if (cut.current_image_id) {
14104
14384
  const current = cut.images?.find((i) => i.id === cut.current_image_id);
14105
14385
  if (current?.model) cover += ` (${current.model}${current.quality ? ` \xB7 ${current.quality}` : ""})`;
@@ -14140,7 +14420,7 @@ function setCutImage(a = {}, deps = {}) {
14140
14420
  );
14141
14421
  const added = out4.images?.[out4.images.length - 1];
14142
14422
  const first = added && out4.current_image_id === added.id && (out4.images?.length ?? 0) === 1;
14143
- return { text: `\uCEF7 \uC774\uBBF8\uC9C0\uB97C \uCD94\uAC00\uD588\uC2B5\uB2C8\uB2E4. ${cutImageLine(out4)}${first ? " \uCCAB \uC774\uBBF8\uC9C0\uB77C \uB300\uD45C\uB85C \uC815\uD588\uC2B5\uB2C8\uB2E4." : ""}`, structured: callableStructured(out4) };
14423
+ return { text: `\uCEF7 \uC774\uBBF8\uC9C0\uB97C \uCD94\uAC00\uD588\uC2B5\uB2C8\uB2E4. ${cutImageLine(out4)}${first ? " \uCCAB \uC774\uBBF8\uC9C0\uB77C \uC120\uD0DD\uD588\uC2B5\uB2C8\uB2E4." : ""}`, structured: callableStructured(out4) };
14144
14424
  });
14145
14425
  }
14146
14426
  function selectCutImage(a = {}, deps = {}) {
@@ -14165,7 +14445,7 @@ function selectCutImage(a = {}, deps = {}) {
14165
14445
  { method: "PUT", body: { image_id: imageId } },
14166
14446
  deps
14167
14447
  );
14168
- const head = imageId === null ? "\uCCAB \uC7A5\uBA74 \uC9C0\uC815\uC744 \uBE44\uC6E0\uC2B5\uB2C8\uB2E4." : "\uB300\uD45C \uCEF7 \uC774\uBBF8\uC9C0\uB97C \uACE8\uB790\uC2B5\uB2C8\uB2E4.";
14448
+ const head = imageId === null ? "\uCCAB \uC7A5\uBA74 \uC9C0\uC815\uC744 \uBE44\uC6E0\uC2B5\uB2C8\uB2E4." : "\uCEF7 \uC774\uBBF8\uC9C0\uB97C \uC120\uD0DD\uD588\uC2B5\uB2C8\uB2E4.";
14169
14449
  const draft = out4.mode === "ai_video" ? " \uCD08\uC548\uC758 image_asset_id \uAC00 \uC774 \uC120\uD0DD\uACFC \uAC19\uC2B5\uB2C8\uB2E4. \uC9C0\uC815\uC774 \uBC14\uB00C\uC5C8\uB2E4\uBA74 \uD504\uB85C\uC81D\uD2B8 rev \uAC00 \uC62C\uB790\uC73C\uB2C8 \uB2E4\uC74C \uD3B8\uC9D1 \uC804\uC5D0 democut_get_storyboard \uB85C rev \uB97C \uB2E4\uC2DC \uC77D\uC73C\uC138\uC694." : "";
14170
14450
  return { text: `${head} ${cutImageLine(out4)}${draft} \uC774\uBBF8 \uB9CC\uB4E0 \uBC84\uC804\uC740 \uADF8\uB300\uB85C\uC785\uB2C8\uB2E4.`, structured: callableStructured(out4) };
14171
14451
  });
@@ -14363,7 +14643,7 @@ function listCuts(a = {}, deps = {}) {
14363
14643
  structured: callableStructured(out4)
14364
14644
  };
14365
14645
  }
14366
- const lines = [`\uCEF7 ${cuts.length}\uAC1C (\uC5F0\uACB0 \uC21C\uC11C) \u2014 id [\uC0C1\uD0DC] \uBC29\uC2DD \xB7 \uC81C\uBAA9 \xB7 \uB300\uD45C \uBC84\uC804 \xB7 \uB9C9\uD78C \uC774\uC720`];
14646
+ const lines = [`\uCEF7 ${cuts.length}\uAC1C (\uC5F0\uACB0 \uC21C\uC11C) \u2014 id [\uC0C1\uD0DC] \uBC29\uC2DD \xB7 \uC81C\uBAA9 \xB7 \uC120\uD0DD\uB41C \uBC84\uC804 \xB7 \uB9C9\uD78C \uC774\uC720`];
14367
14647
  lines.push(...listing(cuts.map(cutLine)));
14368
14648
  lines.push(callableToolNames("\uC0C1\uC138\xB7\uBC84\uC804\xB7\uB0B4\uB824\uBC1B\uAE30 \uC8FC\uC18C\uB294 get_cut, \uC21C\uC11C\xB7rev \uB294 get_storyboard."));
14369
14649
  return { text: lines.join("\n"), structured: callableStructured(out4) };
@@ -14401,7 +14681,7 @@ function getStoryboard(a = {}, deps = {}) {
14401
14681
  function cutLine(cut) {
14402
14682
  const bits = [`${cut.id} [${cut.state}] ${cut.mode}`];
14403
14683
  if (cut.title) bits.push(`\u300C${cut.title}\u300D`);
14404
- if (cut.current_version != null) bits.push(`\uB300\uD45C v${cut.current_version}`);
14684
+ if (cut.current_version != null) bits.push(`v${cut.current_version} \xB7 \uC120\uD0DD\uB428`);
14405
14685
  if (cut.dirty_fields?.length) bits.push(`\uB2EC\uB77C\uC9C4 \uD544\uB4DC: ${cut.dirty_fields.join(", ")}`);
14406
14686
  if (cut.estimated_cost_krw != null) bits.push(`\uC608\uC0C1 ${krw(cut.estimated_cost_krw)}`);
14407
14687
  if (cut.blocked_reason) bits.push(`\uB9C9\uD798: ${callableToolNames(cut.blocked_reason)}`);
@@ -14434,6 +14714,8 @@ function addCut(a = {}, deps = {}) {
14434
14714
  });
14435
14715
  }
14436
14716
  var EDIT_NOTE = "\uC774\uBBF8 \uB9CC\uB4E0 \uC601\uC0C1 \uD30C\uC77C\uC740 \uADF8\uB300\uB85C\uC785\uB2C8\uB2E4 \u2014 \uC7AC\uC0DD\xB7\uC644\uC131\uBCF8\uC5D0\uB9CC \uC801\uC6A9\uB418\uACE0 \uC7AC\uB80C\uB354\uB294 \uC5C6\uC2B5\uB2C8\uB2E4.";
14717
+ var BGM_NOTE = "\uBC30\uACBD\uC74C\uC545\uC744 \uC9C0\uC815\uD588\uC2B5\uB2C8\uB2E4 \u2014 \uCEF7 \uC601\uC0C1\uC740 \uADF8\uB300\uB85C\uC774\uACE0, \uC644\uC131\uBCF8\uC744 \uB9CC\uB4E4 \uB54C(make_export) \uC11E\uC785\uB2C8\uB2E4(\uB2E4\uC2DC \uB9CC\uB4E4 \uD544\uC694 \uC5C6\uC2B5\uB2C8\uB2E4).";
14718
+ var BGM_CLEARED_NOTE = "\uBC30\uACBD\uC74C\uC545\uC744 \uBE90\uC2B5\uB2C8\uB2E4 \u2014 \uCEF7 \uC601\uC0C1\uC740 \uADF8\uB300\uB85C\uC785\uB2C8\uB2E4. \uC774\uBBF8 \uB9CC\uB4E0 \uC644\uC131\uBCF8\uC5D0\uB294 \uB0A8\uC544 \uC788\uACE0, \uB2E4\uC74C \uC644\uC131\uBCF8\uBD80\uD130 \uBE60\uC9D1\uB2C8\uB2E4.";
14437
14719
  var TITLE_NOTE = "\uC81C\uBAA9\uB9CC \uBC14\uB00C\uC5C8\uC2B5\uB2C8\uB2E4 \u2014 \uB9CC\uB4E0 \uC601\uC0C1\xB7\uAE08\uC561\xB7\uC644\uC131\uBCF8\uC740 \uADF8\uB300\uB85C\uC785\uB2C8\uB2E4(\uB2E4\uC2DC \uB9CC\uB4E4 \uD544\uC694 \uC5C6\uC2B5\uB2C8\uB2E4).";
14438
14720
  var SILENCE_NOTE = "\uBBF8\uB9AC\uBCF4\uAE30\uC785\uB2C8\uB2E4 \u2014 \uC2E4\uC81C\uB85C \uC9C0\uC6B0\uB824\uBA74 set_cut_edit \uC758 silence_removal \uC744 \uCF1C\uC138\uC694.";
14439
14721
  function getSilence(a = {}, deps = {}) {
@@ -14636,6 +14918,124 @@ function setCutEdit(a = {}, deps = {}) {
14636
14918
  return { text: [cutLine(cut), EDIT_NOTE].join("\n"), structured: callableStructured(cut) };
14637
14919
  });
14638
14920
  }
14921
+ function setCutBgm(a = {}, deps = {}) {
14922
+ return guarded(READ_ONLY, async () => {
14923
+ const slug = needSlug(a);
14924
+ if (typeof slug !== "string") return slug;
14925
+ const cutId = (a.cut_id ?? "").trim();
14926
+ if (!cutId) return { isError: true, text: "cut_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4." };
14927
+ if (a.bgm === void 0) {
14928
+ return { isError: true, text: "bgm \uC774 \uD544\uC694\uD569\uB2C8\uB2E4(null \uC740 \uC74C\uC545\uC744 \uBE8D\uB2C8\uB2E4)." };
14929
+ }
14930
+ const base = resolveBaseUrl(deps.baseUrl);
14931
+ let cut;
14932
+ try {
14933
+ cut = await apiRequest(
14934
+ base,
14935
+ projectPath(slug, `/cuts/${encodeURIComponent(cutId)}/bgm`),
14936
+ { method: "PUT", body: { bgm: a.bgm } },
14937
+ deps
14938
+ );
14939
+ } catch (e) {
14940
+ const notYet = routeNotDeployed(e, "\uBC30\uACBD\uC74C\uC545 \uC9C0\uC815\uC774", "\uC2AC\uB7EC\uADF8\xB7\uCEF7\xB7\uACE1\uC740");
14941
+ if (notYet) return notYet;
14942
+ throw e;
14943
+ }
14944
+ const note = cut.bgm != null ? BGM_NOTE : BGM_CLEARED_NOTE;
14945
+ return { text: [cutLine(cut), note].join("\n"), structured: callableStructured(cut) };
14946
+ });
14947
+ }
14948
+ function routeNotDeployed(e, what, values) {
14949
+ if (!(e instanceof ApiError) || e.status !== 404 || e.code !== `HTTP_404`) return null;
14950
+ return {
14951
+ isError: true,
14952
+ text: `\uC774 \uC11C\uBC84\uC5D0\uB294 \uC544\uC9C1 ${what} \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 CLI \uAC00 \uC11C\uBC84\uBCF4\uB2E4 \uBA3C\uC800 \uC62C\uB77C\uAC00 \uC0DD\uAE30\uB294 \uC77C\uC2DC\uC801\uC778 \uCC28\uC774\uC785\uB2C8\uB2E4.
14953
+ ${values} \uBB38\uC81C\uAC00 \uC544\uB2C8\uB2C8 \uACE0\uCE58\uC9C0 \uB9C8\uC138\uC694. \uC11C\uBC84\uAC00 \uBC30\uD3EC\uB41C \uB4A4 \uAC19\uC740 \uAC12\uC73C\uB85C \uB2E4\uC2DC \uBD80\uB974\uBA74 \uB429\uB2C8\uB2E4.`
14954
+ };
14955
+ }
14956
+ async function musicRequest(run2) {
14957
+ try {
14958
+ return await run2();
14959
+ } catch (e) {
14960
+ const notYet = routeNotDeployed(e, "\uACE1 \uBAA9\uB85D \uAE30\uB2A5\uC774", "\uC2AC\uB7EC\uADF8\uC640 \uACE1\uC740");
14961
+ if (notYet) return notYet;
14962
+ throw e;
14963
+ }
14964
+ }
14965
+ var isToolResult = (v) => typeof v === "object" && v !== null && "isError" in v && "text" in v;
14966
+ function musicLine(m) {
14967
+ const seconds = m.duration_ms ? `${(m.duration_ms / 1e3).toFixed(1)}\uCD08` : "\uAE38\uC774 \uBBF8\uC815";
14968
+ const used = m.used_by && m.used_by.length ? ` \xB7 \uC4F0\uB294 \uCEF7 ${m.used_by.length}\uAC1C(${m.used_by.join(", ")})` : "";
14969
+ return `- ${m.asset_id} \u300C${m.title || "\uC774\uB984 \uC5C6\uC74C"}\u300D ${seconds}${used}`;
14970
+ }
14971
+ function slimMusic(m) {
14972
+ const { peaks: _peaks, ...rest } = m;
14973
+ return rest;
14974
+ }
14975
+ function listMusic(a = {}, deps = {}) {
14976
+ return guarded(READ_ONLY, async () => {
14977
+ const slug = needSlug(a);
14978
+ if (typeof slug !== "string") return slug;
14979
+ const base = resolveBaseUrl(deps.baseUrl);
14980
+ const out4 = await musicRequest(() => apiRequest(base, projectPath(slug, "/music"), {}, deps));
14981
+ if (isToolResult(out4)) return out4;
14982
+ const music = out4.music ?? [];
14983
+ const slim = callableStructured({ music: music.map(slimMusic) });
14984
+ if (music.length === 0) {
14985
+ return {
14986
+ text: callableToolNames(
14987
+ "\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0\uB294 \uB4F1\uB85D\uB41C \uACE1\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uC18C\uB9AC \uD30C\uC77C\uC744 democut_upload_asset(kind=audio)\uB85C \uC62C\uB9B0 \uB4A4 democut_add_music \uC73C\uB85C \uB4F1\uB85D\uD558\uC138\uC694."
14988
+ ),
14989
+ structured: slim
14990
+ };
14991
+ }
14992
+ return {
14993
+ text: callableToolNames([`\uACE1 ${music.length}\uAC1C \u2014 democut_set_cut_bgm \uC758 bgm.asset_id \uB85C \uC501\uB2C8\uB2E4.`, ...music.map(musicLine)].join("\n")),
14994
+ structured: slim
14995
+ };
14996
+ });
14997
+ }
14998
+ function addMusic(a = {}, deps = {}) {
14999
+ return guarded(READ_ONLY, async () => {
15000
+ const slug = needSlug(a);
15001
+ if (typeof slug !== "string") return slug;
15002
+ const assetId = (a.asset_id ?? "").trim();
15003
+ if (!assetId) return { isError: true, text: callableToolNames("asset_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4 \u2014 democut_upload_asset(kind=audio)\uAC00 \uC900 id \uC785\uB2C8\uB2E4.") };
15004
+ const base = resolveBaseUrl(deps.baseUrl);
15005
+ const body = { asset_id: assetId };
15006
+ if (typeof a.title === "string") body.title = a.title;
15007
+ const out4 = await musicRequest(() => apiRequest(base, projectPath(slug, "/music"), { method: "POST", body }, deps));
15008
+ if (isToolResult(out4)) return out4;
15009
+ return {
15010
+ text: callableToolNames(["\uACE1\uC744 \uB4F1\uB85D\uD588\uC2B5\uB2C8\uB2E4.", musicLine(out4), "\uCEF7\uC5D0 \uAE54\uB824\uBA74 democut_set_cut_bgm \uC5D0 \uC774 asset_id \uB97C \uB123\uC73C\uC138\uC694."].join("\n")),
15011
+ structured: callableStructured(slimMusic(out4))
15012
+ };
15013
+ });
15014
+ }
15015
+ function removeMusic(a = {}, deps = {}) {
15016
+ return guarded(READ_ONLY, async () => {
15017
+ const slug = needSlug(a);
15018
+ if (typeof slug !== "string") return slug;
15019
+ const assetId = (a.asset_id ?? "").trim();
15020
+ if (!assetId) return { isError: true, text: callableToolNames("asset_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4 \u2014 democut_list_music \uC5D0\uC11C \uACE0\uB974\uC138\uC694.") };
15021
+ const base = resolveBaseUrl(deps.baseUrl);
15022
+ const q = a.force === true ? "?force=true" : "";
15023
+ const out4 = await musicRequest(() => apiRequest(
15024
+ base,
15025
+ projectPath(slug, `/music/${encodeURIComponent(assetId)}${q}`),
15026
+ { method: "DELETE" },
15027
+ deps
15028
+ ));
15029
+ if (isToolResult(out4)) return out4;
15030
+ const lines = ["\uACE1\uC744 \uBAA9\uB85D\uC5D0\uC11C \uBE90\uC2B5\uB2C8\uB2E4."];
15031
+ const cleared = out4.cleared_cut_ids ?? [];
15032
+ if (cleared.length) {
15033
+ lines.push(`\uBC30\uACBD\uC74C\uC545 \uC9C0\uC815\uC744 \uBE44\uC6B4 \uCEF7: ${cleared.join(", ")} \u2014 \uC774\uBBF8 \uB9CC\uB4E0 \uC644\uC131\uBCF8\uC5D0\uB294 \uC74C\uC545\uC774 \uB0A8\uC544 \uC788\uACE0 \uB2E4\uC74C \uC644\uC131\uBCF8\uBD80\uD130 \uBE60\uC9D1\uB2C8\uB2E4.`);
15034
+ }
15035
+ lines.push(out4.asset_deleted ? "\uC18C\uB9AC \uD30C\uC77C\uB3C4 \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4." : "\uC18C\uB9AC \uD30C\uC77C\uC740 \uB2E4\uB978 \uACF3\uC774 \uC4F0\uACE0 \uC788\uC5B4 \uB0A8\uACBC\uC2B5\uB2C8\uB2E4.");
15036
+ return { text: lines.join("\n"), structured: callableStructured(out4) };
15037
+ });
15038
+ }
14639
15039
  function setCutTitle(a = {}, deps = {}) {
14640
15040
  return guarded(READ_ONLY, async () => {
14641
15041
  const slug = needSlug(a);
@@ -14738,7 +15138,7 @@ function downloadProject(a = {}, deps = {}) {
14738
15138
  if (typeof slug !== "string") return slug;
14739
15139
  const base = resolveBaseUrl(deps.baseUrl);
14740
15140
  const out4 = await apiRequest(base, projectPath(slug, "/export.zip"), {}, deps);
14741
- const scope = "\uC21C\uC11C\uC5D0 \uB193\uC778 \uCEF7\uC758 \uB300\uD45C \uBC84\uC804 \uC0B0\uCD9C\uBB3C\uB9CC \uB4E4\uC5B4 \uC788\uC2B5\uB2C8\uB2E4(\uC21C\uC11C\uC5D0\uC11C \uBE80 \uCEF7\xB7\uC544\uC9C1 \uB9CC\uB4E4\uC9C0 \uC54A\uC740 \uCEF7 \uC81C\uC678) \u2014 \uC774\uC5B4 \uBD99\uC778 \uC644\uC131\uBCF8\uC774 \uC544\uB2D9\uB2C8\uB2E4.";
15141
+ const scope = "\uC21C\uC11C\uC5D0 \uB193\uC778 \uCEF7\uC758 \uC120\uD0DD\uB41C \uBC84\uC804 \uC0B0\uCD9C\uBB3C\uB9CC \uB4E4\uC5B4 \uC788\uC2B5\uB2C8\uB2E4(\uC21C\uC11C\uC5D0\uC11C \uBE80 \uCEF7\xB7\uC544\uC9C1 \uB9CC\uB4E4\uC9C0 \uC54A\uC740 \uCEF7 \uC81C\uC678) \u2014 \uC774\uC5B4 \uBD99\uC778 \uC644\uC131\uBCF8\uC774 \uC544\uB2D9\uB2C8\uB2E4.";
14742
15142
  if (a.output_path) {
14743
15143
  await (deps.downloadImpl ? deps.downloadImpl(out4.url, a.output_path) : saveUrlToFile(out4.url, a.output_path, deps.fetchImpl ?? fetch));
14744
15144
  return { text: `\uD504\uB85C\uC81D\uD2B8 zip \uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4: ${a.output_path}
@@ -14914,7 +15314,7 @@ function selectCutVersion(a = {}, deps = {}) {
14914
15314
  const base = resolveBaseUrl(deps.baseUrl);
14915
15315
  const out4 = await apiRequest(base, projectPath(slug, `/cuts/${encodeURIComponent(cutId)}/current`), { method: "PUT", body: { version: Number(a.version) } }, deps);
14916
15316
  const lines = [
14917
- `\uCEF7 ${cutId} \uC758 \uB300\uD45C\uB97C v${out4.current_version} \uC73C\uB85C \uBC14\uAFE8\uC2B5\uB2C8\uB2E4(0\uC6D0, \uB80C\uB354 \uC5C6\uC74C).`,
15317
+ `\uCEF7 ${cutId} \uC5D0\uC11C v${out4.current_version} \uC744 \uC120\uD0DD\uD588\uC2B5\uB2C8\uB2E4(0\uC6D0, \uB80C\uB354 \uC5C6\uC74C).`,
14918
15318
  "\uC774 \uCEF7\uC774 \uC21C\uC11C\uC5D0 \uC788\uC73C\uBA74 \uB2E4\uC74C \uC644\uC131\uBCF8(democut_make_export)\uC774 \uC774 \uBC84\uC804\uC744 \uC774\uC5B4 \uBD99\uC785\uB2C8\uB2E4."
14919
15319
  ];
14920
15320
  return { text: lines.join("\n"), structured: callableStructured(out4) };
@@ -14971,7 +15371,7 @@ function createFolder(a = {}, deps = {}) {
14971
15371
  }
14972
15372
  function characterLine(c) {
14973
15373
  const photos = c.photos?.length ? `\uC0AC\uC9C4 ${c.photos.length}\uC7A5` : "\uC0AC\uC9C4 \uC5C6\uC74C";
14974
- return `${c.name} [${c.id}] rev=${c.rev} \xB7 ${photos}${c.current_photo_id ? " (\uB300\uD45C \uC788\uC74C)" : ""}`;
15374
+ return `${c.name} [${c.id}] rev=${c.rev} \xB7 ${photos}${c.current_photo_id ? " (\uC120\uD0DD\uB428)" : ""}`;
14975
15375
  }
14976
15376
  function listCharacters(_a3 = {}, deps = {}) {
14977
15377
  return guarded(READ_ONLY, async () => {
@@ -15022,7 +15422,7 @@ function getCharacter(a = {}, deps = {}) {
15022
15422
  const lines = [characterLine(out4)];
15023
15423
  if (out4.voice_id) lines.push(` \uBCF4\uC774\uC2A4: ${out4.voice_id}`);
15024
15424
  for (const p of out4.photos ?? []) {
15025
- lines.push(` \uC0AC\uC9C4 ${p.seq}: ${p.asset_id} (${p.source})${p.id === out4.current_photo_id ? " \u2190 \uB300\uD45C" : ""}`);
15425
+ lines.push(` \uC0AC\uC9C4 ${p.seq}: ${p.asset_id} (${p.source})${p.id === out4.current_photo_id ? " \u2190 \uC120\uD0DD\uB428" : ""}`);
15026
15426
  }
15027
15427
  return { text: lines.join("\n"), structured: callableStructured(out4) };
15028
15428
  });
@@ -15196,7 +15596,7 @@ function makeCharacterPhoto(a = {}, deps = {}) {
15196
15596
  text: [
15197
15597
  `\uC544\uBC14\uD0C0 \uC0AC\uC9C4\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
15198
15598
  `\uCCAD\uAD6C ${krw(total)} \u2014 \uC0C1\uD55C\uC785\uB2C8\uB2E4. \uC2E4\uC81C \uC0AC\uC6A9\uB7C9\uC774 \uC801\uC73C\uBA74 \uCC28\uC561\uC744 \uC790\uB3D9\uC73C\uB85C \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4.`,
15199
- "democut_wait_jobs \uB85C \uB05D\uB098\uBA74 democut_get_character \uC758 photos \uC5D0 \uC0C8 \uC0AC\uC9C4\uC774 \uC0DD\uAE30\uACE0 \uB300\uD45C\uAC00 \uB429\uB2C8\uB2E4. \uCE90\uB9AD\uD130 \uC2DC\uD2B8\uB3C4 \uD568\uAED8 \uB9CC\uB4E4\uC5B4 \uADF8 \uC0AC\uC9C4\uC758 sheet_asset_id \uC5D0 \uBD99\uC785\uB2C8\uB2E4(\uC2DC\uD2B8\uB9CC \uC2E4\uD328\uD558\uBA74 \uC0AC\uC9C4\uC740 \uB4E4\uC5B4\uC624\uACE0 \uC2DC\uD2B8 \uBAAB\uC740 \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4 \u2014 \uC7A1 \uACB0\uACFC\uC758 sheet_skipped)."
15599
+ "democut_wait_jobs \uB85C \uB05D\uB098\uBA74 democut_get_character \uC758 photos \uC5D0 \uC0C8 \uC0AC\uC9C4\uC774 \uC0DD\uAE30\uACE0 \uC120\uD0DD\uB429\uB2C8\uB2E4. \uCE90\uB9AD\uD130 \uC2DC\uD2B8\uB3C4 \uD568\uAED8 \uB9CC\uB4E4\uC5B4 \uADF8 \uC0AC\uC9C4\uC758 sheet_asset_id \uC5D0 \uBD99\uC785\uB2C8\uB2E4(\uC2DC\uD2B8\uB9CC \uC2E4\uD328\uD558\uBA74 \uC0AC\uC9C4\uC740 \uB4E4\uC5B4\uC624\uACE0 \uC2DC\uD2B8 \uBAAB\uC740 \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4 \u2014 \uC7A1 \uACB0\uACFC\uC758 sheet_skipped)."
15200
15600
  ].join("\n"),
15201
15601
  structured: callableStructured(out4)
15202
15602
  };
@@ -15221,7 +15621,7 @@ function selectCharacterPhoto(a = {}, deps = {}) {
15221
15621
  deps
15222
15622
  );
15223
15623
  return {
15224
- text: `\uB300\uD45C \uC0AC\uC9C4\uC744 \uBC14\uAFE8\uC2B5\uB2C8\uB2E4: ${characterLine(out4)} \u2014 \uC774\uBBF8 \uB9CC\uB4E0 \uCEF7\uC740 \uADF8\uB300\uB85C\uC785\uB2C8\uB2E4.`,
15624
+ text: `\uC120\uD0DD\uB41C \uC0AC\uC9C4\uC744 \uBC14\uAFE8\uC2B5\uB2C8\uB2E4: ${characterLine(out4)} \u2014 \uC774\uBBF8 \uB9CC\uB4E0 \uCEF7\uC740 \uADF8\uB300\uB85C\uC785\uB2C8\uB2E4.`,
15225
15625
  structured: callableStructured(out4)
15226
15626
  };
15227
15627
  });
@@ -15405,7 +15805,7 @@ function makeExport(a = {}, deps = {}) {
15405
15805
  );
15406
15806
  const lines = [
15407
15807
  `\uC644\uC131\uBCF8\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id} (${krw(out4.quote?.total_krw ?? 0)})`,
15408
- "\uC21C\uC11C\uC5D0 \uB193\uC778 \uCEF7\uC758 \uB300\uD45C \uBC84\uC804\uC744 \uADF8 \uC21C\uC11C\uB300\uB85C \uC774\uC5B4 \uBD99\uC774\uACE0 \uC55E\uB4A4 \uC790\uB974\uAE30\xB7\uBB34\uC74C \uC790\uB974\uAE30\uC640 \uC790\uB9C9\uC744 \uC785\uD799\uB2C8\uB2E4(\uC21C\uC11C\uC5D0\uC11C \uBE80 \uCEF7\uC740 \uC81C\uC678).",
15808
+ "\uC21C\uC11C\uC5D0 \uB193\uC778 \uCEF7\uC758 \uC120\uD0DD\uB41C \uBC84\uC804\uC744 \uADF8 \uC21C\uC11C\uB300\uB85C \uC774\uC5B4 \uBD99\uC774\uACE0 \uC55E\uB4A4 \uC790\uB974\uAE30\xB7\uBB34\uC74C \uC790\uB974\uAE30\uC640 \uC790\uB9C9\uC744 \uC785\uD799\uB2C8\uB2E4(\uC21C\uC11C\uC5D0\uC11C \uBE80 \uCEF7\uC740 \uC81C\uC678).",
15409
15809
  "\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."
15410
15810
  ];
15411
15811
  return { text: lines.join("\n"), structured: callableStructured(out4) };
@@ -15527,9 +15927,9 @@ function getExport(a = {}, deps = {}) {
15527
15927
  const thumbs = out4.thumbnails ?? [];
15528
15928
  if (thumbs.length > 0) {
15529
15929
  lines.push(
15530
- `\uC378\uB124\uC77C \uD6C4\uBCF4 ${thumbs.length}\uC7A5 \u2014 \uB300\uD45C ${out4.selected_thumbnail_id ?? "(\uC5C6\uC74C)"}: ` + thumbs.map((t) => `${t.asset_id}${t.asset_id === out4.selected_thumbnail_id ? "\u2605" : ""}${t.url ? ` ${t.url}` : ""}`).join(" \xB7 ")
15930
+ `\uC378\uB124\uC77C \uD6C4\uBCF4 ${thumbs.length}\uC7A5 \u2014 \uC120\uD0DD\uB428 ${out4.selected_thumbnail_id ?? "(\uC5C6\uC74C)"}: ` + thumbs.map((t) => `${t.asset_id}${t.asset_id === out4.selected_thumbnail_id ? "\u2605" : ""}${t.url ? ` ${t.url}` : ""}`).join(" \xB7 ")
15531
15931
  );
15532
- lines.push("\uB300\uD45C\uB97C \uBC14\uAFB8\uB824\uBA74 democut_select_thumbnail(asset_id).");
15932
+ lines.push("\uC120\uD0DD\uC744 \uBC14\uAFB8\uB824\uBA74 democut_select_thumbnail(asset_id).");
15533
15933
  } else {
15534
15934
  lines.push("\uC378\uB124\uC77C\uC740 \uC544\uC9C1 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 democut_make_thumbnails(\uC2A4\uD0C0\uC77C \uACE8\uB77C \uCCAD\uAD6C, \uBE44\uC6B0\uBA74 3\uC7A5) \uB610\uB294 democut_upload_asset \uB4A4 democut_select_thumbnail.");
15535
15935
  }
@@ -15581,7 +15981,7 @@ function makeThumbnails(a = {}, deps = {}) {
15581
15981
  const lines = [
15582
15982
  `\uC644\uC131\uBCF8 #${number3} \uC758 \uC378\uB124\uC77C ${count}\uC7A5\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id} (${krw(out4.quote?.total_krw ?? 0)}, \uC794\uC561\uC5D0\uC11C \uCC28\uAC10\uB410\uC2B5\uB2C8\uB2E4)`,
15583
15983
  `\uC644\uC131\uBCF8 \uC601\uC0C1\uC758 \uD55C \uC7A5\uBA74\uC744 \uC694\uC57D\uD574 ${a.styles ? `\uACE0\uB978 \uC2A4\uD0C0\uC77C(${a.styles.join(", ")})` : "\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.`,
15584
- "\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."
15984
+ "\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 \uC120\uD0DD\uB429\uB2C8\uB2E4. \uBC14\uAFB8\uB824\uBA74 democut_select_thumbnail."
15585
15985
  ];
15586
15986
  return { text: lines.join("\n"), structured: callableStructured(out4) };
15587
15987
  });
@@ -15607,7 +16007,7 @@ function selectThumbnail(a = {}, deps = {}) {
15607
16007
  );
15608
16008
  const thumbs = out4.thumbnails ?? [];
15609
16009
  const chosen = thumbs.find((t) => t.asset_id === out4.selected_thumbnail_id);
15610
- const lines = [`\uC644\uC131\uBCF8 #${out4.number} \uC758 \uB300\uD45C \uC378\uB124\uC77C\uC744 ${out4.selected_thumbnail_id} \uB85C \uACE8\uB790\uC2B5\uB2C8\uB2E4(\uD6C4\uBCF4 ${thumbs.length}\uC7A5).`];
16010
+ const lines = [`\uC644\uC131\uBCF8 #${out4.number} \uC758 \uC378\uB124\uC77C\uC744 ${out4.selected_thumbnail_id} \uB85C \uACE8\uB790\uC2B5\uB2C8\uB2E4(\uD6C4\uBCF4 ${thumbs.length}\uC7A5).`];
15611
16011
  if (chosen?.url) lines.push(`\uBBF8\uB9AC\uBCF4\uAE30: ${chosen.url} (1\uC2DC\uAC04 \uC720\uD6A8)`);
15612
16012
  return { text: lines.join("\n"), structured: callableStructured(out4) };
15613
16013
  });
@@ -15622,7 +16022,7 @@ function deleteThumbnail(a = {}, deps = {}) {
15622
16022
  if (!assetId) return { isError: true, text: "asset_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4 \u2014 democut_get_export \uC758 thumbnails \uC5D0\uC11C \uACE0\uB974\uC138\uC694." };
15623
16023
  const base = resolveBaseUrl(deps.baseUrl);
15624
16024
  const out4 = await apiRequest(base, projectPath(slug, `/exports/${number3}/thumbnails/${encodeURIComponent(assetId)}`), { method: "DELETE" }, deps);
15625
- const tail = out4.selected_thumbnail_id ? `\uB300\uD45C\uB294 ${out4.selected_thumbnail_id} \uC785\uB2C8\uB2E4.` : "\uB300\uD45C\uAC00 \uBE44\uC5C8\uC2B5\uB2C8\uB2E4 \u2014 democut_select_thumbnail \uB85C \uB2E4\uC2DC \uACE0\uB974\uC138\uC694.";
16025
+ const tail = out4.selected_thumbnail_id ? `\uC120\uD0DD\uB41C \uC378\uB124\uC77C\uC740 ${out4.selected_thumbnail_id} \uC785\uB2C8\uB2E4.` : "\uC120\uD0DD\uC774 \uBE44\uC5C8\uC2B5\uB2C8\uB2E4 \u2014 democut_select_thumbnail \uB85C \uB2E4\uC2DC \uACE0\uB974\uC138\uC694.";
15626
16026
  return {
15627
16027
  text: `\uC644\uC131\uBCF8 #${number3} \uC5D0\uC11C \uC378\uB124\uC77C ${assetId} \uB97C \uBE90\uC2B5\uB2C8\uB2E4(\uB0A8\uC740 \uD6C4\uBCF4 ${out4.thumbnails?.length ?? 0}\uC7A5). ${tail}`,
15628
16028
  structured: callableStructured(out4)
@@ -15674,7 +16074,7 @@ function publishYoutube(a = {}, deps = {}) {
15674
16074
  const out4 = await apiRequest(base, projectPath(slug, `/exports/${number3}/publish`), { method: "POST", body: { privacy } }, deps);
15675
16075
  const lines = [
15676
16076
  `\uC644\uC131\uBCF8 #${number3} \uC744 \uC720\uD29C\uBE0C\uC5D0 \uC62C\uB9AC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id} (0\uC6D0, \uACF5\uAC1C \uBC94\uC704 ${privacy})`,
15677
- "\uC81C\uBAA9\xB7\uC124\uBA85\xB7\uD0DC\uADF8\uB294 \uC644\uC131\uBCF8\uC758 youtube_meta \uB97C, \uC378\uB124\uC77C\uC740 \uB300\uD45C \uC378\uB124\uC77C\uC744 \uC501\uB2C8\uB2E4(\uCC44\uB110 \uC778\uC99D\uC774 \uC5C6\uC73C\uBA74 \uC601\uC0C1\uB9CC \uC62C\uB77C\uAC11\uB2C8\uB2E4). \uB04A\uACA8\uB3C4 \uAC19\uC740 \uC138\uC158\uC73C\uB85C \uC774\uC5B4 \uC62C\uB9BD\uB2C8\uB2E4.",
16077
+ "\uC81C\uBAA9\xB7\uC124\uBA85\xB7\uD0DC\uADF8\uB294 \uC644\uC131\uBCF8\uC758 youtube_meta \uB97C, \uC378\uB124\uC77C\uC740 \uC378\uB124\uC77C\uC744 \uC501\uB2C8\uB2E4(\uCC44\uB110 \uC778\uC99D\uC774 \uC5C6\uC73C\uBA74 \uC601\uC0C1\uB9CC \uC62C\uB77C\uAC11\uB2C8\uB2E4). \uB04A\uACA8\uB3C4 \uAC19\uC740 \uC138\uC158\uC73C\uB85C \uC774\uC5B4 \uC62C\uB9BD\uB2C8\uB2E4.",
15678
16078
  "\uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs \uB85C \uAE30\uB2E4\uB9B0 \uB4A4 democut_get_export \uB97C \uBCF4\uBA74 youtube \uC5D0 \uC8FC\uC18C(url)\uAC00 \uC2E4\uB9BD\uB2C8\uB2E4. \uAC19\uC740 \uC644\uC131\uBCF8\uC744 \uB2E4\uC2DC \uC62C\uB9AC\uC9C0 \uB9C8\uC138\uC694(\uB450 \uD3B8\uC774 \uB429\uB2C8\uB2E4)."
15679
16079
  ];
15680
16080
  return { text: lines.join("\n"), structured: callableStructured(out4) };
@@ -15762,6 +16162,14 @@ function dispatch(name, args, deps = {}) {
15762
16162
  return putCutDraft(args, deps);
15763
16163
  case "democut_set_cut_edit":
15764
16164
  return setCutEdit(args, deps);
16165
+ case "democut_list_music":
16166
+ return listMusic(args, deps);
16167
+ case "democut_add_music":
16168
+ return addMusic(args, deps);
16169
+ case "democut_remove_music":
16170
+ return removeMusic(args, deps);
16171
+ case "democut_set_cut_bgm":
16172
+ return setCutBgm(args, deps);
15765
16173
  case "democut_set_cut_title":
15766
16174
  return setCutTitle(args, deps);
15767
16175
  case "democut_duplicate_cut":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "democut",
3
- "version": "1.0.83",
3
+ "version": "1.0.86",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",