democut 1.0.39 → 1.0.44

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 +470 -6
  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.39";
6919
+ var VERSION = "1.0.44";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -11614,7 +11614,7 @@ var GENERATED_TOOLS = [
11614
11614
  },
11615
11615
  {
11616
11616
  "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.",
11617
+ "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
11618
  "inputSchema": {
11619
11619
  "type": "object",
11620
11620
  "properties": {
@@ -11767,7 +11767,7 @@ var GENERATED_TOOLS = [
11767
11767
  },
11768
11768
  {
11769
11769
  "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.",
11770
+ "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
11771
  "inputSchema": {
11772
11772
  "type": "object",
11773
11773
  "properties": {
@@ -11862,7 +11862,7 @@ var GENERATED_TOOLS = [
11862
11862
  },
11863
11863
  {
11864
11864
  "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.",
11865
+ "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
11866
  "inputSchema": {
11867
11867
  "type": "object",
11868
11868
  "properties": {
@@ -11941,6 +11941,142 @@ var GENERATED_TOOLS = [
11941
11941
  "openWorldHint": false
11942
11942
  }
11943
11943
  },
11944
+ {
11945
+ "name": "democut_estimate_character_sheet",
11946
+ "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.",
11947
+ "inputSchema": {
11948
+ "type": "object",
11949
+ "properties": {
11950
+ "character_id": {
11951
+ "type": "string",
11952
+ "description": "\uC544\uBC14\uD0C0 id(chr_\u2026)"
11953
+ },
11954
+ "photo_id": {
11955
+ "anyOf": [
11956
+ {
11957
+ "maxLength": 64,
11958
+ "type": "string"
11959
+ },
11960
+ {
11961
+ "type": "null"
11962
+ }
11963
+ ],
11964
+ "default": null,
11965
+ "description": "\uC2DC\uD2B8\uB97C \uB9CC\uB4E4 \uC0AC\uC9C4(get_character \uC758 photos[].id). \uBE44\uC6B0\uBA74 \uB300\uD45C \uC0AC\uC9C4"
11966
+ }
11967
+ },
11968
+ "required": [
11969
+ "character_id"
11970
+ ],
11971
+ "additionalProperties": false
11972
+ },
11973
+ "outputSchema": {
11974
+ "type": "object",
11975
+ "properties": {
11976
+ "items": {
11977
+ "type": "array"
11978
+ },
11979
+ "notes": {
11980
+ "type": "array"
11981
+ },
11982
+ "total_krw": {
11983
+ "type": "integer"
11984
+ },
11985
+ "rate_version": {
11986
+ "type": "integer"
11987
+ },
11988
+ "balance_krw": {
11989
+ "type": "integer"
11990
+ },
11991
+ "balance_after_krw": {
11992
+ "type": "integer"
11993
+ },
11994
+ "can_afford": {
11995
+ "type": "boolean"
11996
+ },
11997
+ "mock": {
11998
+ "type": "boolean"
11999
+ },
12000
+ "provisional": {
12001
+ "type": "boolean"
12002
+ }
12003
+ },
12004
+ "required": [
12005
+ "total_krw",
12006
+ "rate_version",
12007
+ "balance_krw",
12008
+ "balance_after_krw",
12009
+ "can_afford"
12010
+ ]
12011
+ },
12012
+ "annotations": {
12013
+ "readOnlyHint": false,
12014
+ "destructiveHint": false,
12015
+ "idempotentHint": false,
12016
+ "openWorldHint": false
12017
+ }
12018
+ },
12019
+ {
12020
+ "name": "democut_make_character_sheet",
12021
+ "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.",
12022
+ "inputSchema": {
12023
+ "type": "object",
12024
+ "properties": {
12025
+ "character_id": {
12026
+ "type": "string",
12027
+ "description": "\uC544\uBC14\uD0C0 id(chr_\u2026)"
12028
+ },
12029
+ "photo_id": {
12030
+ "anyOf": [
12031
+ {
12032
+ "maxLength": 64,
12033
+ "type": "string"
12034
+ },
12035
+ {
12036
+ "type": "null"
12037
+ }
12038
+ ],
12039
+ "default": null,
12040
+ "description": "\uC2DC\uD2B8\uB97C \uB9CC\uB4E4 \uC0AC\uC9C4(get_character \uC758 photos[].id). \uBE44\uC6B0\uBA74 \uB300\uD45C \uC0AC\uC9C4"
12041
+ },
12042
+ "confirmed_cost_krw": {
12043
+ "minimum": 0,
12044
+ "type": "integer"
12045
+ },
12046
+ "rate_version": {
12047
+ "minimum": 1,
12048
+ "type": "integer"
12049
+ }
12050
+ },
12051
+ "required": [
12052
+ "character_id",
12053
+ "confirmed_cost_krw",
12054
+ "rate_version"
12055
+ ],
12056
+ "additionalProperties": false
12057
+ },
12058
+ "outputSchema": {
12059
+ "type": "object",
12060
+ "properties": {
12061
+ "job_id": {
12062
+ "type": "string"
12063
+ },
12064
+ "quote": {},
12065
+ "next_calls": {
12066
+ "type": "array"
12067
+ }
12068
+ },
12069
+ "required": [
12070
+ "job_id"
12071
+ ]
12072
+ },
12073
+ "annotations": {
12074
+ "readOnlyHint": false,
12075
+ "destructiveHint": false,
12076
+ "idempotentHint": false,
12077
+ "openWorldHint": false
12078
+ }
12079
+ },
11944
12080
  {
11945
12081
  "name": "democut_list_backgrounds",
11946
12082
  "description": "PIP \uBC30\uACBD \uCE74\uD0C8\uB85C\uADF8(origin=background \uC790\uC0B0) + \uC62C\uB9B0 \uBC30\uACBD.",
@@ -11968,6 +12104,175 @@ var GENERATED_TOOLS = [
11968
12104
  "openWorldHint": false
11969
12105
  }
11970
12106
  },
12107
+ {
12108
+ "name": "democut_estimate_background_image",
12109
+ "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.",
12110
+ "inputSchema": {
12111
+ "type": "object",
12112
+ "properties": {
12113
+ "label": {
12114
+ "anyOf": [
12115
+ {
12116
+ "maxLength": 128,
12117
+ "type": "string"
12118
+ },
12119
+ {
12120
+ "type": "null"
12121
+ }
12122
+ ],
12123
+ "default": null,
12124
+ "description": "\uBC30\uACBD \uC774\uB984(meta.label) \u2014 \uC124\uBA85\uC774 \uBE44\uBA74 \uC774\uAC83\uC73C\uB85C \uADF8\uB9B0\uB2E4"
12125
+ },
12126
+ "description": {
12127
+ "anyOf": [
12128
+ {
12129
+ "maxLength": 1e3,
12130
+ "type": "string"
12131
+ },
12132
+ {
12133
+ "type": "null"
12134
+ }
12135
+ ],
12136
+ "default": null,
12137
+ "description": "\uBB34\uC5C7\uC774 \uBCF4\uC774\uB294 \uC7A5\uBA74\uC778\uAC00(meta.description)"
12138
+ },
12139
+ "quality": {
12140
+ "default": "medium",
12141
+ "enum": [
12142
+ "low",
12143
+ "medium",
12144
+ "high"
12145
+ ],
12146
+ "type": "string"
12147
+ }
12148
+ },
12149
+ "required": [],
12150
+ "additionalProperties": false
12151
+ },
12152
+ "outputSchema": {
12153
+ "type": "object",
12154
+ "properties": {
12155
+ "items": {
12156
+ "type": "array"
12157
+ },
12158
+ "notes": {
12159
+ "type": "array"
12160
+ },
12161
+ "total_krw": {
12162
+ "type": "integer"
12163
+ },
12164
+ "rate_version": {
12165
+ "type": "integer"
12166
+ },
12167
+ "balance_krw": {
12168
+ "type": "integer"
12169
+ },
12170
+ "balance_after_krw": {
12171
+ "type": "integer"
12172
+ },
12173
+ "can_afford": {
12174
+ "type": "boolean"
12175
+ },
12176
+ "mock": {
12177
+ "type": "boolean"
12178
+ },
12179
+ "provisional": {
12180
+ "type": "boolean"
12181
+ }
12182
+ },
12183
+ "required": [
12184
+ "total_krw",
12185
+ "rate_version",
12186
+ "balance_krw",
12187
+ "balance_after_krw",
12188
+ "can_afford"
12189
+ ]
12190
+ },
12191
+ "annotations": {
12192
+ "readOnlyHint": false,
12193
+ "destructiveHint": false,
12194
+ "idempotentHint": false,
12195
+ "openWorldHint": false
12196
+ }
12197
+ },
12198
+ {
12199
+ "name": "democut_make_background_image",
12200
+ "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.",
12201
+ "inputSchema": {
12202
+ "type": "object",
12203
+ "properties": {
12204
+ "label": {
12205
+ "anyOf": [
12206
+ {
12207
+ "maxLength": 128,
12208
+ "type": "string"
12209
+ },
12210
+ {
12211
+ "type": "null"
12212
+ }
12213
+ ],
12214
+ "default": null,
12215
+ "description": "\uBC30\uACBD \uC774\uB984(meta.label) \u2014 \uC124\uBA85\uC774 \uBE44\uBA74 \uC774\uAC83\uC73C\uB85C \uADF8\uB9B0\uB2E4"
12216
+ },
12217
+ "description": {
12218
+ "anyOf": [
12219
+ {
12220
+ "maxLength": 1e3,
12221
+ "type": "string"
12222
+ },
12223
+ {
12224
+ "type": "null"
12225
+ }
12226
+ ],
12227
+ "default": null,
12228
+ "description": "\uBB34\uC5C7\uC774 \uBCF4\uC774\uB294 \uC7A5\uBA74\uC778\uAC00(meta.description)"
12229
+ },
12230
+ "quality": {
12231
+ "default": "medium",
12232
+ "enum": [
12233
+ "low",
12234
+ "medium",
12235
+ "high"
12236
+ ],
12237
+ "type": "string"
12238
+ },
12239
+ "confirmed_cost_krw": {
12240
+ "minimum": 0,
12241
+ "type": "integer"
12242
+ },
12243
+ "rate_version": {
12244
+ "minimum": 1,
12245
+ "type": "integer"
12246
+ }
12247
+ },
12248
+ "required": [
12249
+ "confirmed_cost_krw",
12250
+ "rate_version"
12251
+ ],
12252
+ "additionalProperties": false
12253
+ },
12254
+ "outputSchema": {
12255
+ "type": "object",
12256
+ "properties": {
12257
+ "job_id": {
12258
+ "type": "string"
12259
+ },
12260
+ "quote": {},
12261
+ "next_calls": {
12262
+ "type": "array"
12263
+ }
12264
+ },
12265
+ "required": [
12266
+ "job_id"
12267
+ ]
12268
+ },
12269
+ "annotations": {
12270
+ "readOnlyHint": false,
12271
+ "destructiveHint": false,
12272
+ "idempotentHint": false,
12273
+ "openWorldHint": false
12274
+ }
12275
+ },
11971
12276
  {
11972
12277
  "name": "democut_get_brand_kit",
11973
12278
  "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.",
@@ -16315,12 +16620,36 @@ var TOOL_META = {
16315
16620
  "method": "POST",
16316
16621
  "path": "/api/characters/{character_id}/photos/generate"
16317
16622
  },
16623
+ "democut_estimate_character_sheet": {
16624
+ "cost": "quote",
16625
+ "group": "character",
16626
+ "method": "POST",
16627
+ "path": "/api/characters/{character_id}/sheet/estimate"
16628
+ },
16629
+ "democut_make_character_sheet": {
16630
+ "cost": "charge",
16631
+ "group": "character",
16632
+ "method": "POST",
16633
+ "path": "/api/characters/{character_id}/sheet"
16634
+ },
16318
16635
  "democut_list_backgrounds": {
16319
16636
  "cost": "none",
16320
16637
  "group": "character",
16321
16638
  "method": "GET",
16322
16639
  "path": "/api/backgrounds"
16323
16640
  },
16641
+ "democut_estimate_background_image": {
16642
+ "cost": "quote",
16643
+ "group": "character",
16644
+ "method": "POST",
16645
+ "path": "/api/backgrounds/estimate"
16646
+ },
16647
+ "democut_make_background_image": {
16648
+ "cost": "charge",
16649
+ "group": "character",
16650
+ "method": "POST",
16651
+ "path": "/api/backgrounds/generate"
16652
+ },
16324
16653
  "democut_get_brand_kit": {
16325
16654
  "cost": "none",
16326
16655
  "group": "brand",
@@ -18512,7 +18841,7 @@ function addCharacterPhoto(a = {}, deps = {}) {
18512
18841
  deps
18513
18842
  );
18514
18843
  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." : "";
18844
+ const tail = added && out4.current_photo_id === added.id ? " \uC0C8 \uC0AC\uC9C4\uC744 \uB300\uD45C\uB85C \uC815\uD588\uC2B5\uB2C8\uB2E4." : "";
18516
18845
  return { text: `\uC0AC\uC9C4\uC744 \uCD94\uAC00\uD588\uC2B5\uB2C8\uB2E4: ${characterLine(out4)}${tail}`, structured: callableStructured(out4) };
18517
18846
  });
18518
18847
  }
@@ -18579,7 +18908,134 @@ function makeCharacterPhoto(a = {}, deps = {}) {
18579
18908
  text: [
18580
18909
  `\uC544\uBC14\uD0C0 \uC0AC\uC9C4\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
18581
18910
  `\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."
18911
+ "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)."
18912
+ ].join("\n"),
18913
+ structured: callableStructured(out4)
18914
+ };
18915
+ });
18916
+ }
18917
+ function backgroundImageBody(a) {
18918
+ return {
18919
+ ...a.label !== void 0 ? { label: a.label } : {},
18920
+ ...a.description !== void 0 ? { description: a.description } : {},
18921
+ ...a.quality !== void 0 ? { quality: a.quality } : {}
18922
+ };
18923
+ }
18924
+ function estimateBackgroundImage(a = {}, deps = {}) {
18925
+ return guarded(READ_ONLY, async () => {
18926
+ const base = resolveBaseUrl(deps.baseUrl);
18927
+ const out4 = await apiRequest(
18928
+ base,
18929
+ "/api/backgrounds/estimate",
18930
+ { method: "POST", body: backgroundImageBody(a) },
18931
+ deps
18932
+ );
18933
+ const item = out4.items?.[0];
18934
+ if (!item || item.blocked_reason) {
18935
+ const reason = item?.blocked_reason ?? "\uACAC\uC801\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4";
18936
+ return {
18937
+ text: `\uC544\uC9C1 \uBC30\uACBD\uC744 \uB9CC\uB4E4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${reason}
18938
+ \uAD00\uB9AC\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC138\uC694(\uC0C1\uD55C \uBBF8\uC2E4\uCE21\uC740 \uC6B4\uC601\uC790 \uBAAB\uC785\uB2C8\uB2E4).`,
18939
+ structured: callableStructured(out4)
18940
+ };
18941
+ }
18942
+ const rows = (item.rows ?? []).map((r) => `${r.display_name || r.key} ${krw(r.krw)}`).join(", ") || "\uD589 \uC5C6\uC74C";
18943
+ const lines = [
18944
+ `\uBC30\uACBD \uACAC\uC801 (\uC694\uC728 v${out4.rate_version}) \u2014 \uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4`,
18945
+ ` ${krw(item.total_krw ?? 0)} (${rows})`,
18946
+ `\uC794\uC561 ${krw(out4.balance_krw)} \u2192 \uB0A8\uC744 \uC794\uC561 ${krw(out4.balance_after_krw)}`,
18947
+ 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.",
18948
+ "\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."
18949
+ ];
18950
+ if (out4.mock) lines.push("(mock \uB2E8\uAC00\uC785\uB2C8\uB2E4 \u2014 \uC2E4\uC81C \uCCAD\uAD6C\uC640 \uB2E4\uB97C \uC218 \uC788\uC2B5\uB2C8\uB2E4.)");
18951
+ return { text: lines.join("\n"), structured: callableStructured(out4) };
18952
+ });
18953
+ }
18954
+ function makeBackgroundImage(a = {}, deps = {}) {
18955
+ return guarded(SUBMITTING, async () => {
18956
+ const base = resolveBaseUrl(deps.baseUrl);
18957
+ const out4 = await apiRequest(
18958
+ base,
18959
+ "/api/backgrounds/generate",
18960
+ {
18961
+ method: "POST",
18962
+ body: {
18963
+ ...backgroundImageBody(a),
18964
+ // ★ 동의는 **명시**다 — 없으면 서버가 0원 동의로 읽고 409 로 거부한다(그것이 옳다).
18965
+ confirmed_cost_krw: a.confirmed_cost_krw ?? 0,
18966
+ rate_version: a.rate_version
18967
+ }
18968
+ },
18969
+ deps
18970
+ );
18971
+ const total = out4.quote?.total_krw ?? 0;
18972
+ return {
18973
+ text: [
18974
+ `\uBC30\uACBD\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
18975
+ `\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.`,
18976
+ "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."
18977
+ ].join("\n"),
18978
+ structured: callableStructured(out4)
18979
+ };
18980
+ });
18981
+ }
18982
+ function estimateCharacterSheet(a = {}, deps = {}) {
18983
+ return guarded(READ_ONLY, async () => {
18984
+ const id = (a.character_id ?? "").trim();
18985
+ if (!id) return { isError: true, text: "character_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4." };
18986
+ const base = resolveBaseUrl(deps.baseUrl);
18987
+ const out4 = await apiRequest(
18988
+ base,
18989
+ `/api/characters/${encodeURIComponent(id)}/sheet/estimate`,
18990
+ { method: "POST", body: a.photo_id ? { photo_id: a.photo_id } : {} },
18991
+ deps
18992
+ );
18993
+ const item = out4.items?.[0];
18994
+ if (!item || item.blocked_reason) {
18995
+ const reason = item?.blocked_reason ?? "\uACAC\uC801\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4";
18996
+ return {
18997
+ text: `\uC544\uC9C1 \uCE90\uB9AD\uD130 \uC2DC\uD2B8\uB97C \uACAC\uC801\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${reason}
18998
+ \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).`,
18999
+ structured: callableStructured(out4)
19000
+ };
19001
+ }
19002
+ const rows = (item.rows ?? []).map((r) => `${r.display_name || r.key} ${krw(r.krw)}`).join(", ") || "\uD589 \uC5C6\uC74C";
19003
+ const lines = [
19004
+ `\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`,
19005
+ ` ${id}: ${krw(item.total_krw ?? 0)} (${rows})`,
19006
+ `\uC794\uC561 ${krw(out4.balance_krw)} \u2192 \uB0A8\uC744 \uC794\uC561 ${krw(out4.balance_after_krw)}`,
19007
+ 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.",
19008
+ "\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."
19009
+ ];
19010
+ if (out4.mock) lines.push("(mock \uB2E8\uAC00\uC785\uB2C8\uB2E4 \u2014 \uC2E4\uC81C \uCCAD\uAD6C\uC640 \uB2E4\uB97C \uC218 \uC788\uC2B5\uB2C8\uB2E4.)");
19011
+ return { text: lines.join("\n"), structured: callableStructured(out4) };
19012
+ });
19013
+ }
19014
+ function makeCharacterSheet(a = {}, deps = {}) {
19015
+ return guarded(SUBMITTING, async () => {
19016
+ const id = (a.character_id ?? "").trim();
19017
+ if (!id) return { isError: true, text: "character_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4." };
19018
+ const base = resolveBaseUrl(deps.baseUrl);
19019
+ const out4 = await apiRequest(
19020
+ base,
19021
+ `/api/characters/${encodeURIComponent(id)}/sheet`,
19022
+ {
19023
+ method: "POST",
19024
+ body: {
19025
+ ...a.photo_id ? { photo_id: a.photo_id } : {},
19026
+ // ★ 동의는 **명시**다 — 없으면 서버가 0원 동의로 읽고 409 로 거부한다(그것이 옳다).
19027
+ confirmed_cost_krw: a.confirmed_cost_krw ?? 0,
19028
+ rate_version: a.rate_version
19029
+ }
19030
+ },
19031
+ deps
19032
+ );
19033
+ const total = out4.quote?.total_krw ?? 0;
19034
+ return {
19035
+ text: [
19036
+ `\uCE90\uB9AD\uD130 \uC2DC\uD2B8\uB97C \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
19037
+ `\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.`,
19038
+ "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
19039
  ].join("\n"),
18584
19040
  structured: callableStructured(out4)
18585
19041
  };
@@ -19165,10 +19621,18 @@ function dispatch(name, args, deps = {}) {
19165
19621
  return estimateCharacterPhoto(args, deps);
19166
19622
  case "democut_make_character_photo":
19167
19623
  return makeCharacterPhoto(args, deps);
19624
+ case "democut_estimate_character_sheet":
19625
+ return estimateCharacterSheet(args, deps);
19626
+ case "democut_make_character_sheet":
19627
+ return makeCharacterSheet(args, deps);
19168
19628
  case "democut_delete_character":
19169
19629
  return deleteCharacter(args, deps);
19170
19630
  case "democut_list_backgrounds":
19171
19631
  return listBackgrounds(args, deps);
19632
+ case "democut_estimate_background_image":
19633
+ return estimateBackgroundImage(args, deps);
19634
+ case "democut_make_background_image":
19635
+ return makeBackgroundImage(args, deps);
19172
19636
  default:
19173
19637
  return Promise.resolve({ isError: true, text: `\uC54C \uC218 \uC5C6\uB294 \uB3C4\uAD6C: ${name}` });
19174
19638
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "democut",
3
- "version": "1.0.39",
3
+ "version": "1.0.44",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",