democut 1.0.85 → 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 +282 -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.86";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -9643,7 +9643,7 @@ var GENERATED_TOOLS = [
9643
9643
  },
9644
9644
  {
9645
9645
  "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).",
9646
+ "description": "\uC0AC\uC9C4\uC744 \uC120\uD0DD\uD55C\uB2E4(\uC774\uBBF8 \uB9CC\uB4E0 \uCEF7\uC5D0\uB294 \uC18C\uAE09\uD558\uC9C0 \uC54A\uB294\uB2E4).",
9647
9647
  "inputSchema": {
9648
9648
  "type": "object",
9649
9649
  "properties": {
@@ -9806,7 +9806,7 @@ var GENERATED_TOOLS = [
9806
9806
  },
9807
9807
  {
9808
9808
  "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.",
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.",
9810
9810
  "inputSchema": {
9811
9811
  "type": "object",
9812
9812
  "properties": {
@@ -10928,6 +10928,144 @@ var GENERATED_TOOLS = [
10928
10928
  "openWorldHint": false
10929
10929
  }
10930
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
+ },
10931
11069
  {
10932
11070
  "name": "democut_reorder_cuts",
10933
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.",
@@ -11192,7 +11330,7 @@ var GENERATED_TOOLS = [
11192
11330
  },
11193
11331
  {
11194
11332
  "name": "democut_get_silence",
11195
- "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).",
11196
11334
  "inputSchema": {
11197
11335
  "type": "object",
11198
11336
  "properties": {
@@ -11245,7 +11383,7 @@ var GENERATED_TOOLS = [
11245
11383
  },
11246
11384
  {
11247
11385
  "name": "democut_download_project",
11248
- "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.",
11249
11387
  "inputSchema": {
11250
11388
  "type": "object",
11251
11389
  "properties": {
@@ -12011,7 +12149,7 @@ var GENERATED_TOOLS = [
12011
12149
  },
12012
12150
  {
12013
12151
  "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.",
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.",
12015
12153
  "inputSchema": {
12016
12154
  "type": "object",
12017
12155
  "properties": {
@@ -12514,7 +12652,7 @@ var GENERATED_TOOLS = [
12514
12652
  },
12515
12653
  {
12516
12654
  "name": "democut_select_cut_version",
12517
- "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.",
12518
12656
  "inputSchema": {
12519
12657
  "type": "object",
12520
12658
  "properties": {
@@ -12619,7 +12757,7 @@ var GENERATED_TOOLS = [
12619
12757
  },
12620
12758
  {
12621
12759
  "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).",
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).",
12623
12761
  "inputSchema": {
12624
12762
  "type": "object",
12625
12763
  "properties": {
@@ -13006,6 +13144,24 @@ var TOOL_META = {
13006
13144
  "method": "PUT",
13007
13145
  "path": "/api/projects/{slug}/cuts/{cut_id}/bgm"
13008
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
+ },
13009
13165
  "democut_reorder_cuts": {
13010
13166
  "cost": "none",
13011
13167
  "group": "storyboard",
@@ -14213,7 +14369,7 @@ function makeCutImage(a = {}, deps = {}) {
14213
14369
  `\uCEF7 \uC774\uBBF8\uC9C0\uB97C \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
14214
14370
  // ★★ 상한임을 제출 자리에서도 말한다 — 견적을 건너뛴 호출자는 이 문장만 본다.
14215
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.`,
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."
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."
14217
14373
  ].join("\n"),
14218
14374
  structured: callableStructured(out4)
14219
14375
  };
@@ -14223,7 +14379,7 @@ function cutImageLine(cut) {
14223
14379
  const n = cut.images?.length ?? 0;
14224
14380
  const firstFrame = (cut.mode ?? "ai_video") === "ai_video";
14225
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)." : "."}`;
14226
- 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";
14227
14383
  if (cut.current_image_id) {
14228
14384
  const current = cut.images?.find((i) => i.id === cut.current_image_id);
14229
14385
  if (current?.model) cover += ` (${current.model}${current.quality ? ` \xB7 ${current.quality}` : ""})`;
@@ -14264,7 +14420,7 @@ function setCutImage(a = {}, deps = {}) {
14264
14420
  );
14265
14421
  const added = out4.images?.[out4.images.length - 1];
14266
14422
  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) };
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) };
14268
14424
  });
14269
14425
  }
14270
14426
  function selectCutImage(a = {}, deps = {}) {
@@ -14289,7 +14445,7 @@ function selectCutImage(a = {}, deps = {}) {
14289
14445
  { method: "PUT", body: { image_id: imageId } },
14290
14446
  deps
14291
14447
  );
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.";
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.";
14293
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." : "";
14294
14450
  return { text: `${head} ${cutImageLine(out4)}${draft} \uC774\uBBF8 \uB9CC\uB4E0 \uBC84\uC804\uC740 \uADF8\uB300\uB85C\uC785\uB2C8\uB2E4.`, structured: callableStructured(out4) };
14295
14451
  });
@@ -14487,7 +14643,7 @@ function listCuts(a = {}, deps = {}) {
14487
14643
  structured: callableStructured(out4)
14488
14644
  };
14489
14645
  }
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`];
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`];
14491
14647
  lines.push(...listing(cuts.map(cutLine)));
14492
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."));
14493
14649
  return { text: lines.join("\n"), structured: callableStructured(out4) };
@@ -14525,7 +14681,7 @@ function getStoryboard(a = {}, deps = {}) {
14525
14681
  function cutLine(cut) {
14526
14682
  const bits = [`${cut.id} [${cut.state}] ${cut.mode}`];
14527
14683
  if (cut.title) bits.push(`\u300C${cut.title}\u300D`);
14528
- 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`);
14529
14685
  if (cut.dirty_fields?.length) bits.push(`\uB2EC\uB77C\uC9C4 \uD544\uB4DC: ${cut.dirty_fields.join(", ")}`);
14530
14686
  if (cut.estimated_cost_krw != null) bits.push(`\uC608\uC0C1 ${krw(cut.estimated_cost_krw)}`);
14531
14687
  if (cut.blocked_reason) bits.push(`\uB9C9\uD798: ${callableToolNames(cut.blocked_reason)}`);
@@ -14781,18 +14937,105 @@ function setCutBgm(a = {}, deps = {}) {
14781
14937
  deps
14782
14938
  );
14783
14939
  } 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
- }
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;
14790
14942
  throw e;
14791
14943
  }
14792
14944
  const note = cut.bgm != null ? BGM_NOTE : BGM_CLEARED_NOTE;
14793
14945
  return { text: [cutLine(cut), note].join("\n"), structured: callableStructured(cut) };
14794
14946
  });
14795
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
+ }
14796
15039
  function setCutTitle(a = {}, deps = {}) {
14797
15040
  return guarded(READ_ONLY, async () => {
14798
15041
  const slug = needSlug(a);
@@ -14895,7 +15138,7 @@ function downloadProject(a = {}, deps = {}) {
14895
15138
  if (typeof slug !== "string") return slug;
14896
15139
  const base = resolveBaseUrl(deps.baseUrl);
14897
15140
  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.";
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.";
14899
15142
  if (a.output_path) {
14900
15143
  await (deps.downloadImpl ? deps.downloadImpl(out4.url, a.output_path) : saveUrlToFile(out4.url, a.output_path, deps.fetchImpl ?? fetch));
14901
15144
  return { text: `\uD504\uB85C\uC81D\uD2B8 zip \uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4: ${a.output_path}
@@ -15071,7 +15314,7 @@ function selectCutVersion(a = {}, deps = {}) {
15071
15314
  const base = resolveBaseUrl(deps.baseUrl);
15072
15315
  const out4 = await apiRequest(base, projectPath(slug, `/cuts/${encodeURIComponent(cutId)}/current`), { method: "PUT", body: { version: Number(a.version) } }, deps);
15073
15316
  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).`,
15317
+ `\uCEF7 ${cutId} \uC5D0\uC11C v${out4.current_version} \uC744 \uC120\uD0DD\uD588\uC2B5\uB2C8\uB2E4(0\uC6D0, \uB80C\uB354 \uC5C6\uC74C).`,
15075
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."
15076
15319
  ];
15077
15320
  return { text: lines.join("\n"), structured: callableStructured(out4) };
@@ -15128,7 +15371,7 @@ function createFolder(a = {}, deps = {}) {
15128
15371
  }
15129
15372
  function characterLine(c) {
15130
15373
  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)" : ""}`;
15374
+ return `${c.name} [${c.id}] rev=${c.rev} \xB7 ${photos}${c.current_photo_id ? " (\uC120\uD0DD\uB428)" : ""}`;
15132
15375
  }
15133
15376
  function listCharacters(_a3 = {}, deps = {}) {
15134
15377
  return guarded(READ_ONLY, async () => {
@@ -15179,7 +15422,7 @@ function getCharacter(a = {}, deps = {}) {
15179
15422
  const lines = [characterLine(out4)];
15180
15423
  if (out4.voice_id) lines.push(` \uBCF4\uC774\uC2A4: ${out4.voice_id}`);
15181
15424
  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" : ""}`);
15425
+ lines.push(` \uC0AC\uC9C4 ${p.seq}: ${p.asset_id} (${p.source})${p.id === out4.current_photo_id ? " \u2190 \uC120\uD0DD\uB428" : ""}`);
15183
15426
  }
15184
15427
  return { text: lines.join("\n"), structured: callableStructured(out4) };
15185
15428
  });
@@ -15353,7 +15596,7 @@ function makeCharacterPhoto(a = {}, deps = {}) {
15353
15596
  text: [
15354
15597
  `\uC544\uBC14\uD0C0 \uC0AC\uC9C4\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
15355
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.`,
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)."
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)."
15357
15600
  ].join("\n"),
15358
15601
  structured: callableStructured(out4)
15359
15602
  };
@@ -15378,7 +15621,7 @@ function selectCharacterPhoto(a = {}, deps = {}) {
15378
15621
  deps
15379
15622
  );
15380
15623
  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.`,
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.`,
15382
15625
  structured: callableStructured(out4)
15383
15626
  };
15384
15627
  });
@@ -15562,7 +15805,7 @@ function makeExport(a = {}, deps = {}) {
15562
15805
  );
15563
15806
  const lines = [
15564
15807
  `\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).",
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).",
15566
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."
15567
15810
  ];
15568
15811
  return { text: lines.join("\n"), structured: callableStructured(out4) };
@@ -15684,9 +15927,9 @@ function getExport(a = {}, deps = {}) {
15684
15927
  const thumbs = out4.thumbnails ?? [];
15685
15928
  if (thumbs.length > 0) {
15686
15929
  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 ")
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 ")
15688
15931
  );
15689
- 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).");
15690
15933
  } else {
15691
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.");
15692
15935
  }
@@ -15738,7 +15981,7 @@ function makeThumbnails(a = {}, deps = {}) {
15738
15981
  const lines = [
15739
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)`,
15740
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.`,
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."
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."
15742
15985
  ];
15743
15986
  return { text: lines.join("\n"), structured: callableStructured(out4) };
15744
15987
  });
@@ -15764,7 +16007,7 @@ function selectThumbnail(a = {}, deps = {}) {
15764
16007
  );
15765
16008
  const thumbs = out4.thumbnails ?? [];
15766
16009
  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).`];
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).`];
15768
16011
  if (chosen?.url) lines.push(`\uBBF8\uB9AC\uBCF4\uAE30: ${chosen.url} (1\uC2DC\uAC04 \uC720\uD6A8)`);
15769
16012
  return { text: lines.join("\n"), structured: callableStructured(out4) };
15770
16013
  });
@@ -15779,7 +16022,7 @@ function deleteThumbnail(a = {}, deps = {}) {
15779
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." };
15780
16023
  const base = resolveBaseUrl(deps.baseUrl);
15781
16024
  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.";
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.";
15783
16026
  return {
15784
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}`,
15785
16028
  structured: callableStructured(out4)
@@ -15831,7 +16074,7 @@ function publishYoutube(a = {}, deps = {}) {
15831
16074
  const out4 = await apiRequest(base, projectPath(slug, `/exports/${number3}/publish`), { method: "POST", body: { privacy } }, deps);
15832
16075
  const lines = [
15833
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})`,
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.",
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.",
15835
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)."
15836
16079
  ];
15837
16080
  return { text: lines.join("\n"), structured: callableStructured(out4) };
@@ -15919,6 +16162,12 @@ function dispatch(name, args, deps = {}) {
15919
16162
  return putCutDraft(args, deps);
15920
16163
  case "democut_set_cut_edit":
15921
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);
15922
16171
  case "democut_set_cut_bgm":
15923
16172
  return setCutBgm(args, deps);
15924
16173
  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.86",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",