democut 1.0.85 → 1.0.87

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 +293 -33
  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.85";
6919
+ var VERSION = "1.0.87";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -8253,6 +8253,7 @@ var GENERATED_TOOLS = [
8253
8253
  "draft_spec": {},
8254
8254
  "edit": {},
8255
8255
  "bgm": {},
8256
+ "bgm_resolved": {},
8256
8257
  "current_version": {},
8257
8258
  "current_image_id": {},
8258
8259
  "images": {
@@ -8639,6 +8640,7 @@ var GENERATED_TOOLS = [
8639
8640
  "draft_spec": {},
8640
8641
  "edit": {},
8641
8642
  "bgm": {},
8643
+ "bgm_resolved": {},
8642
8644
  "current_version": {},
8643
8645
  "current_image_id": {},
8644
8646
  "images": {
@@ -8751,6 +8753,7 @@ var GENERATED_TOOLS = [
8751
8753
  "draft_spec": {},
8752
8754
  "edit": {},
8753
8755
  "bgm": {},
8756
+ "bgm_resolved": {},
8754
8757
  "current_version": {},
8755
8758
  "current_image_id": {},
8756
8759
  "images": {
@@ -9643,7 +9646,7 @@ var GENERATED_TOOLS = [
9643
9646
  },
9644
9647
  {
9645
9648
  "name": "democut_select_character_photo",
9646
- "description": "\uB300\uD45C \uC0AC\uC9C4\uC744 \uACE0\uB978\uB2E4(\uC774\uBBF8 \uB9CC\uB4E0 \uCEF7\uC5D0\uB294 \uC18C\uAE09\uD558\uC9C0 \uC54A\uB294\uB2E4).",
9649
+ "description": "\uC0AC\uC9C4\uC744 \uC120\uD0DD\uD55C\uB2E4(\uC774\uBBF8 \uB9CC\uB4E0 \uCEF7\uC5D0\uB294 \uC18C\uAE09\uD558\uC9C0 \uC54A\uB294\uB2E4).",
9647
9650
  "inputSchema": {
9648
9651
  "type": "object",
9649
9652
  "properties": {
@@ -9806,7 +9809,7 @@ var GENERATED_TOOLS = [
9806
9809
  },
9807
9810
  {
9808
9811
  "name": "democut_make_character_photo",
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 \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.",
9812
+ "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.",
9810
9813
  "inputSchema": {
9811
9814
  "type": "object",
9812
9815
  "properties": {
@@ -10310,6 +10313,7 @@ var GENERATED_TOOLS = [
10310
10313
  "draft_spec": {},
10311
10314
  "edit": {},
10312
10315
  "bgm": {},
10316
+ "bgm_resolved": {},
10313
10317
  "current_version": {},
10314
10318
  "current_image_id": {},
10315
10319
  "images": {
@@ -10410,6 +10414,7 @@ var GENERATED_TOOLS = [
10410
10414
  "draft_spec": {},
10411
10415
  "edit": {},
10412
10416
  "bgm": {},
10417
+ "bgm_resolved": {},
10413
10418
  "current_version": {},
10414
10419
  "current_image_id": {},
10415
10420
  "images": {
@@ -10557,6 +10562,7 @@ var GENERATED_TOOLS = [
10557
10562
  "draft_spec": {},
10558
10563
  "edit": {},
10559
10564
  "bgm": {},
10565
+ "bgm_resolved": {},
10560
10566
  "current_version": {},
10561
10567
  "current_image_id": {},
10562
10568
  "images": {
@@ -10662,6 +10668,7 @@ var GENERATED_TOOLS = [
10662
10668
  "draft_spec": {},
10663
10669
  "edit": {},
10664
10670
  "bgm": {},
10671
+ "bgm_resolved": {},
10665
10672
  "current_version": {},
10666
10673
  "current_image_id": {},
10667
10674
  "images": {
@@ -10767,6 +10774,7 @@ var GENERATED_TOOLS = [
10767
10774
  "draft_spec": {},
10768
10775
  "edit": {},
10769
10776
  "bgm": {},
10777
+ "bgm_resolved": {},
10770
10778
  "current_version": {},
10771
10779
  "current_image_id": {},
10772
10780
  "images": {
@@ -10875,6 +10883,7 @@ var GENERATED_TOOLS = [
10875
10883
  "draft_spec": {},
10876
10884
  "edit": {},
10877
10885
  "bgm": {},
10886
+ "bgm_resolved": {},
10878
10887
  "current_version": {},
10879
10888
  "current_image_id": {},
10880
10889
  "images": {
@@ -10928,6 +10937,144 @@ var GENERATED_TOOLS = [
10928
10937
  "openWorldHint": false
10929
10938
  }
10930
10939
  },
10940
+ {
10941
+ "name": "democut_list_music",
10942
+ "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.",
10943
+ "inputSchema": {
10944
+ "type": "object",
10945
+ "properties": {
10946
+ "slug": {
10947
+ "type": "string",
10948
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
10949
+ }
10950
+ },
10951
+ "required": [
10952
+ "slug"
10953
+ ],
10954
+ "additionalProperties": false
10955
+ },
10956
+ "outputSchema": {
10957
+ "type": "object",
10958
+ "properties": {
10959
+ "music": {
10960
+ "type": "array"
10961
+ }
10962
+ },
10963
+ "required": [
10964
+ "music"
10965
+ ]
10966
+ },
10967
+ "annotations": {
10968
+ "readOnlyHint": true,
10969
+ "destructiveHint": false,
10970
+ "idempotentHint": true,
10971
+ "openWorldHint": false
10972
+ }
10973
+ },
10974
+ {
10975
+ "name": "democut_add_music",
10976
+ "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.",
10977
+ "inputSchema": {
10978
+ "type": "object",
10979
+ "properties": {
10980
+ "slug": {
10981
+ "type": "string",
10982
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
10983
+ },
10984
+ "asset_id": {
10985
+ "description": "upload_asset(kind=audio)\uAC00 \uC900 \uC790\uC0B0 id",
10986
+ "minLength": 1,
10987
+ "type": "string"
10988
+ },
10989
+ "title": {
10990
+ "default": "",
10991
+ "description": "\uACE1\uC758 \uC774\uB984(\uC120\uD0DD). \uC0AC\uB78C\uC774 \uACE1\uC744 \uAD6C\uBCC4\uD558\uB294 \uB370\uB9CC \uC4F4\uB2E4",
10992
+ "maxLength": 100,
10993
+ "type": "string"
10994
+ }
10995
+ },
10996
+ "required": [
10997
+ "slug",
10998
+ "asset_id"
10999
+ ],
11000
+ "additionalProperties": false
11001
+ },
11002
+ "outputSchema": {
11003
+ "type": "object",
11004
+ "properties": {
11005
+ "asset_id": {
11006
+ "type": "string"
11007
+ },
11008
+ "title": {
11009
+ "type": "string"
11010
+ },
11011
+ "duration_ms": {},
11012
+ "peaks": {
11013
+ "type": "array"
11014
+ },
11015
+ "url": {},
11016
+ "used_by": {
11017
+ "type": "array"
11018
+ }
11019
+ },
11020
+ "required": [
11021
+ "asset_id"
11022
+ ]
11023
+ },
11024
+ "annotations": {
11025
+ "readOnlyHint": false,
11026
+ "destructiveHint": false,
11027
+ "idempotentHint": false,
11028
+ "openWorldHint": false
11029
+ }
11030
+ },
11031
+ {
11032
+ "name": "democut_remove_music",
11033
+ "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.",
11034
+ "inputSchema": {
11035
+ "type": "object",
11036
+ "properties": {
11037
+ "slug": {
11038
+ "type": "string",
11039
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
11040
+ },
11041
+ "asset_id": {
11042
+ "type": "string",
11043
+ "description": "\uC790\uC0B0 id(ast_\u2026)"
11044
+ },
11045
+ "force": {
11046
+ "default": false,
11047
+ "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",
11048
+ "type": "boolean"
11049
+ }
11050
+ },
11051
+ "required": [
11052
+ "slug",
11053
+ "asset_id"
11054
+ ],
11055
+ "additionalProperties": false
11056
+ },
11057
+ "outputSchema": {
11058
+ "type": "object",
11059
+ "properties": {
11060
+ "deleted": {
11061
+ "type": "boolean"
11062
+ },
11063
+ "cleared_cut_ids": {
11064
+ "type": "array"
11065
+ },
11066
+ "asset_deleted": {
11067
+ "type": "boolean"
11068
+ }
11069
+ }
11070
+ },
11071
+ "annotations": {
11072
+ "readOnlyHint": false,
11073
+ "destructiveHint": true,
11074
+ "idempotentHint": true,
11075
+ "openWorldHint": false
11076
+ }
11077
+ },
10931
11078
  {
10932
11079
  "name": "democut_reorder_cuts",
10933
11080
  "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.",
@@ -11192,7 +11339,7 @@ var GENERATED_TOOLS = [
11192
11339
  },
11193
11340
  {
11194
11341
  "name": "democut_get_silence",
11195
- "description": "\uB300\uD45C \uBC84\uC804\uC758 \uBB34\uC74C \uAD6C\uAC04 \uBBF8\uB9AC\uBCF4\uAE30(threshold_ms).",
11342
+ "description": "\uC120\uD0DD\uB41C \uBC84\uC804\uC758 \uBB34\uC74C \uAD6C\uAC04 \uBBF8\uB9AC\uBCF4\uAE30(threshold_ms).",
11196
11343
  "inputSchema": {
11197
11344
  "type": "object",
11198
11345
  "properties": {
@@ -11245,7 +11392,7 @@ var GENERATED_TOOLS = [
11245
11392
  },
11246
11393
  {
11247
11394
  "name": "democut_download_project",
11248
- "description": "\uD504\uB85C\uC81D\uD2B8 \uC804\uCCB4(\uB300\uD45C \uBC84\uC804 \uC0B0\uCD9C\uBB3C) zip \uC11C\uBA85 URL.",
11395
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC804\uCCB4(\uC120\uD0DD\uB41C \uBC84\uC804 \uC0B0\uCD9C\uBB3C) zip \uC11C\uBA85 URL.",
11249
11396
  "inputSchema": {
11250
11397
  "type": "object",
11251
11398
  "properties": {
@@ -11473,6 +11620,7 @@ var GENERATED_TOOLS = [
11473
11620
  "draft_spec": {},
11474
11621
  "edit": {},
11475
11622
  "bgm": {},
11623
+ "bgm_resolved": {},
11476
11624
  "current_version": {},
11477
11625
  "current_image_id": {},
11478
11626
  "images": {
@@ -12011,7 +12159,7 @@ var GENERATED_TOOLS = [
12011
12159
  },
12012
12160
  {
12013
12161
  "name": "democut_delete_thumbnail",
12014
- "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.",
12162
+ "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.",
12015
12163
  "inputSchema": {
12016
12164
  "type": "object",
12017
12165
  "properties": {
@@ -12514,7 +12662,7 @@ var GENERATED_TOOLS = [
12514
12662
  },
12515
12663
  {
12516
12664
  "name": "democut_select_cut_version",
12517
- "description": "\uB300\uD45C \uBC84\uC804\uC744 \uBC14\uAFBC\uB2E4(0\uC6D0). draft_spec \uC740 \uADF8\uB300\uB85C\uB2E4.",
12665
+ "description": "\uC120\uD0DD\uB41C \uBC84\uC804\uC744 \uBC14\uAFBC\uB2E4(0\uC6D0). draft_spec \uC740 \uADF8\uB300\uB85C\uB2E4.",
12518
12666
  "inputSchema": {
12519
12667
  "type": "object",
12520
12668
  "properties": {
@@ -12564,6 +12712,7 @@ var GENERATED_TOOLS = [
12564
12712
  "draft_spec": {},
12565
12713
  "edit": {},
12566
12714
  "bgm": {},
12715
+ "bgm_resolved": {},
12567
12716
  "current_version": {},
12568
12717
  "current_image_id": {},
12569
12718
  "images": {
@@ -12619,7 +12768,7 @@ var GENERATED_TOOLS = [
12619
12768
  },
12620
12769
  {
12621
12770
  "name": "democut_delete_cut_version",
12622
- "description": "\uBC84\uC804 \uD558\uB098\uB97C \uC9C0\uC6B4\uB2E4(\uB300\uD45C\uBA74 \uB2E4\uB978 \uBC84\uC804\uC73C\uB85C \uC62E\uAE34 \uB4A4).",
12771
+ "description": "\uBC84\uC804 \uD558\uB098\uB97C \uC9C0\uC6B4\uB2E4(\uC120\uD0DD\uB3FC \uC788\uC73C\uBA74 \uB2E4\uB978 \uBC84\uC804\uC73C\uB85C \uC62E\uAE34 \uB4A4).",
12623
12772
  "inputSchema": {
12624
12773
  "type": "object",
12625
12774
  "properties": {
@@ -13006,6 +13155,24 @@ var TOOL_META = {
13006
13155
  "method": "PUT",
13007
13156
  "path": "/api/projects/{slug}/cuts/{cut_id}/bgm"
13008
13157
  },
13158
+ "democut_list_music": {
13159
+ "cost": "none",
13160
+ "group": "storyboard",
13161
+ "method": "GET",
13162
+ "path": "/api/projects/{slug}/music"
13163
+ },
13164
+ "democut_add_music": {
13165
+ "cost": "none",
13166
+ "group": "storyboard",
13167
+ "method": "POST",
13168
+ "path": "/api/projects/{slug}/music"
13169
+ },
13170
+ "democut_remove_music": {
13171
+ "cost": "none",
13172
+ "group": "storyboard",
13173
+ "method": "DELETE",
13174
+ "path": "/api/projects/{slug}/music/{asset_id}"
13175
+ },
13009
13176
  "democut_reorder_cuts": {
13010
13177
  "cost": "none",
13011
13178
  "group": "storyboard",
@@ -14213,7 +14380,7 @@ function makeCutImage(a = {}, deps = {}) {
14213
14380
  `\uCEF7 \uC774\uBBF8\uC9C0\uB97C \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
14214
14381
  // ★★ 상한임을 제출 자리에서도 말한다 — 견적을 건너뛴 호출자는 이 문장만 본다.
14215
14382
  `\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.`,
14216
- "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."
14383
+ "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."
14217
14384
  ].join("\n"),
14218
14385
  structured: callableStructured(out4)
14219
14386
  };
@@ -14223,7 +14390,7 @@ function cutImageLine(cut) {
14223
14390
  const n = cut.images?.length ?? 0;
14224
14391
  const firstFrame = (cut.mode ?? "ai_video") === "ai_video";
14225
14392
  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)." : "."}`;
14226
- let cover = cut.current_image_id ? `\uB300\uD45C ${cut.current_image_id}` : "\uB300\uD45C \uC5C6\uC74C";
14393
+ let cover = cut.current_image_id ? `\uC120\uD0DD\uB41C \uC774\uBBF8\uC9C0 ${cut.current_image_id}` : "\uC120\uD0DD\uB41C \uC774\uBBF8\uC9C0 \uC5C6\uC74C";
14227
14394
  if (cut.current_image_id) {
14228
14395
  const current = cut.images?.find((i) => i.id === cut.current_image_id);
14229
14396
  if (current?.model) cover += ` (${current.model}${current.quality ? ` \xB7 ${current.quality}` : ""})`;
@@ -14264,7 +14431,7 @@ function setCutImage(a = {}, deps = {}) {
14264
14431
  );
14265
14432
  const added = out4.images?.[out4.images.length - 1];
14266
14433
  const first = added && out4.current_image_id === added.id && (out4.images?.length ?? 0) === 1;
14267
- 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) };
14434
+ 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) };
14268
14435
  });
14269
14436
  }
14270
14437
  function selectCutImage(a = {}, deps = {}) {
@@ -14289,7 +14456,7 @@ function selectCutImage(a = {}, deps = {}) {
14289
14456
  { method: "PUT", body: { image_id: imageId } },
14290
14457
  deps
14291
14458
  );
14292
- 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.";
14459
+ 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.";
14293
14460
  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." : "";
14294
14461
  return { text: `${head} ${cutImageLine(out4)}${draft} \uC774\uBBF8 \uB9CC\uB4E0 \uBC84\uC804\uC740 \uADF8\uB300\uB85C\uC785\uB2C8\uB2E4.`, structured: callableStructured(out4) };
14295
14462
  });
@@ -14487,7 +14654,7 @@ function listCuts(a = {}, deps = {}) {
14487
14654
  structured: callableStructured(out4)
14488
14655
  };
14489
14656
  }
14490
- 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`];
14657
+ 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`];
14491
14658
  lines.push(...listing(cuts.map(cutLine)));
14492
14659
  lines.push(callableToolNames("\uC0C1\uC138\xB7\uBC84\uC804\xB7\uB0B4\uB824\uBC1B\uAE30 \uC8FC\uC18C\uB294 get_cut, \uC21C\uC11C\xB7rev \uB294 get_storyboard."));
14493
14660
  return { text: lines.join("\n"), structured: callableStructured(out4) };
@@ -14525,7 +14692,7 @@ function getStoryboard(a = {}, deps = {}) {
14525
14692
  function cutLine(cut) {
14526
14693
  const bits = [`${cut.id} [${cut.state}] ${cut.mode}`];
14527
14694
  if (cut.title) bits.push(`\u300C${cut.title}\u300D`);
14528
- if (cut.current_version != null) bits.push(`\uB300\uD45C v${cut.current_version}`);
14695
+ if (cut.current_version != null) bits.push(`v${cut.current_version} \xB7 \uC120\uD0DD\uB428`);
14529
14696
  if (cut.dirty_fields?.length) bits.push(`\uB2EC\uB77C\uC9C4 \uD544\uB4DC: ${cut.dirty_fields.join(", ")}`);
14530
14697
  if (cut.estimated_cost_krw != null) bits.push(`\uC608\uC0C1 ${krw(cut.estimated_cost_krw)}`);
14531
14698
  if (cut.blocked_reason) bits.push(`\uB9C9\uD798: ${callableToolNames(cut.blocked_reason)}`);
@@ -14781,18 +14948,105 @@ function setCutBgm(a = {}, deps = {}) {
14781
14948
  deps
14782
14949
  );
14783
14950
  } catch (e) {
14784
- if (e instanceof ApiError && e.status === 404 && e.code === `HTTP_404`) {
14785
- return {
14786
- isError: true,
14787
- text: "\uC774 \uC11C\uBC84\uC5D0\uB294 \uC544\uC9C1 \uBC30\uACBD\uC74C\uC545 \uC9C0\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 CLI \uAC00 \uC11C\uBC84\uBCF4\uB2E4 \uBA3C\uC800 \uC62C\uB77C\uAC00 \uC0DD\uAE30\uB294 \uC77C\uC2DC\uC801\uC778 \uCC28\uC774\uC785\uB2C8\uB2E4.\n\uC2AC\uB7EC\uADF8\xB7\uCEF7\xB7\uACE1\uC740 \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."
14788
- };
14789
- }
14951
+ const notYet = routeNotDeployed(e, "\uBC30\uACBD\uC74C\uC545 \uC9C0\uC815\uC774", "\uC2AC\uB7EC\uADF8\xB7\uCEF7\xB7\uACE1\uC740");
14952
+ if (notYet) return notYet;
14790
14953
  throw e;
14791
14954
  }
14792
14955
  const note = cut.bgm != null ? BGM_NOTE : BGM_CLEARED_NOTE;
14793
14956
  return { text: [cutLine(cut), note].join("\n"), structured: callableStructured(cut) };
14794
14957
  });
14795
14958
  }
14959
+ function routeNotDeployed(e, what, values) {
14960
+ if (!(e instanceof ApiError) || e.status !== 404 || e.code !== `HTTP_404`) return null;
14961
+ return {
14962
+ isError: true,
14963
+ 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.
14964
+ ${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.`
14965
+ };
14966
+ }
14967
+ async function musicRequest(run2) {
14968
+ try {
14969
+ return await run2();
14970
+ } catch (e) {
14971
+ const notYet = routeNotDeployed(e, "\uACE1 \uBAA9\uB85D \uAE30\uB2A5\uC774", "\uC2AC\uB7EC\uADF8\uC640 \uACE1\uC740");
14972
+ if (notYet) return notYet;
14973
+ throw e;
14974
+ }
14975
+ }
14976
+ var isToolResult = (v) => typeof v === "object" && v !== null && "isError" in v && "text" in v;
14977
+ function musicLine(m) {
14978
+ const seconds = m.duration_ms ? `${(m.duration_ms / 1e3).toFixed(1)}\uCD08` : "\uAE38\uC774 \uBBF8\uC815";
14979
+ const used = m.used_by && m.used_by.length ? ` \xB7 \uC4F0\uB294 \uCEF7 ${m.used_by.length}\uAC1C(${m.used_by.join(", ")})` : "";
14980
+ return `- ${m.asset_id} \u300C${m.title || "\uC774\uB984 \uC5C6\uC74C"}\u300D ${seconds}${used}`;
14981
+ }
14982
+ function slimMusic(m) {
14983
+ const { peaks: _peaks, ...rest } = m;
14984
+ return rest;
14985
+ }
14986
+ function listMusic(a = {}, deps = {}) {
14987
+ return guarded(READ_ONLY, async () => {
14988
+ const slug = needSlug(a);
14989
+ if (typeof slug !== "string") return slug;
14990
+ const base = resolveBaseUrl(deps.baseUrl);
14991
+ const out4 = await musicRequest(() => apiRequest(base, projectPath(slug, "/music"), {}, deps));
14992
+ if (isToolResult(out4)) return out4;
14993
+ const music = out4.music ?? [];
14994
+ const slim = callableStructured({ music: music.map(slimMusic) });
14995
+ if (music.length === 0) {
14996
+ return {
14997
+ text: callableToolNames(
14998
+ "\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."
14999
+ ),
15000
+ structured: slim
15001
+ };
15002
+ }
15003
+ return {
15004
+ text: callableToolNames([`\uACE1 ${music.length}\uAC1C \u2014 democut_set_cut_bgm \uC758 bgm.asset_id \uB85C \uC501\uB2C8\uB2E4.`, ...music.map(musicLine)].join("\n")),
15005
+ structured: slim
15006
+ };
15007
+ });
15008
+ }
15009
+ function addMusic(a = {}, deps = {}) {
15010
+ return guarded(READ_ONLY, async () => {
15011
+ const slug = needSlug(a);
15012
+ if (typeof slug !== "string") return slug;
15013
+ const assetId = (a.asset_id ?? "").trim();
15014
+ 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.") };
15015
+ const base = resolveBaseUrl(deps.baseUrl);
15016
+ const body = { asset_id: assetId };
15017
+ if (typeof a.title === "string") body.title = a.title;
15018
+ const out4 = await musicRequest(() => apiRequest(base, projectPath(slug, "/music"), { method: "POST", body }, deps));
15019
+ if (isToolResult(out4)) return out4;
15020
+ return {
15021
+ 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")),
15022
+ structured: callableStructured(slimMusic(out4))
15023
+ };
15024
+ });
15025
+ }
15026
+ function removeMusic(a = {}, deps = {}) {
15027
+ return guarded(READ_ONLY, async () => {
15028
+ const slug = needSlug(a);
15029
+ if (typeof slug !== "string") return slug;
15030
+ const assetId = (a.asset_id ?? "").trim();
15031
+ 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.") };
15032
+ const base = resolveBaseUrl(deps.baseUrl);
15033
+ const q = a.force === true ? "?force=true" : "";
15034
+ const out4 = await musicRequest(() => apiRequest(
15035
+ base,
15036
+ projectPath(slug, `/music/${encodeURIComponent(assetId)}${q}`),
15037
+ { method: "DELETE" },
15038
+ deps
15039
+ ));
15040
+ if (isToolResult(out4)) return out4;
15041
+ const lines = ["\uACE1\uC744 \uBAA9\uB85D\uC5D0\uC11C \uBE90\uC2B5\uB2C8\uB2E4."];
15042
+ const cleared = out4.cleared_cut_ids ?? [];
15043
+ if (cleared.length) {
15044
+ 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.`);
15045
+ }
15046
+ 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.");
15047
+ return { text: lines.join("\n"), structured: callableStructured(out4) };
15048
+ });
15049
+ }
14796
15050
  function setCutTitle(a = {}, deps = {}) {
14797
15051
  return guarded(READ_ONLY, async () => {
14798
15052
  const slug = needSlug(a);
@@ -14895,7 +15149,7 @@ function downloadProject(a = {}, deps = {}) {
14895
15149
  if (typeof slug !== "string") return slug;
14896
15150
  const base = resolveBaseUrl(deps.baseUrl);
14897
15151
  const out4 = await apiRequest(base, projectPath(slug, "/export.zip"), {}, deps);
14898
- 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.";
15152
+ 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.";
14899
15153
  if (a.output_path) {
14900
15154
  await (deps.downloadImpl ? deps.downloadImpl(out4.url, a.output_path) : saveUrlToFile(out4.url, a.output_path, deps.fetchImpl ?? fetch));
14901
15155
  return { text: `\uD504\uB85C\uC81D\uD2B8 zip \uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4: ${a.output_path}
@@ -15071,7 +15325,7 @@ function selectCutVersion(a = {}, deps = {}) {
15071
15325
  const base = resolveBaseUrl(deps.baseUrl);
15072
15326
  const out4 = await apiRequest(base, projectPath(slug, `/cuts/${encodeURIComponent(cutId)}/current`), { method: "PUT", body: { version: Number(a.version) } }, deps);
15073
15327
  const lines = [
15074
- `\uCEF7 ${cutId} \uC758 \uB300\uD45C\uB97C v${out4.current_version} \uC73C\uB85C \uBC14\uAFE8\uC2B5\uB2C8\uB2E4(0\uC6D0, \uB80C\uB354 \uC5C6\uC74C).`,
15328
+ `\uCEF7 ${cutId} \uC5D0\uC11C v${out4.current_version} \uC744 \uC120\uD0DD\uD588\uC2B5\uB2C8\uB2E4(0\uC6D0, \uB80C\uB354 \uC5C6\uC74C).`,
15075
15329
  "\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."
15076
15330
  ];
15077
15331
  return { text: lines.join("\n"), structured: callableStructured(out4) };
@@ -15128,7 +15382,7 @@ function createFolder(a = {}, deps = {}) {
15128
15382
  }
15129
15383
  function characterLine(c) {
15130
15384
  const photos = c.photos?.length ? `\uC0AC\uC9C4 ${c.photos.length}\uC7A5` : "\uC0AC\uC9C4 \uC5C6\uC74C";
15131
- return `${c.name} [${c.id}] rev=${c.rev} \xB7 ${photos}${c.current_photo_id ? " (\uB300\uD45C \uC788\uC74C)" : ""}`;
15385
+ return `${c.name} [${c.id}] rev=${c.rev} \xB7 ${photos}${c.current_photo_id ? " (\uC120\uD0DD\uB428)" : ""}`;
15132
15386
  }
15133
15387
  function listCharacters(_a3 = {}, deps = {}) {
15134
15388
  return guarded(READ_ONLY, async () => {
@@ -15179,7 +15433,7 @@ function getCharacter(a = {}, deps = {}) {
15179
15433
  const lines = [characterLine(out4)];
15180
15434
  if (out4.voice_id) lines.push(` \uBCF4\uC774\uC2A4: ${out4.voice_id}`);
15181
15435
  for (const p of out4.photos ?? []) {
15182
- lines.push(` \uC0AC\uC9C4 ${p.seq}: ${p.asset_id} (${p.source})${p.id === out4.current_photo_id ? " \u2190 \uB300\uD45C" : ""}`);
15436
+ lines.push(` \uC0AC\uC9C4 ${p.seq}: ${p.asset_id} (${p.source})${p.id === out4.current_photo_id ? " \u2190 \uC120\uD0DD\uB428" : ""}`);
15183
15437
  }
15184
15438
  return { text: lines.join("\n"), structured: callableStructured(out4) };
15185
15439
  });
@@ -15353,7 +15607,7 @@ function makeCharacterPhoto(a = {}, deps = {}) {
15353
15607
  text: [
15354
15608
  `\uC544\uBC14\uD0C0 \uC0AC\uC9C4\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
15355
15609
  `\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.`,
15356
- "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)."
15610
+ "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)."
15357
15611
  ].join("\n"),
15358
15612
  structured: callableStructured(out4)
15359
15613
  };
@@ -15378,7 +15632,7 @@ function selectCharacterPhoto(a = {}, deps = {}) {
15378
15632
  deps
15379
15633
  );
15380
15634
  return {
15381
- 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.`,
15635
+ 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.`,
15382
15636
  structured: callableStructured(out4)
15383
15637
  };
15384
15638
  });
@@ -15562,7 +15816,7 @@ function makeExport(a = {}, deps = {}) {
15562
15816
  );
15563
15817
  const lines = [
15564
15818
  `\uC644\uC131\uBCF8\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id} (${krw(out4.quote?.total_krw ?? 0)})`,
15565
- "\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).",
15819
+ "\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).",
15566
15820
  "\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."
15567
15821
  ];
15568
15822
  return { text: lines.join("\n"), structured: callableStructured(out4) };
@@ -15684,9 +15938,9 @@ function getExport(a = {}, deps = {}) {
15684
15938
  const thumbs = out4.thumbnails ?? [];
15685
15939
  if (thumbs.length > 0) {
15686
15940
  lines.push(
15687
- `\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 ")
15941
+ `\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 ")
15688
15942
  );
15689
- lines.push("\uB300\uD45C\uB97C \uBC14\uAFB8\uB824\uBA74 democut_select_thumbnail(asset_id).");
15943
+ lines.push("\uC120\uD0DD\uC744 \uBC14\uAFB8\uB824\uBA74 democut_select_thumbnail(asset_id).");
15690
15944
  } else {
15691
15945
  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.");
15692
15946
  }
@@ -15738,7 +15992,7 @@ function makeThumbnails(a = {}, deps = {}) {
15738
15992
  const lines = [
15739
15993
  `\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)`,
15740
15994
  `\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.`,
15741
- "\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."
15995
+ "\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."
15742
15996
  ];
15743
15997
  return { text: lines.join("\n"), structured: callableStructured(out4) };
15744
15998
  });
@@ -15764,7 +16018,7 @@ function selectThumbnail(a = {}, deps = {}) {
15764
16018
  );
15765
16019
  const thumbs = out4.thumbnails ?? [];
15766
16020
  const chosen = thumbs.find((t) => t.asset_id === out4.selected_thumbnail_id);
15767
- 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).`];
16021
+ 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).`];
15768
16022
  if (chosen?.url) lines.push(`\uBBF8\uB9AC\uBCF4\uAE30: ${chosen.url} (1\uC2DC\uAC04 \uC720\uD6A8)`);
15769
16023
  return { text: lines.join("\n"), structured: callableStructured(out4) };
15770
16024
  });
@@ -15779,7 +16033,7 @@ function deleteThumbnail(a = {}, deps = {}) {
15779
16033
  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." };
15780
16034
  const base = resolveBaseUrl(deps.baseUrl);
15781
16035
  const out4 = await apiRequest(base, projectPath(slug, `/exports/${number3}/thumbnails/${encodeURIComponent(assetId)}`), { method: "DELETE" }, deps);
15782
- 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.";
16036
+ 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.";
15783
16037
  return {
15784
16038
  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}`,
15785
16039
  structured: callableStructured(out4)
@@ -15831,7 +16085,7 @@ function publishYoutube(a = {}, deps = {}) {
15831
16085
  const out4 = await apiRequest(base, projectPath(slug, `/exports/${number3}/publish`), { method: "POST", body: { privacy } }, deps);
15832
16086
  const lines = [
15833
16087
  `\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})`,
15834
- "\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.",
16088
+ "\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.",
15835
16089
  "\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)."
15836
16090
  ];
15837
16091
  return { text: lines.join("\n"), structured: callableStructured(out4) };
@@ -15919,6 +16173,12 @@ function dispatch(name, args, deps = {}) {
15919
16173
  return putCutDraft(args, deps);
15920
16174
  case "democut_set_cut_edit":
15921
16175
  return setCutEdit(args, deps);
16176
+ case "democut_list_music":
16177
+ return listMusic(args, deps);
16178
+ case "democut_add_music":
16179
+ return addMusic(args, deps);
16180
+ case "democut_remove_music":
16181
+ return removeMusic(args, deps);
15922
16182
  case "democut_set_cut_bgm":
15923
16183
  return setCutBgm(args, deps);
15924
16184
  case "democut_set_cut_title":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "democut",
3
- "version": "1.0.85",
3
+ "version": "1.0.87",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",