democut 1.0.191 → 1.0.192

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 +104 -20
  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.192";
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"
@@ -17381,15 +17408,16 @@ function estimateVideoAnalysis(a = {}, deps = {}) {
17381
17408
  const out4 = await apiRequest(
17382
17409
  base,
17383
17410
  analysisPath(slug, "/estimate"),
17384
- { method: "POST", body: { source: a.source } },
17411
+ { method: "POST", body: { stage: a.stage, source: a.source } },
17385
17412
  deps
17386
17413
  );
17414
+ const reading = a.stage === "read";
17387
17415
  const rows = (out4.items ?? []).flatMap((item) => item.rows ?? []).map((r) => `${r.display_name || r.key} ${krw(r.krw)}`).join(", ") || "\uD589 \uC5C6\uC74C";
17388
17416
  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`,
17417
+ `\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
17418
  ` ${rows}`,
17391
17419
  `\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.",
17420
+ 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
17421
  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
17422
  "\uC774 total_krw \uB97C confirmed_cost_krw \uC5D0, rate_version \uC744 **\uADF8\uB300\uB85C** democut_make_video_analysis \uC5D0 \uB123\uC73C\uC138\uC694."
17395
17423
  ];
@@ -17405,10 +17433,14 @@ function makeVideoAnalysis(a = {}, deps = {}) {
17405
17433
  const out4 = await apiRequest(
17406
17434
  base,
17407
17435
  analysisPath(slug),
17408
- { method: "POST", body: { source: a.source, confirmed_cost_krw: a.confirmed_cost_krw, rate_version: a.rate_version } },
17436
+ {
17437
+ method: "POST",
17438
+ body: { stage: a.stage, source: a.source, confirmed_cost_krw: a.confirmed_cost_krw, rate_version: a.rate_version }
17439
+ },
17409
17440
  deps
17410
17441
  );
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.
17442
+ 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";
17443
+ 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
17444
  \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs, democut_get_video_analysis`;
17413
17445
  return { text, structured: callableStructured(out4) };
17414
17446
  });
@@ -17432,7 +17464,59 @@ function formatAnalysis(view) {
17432
17464
  } else {
17433
17465
  lines.push("\uC18C\uB9AC \uD2B8\uB799\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uC804\uC0AC \uAE08\uC561\uC740 \uD658\uBD88\uB429\uB2C8\uB2E4.");
17434
17466
  }
17435
- return lines.join("\n");
17467
+ return [...lines, ...formatReading(view)].join("\n");
17468
+ }
17469
+ var REGION_NAMES = { presenter: "\uC9C4\uD589\uC790", graphic: "\uADF8\uB798\uD53D", footage: "\uC2E4\uC0AC \uC601\uC0C1", caption: "\uC790\uB9C9" };
17470
+ var TONE_NAMES = { light: "\uBC1D\uC740 \uBC14\uD0D5", dark: "\uC5B4\uB450\uC6B4 \uBC14\uD0D5" };
17471
+ var WEIGHT_NAMES = { regular: "\uBCF4\uD1B5", bold: "\uAD75\uAC8C", heavy: "\uC544\uC8FC \uAD75\uAC8C" };
17472
+ var RADIUS_NAMES = { none: "\uAC01\uC9C4", small: "\uC870\uAE08 \uB465\uADFC", large: "\uB9CE\uC774 \uB465\uADFC" };
17473
+ var ratio = (v) => (Math.floor(v * 100 + 0.5) / 100).toFixed(2);
17474
+ function formatReading(view) {
17475
+ const state = view.reading_state ?? "none";
17476
+ const head = {
17477
+ 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.",
17478
+ reading: `\uD574\uC11D \uC911\uC785\uB2C8\uB2E4: ${view.reading_job_id}. democut_wait_jobs \uB85C \uAE30\uB2E4\uB9AC\uC138\uC694.`,
17479
+ failed: "\uB9C8\uC9C0\uB9C9 \uD574\uC11D\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uCCAD\uAD6C\uC561\uC740 \uD658\uBD88\uB429\uB2C8\uB2E4.",
17480
+ read: "\uD574\uC11D:"
17481
+ }[state];
17482
+ const r = view.reading;
17483
+ if (!r) return ["", head];
17484
+ const words = view.measured?.words ?? [];
17485
+ const look = r.look;
17486
+ 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";
17487
+ const evidence = look.evidence ?? [];
17488
+ const sizes = look.text_sizes ?? [];
17489
+ const lines = [
17490
+ "",
17491
+ state === "failed" ? `${head} \uC544\uB798\uB294 \uADF8 \uC804 \uD574\uC11D\uC785\uB2C8\uB2E4.` : head,
17492
+ `\uC694\uC57D: ${r.summary || "\uC5C6\uC74C"}`,
17493
+ `\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(", ")}` : ""),
17494
+ `\uBC30\uCE58 ${r.layouts.length}\uAC1C(x \xB7 y \xB7 w \xB7 h \uB294 \uD654\uBA74 \uBE44\uC728):`
17495
+ ];
17496
+ for (const layout of r.layouts) {
17497
+ 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(" / ");
17498
+ lines.push(` ${layout.id}: ${regions}` + (layout.outside_color ? ` \xB7 \uC601\uC5ED \uBC16 ${layout.outside_color}` : ""));
17499
+ }
17500
+ lines.push(`\uAD6C\uAC04 ${r.segments.length}\uAC1C:`);
17501
+ for (const s of r.segments) {
17502
+ 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}`);
17503
+ }
17504
+ const systems = r.systems ?? [];
17505
+ lines.push(systems.length ? `\uC7A5\uCE58 ${systems.length}\uAC1C:` : "\uC7A5\uCE58: \uC5C6\uC74C");
17506
+ for (const y of systems) {
17507
+ const ev = y.evidence ?? [];
17508
+ 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(", ")}` : ""));
17509
+ }
17510
+ const events = r.events ?? [];
17511
+ lines.push(events.length ? `\uC0AC\uAC74 ${events.length}\uAC1C(\uB0B1\uB9D0 \uBC88\uD638 \u2192 \uC7A5\uCE58 \xB7 \uBCC0\uD654):` : "\uC0AC\uAC74: \uC5C6\uC74C");
17512
+ for (const e of events) {
17513
+ lines.push(` #${e.anchor} ${words[e.anchor]?.text ?? "?"}@${e.at_ms} \u2192 ${e.system} ${e.change}`);
17514
+ }
17515
+ const d = r.dropped;
17516
+ if (d && (d.layouts || d.segments || d.systems || d.events)) {
17517
+ 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}`);
17518
+ }
17519
+ return lines;
17436
17520
  }
17437
17521
  function getVideoAnalysis(a = {}, deps = {}) {
17438
17522
  return guarded(READ_ONLY, async () => {
@@ -18604,12 +18688,12 @@ function cleanRegex(source) {
18604
18688
  return source.slice(start, end);
18605
18689
  }
18606
18690
  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)
18691
+ const ratio2 = val / step;
18692
+ const roundedRatio = Math.round(ratio2);
18693
+ const tolerance = Number.EPSILON * Math.max(Math.abs(ratio2), 1);
18694
+ if (Math.abs(ratio2 - roundedRatio) < tolerance)
18611
18695
  return 0;
18612
- return ratio - roundedRatio;
18696
+ return ratio2 - roundedRatio;
18613
18697
  }
18614
18698
  var EVALUATING = /* @__PURE__ */ Symbol("evaluating");
18615
18699
  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.192",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",