democut 1.0.156 → 1.0.158

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 +261 -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.156";
6919
+ var VERSION = "1.0.158";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -12263,6 +12263,171 @@ var GENERATED_TOOLS = [
12263
12263
  "openWorldHint": false
12264
12264
  }
12265
12265
  },
12266
+ {
12267
+ "name": "democut_estimate_video_analysis",
12268
+ "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.',
12269
+ "inputSchema": {
12270
+ "type": "object",
12271
+ "properties": {
12272
+ "slug": {
12273
+ "type": "string",
12274
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
12275
+ },
12276
+ "source": {
12277
+ "type": "object",
12278
+ "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)"
12279
+ }
12280
+ },
12281
+ "required": [
12282
+ "slug",
12283
+ "source"
12284
+ ],
12285
+ "additionalProperties": false
12286
+ },
12287
+ "outputSchema": {
12288
+ "type": "object",
12289
+ "properties": {
12290
+ "items": {
12291
+ "type": "array"
12292
+ },
12293
+ "notes": {
12294
+ "type": "array"
12295
+ },
12296
+ "total_krw": {
12297
+ "type": "integer"
12298
+ },
12299
+ "rate_version": {
12300
+ "type": "integer"
12301
+ },
12302
+ "balance_krw": {
12303
+ "type": "integer"
12304
+ },
12305
+ "balance_after_krw": {
12306
+ "type": "integer"
12307
+ },
12308
+ "can_afford": {
12309
+ "type": "boolean"
12310
+ },
12311
+ "mock": {
12312
+ "type": "boolean"
12313
+ },
12314
+ "provisional": {
12315
+ "type": "boolean"
12316
+ }
12317
+ },
12318
+ "required": [
12319
+ "total_krw",
12320
+ "rate_version",
12321
+ "balance_krw",
12322
+ "balance_after_krw",
12323
+ "can_afford"
12324
+ ]
12325
+ },
12326
+ "annotations": {
12327
+ "readOnlyHint": false,
12328
+ "destructiveHint": false,
12329
+ "idempotentHint": false,
12330
+ "openWorldHint": false
12331
+ }
12332
+ },
12333
+ {
12334
+ "name": "democut_make_video_analysis",
12335
+ "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.",
12336
+ "inputSchema": {
12337
+ "type": "object",
12338
+ "properties": {
12339
+ "slug": {
12340
+ "type": "string",
12341
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
12342
+ },
12343
+ "source": {
12344
+ "type": "object",
12345
+ "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)"
12346
+ },
12347
+ "confirmed_cost_krw": {
12348
+ "minimum": 0,
12349
+ "type": "integer"
12350
+ },
12351
+ "rate_version": {
12352
+ "minimum": 1,
12353
+ "type": "integer"
12354
+ }
12355
+ },
12356
+ "required": [
12357
+ "slug",
12358
+ "source",
12359
+ "confirmed_cost_krw",
12360
+ "rate_version"
12361
+ ],
12362
+ "additionalProperties": false
12363
+ },
12364
+ "outputSchema": {
12365
+ "type": "object",
12366
+ "properties": {
12367
+ "job_id": {
12368
+ "type": "string"
12369
+ },
12370
+ "quote": {},
12371
+ "next_calls": {
12372
+ "type": "array"
12373
+ }
12374
+ },
12375
+ "required": [
12376
+ "job_id"
12377
+ ]
12378
+ },
12379
+ "annotations": {
12380
+ "readOnlyHint": false,
12381
+ "destructiveHint": false,
12382
+ "idempotentHint": false,
12383
+ "openWorldHint": false
12384
+ }
12385
+ },
12386
+ {
12387
+ "name": "democut_get_video_analysis",
12388
+ "description": "\uD504\uB85C\uC81D\uD2B8\uC758 \uAC00\uC7A5 \uCD5C\uADFC \uC601\uC0C1 \uBD84\uC11D(0\uC6D0). \uC5C6\uC73C\uBA74 state=none.",
12389
+ "inputSchema": {
12390
+ "type": "object",
12391
+ "properties": {
12392
+ "slug": {
12393
+ "type": "string",
12394
+ "description": "\uD504\uB85C\uC81D\uD2B8 \uC2AC\uB7EC\uADF8(democut_list_projects)"
12395
+ }
12396
+ },
12397
+ "required": [
12398
+ "slug"
12399
+ ],
12400
+ "additionalProperties": false
12401
+ },
12402
+ "outputSchema": {
12403
+ "type": "object",
12404
+ "properties": {
12405
+ "state": {
12406
+ "type": "string"
12407
+ },
12408
+ "id": {},
12409
+ "job_id": {},
12410
+ "source": {},
12411
+ "schema_version": {
12412
+ "type": "integer"
12413
+ },
12414
+ "measured": {},
12415
+ "created_at": {},
12416
+ "next_calls": {
12417
+ "type": "array"
12418
+ }
12419
+ },
12420
+ "required": [
12421
+ "state"
12422
+ ]
12423
+ },
12424
+ "annotations": {
12425
+ "readOnlyHint": true,
12426
+ "destructiveHint": false,
12427
+ "idempotentHint": true,
12428
+ "openWorldHint": false
12429
+ }
12430
+ },
12266
12431
  {
12267
12432
  "name": "democut_get_audio_tracks",
12268
12433
  "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.",
@@ -13919,6 +14084,24 @@ var TOOL_META = {
13919
14084
  "method": "POST",
13920
14085
  "path": "/api/projects/{slug}/cuts/{cut_id}/hook_scan/pick"
13921
14086
  },
14087
+ "democut_estimate_video_analysis": {
14088
+ "cost": "quote",
14089
+ "group": "storyboard",
14090
+ "method": "POST",
14091
+ "path": "/api/projects/{slug}/video_analysis/estimate"
14092
+ },
14093
+ "democut_make_video_analysis": {
14094
+ "cost": "charge",
14095
+ "group": "storyboard",
14096
+ "method": "POST",
14097
+ "path": "/api/projects/{slug}/video_analysis"
14098
+ },
14099
+ "democut_get_video_analysis": {
14100
+ "cost": "none",
14101
+ "group": "storyboard",
14102
+ "method": "GET",
14103
+ "path": "/api/projects/{slug}/video_analysis"
14104
+ },
13922
14105
  "democut_get_audio_tracks": {
13923
14106
  "cost": "none",
13924
14107
  "group": "storyboard",
@@ -16726,6 +16909,77 @@ function estimateHookScan(a = {}, deps = {}) {
16726
16909
  return { text: lines.join("\n"), structured: callableStructured(out4) };
16727
16910
  });
16728
16911
  }
16912
+ var analysisPath = (slug, tail = "") => `/api/projects/${encodeURIComponent(slug)}/video_analysis${tail}`;
16913
+ function estimateVideoAnalysis(a = {}, deps = {}) {
16914
+ return guarded(READ_ONLY, async () => {
16915
+ const slug = needSlug(a);
16916
+ if (typeof slug !== "string") return slug;
16917
+ const base = resolveBaseUrl(deps.baseUrl);
16918
+ const out4 = await apiRequest(
16919
+ base,
16920
+ analysisPath(slug, "/estimate"),
16921
+ { method: "POST", body: { source: a.source } },
16922
+ deps
16923
+ );
16924
+ const rows = (out4.items ?? []).flatMap((item) => item.rows ?? []).map((r) => `${r.display_name || r.key} ${krw(r.krw)}`).join(", ") || "\uD589 \uC5C6\uC74C";
16925
+ const lines = [
16926
+ `\uC601\uC0C1 \uCE21\uC815 \uACAC\uC801 (\uC694\uC728 v${out4.rate_version}) \u2014 \uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4`,
16927
+ ` ${rows}`,
16928
+ `\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)}`,
16929
+ "\uC18C\uB9AC \uD2B8\uB799\uC774 \uC5C6\uB294 \uC601\uC0C1\uC774\uBA74 \uC804\uC0AC \uD589\uC740 \uD658\uBD88\uB429\uB2C8\uB2E4.",
16930
+ 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.",
16931
+ "\uC774 total_krw \uB97C confirmed_cost_krw \uC5D0, rate_version \uC744 **\uADF8\uB300\uB85C** democut_make_video_analysis \uC5D0 \uB123\uC73C\uC138\uC694."
16932
+ ];
16933
+ if (out4.mock) lines.push("(mock \uB2E8\uAC00\uC785\uB2C8\uB2E4 \u2014 \uC2E4\uC81C \uCCAD\uAD6C\uC640 \uB2E4\uB97C \uC218 \uC788\uC2B5\uB2C8\uB2E4.)");
16934
+ return { text: lines.join("\n"), structured: callableStructured(out4) };
16935
+ });
16936
+ }
16937
+ function makeVideoAnalysis(a = {}, deps = {}) {
16938
+ return guarded(SUBMITTING, async () => {
16939
+ const slug = needSlug(a);
16940
+ if (typeof slug !== "string") return slug;
16941
+ const base = resolveBaseUrl(deps.baseUrl);
16942
+ const out4 = await apiRequest(
16943
+ base,
16944
+ analysisPath(slug),
16945
+ { method: "POST", body: { source: a.source, confirmed_cost_krw: a.confirmed_cost_krw, rate_version: a.rate_version } },
16946
+ deps
16947
+ );
16948
+ 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.
16949
+ \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs, democut_get_video_analysis`;
16950
+ return { text, structured: callableStructured(out4) };
16951
+ });
16952
+ }
16953
+ function formatAnalysis(view) {
16954
+ if (view.state === "none") return "\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0\uB294 \uC601\uC0C1 \uBD84\uC11D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. democut_estimate_video_analysis \uB85C \uC2DC\uC791\uD558\uC138\uC694.";
16955
+ if (view.state === "measuring") return `\uCE21\uC815 \uC911\uC785\uB2C8\uB2E4 \u2014 ${view.job_id}. democut_wait_jobs \uB85C \uAE30\uB2E4\uB9AC\uC138\uC694.`;
16956
+ const m = view.measured;
16957
+ if (view.state === "failed" || !m) return `\uCE21\uC815\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 \u2014 ${view.job_id}. \uCCAD\uAD6C\uC561\uC740 \uD658\uBD88\uB429\uB2C8\uB2E4.`;
16958
+ const lines = [
16959
+ `\uC601\uC0C1 \uCE21\uC815 ${view.id}: ${m.duration_ms}ms \xB7 ${m.width}x${m.height} \xB7 \uC5B8\uC5B4 ${m.language || "\uC5C6\uC74C"}`,
16960
+ `\uC7A5\uBA74 ${m.shots.length}\uAC1C:`,
16961
+ ...m.shots.map((s) => ` ${s.start_ms}-${s.end_ms}`),
16962
+ `\uB300\uC0AC: ${m.words.map((w) => `${w.text}@${w.start_ms}`).join(" ") || "\uC5C6\uC74C"}`,
16963
+ `\uD504\uB808\uC784 \uACA9\uC790 ${m.sheets.length}\uC7A5(\uC67C\uCABD \uC704\uBD80\uD130 \uAC00\uB85C\uB85C \uC77D\uB294\uB2E4):`,
16964
+ ...m.sheets.map((s) => ` ${s.url || s.asset_id} \xB7 \uCE78 \uC2DC\uAC01 ${JSON.stringify(s.cells_ms)}`)
16965
+ ];
16966
+ if (m.audio.has_audio) {
16967
+ const silences = m.audio.silences.map((s) => `${s.start_ms}-${s.end_ms}`).join(", ");
16968
+ lines.push(`\uBB34\uC74C: ${silences || "\uC5C6\uC74C"}`, `\uC74C\uB7C9(LUFS, ${m.audio.step_ms}ms \uAC04\uACA9): ${JSON.stringify(m.audio.loudness_lufs)}`);
16969
+ } else {
16970
+ lines.push("\uC18C\uB9AC \uD2B8\uB799\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uC804\uC0AC \uAE08\uC561\uC740 \uD658\uBD88\uB429\uB2C8\uB2E4.");
16971
+ }
16972
+ return lines.join("\n");
16973
+ }
16974
+ function getVideoAnalysis(a = {}, deps = {}) {
16975
+ return guarded(READ_ONLY, async () => {
16976
+ const slug = needSlug(a);
16977
+ if (typeof slug !== "string") return slug;
16978
+ const base = resolveBaseUrl(deps.baseUrl);
16979
+ const out4 = await apiRequest(base, analysisPath(slug), {}, deps);
16980
+ return { text: formatAnalysis(out4), structured: callableStructured(out4) };
16981
+ });
16982
+ }
16729
16983
  function makeHookScan(a = {}, deps = {}) {
16730
16984
  return guarded(SUBMITTING, async () => {
16731
16985
  const slug = needSlug(a);
@@ -17269,6 +17523,12 @@ function dispatch(name, args, deps = {}) {
17269
17523
  return download(args, deps);
17270
17524
  case "democut_download_project":
17271
17525
  return downloadProject(args, deps);
17526
+ case "democut_estimate_video_analysis":
17527
+ return estimateVideoAnalysis(args, deps);
17528
+ case "democut_make_video_analysis":
17529
+ return makeVideoAnalysis(args, deps);
17530
+ case "democut_get_video_analysis":
17531
+ return getVideoAnalysis(args, deps);
17272
17532
  case "democut_estimate_hook_scan":
17273
17533
  return estimateHookScan(args, deps);
17274
17534
  case "democut_make_hook_scan":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "democut",
3
- "version": "1.0.156",
3
+ "version": "1.0.158",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",