democut 1.0.191 → 1.0.193

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 +118 -30
  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.191";
6919
+ var VERSION = "1.0.193";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -12577,7 +12577,7 @@ var GENERATED_TOOLS = [
12577
12577
  },
12578
12578
  {
12579
12579
  "name": "democut_estimate_video_analysis",
12580
- "description": '\uC601\uC0C1 \uCE21\uC815 \uACAC\uC801(0\uC6D0). source \uB294 {"asset_id":\u2026} \uB610\uB294 \uACF5\uAC1C \uC720\uD29C\uBE0C {"url":\u2026} \uC774\uACE0 60\uCD08 \uC774\uD558\uB9CC \uB41C\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_make_video_analysis.',
12580
+ "description": '\uC601\uC0C1 \uBD84\uC11D \uACAC\uC801(0\uC6D0). stage=measure(\uAE30\uBCF8)\uB294 source \uB85C \uC900 {"asset_id":\u2026} \uB610\uB294 \uACF5\uAC1C \uC720\uD29C\uBE0C {"url":\u2026}(60\uCD08 \uC774\uD558)\uB97C \uC7B0\uB2E4. stage=read \uB294 source \uC5C6\uC774 \uAC00\uC7A5 \uCD5C\uADFC \uCE21\uC815\uC744 AI \uAC00 \uD574\uC11D\uD55C\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_make_video_analysis.',
12581
12581
  "inputSchema": {
12582
12582
  "type": "object",
12583
12583
  "properties": {
@@ -12585,14 +12585,25 @@ var GENERATED_TOOLS = [
12585
12585
  "type": "string",
12586
12586
  "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
12587
12587
  },
12588
+ "stage": {
12589
+ "default": "measure",
12590
+ "enum": [
12591
+ "measure",
12592
+ "read"
12593
+ ],
12594
+ "type": "string"
12595
+ },
12588
12596
  "source": {
12589
- "type": "object",
12597
+ "default": null,
12598
+ "type": [
12599
+ "object",
12600
+ "null"
12601
+ ],
12590
12602
  "description": "\uBAA8\uB378 AnalysisSource \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)"
12591
12603
  }
12592
12604
  },
12593
12605
  "required": [
12594
- "slug",
12595
- "source"
12606
+ "slug"
12596
12607
  ],
12597
12608
  "additionalProperties": false
12598
12609
  },
@@ -12644,7 +12655,7 @@ var GENERATED_TOOLS = [
12644
12655
  },
12645
12656
  {
12646
12657
  "name": "democut_make_video_analysis",
12647
- "description": "\uC601\uC0C1\uC758 \uB300\uC0AC\xB7\uC7A5\uBA74 \uACBD\uACC4\xB7\uD504\uB808\uC784 \uACA9\uC790\xB7\uC74C\uB7C9\uC744 \uC7B0\uB2E4. \uCEF7\uC740 \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4. democut_estimate_video_analysis \uC758 total_krw \uB97C confirmed_cost_krw \uC5D0, rate_version \uC744 \uADF8\uB300\uB85C \uB123\uC5B4\uB77C. \uC5B4\uAE0B\uB098\uBA74 409 QUOTE_MISMATCH \uB2E4(\uACFC\uAE08 \uC5C6\uC74C). \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs, democut_get_video_analysis.",
12658
+ "description": "measure \uB294 \uB300\uC0AC\xB7\uC7A5\uBA74 \uACBD\uACC4\xB7\uD504\uB808\uC784 \uACA9\uC790\xB7\uC74C\uB7C9\uC744 \uC7B0\uB2E4. read \uB294 \uD654\uBA74 \uBC30\uCE58\xB7\uAD6C\uAC04\xB7\uC7A5\uCE58\xB7\uB0B1\uB9D0\uC5D0 \uBD99\uC740 \uBCC0\uD654\uB97C \uC77D\uACE0 \uC0C9\uC744 \uC7B0\uB2E4. \uCEF7\uC740 \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4. democut_estimate_video_analysis \uC758 total_krw \uB97C confirmed_cost_krw \uC5D0, rate_version \uC744 \uADF8\uB300\uB85C \uB123\uC5B4\uB77C. \uC5B4\uAE0B\uB098\uBA74 409 QUOTE_MISMATCH \uB2E4(\uACFC\uAE08 \uC5C6\uC74C). \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs, democut_get_video_analysis.",
12648
12659
  "inputSchema": {
12649
12660
  "type": "object",
12650
12661
  "properties": {
@@ -12652,8 +12663,20 @@ var GENERATED_TOOLS = [
12652
12663
  "type": "string",
12653
12664
  "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
12654
12665
  },
12666
+ "stage": {
12667
+ "default": "measure",
12668
+ "enum": [
12669
+ "measure",
12670
+ "read"
12671
+ ],
12672
+ "type": "string"
12673
+ },
12655
12674
  "source": {
12656
- "type": "object",
12675
+ "default": null,
12676
+ "type": [
12677
+ "object",
12678
+ "null"
12679
+ ],
12657
12680
  "description": "\uBAA8\uB378 AnalysisSource \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)"
12658
12681
  },
12659
12682
  "confirmed_cost_krw": {
@@ -12667,7 +12690,6 @@ var GENERATED_TOOLS = [
12667
12690
  },
12668
12691
  "required": [
12669
12692
  "slug",
12670
- "source",
12671
12693
  "confirmed_cost_krw",
12672
12694
  "rate_version"
12673
12695
  ],
@@ -12697,7 +12719,7 @@ var GENERATED_TOOLS = [
12697
12719
  },
12698
12720
  {
12699
12721
  "name": "democut_get_video_analysis",
12700
- "description": "\uD504\uB85C\uC81D\uD2B8\uC758 \uAC00\uC7A5 \uCD5C\uADFC \uC601\uC0C1 \uBD84\uC11D(0\uC6D0). \uC5C6\uC73C\uBA74 state=none.",
12722
+ "description": "\uD504\uB85C\uC81D\uD2B8\uC758 \uAC00\uC7A5 \uCD5C\uADFC \uC601\uC0C1 \uBD84\uC11D\uACFC \uADF8 \uD574\uC11D(0\uC6D0). \uC5C6\uC73C\uBA74 state=none.",
12701
12723
  "inputSchema": {
12702
12724
  "type": "object",
12703
12725
  "properties": {
@@ -12724,6 +12746,11 @@ var GENERATED_TOOLS = [
12724
12746
  "type": "integer"
12725
12747
  },
12726
12748
  "measured": {},
12749
+ "reading_state": {
12750
+ "type": "string"
12751
+ },
12752
+ "reading_job_id": {},
12753
+ "reading": {},
12727
12754
  "created_at": {},
12728
12755
  "next_calls": {
12729
12756
  "type": "array"
@@ -15180,7 +15207,7 @@ function creditBalance(deps = {}) {
15180
15207
  );
15181
15208
  } else {
15182
15209
  lines.push(
15183
- "\uB3C8\uC774 \uB098\uAC00\uB294 \uC791\uC5C5 \uC804\uC5D0 \uACAC\uC801 \uB3C4\uAD6C(S1 \uC5D0\uC11C \uC81C\uACF5)\uB85C \uAE08\uC561\uC744 \uD655\uC778\uD558\uACE0 \uC774 \uC794\uC561\uACFC \uACAC\uC8FC\uC138\uC694. \uD06C\uB808\uB527\uC740 \uC6D0(KRW)\uC774\uACE0 \uACAC\uC801\uC740 USD \uB77C \uB2E8\uC704\uAC00 \uB2E4\uB985\uB2C8\uB2E4 \u2014 \uD655\uC2E4\uD558\uC9C0 \uC54A\uC73C\uBA74 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uB450 \uAC12\uC744 \uADF8\uB300\uB85C \uBCF4\uC5EC \uC8FC\uC138\uC694."
15210
+ "\uB3C8\uC774 \uB098\uAC00\uB294 \uC791\uC5C5 \uC804\uC5D0 \uACAC\uC801\uC744 \uBC1B\uC544 \uAE08\uC561\uC744 \uC774 \uC794\uC561\uACFC \uACAC\uC8FC\uC138\uC694. \uC794\uC561\uACFC \uACAC\uC801\uC740 \uBAA8\uB450 \uC6D0(KRW)\uC785\uB2C8\uB2E4."
15184
15211
  );
15185
15212
  }
15186
15213
  return { text: lines.join("\n"), structured: callableStructured(view) };
@@ -15372,7 +15399,7 @@ function listProjects(a = {}, deps = {}) {
15372
15399
  const shown = matched.slice(0, limit);
15373
15400
  if (shown.length === 0) {
15374
15401
  return {
15375
- text: query ? `'${query}' \uC640 \uC77C\uCE58\uD558\uB294 \uD504\uB85C\uC81D\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. (\uC774 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uC5D0 \uD504\uB85C\uC81D\uD2B8 ${total}\uAC1C) query \uB97C \uBE7C\uACE0 \uB2E4\uC2DC \uD638\uCD9C\uD574 \uC804\uCCB4\uB97C \uBCF4\uC138\uC694.` : "\uC774 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uC5D0\uB294 \uC544\uC9C1 \uD504\uB85C\uC81D\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uC5D0\uAC8C democut.ai \uC5D0\uC11C \uD504\uB85C\uC81D\uD2B8\uB97C \uD558\uB098 \uB9CC\uB4E0 \uB4A4 \uB2E4\uC2DC \uC694\uCCAD\uD574 \uB2EC\uB77C\uACE0 \uC54C\uB9AC\uC138\uC694 \u2014 \uB124\uAC00 \uC9C1\uC811 \uB9CC\uB4E4 \uC218\uB294 \uC5C6\uC2B5\uB2C8\uB2E4. \uC601\uC0C1 \uC0DD\uC131\uC740 \uADC0\uC18D\uC2DC\uD0AC \uD504\uB85C\uC81D\uD2B8\uAC00 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
15402
+ text: query ? `'${query}' \uC640 \uC77C\uCE58\uD558\uB294 \uD504\uB85C\uC81D\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. (\uC774 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uC5D0 \uD504\uB85C\uC81D\uD2B8 ${total}\uAC1C) query \uB97C \uBE7C\uACE0 \uB2E4\uC2DC \uD638\uCD9C\uD574 \uC804\uCCB4\uB97C \uBCF4\uC138\uC694.` : "\uC774 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uC5D0\uB294 \uC544\uC9C1 \uD504\uB85C\uC81D\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uCEF7\uACFC \uC644\uC131\uBCF8\uC740 \uD504\uB85C\uC81D\uD2B8 \uC548\uC5D0\uC11C \uB9CC\uB4E4\uBBC0\uB85C, \uC5B4\uB5A4 \uC774\uB984\uC73C\uB85C \uB9CC\uB4E4\uC9C0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBB3C\uC740 \uB4A4 democut_create_project \uB85C \uD558\uB098 \uB9CC\uB4DC\uC138\uC694.",
15376
15403
  // 빈 목록도 성공이다 — 광고한 outputSchema(ProjectListResponse)를 지켜 채운다.
15377
15404
  structured: callableStructured({ projects: [] })
15378
15405
  };
@@ -15407,7 +15434,7 @@ function getProject(a = {}, deps = {}) {
15407
15434
  `\uCEF7 ${view.cut_count ?? 0}\uAC1C \xB7 rev ${view.rev ?? 0} \xB7 \uC218\uC815 ${(view.updated_at ?? "").slice(0, 19)}`
15408
15435
  ];
15409
15436
  if (view.folder_id) lines.push(`\uD3F4\uB354: ${view.folder_id}`);
15410
- lines.push("", "\uC21C\uC11C\xB7\uC0C1\uD0DC\uB294 get_storyboard \uB85C, \uB9CC\uB4E4\uB824\uBA74 estimate_cuts \u2192 make_cuts \uB85C. If-Match \uAC00 \uD544\uC694\uD55C \uD3B8\uC9D1 \uB3C4\uAD6C\uC5D0\uB294 \uC704 rev \uB97C \uB123\uC73C\uC138\uC694.");
15437
+ lines.push("", "\uC21C\uC11C\xB7\uC0C1\uD0DC\uB294 get_storyboard \uB85C. If-Match \uAC00 \uD544\uC694\uD55C \uD3B8\uC9D1 \uB3C4\uAD6C\uC5D0\uB294 \uC704 rev \uB97C \uB123\uC73C\uC138\uC694.", "\uB9CC\uB4E4\uB824\uBA74 estimate_cuts \u2192 make_cuts \uB85C.");
15411
15438
  return {
15412
15439
  text: callableToolNames(lines.join("\n")),
15413
15440
  structured: callableStructured(view)
@@ -16093,7 +16120,7 @@ function listCuts(a = {}, deps = {}) {
16093
16120
  const cuts = out4.cuts ?? [];
16094
16121
  if (cuts.length === 0) {
16095
16122
  return {
16096
- text: callableToolNames("\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0\uB294 \uC544\uC9C1 \uCEF7\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uB9CC\uB4E4\uB824\uBA74 estimate_cuts \u2192 make_cuts, \uC644\uC131 \uC601\uC0C1\uC744 \uC62C\uB9AC\uB824\uBA74 import_cut."),
16123
+ text: callableToolNames("\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0\uB294 \uC544\uC9C1 \uCEF7\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.\n\uB9CC\uB4E4\uB824\uBA74 estimate_cuts \u2192 make_cuts.\n\uC644\uC131 \uC601\uC0C1\uC744 \uC62C\uB9AC\uB824\uBA74 import_cut."),
16097
16124
  structured: callableStructured(out4)
16098
16125
  };
16099
16126
  }
@@ -16573,7 +16600,9 @@ function duplicateCut(a = {}, deps = {}) {
16573
16600
  return {
16574
16601
  text: [
16575
16602
  `\uBCF5\uC81C\uB428 \u2014 ${cutLine(cut)}`,
16576
- callableToolNames("\uC0B0\uCD9C\uBB3C(\uBC84\uC804)\uC740 \uBCF5\uC81C\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 \uACC4\uD68D\uB9CC \uBCF5\uC0AC\uB410\uC73C\uB2C8 estimate_cuts \uB85C \uACAC\uC801\uC744 \uB0B4\uACE0 \uB9CC\uB4DC\uC138\uC694.")
16603
+ // 가져온 영상 컷은 만들지 않는다 — 영상을 다시 붙인다(원격 `DUPLICATE_IMPORTED_NOTE` 와 같은 문장).
16604
+ // 사실과 만들기 안내는 다른 줄이다(원격 `DUPLICATE_NOTE`·`DUPLICATE_MAKE_NOTE` 와 같은 문장).
16605
+ ...(cut.mode === "imported_video" ? ["\uC601\uC0C1(\uBC84\uC804)\uC740 \uBCF5\uC81C\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 \uBCF5\uC81C\uD55C \uCEF7\uC5D0 \uC601\uC0C1\uC744 \uBD99\uC774\uB824\uBA74 import_cut \uC744 \uBD80\uB974\uC138\uC694."] : ["\uC0B0\uCD9C\uBB3C(\uBC84\uC804)\uC740 \uBCF5\uC81C\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 \uACC4\uD68D\uB9CC \uBCF5\uC0AC\uD588\uC2B5\uB2C8\uB2E4.", "\uB9CC\uB4E4\uB824\uBA74 estimate_cuts \uB85C \uACAC\uC801\uC744 \uB0B4\uC138\uC694."]).map((line) => callableToolNames(line))
16577
16606
  ].join("\n"),
16578
16607
  structured: callableStructured(cut)
16579
16608
  };
@@ -16595,7 +16624,8 @@ function deleteCut(a = {}, deps = {}) {
16595
16624
  return {
16596
16625
  text: callableToolNames([
16597
16626
  `\uCEF7\uC744 \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4 \u2014 ${cutId}`,
16598
- "\uCC38\uC870 \uC5C6\uB294 \uC790\uC0B0\uC740 \uD568\uAED8 \uC815\uB9AC\uB429\uB2C8\uB2E4(\uADF8\uB9CC\uD07C \uC0AC\uC6A9\uB7C9\uC774 \uC90D\uB2C8\uB2E4) \u2014 24\uC2DC\uAC04 \uC548\uC5D0\uB294 restore_asset \uC73C\uB85C \uB418\uC0B4\uB9B4 \uC218 \uC788\uC2B5\uB2C8\uB2E4."
16627
+ "\uCC38\uC870 \uC5C6\uB294 \uC790\uC0B0\uC740 \uD568\uAED8 \uC815\uB9AC\uB429\uB2C8\uB2E4(\uADF8\uB9CC\uD07C \uC0AC\uC6A9\uB7C9\uC774 \uC90D\uB2C8\uB2E4).",
16628
+ "24\uC2DC\uAC04 \uC548\uC5D0\uB294 restore_asset \uC73C\uB85C \uB418\uC0B4\uB9B4 \uC218 \uC788\uC2B5\uB2C8\uB2E4."
16599
16629
  ].join("\n")),
16600
16630
  structured: callableStructured(res)
16601
16631
  };
@@ -17381,15 +17411,16 @@ function estimateVideoAnalysis(a = {}, deps = {}) {
17381
17411
  const out4 = await apiRequest(
17382
17412
  base,
17383
17413
  analysisPath(slug, "/estimate"),
17384
- { method: "POST", body: { source: a.source } },
17414
+ { method: "POST", body: { stage: a.stage, source: a.source } },
17385
17415
  deps
17386
17416
  );
17417
+ const reading = a.stage === "read";
17387
17418
  const rows = (out4.items ?? []).flatMap((item) => item.rows ?? []).map((r) => `${r.display_name || r.key} ${krw(r.krw)}`).join(", ") || "\uD589 \uC5C6\uC74C";
17388
17419
  const lines = [
17389
- `\uC601\uC0C1 \uCE21\uC815 \uACAC\uC801 (\uC694\uC728 v${out4.rate_version}) \u2014 \uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4`,
17420
+ `\uC601\uC0C1 ${reading ? "\uD574\uC11D" : "\uCE21\uC815"} \uACAC\uC801 (\uC694\uC728 v${out4.rate_version}) \u2014 \uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4`,
17390
17421
  ` ${rows}`,
17391
17422
  `\uCD1D\uC561(\uC0C1\uD55C) ${krw(out4.total_krw)} \xB7 \uC794\uC561 ${krw(out4.balance_krw)} \u2192 \uB0A8\uC744 \uC794\uC561 ${krw(out4.balance_after_krw)}`,
17392
- "\uC18C\uB9AC \uD2B8\uB799\uC774 \uC5C6\uB294 \uC601\uC0C1\uC774\uBA74 \uC804\uC0AC \uD589\uC740 \uD658\uBD88\uB429\uB2C8\uB2E4.",
17423
+ reading ? "\uD574\uC11D\uC740 \uC774 \uAE08\uC561\uAE4C\uC9C0\uB9CC \uC4F0\uACE0, \uC2E4\uC81C\uB85C \uC4F4 \uB9CC\uD07C\uB9CC \uB0A8\uAE30\uACE0 \uB3CC\uB824\uC90D\uB2C8\uB2E4." : "\uC18C\uB9AC \uD2B8\uB799\uC774 \uC5C6\uB294 \uC601\uC0C1\uC774\uBA74 \uC804\uC0AC \uD589\uC740 \uD658\uBD88\uB429\uB2C8\uB2E4.",
17393
17424
  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.",
17394
17425
  "\uC774 total_krw \uB97C confirmed_cost_krw \uC5D0, rate_version \uC744 **\uADF8\uB300\uB85C** democut_make_video_analysis \uC5D0 \uB123\uC73C\uC138\uC694."
17395
17426
  ];
@@ -17405,10 +17436,14 @@ function makeVideoAnalysis(a = {}, deps = {}) {
17405
17436
  const out4 = await apiRequest(
17406
17437
  base,
17407
17438
  analysisPath(slug),
17408
- { method: "POST", body: { source: a.source, confirmed_cost_krw: a.confirmed_cost_krw, rate_version: a.rate_version } },
17439
+ {
17440
+ method: "POST",
17441
+ body: { stage: a.stage, source: a.source, confirmed_cost_krw: a.confirmed_cost_krw, rate_version: a.rate_version }
17442
+ },
17409
17443
  deps
17410
17444
  );
17411
- const text = `\uC601\uC0C1\uC744 \uC7AC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id} (\uCD5C\uB300 ${krw(out4.quote?.total_krw ?? 0)}). \uCEF7\uC740 \uB9CC\uB4E4\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
17445
+ const doing = a.stage === "read" ? "\uC601\uC0C1\uC744 \uD574\uC11D\uD558\uB294 \uC911\uC785\uB2C8\uB2E4" : "\uC601\uC0C1\uC744 \uC7AC\uB294 \uC911\uC785\uB2C8\uB2E4";
17446
+ const text = `${doing} \u2014 ${out4.job_id} (\uCD5C\uB300 ${krw(out4.quote?.total_krw ?? 0)}). \uCEF7\uC740 \uB9CC\uB4E4\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
17412
17447
  \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs, democut_get_video_analysis`;
17413
17448
  return { text, structured: callableStructured(out4) };
17414
17449
  });
@@ -17432,7 +17467,59 @@ function formatAnalysis(view) {
17432
17467
  } else {
17433
17468
  lines.push("\uC18C\uB9AC \uD2B8\uB799\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uC804\uC0AC \uAE08\uC561\uC740 \uD658\uBD88\uB429\uB2C8\uB2E4.");
17434
17469
  }
17435
- return lines.join("\n");
17470
+ return [...lines, ...formatReading(view)].join("\n");
17471
+ }
17472
+ var REGION_NAMES = { presenter: "\uC9C4\uD589\uC790", graphic: "\uADF8\uB798\uD53D", footage: "\uC2E4\uC0AC \uC601\uC0C1", caption: "\uC790\uB9C9" };
17473
+ var TONE_NAMES = { light: "\uBC1D\uC740 \uBC14\uD0D5", dark: "\uC5B4\uB450\uC6B4 \uBC14\uD0D5" };
17474
+ var WEIGHT_NAMES = { regular: "\uBCF4\uD1B5", bold: "\uAD75\uAC8C", heavy: "\uC544\uC8FC \uAD75\uAC8C" };
17475
+ var RADIUS_NAMES = { none: "\uAC01\uC9C4", small: "\uC870\uAE08 \uB465\uADFC", large: "\uB9CE\uC774 \uB465\uADFC" };
17476
+ var ratio = (v) => (Math.floor(v * 100 + 0.5) / 100).toFixed(2);
17477
+ function formatReading(view) {
17478
+ const state = view.reading_state ?? "none";
17479
+ const head = {
17480
+ none: "\uD574\uC11D: \uC544\uC9C1 \uC5C6\uC2B5\uB2C8\uB2E4. democut_estimate_video_analysis(stage=read)\uB85C \uD574\uC11D \uACAC\uC801\uC744 \uBC1B\uC73C\uC138\uC694.",
17481
+ reading: `\uD574\uC11D \uC911\uC785\uB2C8\uB2E4: ${view.reading_job_id}. democut_wait_jobs \uB85C \uAE30\uB2E4\uB9AC\uC138\uC694.`,
17482
+ failed: "\uB9C8\uC9C0\uB9C9 \uD574\uC11D\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uCCAD\uAD6C\uC561\uC740 \uD658\uBD88\uB429\uB2C8\uB2E4.",
17483
+ read: "\uD574\uC11D:"
17484
+ }[state];
17485
+ const r = view.reading;
17486
+ if (!r) return ["", head];
17487
+ const words = view.measured?.words ?? [];
17488
+ const look = r.look;
17489
+ const card = look.card ? `\uCE74\uB4DC \uBAA8\uC11C\uB9AC ${RADIUS_NAMES[look.card.radius]} \xB7 \uADF8\uB9BC\uC790 ${look.card.shadow ? "\uC788\uC74C" : "\uC5C6\uC74C"} \xB7 \uD14C\uB450\uB9AC ${look.card.border ? "\uC788\uC74C" : "\uC5C6\uC74C"}` : "\uCE74\uB4DC \uC5C6\uC74C";
17490
+ const evidence = look.evidence ?? [];
17491
+ const sizes = look.text_sizes ?? [];
17492
+ const lines = [
17493
+ "",
17494
+ state === "failed" ? `${head} \uC544\uB798\uB294 \uADF8 \uC804 \uD574\uC11D\uC785\uB2C8\uB2E4.` : head,
17495
+ `\uC694\uC57D: ${r.summary || "\uC5C6\uC74C"}`,
17496
+ `\uB8E9: \uBC14\uD0D5 ${look.background || "\uC7B4 \uC218 \uC5C6\uC74C"}(${TONE_NAMES[look.tone ?? ""] ?? "\uBC1D\uAE30 \uBAA8\uB984"}) \xB7 \uAC15\uC870\uC0C9 ${look.accent || "\uC5C6\uC74C"} \xB7 \uAE00\uC790 ${WEIGHT_NAMES[look.text_weight ?? ""] ?? "\uAD75\uAE30 \uBAA8\uB984"}, \uD06C\uAE30 \uB2E8\uACC4 ${sizes.length ? `[${sizes.join(", ")}]` : "\uBAA8\uB984"}% \xB7 ${card}` + (evidence.length ? ` \xB7 \uADFC\uAC70 ${evidence.join(", ")}` : ""),
17497
+ `\uBC30\uCE58 ${r.layouts.length}\uAC1C(x \xB7 y \xB7 w \xB7 h \uB294 \uD654\uBA74 \uBE44\uC728):`
17498
+ ];
17499
+ for (const layout of r.layouts) {
17500
+ const regions = layout.regions.map((g) => `${REGION_NAMES[g.role]}(${g.role}) x${ratio(g.x)} y${ratio(g.y)} w${ratio(g.w)} h${ratio(g.h)}` + (g.color ? ` ${g.color}` : "")).join(" / ");
17501
+ lines.push(` ${layout.id}: ${regions}` + (layout.outside_color ? ` \xB7 \uC601\uC5ED \uBC16 ${layout.outside_color}` : ""));
17502
+ }
17503
+ lines.push(`\uAD6C\uAC04 ${r.segments.length}\uAC1C:`);
17504
+ for (const s of r.segments) {
17505
+ lines.push(` ${s.from_ms}-${s.to_ms} ${s.role} \xB7 \uBC30\uCE58 ${s.layout} \xB7 \uC9C4\uD589\uC790 ${s.presenter ? "\uBCF4\uC784" : "\uC548 \uBCF4\uC784"} \xB7 ${s.meaning}`);
17506
+ }
17507
+ const systems = r.systems ?? [];
17508
+ lines.push(systems.length ? `\uC7A5\uCE58 ${systems.length}\uAC1C:` : "\uC7A5\uCE58: \uC5C6\uC74C");
17509
+ for (const y of systems) {
17510
+ const ev = y.evidence ?? [];
17511
+ lines.push(` ${y.id}(${y.kind}, ${REGION_NAMES[y.region]} \uC601\uC5ED): ${y.appearance} \xB7 \uB4F1\uC7A5 ${y.enter} \xB7 \uC720\uC9C0 ${y.hold} \xB7 \uD1F4\uC7A5 ${y.exit}` + (ev.length ? ` \xB7 \uADFC\uAC70 ${ev.join(", ")}` : ""));
17512
+ }
17513
+ const events = r.events ?? [];
17514
+ lines.push(events.length ? `\uC0AC\uAC74 ${events.length}\uAC1C(\uB0B1\uB9D0 \uBC88\uD638 \u2192 \uC7A5\uCE58 \xB7 \uBCC0\uD654):` : "\uC0AC\uAC74: \uC5C6\uC74C");
17515
+ for (const e of events) {
17516
+ lines.push(` #${e.anchor} ${words[e.anchor]?.text ?? "?"}@${e.at_ms} \u2192 ${e.system} ${e.change}`);
17517
+ }
17518
+ const d = r.dropped;
17519
+ if (d && (d.layouts || d.segments || d.systems || d.events)) {
17520
+ lines.push(`\uCE21\uC815\uACFC \uB9DE\uC9C0 \uC54A\uC544 \uBC84\uB9B0 \uAC83: \uBC30\uCE58 ${d.layouts ?? 0} \xB7 \uAD6C\uAC04 ${d.segments ?? 0} \xB7 \uC7A5\uCE58 ${d.systems ?? 0} \xB7 \uC0AC\uAC74 ${d.events ?? 0}`);
17521
+ }
17522
+ return lines;
17436
17523
  }
17437
17524
  function getVideoAnalysis(a = {}, deps = {}) {
17438
17525
  return guarded(READ_ONLY, async () => {
@@ -17702,19 +17789,20 @@ function getExport(a = {}, deps = {}) {
17702
17789
  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.");
17703
17790
  }
17704
17791
  if (out4.youtube_meta) {
17705
- lines.push(`\uC720\uD29C\uBE0C \uBA54\uD0C0: \u300C${out4.youtube_meta.title}\u300D \xB7 \uD0DC\uADF8 ${out4.youtube_meta.tags?.length ?? 0}\uAC1C \u2014 \uACE0\uCE58\uB824\uBA74 democut_set_youtube_meta.`);
17792
+ lines.push("\uC720\uD29C\uBE0C \uC81C\uBAA9\xB7\uC124\uBA85\xB7\uD0DC\uADF8 \u2014 \uACE0\uCE58\uB824\uBA74 \uC774 \uAC12\uC744 \uACE0\uCCD0 democut_set_youtube_meta \uC5D0 \uB123\uC73C\uC138\uC694:");
17793
+ lines.push(JSON.stringify(out4.youtube_meta));
17706
17794
  } else {
17707
- lines.push("\uC720\uD29C\uBE0C \uBA54\uD0C0\uB294 \uC544\uC9C1 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 democut_generate_youtube_meta(\uC18C\uC561) \uB610\uB294 democut_set_youtube_meta(0\uC6D0).");
17795
+ lines.push("\uC720\uD29C\uBE0C \uC81C\uBAA9\xB7\uC124\uBA85\uC740 \uC544\uC9C1 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 democut_generate_youtube_meta \uB85C \uCD08\uC548\uC744 \uBC1B\uAC70\uB098(\uC18C\uC561) democut_set_youtube_meta \uB85C \uC9C1\uC811 \uB123\uC73C\uC138\uC694(0\uC6D0).");
17708
17796
  }
17709
17797
  if (out4.youtube) {
17710
17798
  lines.push(`\uC720\uD29C\uBE0C\uC5D0 \uC62C\uB77C\uAC14\uC2B5\uB2C8\uB2E4(${out4.youtube.privacy}): ${out4.youtube.url} \u2014 \uB2E4\uC2DC \uC62C\uB9AC\uC9C0 \uB9C8\uC138\uC694(\uB450 \uD3B8\uC774 \uB429\uB2C8\uB2E4).`);
17711
17799
  } else if (out4.youtube_meta) {
17712
- lines.push("\uC720\uD29C\uBE0C\uC5D0 \uC62C\uB9AC\uB824\uBA74 democut_publish_youtube(0\uC6D0, \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uACC4\uC815 \uD544\uC694).");
17800
+ lines.push("\uC720\uD29C\uBE0C\uC5D0 \uC62C\uB9AC\uB824\uBA74 democut_publish_youtube \uB97C \uBD80\uB974\uC138\uC694(0\uC6D0, \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uC5D0 \uC5F0\uACB0\uB41C \uC720\uD29C\uBE0C \uACC4\uC815\uC774 \uD544\uC694\uD569\uB2C8\uB2E4).");
17713
17801
  }
17714
17802
  if (out4.instagram) {
17715
17803
  lines.push(`Instagram \uC5D0 \uC62C\uB77C\uAC14\uC2B5\uB2C8\uB2E4(@${out4.instagram.username}): ${out4.instagram.url} \u2014 \uB2E4\uC2DC \uC62C\uB9AC\uC9C0 \uB9C8\uC138\uC694(\uB450 \uD3B8\uC774 \uB429\uB2C8\uB2E4).`);
17716
17804
  } else if (out4.youtube_meta) {
17717
- lines.push("Instagram \uB9B4\uC2A4\uB85C \uC62C\uB9AC\uB824\uBA74 democut_publish_instagram(0\uC6D0, \uCE90\uB9AD\uD130\uC5D0 \uC5F0\uACB0\uB41C \uACC4\uC815 \uD544\uC694, 3\uCD08~15\uBD84).");
17805
+ lines.push("Instagram \uB9B4\uC2A4\uB85C \uC62C\uB9AC\uB824\uBA74 democut_publish_instagram \uC744 \uBD80\uB974\uC138\uC694(0\uC6D0, \uCE90\uB9AD\uD130\uC5D0 \uC5F0\uACB0\uB41C \uACC4\uC815\uC774 \uD544\uC694\uD558\uACE0 3\uCD08~15\uBD84 \uC601\uC0C1\uB9CC \uB429\uB2C8\uB2E4).");
17718
17806
  }
17719
17807
  lines.push("\uC8FC\uC18C\uB294 1\uC2DC\uAC04 \uB3D9\uC548\uB9CC \uC720\uD6A8\uD569\uB2C8\uB2E4.");
17720
17808
  } else if (["queued", "running"].includes(out4.state)) {
@@ -18604,12 +18692,12 @@ function cleanRegex(source) {
18604
18692
  return source.slice(start, end);
18605
18693
  }
18606
18694
  function floatSafeRemainder(val, step) {
18607
- const ratio = val / step;
18608
- const roundedRatio = Math.round(ratio);
18609
- const tolerance = Number.EPSILON * Math.max(Math.abs(ratio), 1);
18610
- if (Math.abs(ratio - roundedRatio) < tolerance)
18695
+ const ratio2 = val / step;
18696
+ const roundedRatio = Math.round(ratio2);
18697
+ const tolerance = Number.EPSILON * Math.max(Math.abs(ratio2), 1);
18698
+ if (Math.abs(ratio2 - roundedRatio) < tolerance)
18611
18699
  return 0;
18612
- return ratio - roundedRatio;
18700
+ return ratio2 - roundedRatio;
18613
18701
  }
18614
18702
  var EVALUATING = /* @__PURE__ */ Symbol("evaluating");
18615
18703
  function defineLazy(object3, key, getter) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "democut",
3
- "version": "1.0.191",
3
+ "version": "1.0.193",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",