democut 1.0.57 → 1.0.59

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 +200 -1
  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.57";
6919
+ var VERSION = "1.0.59";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -9026,6 +9026,84 @@ var GENERATED_TOOLS = [
9026
9026
  "openWorldHint": false
9027
9027
  }
9028
9028
  },
9029
+ {
9030
+ "name": "democut_list_folders",
9031
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uD3F4\uB354 \uBAA9\uB85D(1\uB381\uC2A4, \uC911\uCCA9 \uC5C6\uC74C) + \uD3F4\uB354\uBCC4 \uD504\uB85C\uC81D\uD2B8 \uC218. \uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uB2E4. \uD504\uB85C\uC81D\uD2B8\uB97C \uD3F4\uB354\uC5D0 \uB123\uC73C\uB824\uBA74 \uC5EC\uAE30\uC11C \uBC1B\uC740 id \uB97C democut_update_project \uC758 folder_id \uC5D0 \uC900\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_create_folder, democut_update_project.",
9032
+ "inputSchema": {
9033
+ "type": "object",
9034
+ "properties": {},
9035
+ "required": [],
9036
+ "additionalProperties": false
9037
+ },
9038
+ "outputSchema": {
9039
+ "type": "object",
9040
+ "properties": {
9041
+ "folders": {
9042
+ "type": "array"
9043
+ }
9044
+ },
9045
+ "required": [
9046
+ "folders"
9047
+ ]
9048
+ },
9049
+ "annotations": {
9050
+ "readOnlyHint": true,
9051
+ "destructiveHint": false,
9052
+ "idempotentHint": true,
9053
+ "openWorldHint": false
9054
+ }
9055
+ },
9056
+ {
9057
+ "name": "democut_create_folder",
9058
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uD3F4\uB354\uB97C \uB9CC\uB4E0\uB2E4(0\uC6D0). \uAC19\uC740 \uC774\uB984\uC744 \uC5EC\uB7FF \uB9CC\uB4E4 \uC218 \uC788\uC73C\uB2C8 **\uBA3C\uC800 democut_list_folders \uB85C \uC788\uB294\uC9C0 \uBCF4\uB77C** \u2014 \uBB3B\uC9C0 \uC54A\uACE0 \uB9CC\uB4E4\uBA74 \uAC19\uC740 \uC774\uB984\uC758 \uD3F4\uB354\uAC00 \uC313\uC778\uB2E4. \uB9CC\uB4E0 \uB4A4 \uD504\uB85C\uC81D\uD2B8\uB97C \uB123\uB294 \uAC83\uC740 update_project(folder_id=\u2026) \uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_update_project, democut_list_folders.",
9059
+ "inputSchema": {
9060
+ "type": "object",
9061
+ "properties": {
9062
+ "name": {
9063
+ "description": "\uD3F4\uB354 \uC774\uB984(1~80\uC790, \uC55E\uB4A4 \uACF5\uBC31\uC740 \uC11C\uBC84\uAC00 \uC790\uB978\uB2E4)",
9064
+ "maxLength": 80,
9065
+ "minLength": 1,
9066
+ "type": "string"
9067
+ }
9068
+ },
9069
+ "required": [
9070
+ "name"
9071
+ ],
9072
+ "additionalProperties": false
9073
+ },
9074
+ "outputSchema": {
9075
+ "type": "object",
9076
+ "properties": {
9077
+ "id": {
9078
+ "type": "string"
9079
+ },
9080
+ "name": {
9081
+ "type": "string"
9082
+ },
9083
+ "project_count": {
9084
+ "type": "integer"
9085
+ },
9086
+ "created_at": {
9087
+ "type": "string"
9088
+ },
9089
+ "updated_at": {
9090
+ "type": "string"
9091
+ }
9092
+ },
9093
+ "required": [
9094
+ "id",
9095
+ "name",
9096
+ "created_at",
9097
+ "updated_at"
9098
+ ]
9099
+ },
9100
+ "annotations": {
9101
+ "readOnlyHint": false,
9102
+ "destructiveHint": false,
9103
+ "idempotentHint": false,
9104
+ "openWorldHint": false
9105
+ }
9106
+ },
9029
9107
  {
9030
9108
  "name": "democut_credit_balance",
9031
9109
  "description": "\uB0B4 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uC758 \uD06C\uB808\uB527 \uC794\uC561. \uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uB2E4. \uB3C8\uC774 \uB098\uAC00\uB294 \uC791\uC5C5(democut_make_cuts \uB4F1)\uC744 \uC81C\uCD9C\uD558\uAE30 **\uC804\uC5D0** \uD655\uC778\uD558\uB77C \u2014 \uBD80\uC871\uD558\uBA74 \uC81C\uCD9C\uC774 402 \uB85C \uAC70\uBD80\uB418\uACE0, \uADF8\uAC83\uC744 \uBBF8\uB9AC \uC544\uB294 \uD3B8\uC774 \uB0AB\uB2E4(democut_estimate_cuts \uC758 can_afford \uAC00 \uC788\uC73C\uBA74 \uB9E4\uBC88 \uBD80\uB97C \uD544\uC694\uB294 \uC5C6\uB2E4). \uBAA8\uC790\uB77C\uBA74 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC54C\uB9AC\uACE0 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uAD00\uB9AC\uC790\uC5D0\uAC8C \uCDA9\uC804\uC744 \uC694\uCCAD\uD558\uB3C4\uB85D \uC548\uB0B4\uD558\uB77C \u2014 \uB124\uAC00 \uC9C1\uC811 \uCDA9\uC804\uD560 \uC218\uB294 \uC5C6\uB2E4.",
@@ -11292,6 +11370,52 @@ var GENERATED_TOOLS = [
11292
11370
  "openWorldHint": false
11293
11371
  }
11294
11372
  },
11373
+ {
11374
+ "name": "democut_get_audio_tracks",
11375
+ "description": "\uADF8 \uC720\uD29C\uBE0C \uD074\uB9BD \uCEF7\uC758 \uC74C\uC131 \uD2B8\uB799(\uC5B8\uC5B4) \uBAA9\uB85D \u2014 \uC6D0\uBCF8\uACFC \uC720\uD29C\uBE0C \uC790\uB3D9 \uB354\uBE59(0\uC6D0). \uC8FC\uC18C\uB294 \uCEF7 \uCD08\uC548(draft_spec.source.url)\uC5D0\uC11C \uC77D\uB294\uB2E4 \u2014 \uC5C6\uC73C\uBA74 422. \uACE0\uB978 lang \uC744 draft_spec.source.audio_lang \uC5D0 \uB123\uC5B4 democut_put_cut_draft \uD558\uBA74 \uADF8 \uC5B8\uC5B4\uC758 \uC74C\uC131\uC73C\uB85C \uB9CC\uB4E0\uB2E4(\uBE44\uC6B0\uBA74 \uC6D0\uBCF8). \uC74C\uC131\uC744 \uBC14\uAFB8\uBA74 \uB2E4\uB978 \uC601\uC0C1\uC774\uB77C \uC774\uBBF8 \uB9CC\uB4E0 \uCEF7\uC740 dirty \uAC00 \uB41C\uB2E4. \uD2B8\uB799\uC740 \uC601\uC0C1\uB9C8\uB2E4 \uB2E4\uB974\uB2E4 \u2014 \uC8FC\uC18C\uB97C \uBC14\uAFB8\uBA74 \uB2E4\uC2DC \uC77D\uC5B4\uB77C. \uB2E4\uC74C \uD638\uCD9C: democut_put_cut_draft, democut_estimate_cuts.",
11376
+ "inputSchema": {
11377
+ "type": "object",
11378
+ "properties": {
11379
+ "slug": {
11380
+ "type": "string",
11381
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
11382
+ },
11383
+ "cut_id": {
11384
+ "type": "string",
11385
+ "description": "\uCEF7 id(cut_\u2026)"
11386
+ }
11387
+ },
11388
+ "required": [
11389
+ "slug",
11390
+ "cut_id"
11391
+ ],
11392
+ "additionalProperties": false
11393
+ },
11394
+ "outputSchema": {
11395
+ "type": "object",
11396
+ "properties": {
11397
+ "cut_id": {
11398
+ "type": "string"
11399
+ },
11400
+ "url": {
11401
+ "type": "string"
11402
+ },
11403
+ "tracks": {
11404
+ "type": "array"
11405
+ }
11406
+ },
11407
+ "required": [
11408
+ "cut_id",
11409
+ "url"
11410
+ ]
11411
+ },
11412
+ "annotations": {
11413
+ "readOnlyHint": true,
11414
+ "destructiveHint": false,
11415
+ "idempotentHint": true,
11416
+ "openWorldHint": false
11417
+ }
11418
+ },
11295
11419
  {
11296
11420
  "name": "democut_estimate_export",
11297
11421
  "description": "\uC644\uC131\uBCF8 \uACAC\uC801(0\uC6D0 \uD589).",
@@ -12519,6 +12643,18 @@ var TOOL_META = {
12519
12643
  "method": "POST",
12520
12644
  "path": "/api/projects/{slug}/cuts/{cut_id}/images/generate"
12521
12645
  },
12646
+ "democut_list_folders": {
12647
+ "cost": "none",
12648
+ "group": "core",
12649
+ "method": "GET",
12650
+ "path": "/api/folders"
12651
+ },
12652
+ "democut_create_folder": {
12653
+ "cost": "none",
12654
+ "group": "core",
12655
+ "method": "POST",
12656
+ "path": "/api/folders"
12657
+ },
12522
12658
  "democut_credit_balance": {
12523
12659
  "cost": "none",
12524
12660
  "group": "credits",
@@ -12711,6 +12847,12 @@ var TOOL_META = {
12711
12847
  "method": "POST",
12712
12848
  "path": "/api/projects/{slug}/cuts/{cut_id}/hook_scan/pick"
12713
12849
  },
12850
+ "democut_get_audio_tracks": {
12851
+ "cost": "none",
12852
+ "group": "storyboard",
12853
+ "method": "GET",
12854
+ "path": "/api/projects/{slug}/cuts/{cut_id}/audio_tracks"
12855
+ },
12714
12856
  "democut_estimate_export": {
12715
12857
  "cost": "quote",
12716
12858
  "group": "export",
@@ -14632,6 +14774,37 @@ function deleteCutVersion(a = {}, deps = {}) {
14632
14774
  };
14633
14775
  });
14634
14776
  }
14777
+ function listFolders(_a3 = {}, deps = {}) {
14778
+ return guarded(READ_ONLY, async () => {
14779
+ const base = resolveBaseUrl(deps.baseUrl);
14780
+ const out4 = await apiRequest(base, "/api/folders", {}, deps);
14781
+ if (!out4.folders?.length) {
14782
+ return { text: "\uD3F4\uB354\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. democut_create_folder \uB85C \uB9CC\uB4DC\uC138\uC694.", structured: callableStructured(out4) };
14783
+ }
14784
+ return {
14785
+ text: [
14786
+ `\uD3F4\uB354 ${out4.folders.length}\uAC1C \u2014 id \xB7 \uC774\uB984 \xB7 \uD504\uB85C\uC81D\uD2B8 \uC218:`,
14787
+ ...out4.folders.map((f) => ` ${f.id} \xB7 ${f.name} \xB7 \uD504\uB85C\uC81D\uD2B8 ${f.project_count ?? 0}\uAC1C`),
14788
+ "\uD504\uB85C\uC81D\uD2B8\uB97C \uB123\uC73C\uB824\uBA74 democut_update_project \uC758 folder_id \uC5D0 \uC704 id \uB97C \uC8FC\uC138\uC694."
14789
+ ].join("\n"),
14790
+ structured: callableStructured(out4)
14791
+ };
14792
+ });
14793
+ }
14794
+ function createFolder(a = {}, deps = {}) {
14795
+ return guarded(READ_ONLY, async () => {
14796
+ if (!(a.name ?? "").trim()) return { isError: true, text: "name \uC774 \uD544\uC694\uD569\uB2C8\uB2E4." };
14797
+ const base = resolveBaseUrl(deps.baseUrl);
14798
+ const out4 = await apiRequest(base, "/api/folders", { method: "POST", body: { name: a.name } }, deps);
14799
+ return {
14800
+ text: [
14801
+ `\uD3F4\uB354\uB97C \uB9CC\uB4E4\uC5C8\uC2B5\uB2C8\uB2E4: ${out4.name} [${out4.id}]`,
14802
+ `\uD504\uB85C\uC81D\uD2B8\uB97C \uB123\uC73C\uB824\uBA74 democut_update_project(slug=\u2026, folder_id=${out4.id}) \uB97C \uBD80\uB974\uC138\uC694.`
14803
+ ].join("\n"),
14804
+ structured: callableStructured(out4)
14805
+ };
14806
+ });
14807
+ }
14635
14808
  function characterLine(c) {
14636
14809
  const photos = c.photos?.length ? `\uC0AC\uC9C4 ${c.photos.length}\uC7A5` : "\uC0AC\uC9C4 \uC5C6\uC74C";
14637
14810
  return `${c.name} [${c.id}] rev=${c.rev} \xB7 ${photos}${c.current_photo_id ? " (\uB300\uD45C \uC788\uC74C)" : ""}`;
@@ -15047,6 +15220,25 @@ function pickHookCandidate(a = {}, deps = {}) {
15047
15220
  return { text: lines.join("\n"), structured: callableStructured(out4) };
15048
15221
  });
15049
15222
  }
15223
+ function getAudioTracks(a = {}, deps = {}) {
15224
+ return guarded(READ_ONLY, async () => {
15225
+ const slug = needSlug(a);
15226
+ if (typeof slug !== "string") return slug;
15227
+ const cutId = needCut(a);
15228
+ if (typeof cutId !== "string") return cutId;
15229
+ const base = resolveBaseUrl(deps.baseUrl);
15230
+ const out4 = await apiRequest(base, cutPath(slug, cutId, "/audio_tracks"), {}, deps);
15231
+ const tracks = out4.tracks ?? [];
15232
+ const original = tracks.find((t) => t.original)?.lang;
15233
+ const dubs = tracks.filter((t) => !t.original).map((t) => t.lang);
15234
+ const lines = tracks.length === 0 ? [`${cutId} \uC758 \uC601\uC0C1\uC5D0\uB294 \uC5B8\uC5B4\uAC00 \uD45C\uC2DC\uB41C \uC74C\uC131 \uD2B8\uB799\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC6D0\uBCF8 \uC74C\uC131\uB9CC \uBC1B\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4(audio_lang \uC744 \uBE44\uC6CC \uB450\uC138\uC694).`] : [
15235
+ `${cutId} \uC758 \uC74C\uC131 \uD2B8\uB799 ${tracks.length}\uAC1C \u2014 \uC6D0\uBCF8: ${original ?? "(\uD45C\uC2DC \uC5C6\uC74C)"}` + (dubs.length ? `, \uC790\uB3D9 \uB354\uBE59: ${dubs.join(", ")}` : ""),
15236
+ "\uC6D0\uBCF8\uC73C\uB85C \uB9CC\uB4E4\uB824\uBA74 draft_spec.source.audio_lang \uC744 \uBE44\uC6CC \uB450\uACE0, \uB2E4\uB978 \uC5B8\uC5B4\uB85C \uB9CC\uB4E4\uB824\uBA74 \uADF8 lang \uC744 \uB123\uC5B4 democut_put_cut_draft \uD558\uC138\uC694.",
15237
+ "\uB354\uBE59\uC740 \uC720\uD29C\uBE0C\uAC00 \uC790\uB3D9\uC73C\uB85C \uB9CC\uB4E0 \uC74C\uC131\uC774\uB77C \uD488\uC9C8\uC774 \uACE0\uB974\uC9C0 \uC54A\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC790\uB9C9 \uC5B8\uC5B4\uB294 \uC74C\uC131\uC744 \uB530\uB77C \uC804\uC0AC\uB429\uB2C8\uB2E4."
15238
+ ];
15239
+ return { text: lines.join("\n"), structured: callableStructured(out4) };
15240
+ });
15241
+ }
15050
15242
  function estimateExport(a = {}, deps = {}) {
15051
15243
  return guarded(READ_ONLY, async () => {
15052
15244
  const slug = needSlug(a);
@@ -15436,6 +15628,8 @@ function dispatch(name, args, deps = {}) {
15436
15628
  return makeHookScan(args, deps);
15437
15629
  case "democut_pick_hook_candidate":
15438
15630
  return pickHookCandidate(args, deps);
15631
+ case "democut_get_audio_tracks":
15632
+ return getAudioTracks(args, deps);
15439
15633
  case "democut_estimate_export":
15440
15634
  return estimateExport(args, deps);
15441
15635
  case "democut_make_export":
@@ -15477,6 +15671,11 @@ function dispatch(name, args, deps = {}) {
15477
15671
  return selectCutVersion(args, deps);
15478
15672
  case "democut_delete_cut_version":
15479
15673
  return deleteCutVersion(args, deps);
15674
+ // ── 프로젝트 폴더(1뎁스) ──
15675
+ case "democut_list_folders":
15676
+ return listFolders(args, deps);
15677
+ case "democut_create_folder":
15678
+ return createFolder(args, deps);
15480
15679
  // ── 아바타(캐릭터) CRUD (MR 19a) ──
15481
15680
  case "democut_list_characters":
15482
15681
  return listCharacters(args, deps);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "democut",
3
- "version": "1.0.57",
3
+ "version": "1.0.59",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",