democut 1.0.40 → 1.0.47

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 (3) hide show
  1. package/README.md +6 -4
  2. package/dist/cli.js +621 -36
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -254,11 +254,13 @@ visibility: "private"`) 이 레포는 private 이다. CI 설정으로 우회할
254
254
 
255
255
  ### 선행 설정 (1회)
256
256
 
257
- npm **Automation token** 을 발급해(2FA 를 우회하도록 설계된 종류다) GitLab CI/CD 변수
258
- `NPM_TOKEN` 에 **masked + protected** 로 넣는다. 토큰이 없으면 잡이 명확한 메시지로 실패한다.
257
+ 게시는 **trusted publishing(OIDC)** 으로만 한다 — 장수명 토큰이 없다. npmjs.com 의 `democut` 패키지
258
+ 설정에서 **신뢰 게시자**를 이 GitLab 프로젝트(namespace/project/CI 파일 경로)로 등록해 두면, 잡의
259
+ `id_tokens: NPM_ID_TOKEN`(aud `npm:registry.npmjs.org`)을 npm 이 자동으로 쓴다. GitLab.com 공유 러너에서만
260
+ 동작하고 npm 11.5.1+ 이 필요하다(잡 이미지 `node:24`).
259
261
 
260
- > **토큰을 코드나 대화에 넣지 않는다.** 값은 GitLab 변수에만 두고, 레포에도 로컬 파일에도
261
- > 남기지 않는다.
262
+ > `NPM_TOKEN` 변수는 두지 않는다(2026-09-26 폐기). 남아 있어도 게시 스크립트가 쓰지 않고 경고한다.
263
+ > 옛 토큰을 정리할 때도 값을 코드·문서·대화·로컬 파일에 옮기지 않는다 — npmjs.com 에서 토큰 자체를 폐기한다.
262
264
 
263
265
  ### 수동 게시 (긴급시)
264
266
 
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.40";
6919
+ var VERSION = "1.0.47";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -8309,6 +8309,9 @@ var GENERATED_TOOLS = [
8309
8309
  "video_providers": {
8310
8310
  "type": "array"
8311
8311
  },
8312
+ "video_models": {
8313
+ "type": "array"
8314
+ },
8312
8315
  "image_models": {
8313
8316
  "type": "array"
8314
8317
  },
@@ -8685,7 +8688,39 @@ var GENERATED_TOOLS = [
8685
8688
  }
8686
8689
  ],
8687
8690
  "default": null,
8688
- "description": "\uC601\uC0C1 \uC0DD\uC131 \uACF5\uAE09\uC790(\uC608: minimax). \uBE44\uC6B0\uBA74 \uC11C\uBC84 \uAE30\uBCF8\uAC12 \u2014 \uC4F8 \uC218 \uC788\uB294 \uBAA9\uB85D\uC740 GET \u2026/options \uC758 video_providers[].name"
8691
+ "description": "\uC601\uC0C1 \uC0DD\uC131 \uACF5\uAE09\uC790(\uC608: minimax) \u2014 video_model \uC744 \uC8FC\uBA74 \uBE44\uC6CC \uB454\uB2E4(\uBAA8\uB378\uC774 \uACF5\uAE09\uC790\uB97C \uC815\uD55C\uB2E4). \uACF5\uAE09\uC790\uB9CC \uC8FC\uBA74 \uADF8 \uACF5\uAE09\uC790\uC758 \uAE30\uBCF8 \uBAA8\uB378. \uBAA9\uB85D\uC740 GET \u2026/options \uC758 video_providers[].name"
8692
+ },
8693
+ "video_model": {
8694
+ "anyOf": [
8695
+ {
8696
+ "maxLength": 64,
8697
+ "minLength": 1,
8698
+ "type": "string"
8699
+ },
8700
+ {
8701
+ "type": "null"
8702
+ }
8703
+ ],
8704
+ "default": null,
8705
+ "description": "\uC601\uC0C1 \uC0DD\uC131 \uBAA8\uB378(\uC608: seedance-2.0-fast). \uBE44\uC6B0\uBA74 provider \uC758 \uAE30\uBCF8 \uBAA8\uB378 \u2014 \uBAA9\uB85D\uC740 GET \u2026/options \uC758 video_models[].name"
8706
+ },
8707
+ "video_resolution": {
8708
+ "anyOf": [
8709
+ {
8710
+ "enum": [
8711
+ "480p",
8712
+ "720p",
8713
+ "1080p",
8714
+ "4k"
8715
+ ],
8716
+ "type": "string"
8717
+ },
8718
+ {
8719
+ "type": "null"
8720
+ }
8721
+ ],
8722
+ "default": null,
8723
+ "description": "\uC601\uC0C1 \uC0DD\uC131 \uD574\uC0C1\uB3C4. \uBE44\uC6B0\uBA74 \uD504\uB85C\uC81D\uD2B8 \uD574\uC0C1\uB3C4(\uADF8 \uBAA8\uB378\uC774 \uBABB \uB9CC\uB4E4\uBA74 \uADF8\uBCF4\uB2E4 \uC791\uC740 \uAC83 \uC911 \uAC00\uC7A5 \uD070 \uAC83). \uBAA8\uB378\uC774 \uB9CC\uB4DC\uB294 \uAC12\uB9CC \u2014 video_models[].resolutions. \uC644\uC131\uBCF8\uC740 \uD504\uB85C\uC81D\uD2B8 \uD574\uC0C1\uB3C4\uB85C \uB9DE\uCD98\uB2E4"
8689
8724
  },
8690
8725
  "seed": {
8691
8726
  "anyOf": [
@@ -9611,7 +9646,39 @@ var GENERATED_TOOLS = [
9611
9646
  }
9612
9647
  ],
9613
9648
  "default": null,
9614
- "description": "\uC601\uC0C1 \uC0DD\uC131 \uACF5\uAE09\uC790(\uC608: minimax). \uBE44\uC6B0\uBA74 \uC11C\uBC84 \uAE30\uBCF8\uAC12 \u2014 \uC4F8 \uC218 \uC788\uB294 \uBAA9\uB85D\uC740 GET \u2026/options \uC758 video_providers[].name"
9649
+ "description": "\uC601\uC0C1 \uC0DD\uC131 \uACF5\uAE09\uC790(\uC608: minimax) \u2014 video_model \uC744 \uC8FC\uBA74 \uBE44\uC6CC \uB454\uB2E4(\uBAA8\uB378\uC774 \uACF5\uAE09\uC790\uB97C \uC815\uD55C\uB2E4). \uACF5\uAE09\uC790\uB9CC \uC8FC\uBA74 \uADF8 \uACF5\uAE09\uC790\uC758 \uAE30\uBCF8 \uBAA8\uB378. \uBAA9\uB85D\uC740 GET \u2026/options \uC758 video_providers[].name"
9650
+ },
9651
+ "video_model": {
9652
+ "anyOf": [
9653
+ {
9654
+ "maxLength": 64,
9655
+ "minLength": 1,
9656
+ "type": "string"
9657
+ },
9658
+ {
9659
+ "type": "null"
9660
+ }
9661
+ ],
9662
+ "default": null,
9663
+ "description": "\uC601\uC0C1 \uC0DD\uC131 \uBAA8\uB378(\uC608: seedance-2.0-fast). \uBE44\uC6B0\uBA74 provider \uC758 \uAE30\uBCF8 \uBAA8\uB378 \u2014 \uBAA9\uB85D\uC740 GET \u2026/options \uC758 video_models[].name"
9664
+ },
9665
+ "video_resolution": {
9666
+ "anyOf": [
9667
+ {
9668
+ "enum": [
9669
+ "480p",
9670
+ "720p",
9671
+ "1080p",
9672
+ "4k"
9673
+ ],
9674
+ "type": "string"
9675
+ },
9676
+ {
9677
+ "type": "null"
9678
+ }
9679
+ ],
9680
+ "default": null,
9681
+ "description": "\uC601\uC0C1 \uC0DD\uC131 \uD574\uC0C1\uB3C4. \uBE44\uC6B0\uBA74 \uD504\uB85C\uC81D\uD2B8 \uD574\uC0C1\uB3C4(\uADF8 \uBAA8\uB378\uC774 \uBABB \uB9CC\uB4E4\uBA74 \uADF8\uBCF4\uB2E4 \uC791\uC740 \uAC83 \uC911 \uAC00\uC7A5 \uD070 \uAC83). \uBAA8\uB378\uC774 \uB9CC\uB4DC\uB294 \uAC12\uB9CC \u2014 video_models[].resolutions. \uC644\uC131\uBCF8\uC740 \uD504\uB85C\uC81D\uD2B8 \uD574\uC0C1\uB3C4\uB85C \uB9DE\uCD98\uB2E4"
9615
9682
  },
9616
9683
  "seed": {
9617
9684
  "anyOf": [
@@ -10274,7 +10341,7 @@ var GENERATED_TOOLS = [
10274
10341
  },
10275
10342
  {
10276
10343
  "name": "democut_wait_jobs",
10277
- "description": "\uC7A1\uC774 \uB05D\uB0A0 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9B0\uB2E4(\uC694\uCCAD\uD55C \uBAA8\uB4E0 id \uC758 \uC2A4\uB0C5\uC0F7 + all_done). all_done=false \uBA74 \uC544\uC9C1 \uC548 \uB05D\uB09C id \uB9CC \uAC19\uC740 \uB3C4\uAD6C\uB85C \uB2E4\uC2DC \uBD80\uB978\uB2E4. \uB05D\uB09C \uC7A1\uC758 result.download \uB85C \uBC14\uB85C \uB0B4\uB824\uBC1B\uB294\uB2E4. state=error \uC778 \uC7A1\uC740 \uC0B0\uCD9C\uBB3C\uC774 \uC5C6\uB2E4 \u2014 error.message \uAC00 \uC0AC\uC720, error.hint \uAC00 \uB2E4\uC74C \uD589\uB3D9, refunded_krw \uAC00 \uD658\uBD88\uC561\uC774\uB2C8 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC54C\uB9B0\uB2E4. job_ids\xB7batch_id\xB7project \uC911 \uD558\uB098\uB294 \uC788\uC5B4\uC57C \uD55C\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_download, democut_get_cut.",
10344
+ "description": "\uC7A1\uC774 \uB05D\uB0A0 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9B0\uB2E4(\uC694\uCCAD\uD55C \uBAA8\uB4E0 id \uC758 \uC2A4\uB0C5\uC0F7 + all_done). all_done=false \uBA74 \uC544\uC9C1 \uC548 \uB05D\uB09C id \uB9CC \uAC19\uC740 \uB3C4\uAD6C\uB85C \uB2E4\uC2DC \uBD80\uB978\uB2E4. \uB05D\uB09C \uC7A1\uC758 result.cut_id\xB7result.version \uC744 democut_download \uC5D0 \uADF8\uB300\uB85C \uB123\uC5B4\uB77C \u2014 \uADF8 \uB458\uC774 democut_download \uC758 \uACBD\uB85C \uC778\uC790\uB77C **\uB0B4\uB824\uBC1B\uAE30 \uC804\uC5D0** democut_get_cut \uC744 \uAC70\uCE60 \uD544\uC694\uAC00 \uC5C6\uB2E4(\uC644\uC131\uBCF8\uC740 result.export_number). democut_get_cut \uC740 \uBC84\uC804 \uBAA9\uB85D\uC774\uB098 \uC2E4\uD328 \uC0AC\uC720\uB97C \uBCFC \uB54C \uC4F4\uB2E4. state=error \uC778 \uC7A1\uC740 \uC0B0\uCD9C\uBB3C\uC774 \uC5C6\uB2E4 \u2014 error.message \uAC00 \uC0AC\uC720, error.hint \uAC00 \uB2E4\uC74C \uD589\uB3D9, refunded_krw \uAC00 \uD658\uBD88\uC561\uC774\uB2C8 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC54C\uB9B0\uB2E4. job_ids\xB7batch_id\xB7project \uC911 \uD558\uB098\uB294 \uC788\uC5B4\uC57C \uD55C\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_download, democut_get_cut.",
10278
10345
  "inputSchema": {
10279
10346
  "type": "object",
10280
10347
  "properties": {
@@ -11332,10 +11399,6 @@ var GENERATED_TOOLS = [
11332
11399
  "minLength": 1,
11333
11400
  "type": "string"
11334
11401
  },
11335
- "role": {
11336
- "default": "",
11337
- "type": "string"
11338
- },
11339
11402
  "voice_id": {
11340
11403
  "anyOf": [
11341
11404
  {
@@ -11349,10 +11412,12 @@ var GENERATED_TOOLS = [
11349
11412
  },
11350
11413
  "persona_text": {
11351
11414
  "default": "",
11415
+ "description": "\uC131\uACA9\xB7\uB9D0\uD22C \u2014 \uC774 \uC544\uBC14\uD0C0\uAC00 \uB098\uC624\uB294 \uC601\uC0C1\uC5D0 \uBC18\uC601\uB41C\uB2E4(\uB9BD\uC2F1\uD06C\uC758 \uD45C\uC815\xB7\uBAB8\uC9D3\xB7\uB9D0\uD558\uB294 \uBD84\uC704\uAE30, \uCC38\uACE0 \uC778\uBB3C\uB85C \uACE0\uB978 AI \uC601\uC0C1\uC758 \uD0DC\uB3C4)",
11352
11416
  "type": "string"
11353
11417
  },
11354
11418
  "look_text": {
11355
11419
  "default": "",
11420
+ "description": "\uC678\uBAA8(\uC131\uBCC4\xB7\uB098\uC774\xB7\uBA38\uB9AC\xB7\uC637 \uB4F1). \uC11C\uBC84\uB294 \uC774 \uCE78\uC744 \uC77D\uC9C0 \uC54A\uB294\uB2E4 \u2014 AI \uC0AC\uC9C4\uC740 make_character_photo \uC758 prompt \uC5D0 \uC678\uBAA8\uB97C \uC9C1\uC811 \uB123\uB294\uB2E4",
11356
11421
  "type": "string"
11357
11422
  }
11358
11423
  },
@@ -11373,9 +11438,6 @@ var GENERATED_TOOLS = [
11373
11438
  "name": {
11374
11439
  "type": "string"
11375
11440
  },
11376
- "role": {
11377
- "type": "string"
11378
- },
11379
11441
  "voice_id": {},
11380
11442
  "persona_text": {
11381
11443
  "type": "string"
@@ -11440,9 +11502,6 @@ var GENERATED_TOOLS = [
11440
11502
  "name": {
11441
11503
  "type": "string"
11442
11504
  },
11443
- "role": {
11444
- "type": "string"
11445
- },
11446
11505
  "voice_id": {},
11447
11506
  "persona_text": {
11448
11507
  "type": "string"
@@ -11494,10 +11553,6 @@ var GENERATED_TOOLS = [
11494
11553
  "minLength": 1,
11495
11554
  "type": "string"
11496
11555
  },
11497
- "role": {
11498
- "default": "",
11499
- "type": "string"
11500
- },
11501
11556
  "voice_id": {
11502
11557
  "anyOf": [
11503
11558
  {
@@ -11511,10 +11566,12 @@ var GENERATED_TOOLS = [
11511
11566
  },
11512
11567
  "persona_text": {
11513
11568
  "default": "",
11569
+ "description": "\uC131\uACA9\xB7\uB9D0\uD22C \u2014 \uC774 \uC544\uBC14\uD0C0\uAC00 \uB098\uC624\uB294 \uC601\uC0C1\uC5D0 \uBC18\uC601\uB41C\uB2E4(\uB9BD\uC2F1\uD06C\uC758 \uD45C\uC815\xB7\uBAB8\uC9D3\xB7\uB9D0\uD558\uB294 \uBD84\uC704\uAE30, \uCC38\uACE0 \uC778\uBB3C\uB85C \uACE0\uB978 AI \uC601\uC0C1\uC758 \uD0DC\uB3C4)",
11514
11570
  "type": "string"
11515
11571
  },
11516
11572
  "look_text": {
11517
11573
  "default": "",
11574
+ "description": "\uC678\uBAA8(\uC131\uBCC4\xB7\uB098\uC774\xB7\uBA38\uB9AC\xB7\uC637 \uB4F1). \uC11C\uBC84\uB294 \uC774 \uCE78\uC744 \uC77D\uC9C0 \uC54A\uB294\uB2E4 \u2014 AI \uC0AC\uC9C4\uC740 make_character_photo \uC758 prompt \uC5D0 \uC678\uBAA8\uB97C \uC9C1\uC811 \uB123\uB294\uB2E4",
11518
11575
  "type": "string"
11519
11576
  },
11520
11577
  "rev": {
@@ -11542,9 +11599,6 @@ var GENERATED_TOOLS = [
11542
11599
  "name": {
11543
11600
  "type": "string"
11544
11601
  },
11545
- "role": {
11546
- "type": "string"
11547
- },
11548
11602
  "voice_id": {},
11549
11603
  "persona_text": {
11550
11604
  "type": "string"
@@ -11614,7 +11668,7 @@ var GENERATED_TOOLS = [
11614
11668
  },
11615
11669
  {
11616
11670
  "name": "democut_add_character_photo",
11617
- "description": "\uC62C\uB9B0 \uC774\uBBF8\uC9C0\uB97C \uC0AC\uC9C4 \uD310\uC73C\uB85C \uCD94\uAC00\uD55C\uB2E4(0\uC6D0). \uC18C\uAE09 \uC5C6\uC74C.",
11671
+ "description": "\uC62C\uB9B0 \uC774\uBBF8\uC9C0\uB97C \uC0AC\uC9C4 \uD310\uC73C\uB85C \uCD94\uAC00\uD55C\uB2E4(0\uC6D0). \uC0C8 \uC0AC\uC9C4\uC774 \uB300\uD45C\uAC00 \uB41C\uB2E4. \uC18C\uAE09 \uC5C6\uC74C.",
11618
11672
  "inputSchema": {
11619
11673
  "type": "object",
11620
11674
  "properties": {
@@ -11655,9 +11709,6 @@ var GENERATED_TOOLS = [
11655
11709
  "name": {
11656
11710
  "type": "string"
11657
11711
  },
11658
- "role": {
11659
- "type": "string"
11660
- },
11661
11712
  "voice_id": {},
11662
11713
  "persona_text": {
11663
11714
  "type": "string"
@@ -11726,9 +11777,6 @@ var GENERATED_TOOLS = [
11726
11777
  "name": {
11727
11778
  "type": "string"
11728
11779
  },
11729
- "role": {
11730
- "type": "string"
11731
- },
11732
11780
  "voice_id": {},
11733
11781
  "persona_text": {
11734
11782
  "type": "string"
@@ -11767,7 +11815,7 @@ var GENERATED_TOOLS = [
11767
11815
  },
11768
11816
  {
11769
11817
  "name": "democut_estimate_character_photo",
11770
- "description": "\uC544\uBC14\uD0C0 \uC0AC\uC9C4 AI \uC0DD\uC131 \uACAC\uC801(0\uC6D0). \uAE08\uC561\uC740 \uC0C1\uD55C\uC774\uACE0 \uC2E4\uCE21\uC73C\uB85C \uCC28\uC561\uC744 \uB3CC\uB824\uC900\uB2E4.",
11818
+ "description": "\uC544\uBC14\uD0C0 \uC0AC\uC9C4 AI \uC0DD\uC131 \uACAC\uC801(0\uC6D0). \uD589\uC740 \uC0AC\uC9C4\uACFC \uCE90\uB9AD\uD130 \uC2DC\uD2B8(\uAC19\uC740 \uC7A1\uC5D0\uC11C \uB9CC\uB4E0\uB2E4) \uBAAB\uC774\uB2E4. \uAE08\uC561\uC740 \uC0C1\uD55C\uC774\uACE0 \uC2E4\uCE21\uC73C\uB85C \uCC28\uC561\uC744 \uB3CC\uB824\uC900\uB2E4.",
11771
11819
  "inputSchema": {
11772
11820
  "type": "object",
11773
11821
  "properties": {
@@ -11862,7 +11910,7 @@ var GENERATED_TOOLS = [
11862
11910
  },
11863
11911
  {
11864
11912
  "name": "democut_make_character_photo",
11865
- "description": "\uC544\uBC14\uD0C0 \uC0AC\uC9C4\uC744 AI \uB85C \uB9CC\uB4E0\uB2E4(\uCCAD\uAD6C\xB7\uC0C1\uD55C). \uCCAB \uC0AC\uC9C4\uC774\uBA74 \uB300\uD45C\uAC00 \uB41C\uB2E4. \uD06C\uAE30\uB294 \uC815\uC0AC\uAC01 \uACE0\uC815. \uB3C8\uC774 \uB098\uAC00\uB294 \uB3C4\uAD6C\uB2E4: estimate_cuts(\uB610\uB294 \uC9DD\uC774 \uB418\uB294 estimate \uB3C4\uAD6C)\uB85C \uAE08\uC561\uC744 \uBCF4\uACE0 \uC0AC\uC6A9\uC790 \uB3D9\uC758\uB97C \uBC1B\uC740 \uB4A4 confirmed_*_krw \uC640 rate_version \uC744 \uADF8\uB300\uB85C \uB123\uC5B4\uB77C. \uC5B4\uAE0B\uB098\uBA74 409 QUOTE_MISMATCH \uB85C \uC0C8 \uACAC\uC801\uC744 \uC900\uB2E4(\uACFC\uAE08 \uC5C6\uC74C). \uC2E4\uD328\uD574\uB3C4 \uC7AC\uC81C\uCD9C\uD558\uC9C0 \uB9C8\uB77C \u2014 \uAC19\uC740 spec \uC774 \uD65C\uC131\uC774\uBA74 \uC11C\uBC84\uAC00 \uAE30\uC874 \uC7A1\uC744 \uB3CC\uB824\uC900\uB2E4(deduplicated=true). \uC751\uB2F5\uC740 202 \u2014 \uACB0\uACFC\uB294 democut_wait_jobs \uB85C \uBC1B\uB294\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs.",
11913
+ "description": "\uC544\uBC14\uD0C0 \uC0AC\uC9C4\uC744 AI \uB85C \uB9CC\uB4E0\uB2E4(\uCCAD\uAD6C\xB7\uC0C1\uD55C). \uCE90\uB9AD\uD130 \uC2DC\uD2B8\uB3C4 \uAC19\uC740 \uC7A1\uC5D0\uC11C \uB9CC\uB4E4\uC5B4 \uADF8 \uC0AC\uC9C4\uC5D0 \uB2E8\uB2E4. \uB9CC\uB4E0 \uC0AC\uC9C4\uC774 \uB300\uD45C\uAC00 \uB41C\uB2E4. \uD06C\uAE30\uB294 \uC815\uC0AC\uAC01 \uACE0\uC815. prompt \uC5D0\uB294 \uB204\uAD6C\uC778\uC9C0(\uB098\uC774\xB7\uC131\uBCC4\xB7\uCD9C\uC2E0\xB7\uBA38\uB9AC\xB7\uC637 \uB4F1)\uB97C \uC801\uB294\uB2E4 \u2014 \uC0AC\uC2E4\uC801\uC778 \uC778\uBB3C \uC0AC\uC9C4\uC758 \uD2C0\uC740 \uC11C\uBC84\uAC00 \uC50C\uC6B4\uB2E4. \uB3C8\uC774 \uB098\uAC00\uB294 \uB3C4\uAD6C\uB2E4: estimate_cuts(\uB610\uB294 \uC9DD\uC774 \uB418\uB294 estimate \uB3C4\uAD6C)\uB85C \uAE08\uC561\uC744 \uBCF4\uACE0 \uC0AC\uC6A9\uC790 \uB3D9\uC758\uB97C \uBC1B\uC740 \uB4A4 confirmed_*_krw \uC640 rate_version \uC744 \uADF8\uB300\uB85C \uB123\uC5B4\uB77C. \uC5B4\uAE0B\uB098\uBA74 409 QUOTE_MISMATCH \uB85C \uC0C8 \uACAC\uC801\uC744 \uC900\uB2E4(\uACFC\uAE08 \uC5C6\uC74C). \uC2E4\uD328\uD574\uB3C4 \uC7AC\uC81C\uCD9C\uD558\uC9C0 \uB9C8\uB77C \u2014 \uAC19\uC740 spec \uC774 \uD65C\uC131\uC774\uBA74 \uC11C\uBC84\uAC00 \uAE30\uC874 \uC7A1\uC744 \uB3CC\uB824\uC900\uB2E4(deduplicated=true). \uC751\uB2F5\uC740 202 \u2014 \uACB0\uACFC\uB294 democut_wait_jobs \uB85C \uBC1B\uB294\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs.",
11866
11914
  "inputSchema": {
11867
11915
  "type": "object",
11868
11916
  "properties": {
@@ -11941,6 +11989,142 @@ var GENERATED_TOOLS = [
11941
11989
  "openWorldHint": false
11942
11990
  }
11943
11991
  },
11992
+ {
11993
+ "name": "democut_estimate_character_sheet",
11994
+ "description": "\uCE90\uB9AD\uD130 \uC2DC\uD2B8(\uC0AC\uC9C4 \uD55C \uC7A5 \u2192 \uC5EC\uB7EC \uAC01\uB3C4 \uD55C \uC7A5) \uACAC\uC801(0\uC6D0). \uBE44\uC6B0\uBA74 \uB300\uD45C \uC0AC\uC9C4\uC73C\uB85C \uB9CC\uB4E0\uB2E4. \uAE08\uC561\uC740 \uC0C1\uD55C\uC774\uACE0 \uC2E4\uCE21\uC73C\uB85C \uCC28\uC561\uC744 \uB3CC\uB824\uC900\uB2E4.",
11995
+ "inputSchema": {
11996
+ "type": "object",
11997
+ "properties": {
11998
+ "character_id": {
11999
+ "type": "string",
12000
+ "description": "\uC544\uBC14\uD0C0 id(chr_\u2026)"
12001
+ },
12002
+ "photo_id": {
12003
+ "anyOf": [
12004
+ {
12005
+ "maxLength": 64,
12006
+ "type": "string"
12007
+ },
12008
+ {
12009
+ "type": "null"
12010
+ }
12011
+ ],
12012
+ "default": null,
12013
+ "description": "\uC2DC\uD2B8\uB97C \uB9CC\uB4E4 \uC0AC\uC9C4(get_character \uC758 photos[].id). \uBE44\uC6B0\uBA74 \uB300\uD45C \uC0AC\uC9C4"
12014
+ }
12015
+ },
12016
+ "required": [
12017
+ "character_id"
12018
+ ],
12019
+ "additionalProperties": false
12020
+ },
12021
+ "outputSchema": {
12022
+ "type": "object",
12023
+ "properties": {
12024
+ "items": {
12025
+ "type": "array"
12026
+ },
12027
+ "notes": {
12028
+ "type": "array"
12029
+ },
12030
+ "total_krw": {
12031
+ "type": "integer"
12032
+ },
12033
+ "rate_version": {
12034
+ "type": "integer"
12035
+ },
12036
+ "balance_krw": {
12037
+ "type": "integer"
12038
+ },
12039
+ "balance_after_krw": {
12040
+ "type": "integer"
12041
+ },
12042
+ "can_afford": {
12043
+ "type": "boolean"
12044
+ },
12045
+ "mock": {
12046
+ "type": "boolean"
12047
+ },
12048
+ "provisional": {
12049
+ "type": "boolean"
12050
+ }
12051
+ },
12052
+ "required": [
12053
+ "total_krw",
12054
+ "rate_version",
12055
+ "balance_krw",
12056
+ "balance_after_krw",
12057
+ "can_afford"
12058
+ ]
12059
+ },
12060
+ "annotations": {
12061
+ "readOnlyHint": false,
12062
+ "destructiveHint": false,
12063
+ "idempotentHint": false,
12064
+ "openWorldHint": false
12065
+ }
12066
+ },
12067
+ {
12068
+ "name": "democut_make_character_sheet",
12069
+ "description": "\uCE90\uB9AD\uD130 \uC2DC\uD2B8\uB97C \uB9CC\uB4E0\uB2E4(\uCCAD\uAD6C\xB7\uC0C1\uD55C). \uADF8 \uC0AC\uC9C4\uC5D0 \uBD99\uACE0(\uC788\uC73C\uBA74 \uBC14\uAFBC\uB2E4) \uB300\uD45C \uC0AC\uC9C4\uC758 \uC2DC\uD2B8\uB294 PIP \uC7A5\uBA74\uC744 \uADF8\uB9B4 \uB54C \uCC38\uACE0\uB85C \uC4F0\uC778\uB2E4. AI \uB85C \uB9CC\uB4E0 \uC0AC\uC9C4\uC5D0\uB294 \uC2DC\uD2B8\uAC00 \uC774\uBBF8 \uD568\uAED8 \uB9CC\uB4E4\uC5B4\uC9C4\uB2E4 \u2014 \uC62C\uB9B0 \uC0AC\uC9C4\uC774\uB098 \uC2DC\uD2B8\uAC00 \uC5C6\uB294 \uC0AC\uC9C4\uC5D0 \uC4F4\uB2E4. \uB3C8\uC774 \uB098\uAC00\uB294 \uB3C4\uAD6C\uB2E4: estimate_cuts(\uB610\uB294 \uC9DD\uC774 \uB418\uB294 estimate \uB3C4\uAD6C)\uB85C \uAE08\uC561\uC744 \uBCF4\uACE0 \uC0AC\uC6A9\uC790 \uB3D9\uC758\uB97C \uBC1B\uC740 \uB4A4 confirmed_*_krw \uC640 rate_version \uC744 \uADF8\uB300\uB85C \uB123\uC5B4\uB77C. \uC5B4\uAE0B\uB098\uBA74 409 QUOTE_MISMATCH \uB85C \uC0C8 \uACAC\uC801\uC744 \uC900\uB2E4(\uACFC\uAE08 \uC5C6\uC74C). \uC2E4\uD328\uD574\uB3C4 \uC7AC\uC81C\uCD9C\uD558\uC9C0 \uB9C8\uB77C \u2014 \uAC19\uC740 spec \uC774 \uD65C\uC131\uC774\uBA74 \uC11C\uBC84\uAC00 \uAE30\uC874 \uC7A1\uC744 \uB3CC\uB824\uC900\uB2E4(deduplicated=true). \uC751\uB2F5\uC740 202 \u2014 \uACB0\uACFC\uB294 democut_wait_jobs \uB85C \uBC1B\uB294\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs.",
12070
+ "inputSchema": {
12071
+ "type": "object",
12072
+ "properties": {
12073
+ "character_id": {
12074
+ "type": "string",
12075
+ "description": "\uC544\uBC14\uD0C0 id(chr_\u2026)"
12076
+ },
12077
+ "photo_id": {
12078
+ "anyOf": [
12079
+ {
12080
+ "maxLength": 64,
12081
+ "type": "string"
12082
+ },
12083
+ {
12084
+ "type": "null"
12085
+ }
12086
+ ],
12087
+ "default": null,
12088
+ "description": "\uC2DC\uD2B8\uB97C \uB9CC\uB4E4 \uC0AC\uC9C4(get_character \uC758 photos[].id). \uBE44\uC6B0\uBA74 \uB300\uD45C \uC0AC\uC9C4"
12089
+ },
12090
+ "confirmed_cost_krw": {
12091
+ "minimum": 0,
12092
+ "type": "integer"
12093
+ },
12094
+ "rate_version": {
12095
+ "minimum": 1,
12096
+ "type": "integer"
12097
+ }
12098
+ },
12099
+ "required": [
12100
+ "character_id",
12101
+ "confirmed_cost_krw",
12102
+ "rate_version"
12103
+ ],
12104
+ "additionalProperties": false
12105
+ },
12106
+ "outputSchema": {
12107
+ "type": "object",
12108
+ "properties": {
12109
+ "job_id": {
12110
+ "type": "string"
12111
+ },
12112
+ "quote": {},
12113
+ "next_calls": {
12114
+ "type": "array"
12115
+ }
12116
+ },
12117
+ "required": [
12118
+ "job_id"
12119
+ ]
12120
+ },
12121
+ "annotations": {
12122
+ "readOnlyHint": false,
12123
+ "destructiveHint": false,
12124
+ "idempotentHint": false,
12125
+ "openWorldHint": false
12126
+ }
12127
+ },
11944
12128
  {
11945
12129
  "name": "democut_list_backgrounds",
11946
12130
  "description": "PIP \uBC30\uACBD \uCE74\uD0C8\uB85C\uADF8(origin=background \uC790\uC0B0) + \uC62C\uB9B0 \uBC30\uACBD.",
@@ -11968,6 +12152,175 @@ var GENERATED_TOOLS = [
11968
12152
  "openWorldHint": false
11969
12153
  }
11970
12154
  },
12155
+ {
12156
+ "name": "democut_estimate_background_image",
12157
+ "description": "PIP \uBC30\uACBD AI \uC0DD\uC131 \uACAC\uC801(0\uC6D0). \uD06C\uAE30\uB294 \uAC00\uB85C 1536\xD71024 \uACE0\uC815. \uAE08\uC561\uC740 \uC0C1\uD55C\uC774\uACE0 \uC2E4\uCE21\uC73C\uB85C \uCC28\uC561\uC744 \uB3CC\uB824\uC900\uB2E4.",
12158
+ "inputSchema": {
12159
+ "type": "object",
12160
+ "properties": {
12161
+ "label": {
12162
+ "anyOf": [
12163
+ {
12164
+ "maxLength": 128,
12165
+ "type": "string"
12166
+ },
12167
+ {
12168
+ "type": "null"
12169
+ }
12170
+ ],
12171
+ "default": null,
12172
+ "description": "\uBC30\uACBD \uC774\uB984(meta.label) \u2014 \uC124\uBA85\uC774 \uBE44\uBA74 \uC774\uAC83\uC73C\uB85C \uADF8\uB9B0\uB2E4"
12173
+ },
12174
+ "description": {
12175
+ "anyOf": [
12176
+ {
12177
+ "maxLength": 1e3,
12178
+ "type": "string"
12179
+ },
12180
+ {
12181
+ "type": "null"
12182
+ }
12183
+ ],
12184
+ "default": null,
12185
+ "description": "\uBB34\uC5C7\uC774 \uBCF4\uC774\uB294 \uC7A5\uBA74\uC778\uAC00(meta.description)"
12186
+ },
12187
+ "quality": {
12188
+ "default": "medium",
12189
+ "enum": [
12190
+ "low",
12191
+ "medium",
12192
+ "high"
12193
+ ],
12194
+ "type": "string"
12195
+ }
12196
+ },
12197
+ "required": [],
12198
+ "additionalProperties": false
12199
+ },
12200
+ "outputSchema": {
12201
+ "type": "object",
12202
+ "properties": {
12203
+ "items": {
12204
+ "type": "array"
12205
+ },
12206
+ "notes": {
12207
+ "type": "array"
12208
+ },
12209
+ "total_krw": {
12210
+ "type": "integer"
12211
+ },
12212
+ "rate_version": {
12213
+ "type": "integer"
12214
+ },
12215
+ "balance_krw": {
12216
+ "type": "integer"
12217
+ },
12218
+ "balance_after_krw": {
12219
+ "type": "integer"
12220
+ },
12221
+ "can_afford": {
12222
+ "type": "boolean"
12223
+ },
12224
+ "mock": {
12225
+ "type": "boolean"
12226
+ },
12227
+ "provisional": {
12228
+ "type": "boolean"
12229
+ }
12230
+ },
12231
+ "required": [
12232
+ "total_krw",
12233
+ "rate_version",
12234
+ "balance_krw",
12235
+ "balance_after_krw",
12236
+ "can_afford"
12237
+ ]
12238
+ },
12239
+ "annotations": {
12240
+ "readOnlyHint": false,
12241
+ "destructiveHint": false,
12242
+ "idempotentHint": false,
12243
+ "openWorldHint": false
12244
+ }
12245
+ },
12246
+ {
12247
+ "name": "democut_make_background_image",
12248
+ "description": "PIP \uBC30\uACBD\uC744 AI \uB85C \uB9CC\uB4E0\uB2E4(\uCCAD\uAD6C\xB7\uC0C1\uD55C). description(\uBB34\uC5C7\uC774 \uBCF4\uC774\uB294 \uC7A5\uBA74\uC778\uAC00)\uC73C\uB85C \uADF8\uB9AC\uACE0, \uBE44\uC6B0\uBA74 label \uB85C \uADF8\uB9B0\uB2E4. \uC0AC\uB78C\uC774 \uC5C6\uB294 \uC7A5\uBA74\uC774\uB2E4(PIP \uC7A5\uBA74\uC774 \uADF8 \uC548\uC5D0 \uC544\uBC14\uD0C0\uB97C \uADF8\uB824 \uB123\uB294\uB2E4). \uB05D\uB098\uBA74 democut_list_backgrounds \uC5D0 \uB098\uC628\uB2E4. \uB3C8\uC774 \uB098\uAC00\uB294 \uB3C4\uAD6C\uB2E4: estimate_cuts(\uB610\uB294 \uC9DD\uC774 \uB418\uB294 estimate \uB3C4\uAD6C)\uB85C \uAE08\uC561\uC744 \uBCF4\uACE0 \uC0AC\uC6A9\uC790 \uB3D9\uC758\uB97C \uBC1B\uC740 \uB4A4 confirmed_*_krw \uC640 rate_version \uC744 \uADF8\uB300\uB85C \uB123\uC5B4\uB77C. \uC5B4\uAE0B\uB098\uBA74 409 QUOTE_MISMATCH \uB85C \uC0C8 \uACAC\uC801\uC744 \uC900\uB2E4(\uACFC\uAE08 \uC5C6\uC74C). \uC2E4\uD328\uD574\uB3C4 \uC7AC\uC81C\uCD9C\uD558\uC9C0 \uB9C8\uB77C \u2014 \uAC19\uC740 spec \uC774 \uD65C\uC131\uC774\uBA74 \uC11C\uBC84\uAC00 \uAE30\uC874 \uC7A1\uC744 \uB3CC\uB824\uC900\uB2E4(deduplicated=true). \uC751\uB2F5\uC740 202 \u2014 \uACB0\uACFC\uB294 democut_wait_jobs \uB85C \uBC1B\uB294\uB2E4. \uB2E4\uC74C \uD638\uCD9C: democut_wait_jobs.",
12249
+ "inputSchema": {
12250
+ "type": "object",
12251
+ "properties": {
12252
+ "label": {
12253
+ "anyOf": [
12254
+ {
12255
+ "maxLength": 128,
12256
+ "type": "string"
12257
+ },
12258
+ {
12259
+ "type": "null"
12260
+ }
12261
+ ],
12262
+ "default": null,
12263
+ "description": "\uBC30\uACBD \uC774\uB984(meta.label) \u2014 \uC124\uBA85\uC774 \uBE44\uBA74 \uC774\uAC83\uC73C\uB85C \uADF8\uB9B0\uB2E4"
12264
+ },
12265
+ "description": {
12266
+ "anyOf": [
12267
+ {
12268
+ "maxLength": 1e3,
12269
+ "type": "string"
12270
+ },
12271
+ {
12272
+ "type": "null"
12273
+ }
12274
+ ],
12275
+ "default": null,
12276
+ "description": "\uBB34\uC5C7\uC774 \uBCF4\uC774\uB294 \uC7A5\uBA74\uC778\uAC00(meta.description)"
12277
+ },
12278
+ "quality": {
12279
+ "default": "medium",
12280
+ "enum": [
12281
+ "low",
12282
+ "medium",
12283
+ "high"
12284
+ ],
12285
+ "type": "string"
12286
+ },
12287
+ "confirmed_cost_krw": {
12288
+ "minimum": 0,
12289
+ "type": "integer"
12290
+ },
12291
+ "rate_version": {
12292
+ "minimum": 1,
12293
+ "type": "integer"
12294
+ }
12295
+ },
12296
+ "required": [
12297
+ "confirmed_cost_krw",
12298
+ "rate_version"
12299
+ ],
12300
+ "additionalProperties": false
12301
+ },
12302
+ "outputSchema": {
12303
+ "type": "object",
12304
+ "properties": {
12305
+ "job_id": {
12306
+ "type": "string"
12307
+ },
12308
+ "quote": {},
12309
+ "next_calls": {
12310
+ "type": "array"
12311
+ }
12312
+ },
12313
+ "required": [
12314
+ "job_id"
12315
+ ]
12316
+ },
12317
+ "annotations": {
12318
+ "readOnlyHint": false,
12319
+ "destructiveHint": false,
12320
+ "idempotentHint": false,
12321
+ "openWorldHint": false
12322
+ }
12323
+ },
11971
12324
  {
11972
12325
  "name": "democut_get_brand_kit",
11973
12326
  "description": "\uC774 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uC758 \uBE0C\uB79C\uB4DC\uD0B7(\uBE0C\uB79C\uB4DC \uC774\uB984\xB7\uB300\uD45C\uC0C9\xB7\uBCF4\uC870\uC0C9\xB7\uD1A4\xB7\uD5E4\uB529/\uBCF8\uBB38 \uD3F0\uD2B8\xB7\uB85C\uACE0)\uACFC \uACE0\uB97C \uC218 \uC788\uB294 \uD3F0\uD2B8(font_options \u2014 `is_default` \uAC00 \uD3F0\uD2B8\uB97C \uBE44\uC6E0\uC744 \uB54C \uC4F0\uC774\uB294 \uAC83). \uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uB2E4. \uC800\uC7A5\uD55C \uC801\uC774 \uC5C6\uC73C\uBA74 \uBE48 \uBE0C\uB79C\uB4DC\uD0B7\uACFC rev 0 \uC774\uB2E4.",
@@ -12467,7 +12820,39 @@ var GENERATED_TOOLS = [
12467
12820
  }
12468
12821
  ],
12469
12822
  "default": null,
12470
- "description": "\uC601\uC0C1 \uC0DD\uC131 \uACF5\uAE09\uC790(\uC608: minimax). \uBE44\uC6B0\uBA74 \uC11C\uBC84 \uAE30\uBCF8\uAC12 \u2014 \uC4F8 \uC218 \uC788\uB294 \uBAA9\uB85D\uC740 GET \u2026/options \uC758 video_providers[].name"
12823
+ "description": "\uC601\uC0C1 \uC0DD\uC131 \uACF5\uAE09\uC790(\uC608: minimax) \u2014 video_model \uC744 \uC8FC\uBA74 \uBE44\uC6CC \uB454\uB2E4(\uBAA8\uB378\uC774 \uACF5\uAE09\uC790\uB97C \uC815\uD55C\uB2E4). \uACF5\uAE09\uC790\uB9CC \uC8FC\uBA74 \uADF8 \uACF5\uAE09\uC790\uC758 \uAE30\uBCF8 \uBAA8\uB378. \uBAA9\uB85D\uC740 GET \u2026/options \uC758 video_providers[].name"
12824
+ },
12825
+ "video_model": {
12826
+ "anyOf": [
12827
+ {
12828
+ "maxLength": 64,
12829
+ "minLength": 1,
12830
+ "type": "string"
12831
+ },
12832
+ {
12833
+ "type": "null"
12834
+ }
12835
+ ],
12836
+ "default": null,
12837
+ "description": "\uC601\uC0C1 \uC0DD\uC131 \uBAA8\uB378(\uC608: seedance-2.0-fast). \uBE44\uC6B0\uBA74 provider \uC758 \uAE30\uBCF8 \uBAA8\uB378 \u2014 \uBAA9\uB85D\uC740 GET \u2026/options \uC758 video_models[].name"
12838
+ },
12839
+ "video_resolution": {
12840
+ "anyOf": [
12841
+ {
12842
+ "enum": [
12843
+ "480p",
12844
+ "720p",
12845
+ "1080p",
12846
+ "4k"
12847
+ ],
12848
+ "type": "string"
12849
+ },
12850
+ {
12851
+ "type": "null"
12852
+ }
12853
+ ],
12854
+ "default": null,
12855
+ "description": "\uC601\uC0C1 \uC0DD\uC131 \uD574\uC0C1\uB3C4. \uBE44\uC6B0\uBA74 \uD504\uB85C\uC81D\uD2B8 \uD574\uC0C1\uB3C4(\uADF8 \uBAA8\uB378\uC774 \uBABB \uB9CC\uB4E4\uBA74 \uADF8\uBCF4\uB2E4 \uC791\uC740 \uAC83 \uC911 \uAC00\uC7A5 \uD070 \uAC83). \uBAA8\uB378\uC774 \uB9CC\uB4DC\uB294 \uAC12\uB9CC \u2014 video_models[].resolutions. \uC644\uC131\uBCF8\uC740 \uD504\uB85C\uC81D\uD2B8 \uD574\uC0C1\uB3C4\uB85C \uB9DE\uCD98\uB2E4"
12471
12856
  },
12472
12857
  "seed": {
12473
12858
  "anyOf": [
@@ -13497,7 +13882,39 @@ var GENERATED_TOOLS = [
13497
13882
  }
13498
13883
  ],
13499
13884
  "default": null,
13500
- "description": "\uC601\uC0C1 \uC0DD\uC131 \uACF5\uAE09\uC790(\uC608: minimax). \uBE44\uC6B0\uBA74 \uC11C\uBC84 \uAE30\uBCF8\uAC12 \u2014 \uC4F8 \uC218 \uC788\uB294 \uBAA9\uB85D\uC740 GET \u2026/options \uC758 video_providers[].name"
13885
+ "description": "\uC601\uC0C1 \uC0DD\uC131 \uACF5\uAE09\uC790(\uC608: minimax) \u2014 video_model \uC744 \uC8FC\uBA74 \uBE44\uC6CC \uB454\uB2E4(\uBAA8\uB378\uC774 \uACF5\uAE09\uC790\uB97C \uC815\uD55C\uB2E4). \uACF5\uAE09\uC790\uB9CC \uC8FC\uBA74 \uADF8 \uACF5\uAE09\uC790\uC758 \uAE30\uBCF8 \uBAA8\uB378. \uBAA9\uB85D\uC740 GET \u2026/options \uC758 video_providers[].name"
13886
+ },
13887
+ "video_model": {
13888
+ "anyOf": [
13889
+ {
13890
+ "maxLength": 64,
13891
+ "minLength": 1,
13892
+ "type": "string"
13893
+ },
13894
+ {
13895
+ "type": "null"
13896
+ }
13897
+ ],
13898
+ "default": null,
13899
+ "description": "\uC601\uC0C1 \uC0DD\uC131 \uBAA8\uB378(\uC608: seedance-2.0-fast). \uBE44\uC6B0\uBA74 provider \uC758 \uAE30\uBCF8 \uBAA8\uB378 \u2014 \uBAA9\uB85D\uC740 GET \u2026/options \uC758 video_models[].name"
13900
+ },
13901
+ "video_resolution": {
13902
+ "anyOf": [
13903
+ {
13904
+ "enum": [
13905
+ "480p",
13906
+ "720p",
13907
+ "1080p",
13908
+ "4k"
13909
+ ],
13910
+ "type": "string"
13911
+ },
13912
+ {
13913
+ "type": "null"
13914
+ }
13915
+ ],
13916
+ "default": null,
13917
+ "description": "\uC601\uC0C1 \uC0DD\uC131 \uD574\uC0C1\uB3C4. \uBE44\uC6B0\uBA74 \uD504\uB85C\uC81D\uD2B8 \uD574\uC0C1\uB3C4(\uADF8 \uBAA8\uB378\uC774 \uBABB \uB9CC\uB4E4\uBA74 \uADF8\uBCF4\uB2E4 \uC791\uC740 \uAC83 \uC911 \uAC00\uC7A5 \uD070 \uAC83). \uBAA8\uB378\uC774 \uB9CC\uB4DC\uB294 \uAC12\uB9CC \u2014 video_models[].resolutions. \uC644\uC131\uBCF8\uC740 \uD504\uB85C\uC81D\uD2B8 \uD574\uC0C1\uB3C4\uB85C \uB9DE\uCD98\uB2E4"
13501
13918
  },
13502
13919
  "seed": {
13503
13920
  "anyOf": [
@@ -16315,12 +16732,36 @@ var TOOL_META = {
16315
16732
  "method": "POST",
16316
16733
  "path": "/api/characters/{character_id}/photos/generate"
16317
16734
  },
16735
+ "democut_estimate_character_sheet": {
16736
+ "cost": "quote",
16737
+ "group": "character",
16738
+ "method": "POST",
16739
+ "path": "/api/characters/{character_id}/sheet/estimate"
16740
+ },
16741
+ "democut_make_character_sheet": {
16742
+ "cost": "charge",
16743
+ "group": "character",
16744
+ "method": "POST",
16745
+ "path": "/api/characters/{character_id}/sheet"
16746
+ },
16318
16747
  "democut_list_backgrounds": {
16319
16748
  "cost": "none",
16320
16749
  "group": "character",
16321
16750
  "method": "GET",
16322
16751
  "path": "/api/backgrounds"
16323
16752
  },
16753
+ "democut_estimate_background_image": {
16754
+ "cost": "quote",
16755
+ "group": "character",
16756
+ "method": "POST",
16757
+ "path": "/api/backgrounds/estimate"
16758
+ },
16759
+ "democut_make_background_image": {
16760
+ "cost": "charge",
16761
+ "group": "character",
16762
+ "method": "POST",
16763
+ "path": "/api/backgrounds/generate"
16764
+ },
16324
16765
  "democut_get_brand_kit": {
16325
16766
  "cost": "none",
16326
16767
  "group": "brand",
@@ -16571,11 +17012,22 @@ function callableStructured(value) {
16571
17012
  function usd(v) {
16572
17013
  return v < 0.01 ? `$${v.toFixed(4)}` : `$${v.toFixed(2)}`;
16573
17014
  }
17015
+ var DATA_CHARS = 400;
17016
+ function contractData(extra) {
17017
+ const entries = Object.entries(extra).filter(([k]) => k !== "hint");
17018
+ if (!entries.length) return null;
17019
+ entries.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
17020
+ const json = JSON.stringify(Object.fromEntries(entries));
17021
+ const chars = [...json];
17022
+ return chars.length <= DATA_CHARS ? json : `${chars.slice(0, DATA_CHARS).join("")}\u2026(\uC904\uC784)`;
17023
+ }
16574
17024
  function classifyApiError(e, ctx) {
16575
17025
  const hint = ctx.statusHint ?? "\uC0C1\uD0DC \uC870\uD68C";
16576
17026
  const contractHint = typeof e.extra.hint === "string" ? callableToolNames(e.extra.hint) : null;
16577
17027
  if (contractHint) {
16578
17028
  const lines = [contractHint];
17029
+ const facts = contractData(e.extra);
17030
+ if (facts) lines.push(`\uC0AC\uC2E4: ${facts}`);
16579
17031
  if (ctx.submitted) {
16580
17032
  lines.push(
16581
17033
  e.status < 500 ? "\uC544\uC9C1 \uC544\uBB34\uAC83\uB3C4 \uC81C\uCD9C\uB418\uC9C0 \uC54A\uC558\uACE0 \uACFC\uAE08\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC694\uCCAD\uC744 \uACE0\uCCD0 \uB2E4\uC2DC \uD638\uCD9C\uD558\uC138\uC694." : `\u26A0\uFE0F \uC81C\uCD9C\uC774 \uC811\uC218\uB410\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uBCF4\uB0B4\uC9C0 \uB9D0\uACE0 ${hint} \uB85C \uC0C1\uD0DC\uB97C \uBA3C\uC800 \uD655\uC778\uD558\uC138\uC694.`
@@ -18378,7 +18830,6 @@ function listCharacters(_a3 = {}, deps = {}) {
18378
18830
  function characterBody(a) {
18379
18831
  return {
18380
18832
  name: a.name,
18381
- role: a.role ?? "",
18382
18833
  voice_id: a.voice_id ?? null,
18383
18834
  persona_text: a.persona_text ?? "",
18384
18835
  look_text: a.look_text ?? ""
@@ -18410,7 +18861,6 @@ function getCharacter(a = {}, deps = {}) {
18410
18861
  const base = resolveBaseUrl(deps.baseUrl);
18411
18862
  const out4 = await apiRequest(base, `/api/characters/${encodeURIComponent(id)}`, {}, deps);
18412
18863
  const lines = [characterLine(out4)];
18413
- if (out4.role) lines.push(` \uC5ED\uD560: ${out4.role}`);
18414
18864
  if (out4.voice_id) lines.push(` \uBCF4\uC774\uC2A4: ${out4.voice_id}`);
18415
18865
  for (const p of out4.photos ?? []) {
18416
18866
  lines.push(` \uC0AC\uC9C4 ${p.seq}: ${p.asset_id} (${p.source})${p.id === out4.current_photo_id ? " \u2190 \uB300\uD45C" : ""}`);
@@ -18512,7 +18962,7 @@ function addCharacterPhoto(a = {}, deps = {}) {
18512
18962
  deps
18513
18963
  );
18514
18964
  const added = out4.photos?.[out4.photos.length - 1];
18515
- const tail = added && out4.current_photo_id === added.id ? " \uCCAB \uC0AC\uC9C4\uC774\uB77C \uB300\uD45C\uB85C \uC815\uD588\uC2B5\uB2C8\uB2E4." : "";
18965
+ const tail = added && out4.current_photo_id === added.id ? " \uC0C8 \uC0AC\uC9C4\uC744 \uB300\uD45C\uB85C \uC815\uD588\uC2B5\uB2C8\uB2E4." : "";
18516
18966
  return { text: `\uC0AC\uC9C4\uC744 \uCD94\uAC00\uD588\uC2B5\uB2C8\uB2E4: ${characterLine(out4)}${tail}`, structured: callableStructured(out4) };
18517
18967
  });
18518
18968
  }
@@ -18579,7 +19029,134 @@ function makeCharacterPhoto(a = {}, deps = {}) {
18579
19029
  text: [
18580
19030
  `\uC544\uBC14\uD0C0 \uC0AC\uC9C4\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
18581
19031
  `\uCCAD\uAD6C ${krw(total)} \u2014 \uC0C1\uD55C\uC785\uB2C8\uB2E4. \uC2E4\uC81C \uC0AC\uC6A9\uB7C9\uC774 \uC801\uC73C\uBA74 \uCC28\uC561\uC744 \uC790\uB3D9\uC73C\uB85C \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4.`,
18582
- "democut_wait_jobs \uB85C \uB05D\uB098\uBA74 democut_get_character \uC758 photos \uC5D0 \uC0C8 \uC0AC\uC9C4\uC774 \uC0DD\uAE41\uB2C8\uB2E4 \u2014 \uCCAB \uC0AC\uC9C4\uC774\uBA74 \uB300\uD45C\uAC00 \uB429\uB2C8\uB2E4."
19032
+ "democut_wait_jobs \uB85C \uB05D\uB098\uBA74 democut_get_character \uC758 photos \uC5D0 \uC0C8 \uC0AC\uC9C4\uC774 \uC0DD\uAE30\uACE0 \uB300\uD45C\uAC00 \uB429\uB2C8\uB2E4. \uCE90\uB9AD\uD130 \uC2DC\uD2B8\uB3C4 \uD568\uAED8 \uB9CC\uB4E4\uC5B4 \uADF8 \uC0AC\uC9C4\uC758 sheet_asset_id \uC5D0 \uBD99\uC785\uB2C8\uB2E4(\uC2DC\uD2B8\uB9CC \uC2E4\uD328\uD558\uBA74 \uC0AC\uC9C4\uC740 \uB4E4\uC5B4\uC624\uACE0 \uC2DC\uD2B8 \uBAAB\uC740 \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4 \u2014 \uC7A1 \uACB0\uACFC\uC758 sheet_skipped)."
19033
+ ].join("\n"),
19034
+ structured: callableStructured(out4)
19035
+ };
19036
+ });
19037
+ }
19038
+ function backgroundImageBody(a) {
19039
+ return {
19040
+ ...a.label !== void 0 ? { label: a.label } : {},
19041
+ ...a.description !== void 0 ? { description: a.description } : {},
19042
+ ...a.quality !== void 0 ? { quality: a.quality } : {}
19043
+ };
19044
+ }
19045
+ function estimateBackgroundImage(a = {}, deps = {}) {
19046
+ return guarded(READ_ONLY, async () => {
19047
+ const base = resolveBaseUrl(deps.baseUrl);
19048
+ const out4 = await apiRequest(
19049
+ base,
19050
+ "/api/backgrounds/estimate",
19051
+ { method: "POST", body: backgroundImageBody(a) },
19052
+ deps
19053
+ );
19054
+ const item = out4.items?.[0];
19055
+ if (!item || item.blocked_reason) {
19056
+ const reason = item?.blocked_reason ?? "\uACAC\uC801\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4";
19057
+ return {
19058
+ text: `\uC544\uC9C1 \uBC30\uACBD\uC744 \uB9CC\uB4E4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${reason}
19059
+ \uAD00\uB9AC\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC138\uC694(\uC0C1\uD55C \uBBF8\uC2E4\uCE21\uC740 \uC6B4\uC601\uC790 \uBAAB\uC785\uB2C8\uB2E4).`,
19060
+ structured: callableStructured(out4)
19061
+ };
19062
+ }
19063
+ const rows = (item.rows ?? []).map((r) => `${r.display_name || r.key} ${krw(r.krw)}`).join(", ") || "\uD589 \uC5C6\uC74C";
19064
+ const lines = [
19065
+ `\uBC30\uACBD \uACAC\uC801 (\uC694\uC728 v${out4.rate_version}) \u2014 \uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4`,
19066
+ ` ${krw(item.total_krw ?? 0)} (${rows})`,
19067
+ `\uC794\uC561 ${krw(out4.balance_krw)} \u2192 \uB0A8\uC744 \uC794\uC561 ${krw(out4.balance_after_krw)}`,
19068
+ 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.",
19069
+ "\uC774 \uAE08\uC561\uC740 \uC0C1\uD55C\uC785\uB2C8\uB2E4 \u2014 \uC2E4\uC81C \uC0AC\uC6A9\uB7C9\uC774 \uC801\uC73C\uBA74 \uCC28\uC561\uC744 \uC790\uB3D9\uC73C\uB85C \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4."
19070
+ ];
19071
+ if (out4.mock) lines.push("(mock \uB2E8\uAC00\uC785\uB2C8\uB2E4 \u2014 \uC2E4\uC81C \uCCAD\uAD6C\uC640 \uB2E4\uB97C \uC218 \uC788\uC2B5\uB2C8\uB2E4.)");
19072
+ return { text: lines.join("\n"), structured: callableStructured(out4) };
19073
+ });
19074
+ }
19075
+ function makeBackgroundImage(a = {}, deps = {}) {
19076
+ return guarded(SUBMITTING, async () => {
19077
+ const base = resolveBaseUrl(deps.baseUrl);
19078
+ const out4 = await apiRequest(
19079
+ base,
19080
+ "/api/backgrounds/generate",
19081
+ {
19082
+ method: "POST",
19083
+ body: {
19084
+ ...backgroundImageBody(a),
19085
+ // ★ 동의는 **명시**다 — 없으면 서버가 0원 동의로 읽고 409 로 거부한다(그것이 옳다).
19086
+ confirmed_cost_krw: a.confirmed_cost_krw ?? 0,
19087
+ rate_version: a.rate_version
19088
+ }
19089
+ },
19090
+ deps
19091
+ );
19092
+ const total = out4.quote?.total_krw ?? 0;
19093
+ return {
19094
+ text: [
19095
+ `\uBC30\uACBD\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
19096
+ `\uCCAD\uAD6C ${krw(total)} \u2014 \uC0C1\uD55C\uC785\uB2C8\uB2E4. \uC2E4\uC81C \uC0AC\uC6A9\uB7C9\uC774 \uC801\uC73C\uBA74 \uCC28\uC561\uC744 \uC790\uB3D9\uC73C\uB85C \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4.`,
19097
+ "democut_wait_jobs \uB85C \uB05D\uB098\uBA74 democut_list_backgrounds \uC5D0 \uC0C8 \uBC30\uACBD\uC774 \uB098\uC635\uB2C8\uB2E4 \u2014 \uADF8 id \uB97C pip.background_asset_id \uC5D0 \uB123\uC73C\uC138\uC694."
19098
+ ].join("\n"),
19099
+ structured: callableStructured(out4)
19100
+ };
19101
+ });
19102
+ }
19103
+ function estimateCharacterSheet(a = {}, deps = {}) {
19104
+ return guarded(READ_ONLY, async () => {
19105
+ const id = (a.character_id ?? "").trim();
19106
+ if (!id) return { isError: true, text: "character_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4." };
19107
+ const base = resolveBaseUrl(deps.baseUrl);
19108
+ const out4 = await apiRequest(
19109
+ base,
19110
+ `/api/characters/${encodeURIComponent(id)}/sheet/estimate`,
19111
+ { method: "POST", body: a.photo_id ? { photo_id: a.photo_id } : {} },
19112
+ deps
19113
+ );
19114
+ const item = out4.items?.[0];
19115
+ if (!item || item.blocked_reason) {
19116
+ const reason = item?.blocked_reason ?? "\uACAC\uC801\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4";
19117
+ return {
19118
+ text: `\uC544\uC9C1 \uCE90\uB9AD\uD130 \uC2DC\uD2B8\uB97C \uACAC\uC801\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${reason}
19119
+ \uC774 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uC5D0\uC11C AI \uC774\uBBF8\uC9C0 \uC0DD\uC131\uC744 \uC4F8 \uC218 \uC5C6\uB294 \uC0C1\uD0DC\uC785\uB2C8\uB2E4(\uAD00\uB9AC\uC790 \uBB38\uC758).`,
19120
+ structured: callableStructured(out4)
19121
+ };
19122
+ }
19123
+ const rows = (item.rows ?? []).map((r) => `${r.display_name || r.key} ${krw(r.krw)}`).join(", ") || "\uD589 \uC5C6\uC74C";
19124
+ const lines = [
19125
+ `\uCE90\uB9AD\uD130 \uC2DC\uD2B8 \uACAC\uC801 (\uC694\uC728 v${out4.rate_version}) \u2014 \uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4`,
19126
+ ` ${id}: ${krw(item.total_krw ?? 0)} (${rows})`,
19127
+ `\uC794\uC561 ${krw(out4.balance_krw)} \u2192 \uB0A8\uC744 \uC794\uC561 ${krw(out4.balance_after_krw)}`,
19128
+ 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.",
19129
+ "\uC774 \uAE08\uC561\uC740 \uC0C1\uD55C\uC785\uB2C8\uB2E4 \u2014 \uC2E4\uC81C \uC0AC\uC6A9\uB7C9\uC774 \uC801\uC73C\uBA74 \uCC28\uC561\uC744 \uC790\uB3D9\uC73C\uB85C \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4."
19130
+ ];
19131
+ if (out4.mock) lines.push("(mock \uB2E8\uAC00\uC785\uB2C8\uB2E4 \u2014 \uC2E4\uC81C \uCCAD\uAD6C\uC640 \uB2E4\uB97C \uC218 \uC788\uC2B5\uB2C8\uB2E4.)");
19132
+ return { text: lines.join("\n"), structured: callableStructured(out4) };
19133
+ });
19134
+ }
19135
+ function makeCharacterSheet(a = {}, deps = {}) {
19136
+ return guarded(SUBMITTING, async () => {
19137
+ const id = (a.character_id ?? "").trim();
19138
+ if (!id) return { isError: true, text: "character_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4." };
19139
+ const base = resolveBaseUrl(deps.baseUrl);
19140
+ const out4 = await apiRequest(
19141
+ base,
19142
+ `/api/characters/${encodeURIComponent(id)}/sheet`,
19143
+ {
19144
+ method: "POST",
19145
+ body: {
19146
+ ...a.photo_id ? { photo_id: a.photo_id } : {},
19147
+ // ★ 동의는 **명시**다 — 없으면 서버가 0원 동의로 읽고 409 로 거부한다(그것이 옳다).
19148
+ confirmed_cost_krw: a.confirmed_cost_krw ?? 0,
19149
+ rate_version: a.rate_version
19150
+ }
19151
+ },
19152
+ deps
19153
+ );
19154
+ const total = out4.quote?.total_krw ?? 0;
19155
+ return {
19156
+ text: [
19157
+ `\uCE90\uB9AD\uD130 \uC2DC\uD2B8\uB97C \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
19158
+ `\uCCAD\uAD6C ${krw(total)} \u2014 \uC0C1\uD55C\uC785\uB2C8\uB2E4. \uC2E4\uC81C \uC0AC\uC6A9\uB7C9\uC774 \uC801\uC73C\uBA74 \uCC28\uC561\uC744 \uC790\uB3D9\uC73C\uB85C \uB3CC\uB824\uB4DC\uB9BD\uB2C8\uB2E4.`,
19159
+ "democut_wait_jobs \uB85C \uB05D\uB098\uBA74 democut_get_character \uC758 photos[].sheet_asset_id \uC5D0 \uC2DC\uD2B8\uAC00 \uBD99\uC2B5\uB2C8\uB2E4 \u2014 \uB300\uD45C \uC0AC\uC9C4\uC758 \uC2DC\uD2B8\uB294 PIP \uC7A5\uBA74\uC758 \uCC38\uACE0\uB85C \uC4F0\uC785\uB2C8\uB2E4."
18583
19160
  ].join("\n"),
18584
19161
  structured: callableStructured(out4)
18585
19162
  };
@@ -19165,10 +19742,18 @@ function dispatch(name, args, deps = {}) {
19165
19742
  return estimateCharacterPhoto(args, deps);
19166
19743
  case "democut_make_character_photo":
19167
19744
  return makeCharacterPhoto(args, deps);
19745
+ case "democut_estimate_character_sheet":
19746
+ return estimateCharacterSheet(args, deps);
19747
+ case "democut_make_character_sheet":
19748
+ return makeCharacterSheet(args, deps);
19168
19749
  case "democut_delete_character":
19169
19750
  return deleteCharacter(args, deps);
19170
19751
  case "democut_list_backgrounds":
19171
19752
  return listBackgrounds(args, deps);
19753
+ case "democut_estimate_background_image":
19754
+ return estimateBackgroundImage(args, deps);
19755
+ case "democut_make_background_image":
19756
+ return makeBackgroundImage(args, deps);
19172
19757
  default:
19173
19758
  return Promise.resolve({ isError: true, text: `\uC54C \uC218 \uC5C6\uB294 \uB3C4\uAD6C: ${name}` });
19174
19759
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "democut",
3
- "version": "1.0.40",
3
+ "version": "1.0.47",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",