democut 1.0.171 → 1.0.173

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 +203 -11
  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.171";
6919
+ var VERSION = "1.0.173";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -11554,7 +11554,7 @@ var GENERATED_TOOLS = [
11554
11554
  },
11555
11555
  {
11556
11556
  "name": "democut_estimate_music",
11557
- "description": "AI \uBC30\uACBD\uC74C\uC545 \uACAC\uC801(0\uC6D0). 5\uBD84 \uC0C1\uD55C\uC774\uACE0 \uC2E4\uC81C \uAE38\uC774\uB85C \uCC28\uC561\uC744 \uB3CC\uB824\uC900\uB2E4.",
11557
+ "description": "AI \uBC30\uACBD\uC74C\uC545 \uACAC\uC801(0\uC6D0). prompt \uB9CC\uC774\uBA74 5\uBD84 \uC0C1\uD55C, length_s\xB7plan \uC774\uBA74 \uADF8 \uAE38\uC774. \uC2E4\uCE21\uC73C\uB85C \uC815\uC0B0\uD55C\uB2E4.",
11558
11558
  "inputSchema": {
11559
11559
  "type": "object",
11560
11560
  "properties": {
@@ -11566,8 +11566,43 @@ var GENERATED_TOOLS = [
11566
11566
  },
11567
11567
  "instrumental": {
11568
11568
  "default": true,
11569
- "description": "\uBCF4\uCEEC \uC5C6\uB294 \uC5F0\uC8FC\uACE1",
11569
+ "description": "\uC5F0\uC8FC\uACE1(prompt \uC77C \uB54C)",
11570
11570
  "type": "boolean"
11571
+ },
11572
+ "length_s": {
11573
+ "anyOf": [
11574
+ {
11575
+ "maximum": 300,
11576
+ "minimum": 3,
11577
+ "type": "integer"
11578
+ },
11579
+ {
11580
+ "type": "null"
11581
+ }
11582
+ ],
11583
+ "default": null,
11584
+ "description": "\uCD08(prompt \uC77C \uB54C). \uBE44\uC6B0\uBA74 \uBAA8\uB378\uC774 \uC815\uD55C\uB2E4"
11585
+ },
11586
+ "plan": {
11587
+ "default": null,
11588
+ "type": [
11589
+ "object",
11590
+ "null"
11591
+ ],
11592
+ "description": "prompt \uB300\uC2E0 \uAD6C\uC131\uD45C(democut_plan_music \uAF34) \u2014 \uBAA8\uB378 MusicPlan \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)"
11593
+ },
11594
+ "source_asset_id": {
11595
+ "anyOf": [
11596
+ {
11597
+ "maxLength": 64,
11598
+ "type": "string"
11599
+ },
11600
+ {
11601
+ "type": "null"
11602
+ }
11603
+ ],
11604
+ "default": null,
11605
+ "description": "\uC6D0\uACE1 \u2014 plan \uC758 keep\xB7reference \uAC00 \uAC00\uB9AC\uD0A8\uB2E4"
11571
11606
  }
11572
11607
  },
11573
11608
  "required": [],
@@ -11621,7 +11656,7 @@ var GENERATED_TOOLS = [
11621
11656
  },
11622
11657
  {
11623
11658
  "name": "democut_make_music",
11624
- "description": "\uACE1\uC744 \uB9CC\uB4E0\uB2E4(\uCCAD\uAD6C\xB7\uC0C1\uD55C). \uACB0\uACFC\uC758 asset_id \uB97C democut_set_cut_bgm \uC5D0 \uC4F4\uB2E4. \uB3C8\uC774 \uB098\uAC00\uB294 \uB3C4\uAD6C\uB2E4 \u2014 \uC9DD\uC774 \uB418\uB294 estimate \uB3C4\uAD6C\uC758 \uAE08\uC561\uC5D0 \uC0AC\uC6A9\uC790\uAC00 \uB3D9\uC758\uD55C \uB4A4 confirmed_*_krw\xB7rate_version \uC744 \uADF8\uB300\uB85C \uB123\uC5B4\uB77C. \uC2E4\uD328\uD574\uB3C4 \uC7AC\uC81C\uCD9C\uD558\uC9C0 \uB9C8\uB77C(\uAC19\uC740 spec \uC774 \uD65C\uC131\uC774\uBA74 \uAE30\uC874 \uC7A1\uC744 \uB3CC\uB824\uC900\uB2E4 \u2014 deduplicated=true). \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs.",
11659
+ "description": "\uACE1\uC744 \uB9CC\uB4E0\uB2E4(\uCCAD\uAD6C). \uBCC0\uD615\xB7\uAC00\uC0AC \uACE0\uCE58\uAE30\uB294 source_asset_id + plan(\uACE0\uCE60 \uAD6C\uAC04\uB9CC new). \uACB0\uACFC asset_id \uB97C democut_set_cut_bgm \uC5D0. \uB3C8\uC774 \uB098\uAC00\uB294 \uB3C4\uAD6C\uB2E4 \u2014 \uC9DD\uC774 \uB418\uB294 estimate \uB3C4\uAD6C\uC758 \uAE08\uC561\uC5D0 \uC0AC\uC6A9\uC790\uAC00 \uB3D9\uC758\uD55C \uB4A4 confirmed_*_krw\xB7rate_version \uC744 \uADF8\uB300\uB85C \uB123\uC5B4\uB77C. \uC2E4\uD328\uD574\uB3C4 \uC7AC\uC81C\uCD9C\uD558\uC9C0 \uB9C8\uB77C(\uAC19\uC740 spec \uC774 \uD65C\uC131\uC774\uBA74 \uAE30\uC874 \uC7A1\uC744 \uB3CC\uB824\uC900\uB2E4 \u2014 deduplicated=true). \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs.",
11625
11660
  "inputSchema": {
11626
11661
  "type": "object",
11627
11662
  "properties": {
@@ -11633,9 +11668,44 @@ var GENERATED_TOOLS = [
11633
11668
  },
11634
11669
  "instrumental": {
11635
11670
  "default": true,
11636
- "description": "\uBCF4\uCEEC \uC5C6\uB294 \uC5F0\uC8FC\uACE1",
11671
+ "description": "\uC5F0\uC8FC\uACE1(prompt \uC77C \uB54C)",
11637
11672
  "type": "boolean"
11638
11673
  },
11674
+ "length_s": {
11675
+ "anyOf": [
11676
+ {
11677
+ "maximum": 300,
11678
+ "minimum": 3,
11679
+ "type": "integer"
11680
+ },
11681
+ {
11682
+ "type": "null"
11683
+ }
11684
+ ],
11685
+ "default": null,
11686
+ "description": "\uCD08(prompt \uC77C \uB54C). \uBE44\uC6B0\uBA74 \uBAA8\uB378\uC774 \uC815\uD55C\uB2E4"
11687
+ },
11688
+ "plan": {
11689
+ "default": null,
11690
+ "type": [
11691
+ "object",
11692
+ "null"
11693
+ ],
11694
+ "description": "prompt \uB300\uC2E0 \uAD6C\uC131\uD45C(democut_plan_music \uAF34) \u2014 \uBAA8\uB378 MusicPlan \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)"
11695
+ },
11696
+ "source_asset_id": {
11697
+ "anyOf": [
11698
+ {
11699
+ "maxLength": 64,
11700
+ "type": "string"
11701
+ },
11702
+ {
11703
+ "type": "null"
11704
+ }
11705
+ ],
11706
+ "default": null,
11707
+ "description": "\uC6D0\uACE1 \u2014 plan \uC758 keep\xB7reference \uAC00 \uAC00\uB9AC\uD0A8\uB2E4"
11708
+ },
11639
11709
  "title": {
11640
11710
  "default": "",
11641
11711
  "maxLength": 100,
@@ -11690,6 +11760,72 @@ var GENERATED_TOOLS = [
11690
11760
  "openWorldHint": false
11691
11761
  }
11692
11762
  },
11763
+ {
11764
+ "name": "democut_plan_music",
11765
+ "description": "\uACE1 \uAD6C\uC131\uD45C(0\uC6D0). prompt \uB85C \uAD6C\uAC04\xB7\uAC00\uC0AC \uCD08\uC548, source_asset_id \uB85C \uADF8 \uACE1\uC758 \uAD6C\uAC04(keep \uAF34)\uC744 \uC900\uB2E4. \uACE0\uCCD0 plan \uC5D0 \uC2E3\uB294\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_estimate_music.",
11766
+ "inputSchema": {
11767
+ "type": "object",
11768
+ "properties": {
11769
+ "prompt": {
11770
+ "default": "",
11771
+ "description": "\uCD08\uC548\uC744 \uC9E4 \uC124\uBA85",
11772
+ "maxLength": 2e3,
11773
+ "type": "string"
11774
+ },
11775
+ "length_s": {
11776
+ "anyOf": [
11777
+ {
11778
+ "maximum": 300,
11779
+ "minimum": 3,
11780
+ "type": "integer"
11781
+ },
11782
+ {
11783
+ "type": "null"
11784
+ }
11785
+ ],
11786
+ "default": null,
11787
+ "description": "\uCD08"
11788
+ },
11789
+ "source_asset_id": {
11790
+ "anyOf": [
11791
+ {
11792
+ "maxLength": 64,
11793
+ "type": "string"
11794
+ },
11795
+ {
11796
+ "type": "null"
11797
+ }
11798
+ ],
11799
+ "default": null,
11800
+ "description": "\uC774 \uACE1\uC758 \uAD6C\uC131\uC744 \uC77D\uB294\uB2E4"
11801
+ }
11802
+ },
11803
+ "required": [],
11804
+ "additionalProperties": false
11805
+ },
11806
+ "outputSchema": {
11807
+ "type": "object",
11808
+ "properties": {
11809
+ "plan": {},
11810
+ "sections": {
11811
+ "type": "array"
11812
+ },
11813
+ "total_ms": {
11814
+ "type": "integer"
11815
+ },
11816
+ "source_asset_id": {}
11817
+ },
11818
+ "required": [
11819
+ "plan"
11820
+ ]
11821
+ },
11822
+ "annotations": {
11823
+ "readOnlyHint": false,
11824
+ "destructiveHint": false,
11825
+ "idempotentHint": false,
11826
+ "openWorldHint": false
11827
+ }
11828
+ },
11693
11829
  {
11694
11830
  "name": "democut_reorder_cuts",
11695
11831
  "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.",
@@ -14175,6 +14311,12 @@ var TOOL_META = {
14175
14311
  "method": "POST",
14176
14312
  "path": "/api/music/generate"
14177
14313
  },
14314
+ "democut_plan_music": {
14315
+ "cost": "none",
14316
+ "group": "storyboard",
14317
+ "method": "POST",
14318
+ "path": "/api/music/plan"
14319
+ },
14178
14320
  "democut_reorder_cuts": {
14179
14321
  "cost": "none",
14180
14322
  "group": "storyboard",
@@ -16985,13 +17127,60 @@ function makeCharacterPhoto(a = {}, deps = {}) {
16985
17127
  }
16986
17128
  function musicBody(a) {
16987
17129
  return {
16988
- prompt: (a.prompt ?? "").trim(),
16989
- ...typeof a.instrumental === "boolean" ? { instrumental: a.instrumental } : {}
17130
+ ...a.plan ? {} : { prompt: (a.prompt ?? "").trim() },
17131
+ ...typeof a.instrumental === "boolean" && !a.plan ? { instrumental: a.instrumental } : {},
17132
+ ...typeof a.length_s === "number" ? { length_s: a.length_s } : {},
17133
+ ...a.plan ? { plan: a.plan } : {},
17134
+ ...a.source_asset_id ? { source_asset_id: a.source_asset_id } : {}
16990
17135
  };
16991
17136
  }
17137
+ function musicLengthNote(a) {
17138
+ if (a.plan) {
17139
+ const ms = (a.plan.sections ?? []).reduce((sum, s) => {
17140
+ const sec = s;
17141
+ return sum + (sec.kind === "keep" && sec.range ? sec.range.end_ms - sec.range.start_ms : sec.duration_ms ?? 0);
17142
+ }, 0);
17143
+ return `\uAD6C\uC131\uD45C \uAE38\uC774 ${ms / 1e3}\uCD08\uB85C \uB0C5\uB2C8\uB2E4. \uBC1B\uC740 \uACE1 \uAE38\uC774\uB85C \uC815\uC0B0\uD569\uB2C8\uB2E4.`;
17144
+ }
17145
+ if (typeof a.length_s === "number") return `\uACE0\uB978 \uAE38\uC774 ${a.length_s}\uCD08\uB85C \uB0C5\uB2C8\uB2E4. \uBC1B\uC740 \uACE1 \uAE38\uC774\uB85C \uC815\uC0B0\uD569\uB2C8\uB2E4.`;
17146
+ return "5\uBD84 \uC0C1\uD55C\uC785\uB2C8\uB2E4. \uAE38\uC774\uB294 \uBAA8\uB378\uC774 \uC815\uD558\uACE0(\uBCF4\uD1B5 \uC57D 3\uBD84), \uBC1B\uC740 \uACE1 \uAE38\uC774\uB9CC\uD07C \uC815\uC0B0\uD574 \uCC28\uC561\uC744 \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4.";
17147
+ }
17148
+ function musicRequestError(a) {
17149
+ if (a.source_asset_id && !a.plan) return "source_asset_id \uB294 plan(\uAD6C\uC131\uD45C)\uACFC \uD568\uAED8 \uC501\uB2C8\uB2E4. \uC6D0\uACE1\uC758 \uAD6C\uAC04\uC740 plan_music \uC73C\uB85C \uBC1B\uC73C\uC138\uC694.";
17150
+ if (!a.plan && !(a.prompt ?? "").trim()) return "prompt(\uACE1 \uC124\uBA85) \uB610\uB294 plan(\uAD6C\uC131\uD45C)\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.";
17151
+ return null;
17152
+ }
17153
+ function planMusic(a = {}, deps = {}) {
17154
+ return guarded(READ_ONLY, async () => {
17155
+ const prompt = (a.prompt ?? "").trim();
17156
+ if (!prompt === !a.source_asset_id) {
17157
+ return { isError: true, text: "prompt(\uCD08\uC548\uC744 \uC9E4 \uC124\uBA85)\uC640 source_asset_id(\uAD6C\uC131\uC744 \uC77D\uC744 \uACE1) \uC911 \uC815\uD655\uD788 \uD558\uB098\uB97C \uC8FC\uC138\uC694." };
17158
+ }
17159
+ const base = resolveBaseUrl(deps.baseUrl);
17160
+ const out4 = await apiRequest(
17161
+ base,
17162
+ "/api/music/plan",
17163
+ {
17164
+ method: "POST",
17165
+ body: a.source_asset_id ? { source_asset_id: a.source_asset_id } : { prompt, ...typeof a.length_s === "number" ? { length_s: a.length_s } : {} }
17166
+ },
17167
+ deps
17168
+ );
17169
+ const lines = [
17170
+ out4.source_asset_id ? `\uACE1 ${out4.source_asset_id} \uC758 \uAD6C\uC131\uC785\uB2C8\uB2E4` : "\uAD6C\uC131\uD45C \uCD08\uC548\uC785\uB2C8\uB2E4(0\uC6D0)",
17171
+ `\uCD1D ${(out4.total_ms ?? 0) / 1e3}\uCD08 \xB7 \uAD6C\uAC04 ${(out4.sections ?? []).length}\uAC1C`,
17172
+ ...(out4.sections ?? []).map(
17173
+ (s, i) => ` ${i}. [${s.name}] ${s.start_ms}~${s.end_ms}ms \u2014 ${s.lyrics ? s.lyrics.replace(/\n/g, " / ").slice(0, 80) : "(\uC5F0\uC8FC)"}`
17174
+ ),
17175
+ out4.source_asset_id ? "plan \uC740 \uBAA8\uB4E0 \uAD6C\uAC04\uC774 keep(\uC6D0\uACE1 \uADF8\uB300\uB85C)\uC774\uB2E4. \uACE0\uCE60 \uAD6C\uAC04\uB9CC kind=new(name\xB7lyrics\xB7duration_ms\xB7styles)\uB85C \uBC14\uAFD4 source_asset_id \uC640 \uD568\uAED8 estimate_music\xB7make_music \uC5D0 \uC2E3\uB294\uB2E4." : "plan \uC744 \uACE0\uCCD0(\uAC00\uC0AC\xB7\uAE38\uC774\xB7\uC2A4\uD0C0\uC77C) estimate_music\xB7make_music \uC758 plan \uC5D0 \uADF8\uB300\uB85C \uC2E3\uB294\uB2E4."
17176
+ ];
17177
+ return { text: lines.join("\n"), structured: callableStructured(out4) };
17178
+ });
17179
+ }
16992
17180
  function estimateMusic(a = {}, deps = {}) {
16993
17181
  return guarded(READ_ONLY, async () => {
16994
- if (!(a.prompt ?? "").trim()) return { isError: true, text: "prompt(\uACE1 \uC124\uBA85)\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4." };
17182
+ const invalid = musicRequestError(a);
17183
+ if (invalid) return { isError: true, text: invalid };
16995
17184
  const base = resolveBaseUrl(deps.baseUrl);
16996
17185
  const out4 = await apiRequest(base, "/api/music/estimate", { method: "POST", body: musicBody(a) }, deps);
16997
17186
  const item = out4.items?.[0];
@@ -17003,7 +17192,7 @@ function estimateMusic(a = {}, deps = {}) {
17003
17192
  }
17004
17193
  const lines = [
17005
17194
  `AI \uC74C\uC545 \uACAC\uC801 (\uC694\uC728 v${out4.rate_version}) \u2014 \uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4`,
17006
- ` ${krw(item.total_krw ?? 0)} \u2014 5\uBD84 \uC0C1\uD55C\uC785\uB2C8\uB2E4. \uAE38\uC774\uB294 \uBAA8\uB378\uC774 \uC815\uD558\uACE0, \uBC1B\uC740 \uACE1 \uAE38\uC774\uB9CC\uD07C \uC815\uC0B0\uD574 \uCC28\uC561\uC744 \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4.`,
17195
+ ` ${krw(item.total_krw ?? 0)} \u2014 ${musicLengthNote(a)}`,
17007
17196
  `\uC794\uC561 ${krw(out4.balance_krw)} \u2192 \uB0A8\uC744 \uC794\uC561 ${krw(out4.balance_after_krw)}`,
17008
17197
  out4.can_afford ? "\uCDA9\uBD84\uD569\uB2C8\uB2E4." : "\u26A0\uFE0F \uC794\uC561\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4 \u2014 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uAD00\uB9AC\uC790\uC5D0\uAC8C \uCDA9\uC804\uC744 \uC694\uCCAD\uD558\uC138\uC694."
17009
17198
  ];
@@ -17013,7 +17202,8 @@ function estimateMusic(a = {}, deps = {}) {
17013
17202
  }
17014
17203
  function makeMusic(a = {}, deps = {}) {
17015
17204
  return guarded(SUBMITTING, async () => {
17016
- if (!(a.prompt ?? "").trim()) return { isError: true, text: "prompt(\uACE1 \uC124\uBA85)\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4." };
17205
+ const invalid = musicRequestError(a);
17206
+ if (invalid) return { isError: true, text: invalid };
17017
17207
  const base = resolveBaseUrl(deps.baseUrl);
17018
17208
  const out4 = await apiRequest(
17019
17209
  base,
@@ -17034,7 +17224,7 @@ function makeMusic(a = {}, deps = {}) {
17034
17224
  return {
17035
17225
  text: [
17036
17226
  `\uACE1\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
17037
- `\uCCAD\uAD6C ${krw(out4.quote?.total_krw ?? 0)} \u2014 5\uBD84 \uC0C1\uD55C\uC785\uB2C8\uB2E4. \uBC1B\uC740 \uACE1 \uAE38\uC774\uB9CC\uD07C \uC815\uC0B0\uD574 \uCC28\uC561\uC744 \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4.`,
17227
+ `\uCCAD\uAD6C ${krw(out4.quote?.total_krw ?? 0)} \u2014 ${musicLengthNote(a)}`,
17038
17228
  "democut_wait_jobs \uB85C \uB05D\uB098\uBA74 \uACB0\uACFC\uC758 asset_id \uAC00 \uACE1\uC785\uB2C8\uB2E4 \u2014 democut_set_cut_bgm \uC5D0 \uADF8\uB300\uB85C \uC4F0\uC138\uC694." + (a.project_slug ? " \uADF8 \uD504\uB85C\uC81D\uD2B8\uC758 \uACE1 \uBAA9\uB85D\uC5D0\uB3C4 \uB4E4\uC5B4\uAC11\uB2C8\uB2E4." : "")
17039
17229
  ].join("\n"),
17040
17230
  structured: callableStructured(out4)
@@ -17845,6 +18035,8 @@ function dispatch(name, args, deps = {}) {
17845
18035
  return estimateCharacterPhoto(args, deps);
17846
18036
  case "democut_make_character_photo":
17847
18037
  return makeCharacterPhoto(args, deps);
18038
+ case "democut_plan_music":
18039
+ return planMusic(args, deps);
17848
18040
  case "democut_estimate_music":
17849
18041
  return estimateMusic(args, deps);
17850
18042
  case "democut_make_music":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "democut",
3
- "version": "1.0.171",
3
+ "version": "1.0.173",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",