democut 1.0.51 → 1.0.54

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 +11 -482
  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.51";
6919
+ var VERSION = "1.0.54";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -7753,7 +7753,7 @@ var GENERATED_TOOLS = [
7753
7753
  },
7754
7754
  {
7755
7755
  "name": "democut_get_options",
7756
- "description": "\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C \uC4F8 \uC218 \uC788\uB294 \uBC29\uC2DD\xB7\uC9C4\uD589(host)\xB7\uD544\uC218 \uD544\uB4DC\xB7BYO \uD544\uB4DC\xB7\uBCF4\uC774\uC2A4\xB7\uC544\uBC14\uD0C0\xB7\uBC30\uACBD\xB7**\uBAA8\uC158\uADF8\uB798\uD53D \uD654\uBA74 \uAD6C\uC131**\xB7\uB2E8\uAC00\xB7\uC794\uC561. recommended_mode=ai_video. layout_patterns[] \uB294 motion_graphic \uC758 layout_pattern \uC774 \uBC1B\uB294 \uAC12\uC774\uACE0 \uAC01 \uD56D\uBAA9\uC774 \uC5B8\uC81C \uC4F0\uB294\uC9C0(when)\uB97C \uB9D0\uD55C\uB2E4 \u2014 \uBE44\uC6CC \uB450\uBA74 \uB300\uC0AC\uC5D0 \uB9DE\uB294 \uAD6C\uC131\uC744 \uC11C\uBC84\uAC00 \uACE0\uB978\uB2E4. \uB2E8\uAC00\uB294 \uCC38\uACE0\uAC12\uC774\uB2E4 \u2014 \uCCAD\uAD6C\uB294 democut_estimate_cuts \uC758 \uAC12\uC73C\uB85C. \uB2E4\uC74C \uD638\uCD9C: democut_upload_asset, democut_estimate_cuts.",
7756
+ "description": "\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C \uC4F8 \uC218 \uC788\uB294 \uBC29\uC2DD\xB7\uC9C4\uD589(host)\xB7\uD544\uC218 \uD544\uB4DC\xB7BYO \uD544\uB4DC\xB7\uBCF4\uC774\uC2A4\xB7\uC544\uBC14\uD0C0\xB7**\uBAA8\uC158\uADF8\uB798\uD53D \uD654\uBA74 \uAD6C\uC131**\xB7\uB2E8\uAC00\xB7\uC794\uC561. recommended_mode=ai_video. layout_patterns[] \uB294 motion_graphic \uC758 layout_pattern \uC774 \uBC1B\uB294 \uAC12\uC774\uACE0 \uAC01 \uD56D\uBAA9\uC774 \uC5B8\uC81C \uC4F0\uB294\uC9C0(when)\uB97C \uB9D0\uD55C\uB2E4 \u2014 \uBE44\uC6CC \uB450\uBA74 \uB300\uC0AC\uC5D0 \uB9DE\uB294 \uAD6C\uC131\uC744 \uC11C\uBC84\uAC00 \uACE0\uB978\uB2E4. \uB2E8\uAC00\uB294 \uCC38\uACE0\uAC12\uC774\uB2E4 \u2014 \uCCAD\uAD6C\uB294 democut_estimate_cuts \uC758 \uAC12\uC73C\uB85C. \uB2E4\uC74C \uD638\uCD9C: democut_upload_asset, democut_estimate_cuts.",
7757
7757
  "inputSchema": {
7758
7758
  "type": "object",
7759
7759
  "properties": {
@@ -7782,9 +7782,6 @@ var GENERATED_TOOLS = [
7782
7782
  "characters": {
7783
7783
  "type": "array"
7784
7784
  },
7785
- "backgrounds": {
7786
- "type": "array"
7787
- },
7788
7785
  "rates": {},
7789
7786
  "video_providers": {
7790
7787
  "type": "array"
@@ -9879,338 +9876,6 @@ var GENERATED_TOOLS = [
9879
9876
  "openWorldHint": false
9880
9877
  }
9881
9878
  },
9882
- {
9883
- "name": "democut_list_backgrounds",
9884
- "description": "PIP \uBC30\uACBD \uCE74\uD0C8\uB85C\uADF8(origin=background \uC790\uC0B0) + \uC62C\uB9B0 \uBC30\uACBD.",
9885
- "inputSchema": {
9886
- "type": "object",
9887
- "properties": {},
9888
- "required": [],
9889
- "additionalProperties": false
9890
- },
9891
- "outputSchema": {
9892
- "type": "object",
9893
- "properties": {
9894
- "backgrounds": {
9895
- "type": "array"
9896
- }
9897
- },
9898
- "required": [
9899
- "backgrounds"
9900
- ]
9901
- },
9902
- "annotations": {
9903
- "readOnlyHint": true,
9904
- "destructiveHint": false,
9905
- "idempotentHint": true,
9906
- "openWorldHint": false
9907
- }
9908
- },
9909
- {
9910
- "name": "democut_estimate_background_image",
9911
- "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.",
9912
- "inputSchema": {
9913
- "type": "object",
9914
- "properties": {
9915
- "label": {
9916
- "anyOf": [
9917
- {
9918
- "maxLength": 128,
9919
- "type": "string"
9920
- },
9921
- {
9922
- "type": "null"
9923
- }
9924
- ],
9925
- "default": null,
9926
- "description": "\uBC30\uACBD \uC774\uB984(meta.label) \u2014 \uC124\uBA85\uC774 \uBE44\uBA74 \uC774\uAC83\uC73C\uB85C \uADF8\uB9B0\uB2E4"
9927
- },
9928
- "description": {
9929
- "anyOf": [
9930
- {
9931
- "maxLength": 1e3,
9932
- "type": "string"
9933
- },
9934
- {
9935
- "type": "null"
9936
- }
9937
- ],
9938
- "default": null,
9939
- "description": "\uBB34\uC5C7\uC774 \uBCF4\uC774\uB294 \uC7A5\uBA74\uC778\uAC00(meta.description)"
9940
- },
9941
- "quality": {
9942
- "default": "medium",
9943
- "enum": [
9944
- "low",
9945
- "medium",
9946
- "high"
9947
- ],
9948
- "type": "string"
9949
- },
9950
- "replaces_asset_id": {
9951
- "anyOf": [
9952
- {
9953
- "maxLength": 64,
9954
- "minLength": 1,
9955
- "type": "string"
9956
- },
9957
- {
9958
- "type": "null"
9959
- }
9960
- ],
9961
- "default": null,
9962
- "description": "\uB2E4\uC2DC \uB9CC\uB4E4 \uB54C \uAD50\uCCB4\uD560 \uAE30\uC874 \uBC30\uACBD \uC790\uC0B0 id(\uAE08\uC561\uACFC \uBB34\uAD00). \uC0C8 \uBC30\uACBD\uC774 \uC644\uC131\uB418\uBA74 \uC774\uAC83\uC744 \uC9C0\uC6B4\uB2E4(\uCEF7\uC774 \uC4F0\uACE0 \uC788\uC73C\uBA74 \uB0A8\uAE30\uACE0 \uACB0\uACFC extra.replaced \uB85C \uC54C\uB9B0\uB2E4)"
9963
- }
9964
- },
9965
- "required": [],
9966
- "additionalProperties": false
9967
- },
9968
- "outputSchema": {
9969
- "type": "object",
9970
- "properties": {
9971
- "items": {
9972
- "type": "array"
9973
- },
9974
- "notes": {
9975
- "type": "array"
9976
- },
9977
- "total_krw": {
9978
- "type": "integer"
9979
- },
9980
- "rate_version": {
9981
- "type": "integer"
9982
- },
9983
- "balance_krw": {
9984
- "type": "integer"
9985
- },
9986
- "balance_after_krw": {
9987
- "type": "integer"
9988
- },
9989
- "can_afford": {
9990
- "type": "boolean"
9991
- },
9992
- "mock": {
9993
- "type": "boolean"
9994
- },
9995
- "provisional": {
9996
- "type": "boolean"
9997
- }
9998
- },
9999
- "required": [
10000
- "total_krw",
10001
- "rate_version",
10002
- "balance_krw",
10003
- "balance_after_krw",
10004
- "can_afford"
10005
- ]
10006
- },
10007
- "annotations": {
10008
- "readOnlyHint": false,
10009
- "destructiveHint": false,
10010
- "idempotentHint": false,
10011
- "openWorldHint": false
10012
- }
10013
- },
10014
- {
10015
- "name": "democut_make_background_image",
10016
- "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. \uC788\uB294 \uBC30\uACBD\uC744 \uB2E4\uC2DC \uB9CC\uB4E4\uB824\uBA74 replaces_asset_id \uC5D0 \uADF8 id \uB97C \uB123\uB294\uB2E4 \u2014 \uC0C8 \uBC30\uACBD\uC774 \uC644\uC131\uB418\uBA74 \uC61B \uAC83\uC744 \uC9C0\uC6B0\uACE0, \uCEF7\uC774 \uC4F0\uACE0 \uC788\uC73C\uBA74 \uB0A8\uAE34\uB2E4(democut_wait_jobs \uACB0\uACFC\uC758 extra.replaced \uAC00 \uC5B4\uB290 \uCABD\uC778\uC9C0 \uB9D0\uD55C\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.",
10017
- "inputSchema": {
10018
- "type": "object",
10019
- "properties": {
10020
- "label": {
10021
- "anyOf": [
10022
- {
10023
- "maxLength": 128,
10024
- "type": "string"
10025
- },
10026
- {
10027
- "type": "null"
10028
- }
10029
- ],
10030
- "default": null,
10031
- "description": "\uBC30\uACBD \uC774\uB984(meta.label) \u2014 \uC124\uBA85\uC774 \uBE44\uBA74 \uC774\uAC83\uC73C\uB85C \uADF8\uB9B0\uB2E4"
10032
- },
10033
- "description": {
10034
- "anyOf": [
10035
- {
10036
- "maxLength": 1e3,
10037
- "type": "string"
10038
- },
10039
- {
10040
- "type": "null"
10041
- }
10042
- ],
10043
- "default": null,
10044
- "description": "\uBB34\uC5C7\uC774 \uBCF4\uC774\uB294 \uC7A5\uBA74\uC778\uAC00(meta.description)"
10045
- },
10046
- "quality": {
10047
- "default": "medium",
10048
- "enum": [
10049
- "low",
10050
- "medium",
10051
- "high"
10052
- ],
10053
- "type": "string"
10054
- },
10055
- "replaces_asset_id": {
10056
- "anyOf": [
10057
- {
10058
- "maxLength": 64,
10059
- "minLength": 1,
10060
- "type": "string"
10061
- },
10062
- {
10063
- "type": "null"
10064
- }
10065
- ],
10066
- "default": null,
10067
- "description": "\uB2E4\uC2DC \uB9CC\uB4E4 \uB54C \uAD50\uCCB4\uD560 \uAE30\uC874 \uBC30\uACBD \uC790\uC0B0 id(\uAE08\uC561\uACFC \uBB34\uAD00). \uC0C8 \uBC30\uACBD\uC774 \uC644\uC131\uB418\uBA74 \uC774\uAC83\uC744 \uC9C0\uC6B4\uB2E4(\uCEF7\uC774 \uC4F0\uACE0 \uC788\uC73C\uBA74 \uB0A8\uAE30\uACE0 \uACB0\uACFC extra.replaced \uB85C \uC54C\uB9B0\uB2E4)"
10068
- },
10069
- "confirmed_cost_krw": {
10070
- "minimum": 0,
10071
- "type": "integer"
10072
- },
10073
- "rate_version": {
10074
- "minimum": 1,
10075
- "type": "integer"
10076
- }
10077
- },
10078
- "required": [
10079
- "confirmed_cost_krw",
10080
- "rate_version"
10081
- ],
10082
- "additionalProperties": false
10083
- },
10084
- "outputSchema": {
10085
- "type": "object",
10086
- "properties": {
10087
- "job_id": {
10088
- "type": "string"
10089
- },
10090
- "quote": {},
10091
- "next_calls": {
10092
- "type": "array"
10093
- }
10094
- },
10095
- "required": [
10096
- "job_id"
10097
- ]
10098
- },
10099
- "annotations": {
10100
- "readOnlyHint": false,
10101
- "destructiveHint": false,
10102
- "idempotentHint": false,
10103
- "openWorldHint": false
10104
- }
10105
- },
10106
- {
10107
- "name": "democut_update_background",
10108
- "description": "\uBC30\uACBD\uC758 \uB77C\uBCA8\xB7\uC124\uBA85\uC744 \uACE0\uCE5C\uB2E4(0\uC6D0). \uC900 \uCE78\uB9CC \uBC14\uAFB8\uACE0 \uC548 \uC900 \uCE78\uC740 \uADF8\uB300\uB85C, \uBE48 \uBB38\uC790\uC5F4\uC740 \uADF8 \uCE78\uC744 \uBE44\uC6B4\uB2E4. \uADF8\uB9BC\uC740 \uADF8\uB300\uB85C\uB2E4 \u2014 \uB2E4\uC2DC \uADF8\uB9AC\uB824\uBA74 democut_make_background_image \uC5D0 replaces_asset_id.",
10109
- "inputSchema": {
10110
- "type": "object",
10111
- "properties": {
10112
- "asset_id": {
10113
- "type": "string",
10114
- "description": "\uC790\uC0B0 id(ast_\u2026)"
10115
- },
10116
- "label": {
10117
- "anyOf": [
10118
- {
10119
- "maxLength": 128,
10120
- "type": "string"
10121
- },
10122
- {
10123
- "type": "null"
10124
- }
10125
- ],
10126
- "default": null,
10127
- "description": "\uBC30\uACBD \uC774\uB984(meta.label). \uBE48 \uBB38\uC790\uC5F4\uC774\uBA74 \uBE44\uC6B4\uB2E4"
10128
- },
10129
- "description": {
10130
- "anyOf": [
10131
- {
10132
- "maxLength": 1e3,
10133
- "type": "string"
10134
- },
10135
- {
10136
- "type": "null"
10137
- }
10138
- ],
10139
- "default": null,
10140
- "description": "\uBB34\uC5C7\uC774 \uBCF4\uC774\uB294 \uC7A5\uBA74\uC778\uAC00(meta.description). \uBE48 \uBB38\uC790\uC5F4\uC774\uBA74 \uBE44\uC6B4\uB2E4"
10141
- }
10142
- },
10143
- "required": [
10144
- "asset_id"
10145
- ],
10146
- "additionalProperties": false,
10147
- "anyOf": [
10148
- {
10149
- "required": [
10150
- "label"
10151
- ]
10152
- },
10153
- {
10154
- "required": [
10155
- "description"
10156
- ]
10157
- }
10158
- ]
10159
- },
10160
- "outputSchema": {
10161
- "type": "object",
10162
- "properties": {
10163
- "id": {
10164
- "type": "string"
10165
- },
10166
- "workspace_id": {
10167
- "type": "string"
10168
- },
10169
- "project_slug": {},
10170
- "kind": {
10171
- "type": "string"
10172
- },
10173
- "origin": {
10174
- "type": "string"
10175
- },
10176
- "mime": {
10177
- "type": "string"
10178
- },
10179
- "bytes": {
10180
- "type": "integer"
10181
- },
10182
- "sha256": {},
10183
- "meta": {},
10184
- "state": {
10185
- "type": "string"
10186
- },
10187
- "created_by": {
10188
- "type": "string"
10189
- },
10190
- "created_at": {
10191
- "type": "string"
10192
- },
10193
- "download_url": {}
10194
- },
10195
- "required": [
10196
- "id",
10197
- "workspace_id",
10198
- "kind",
10199
- "origin",
10200
- "mime",
10201
- "bytes",
10202
- "state",
10203
- "created_by",
10204
- "created_at"
10205
- ]
10206
- },
10207
- "annotations": {
10208
- "readOnlyHint": false,
10209
- "destructiveHint": false,
10210
- "idempotentHint": false,
10211
- "openWorldHint": false
10212
- }
10213
- },
10214
9879
  {
10215
9880
  "name": "democut_get_brand_kit",
10216
9881
  "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.",
@@ -12932,30 +12597,6 @@ var TOOL_META = {
12932
12597
  "method": "POST",
12933
12598
  "path": "/api/characters/{character_id}/sheet"
12934
12599
  },
12935
- "democut_list_backgrounds": {
12936
- "cost": "none",
12937
- "group": "character",
12938
- "method": "GET",
12939
- "path": "/api/backgrounds"
12940
- },
12941
- "democut_estimate_background_image": {
12942
- "cost": "quote",
12943
- "group": "character",
12944
- "method": "POST",
12945
- "path": "/api/backgrounds/estimate"
12946
- },
12947
- "democut_make_background_image": {
12948
- "cost": "charge",
12949
- "group": "character",
12950
- "method": "POST",
12951
- "path": "/api/backgrounds/generate"
12952
- },
12953
- "democut_update_background": {
12954
- "cost": "none",
12955
- "group": "character",
12956
- "method": "PATCH",
12957
- "path": "/api/backgrounds/{asset_id}"
12958
- },
12959
12600
  "democut_get_brand_kit": {
12960
12601
  "cost": "none",
12961
12602
  "group": "brand",
@@ -13451,11 +13092,18 @@ var err2 = (s) => process.stderr.write(`${s}
13451
13092
  `);
13452
13093
  function renderBlock(guide, base, isDefaultBase) {
13453
13094
  const register = isDefaultBase ? "claude mcp add democut -- npx -y democut@latest mcp" : `claude mcp add democut -- npx -y democut@latest mcp --base-url ${base}`;
13095
+ const loginBase = isDefaultBase ? "" : ` --base-url ${base}`;
13454
13096
  return [
13455
13097
  BLOCK_START,
13456
13098
  "## DemoCut \uC5D0\uC774\uC804\uD2B8 \uC5F0\uACB0",
13457
13099
  "",
13458
- "MCP \uB4F1\uB85D(\uD55C \uBC88): `" + register + "` \u2014 `@latest` \uD544\uC218(`-y` \uB294 npx \uCE90\uC2DC\uC758 \uC61B \uBC84\uC804\uC744 \uADF8\uB300\uB85C \uB744\uC6B4\uB2E4). \uB85C\uADF8\uC778: `democut auth login`.",
13100
+ // ★★ 로그인도 `npx -y democut@latest` 로 안내한다(GitLab #28) — 맨 `democut` 은 **전역 설치본**을
13101
+ // 부르고, 그것이 낡아 있으면(0.6.x 가 PATH 에 남아 있는 경우가 실제로 있다) 사라진 명령을
13102
+ // 광고하고 404 를 받는다. 등록 줄이 이미 `@latest` 를 쓰는데 로그인만 그러지 않았다.
13103
+ // ★★ 커스텀 base 면 로그인 줄에도 `--base-url` 을 붙인다(faceta !623) — 없으면 스테이징에
13104
+ // 등록해 놓고 **prod 에 로그인**해, 등록한 서버와 인증한 서버가 갈린다. 같은 함정을
13105
+ // `cli.ts:207` 이 이미 적어 뒀는데 등록 줄만 반영하고 로그인 줄은 빠져 있었다.
13106
+ "MCP \uB4F1\uB85D(\uD55C \uBC88): `" + register + "` \u2014 `@latest` \uD544\uC218(`-y` \uB294 npx \uCE90\uC2DC\uC758 \uC61B \uBC84\uC804\uC744 \uADF8\uB300\uB85C \uB744\uC6B4\uB2E4). \uB85C\uADF8\uC778: `npx -y democut@latest auth login" + loginBase + "`.",
13459
13107
  "\uB3C4\uAD6C \uC774\uB984\uC740 `democut_` \uC811\uB450\uC0AC\uB2E4(\uC608: `democut_estimate_cuts`). \uC544\uB798 \uAC00\uC774\uB4DC\uC758 \uC774\uB984\uC740 \uADF8 \uC811\uB450\uC0AC\uB97C \uBE80 \uAC83\uC774\uB2E4.",
13460
13108
  "",
13461
13109
  guide.trim(),
@@ -13958,7 +13606,7 @@ function getOptions(a = {}, deps = {}) {
13958
13606
  text: [
13959
13607
  `\uD504\uB85C\uC81D\uD2B8 ${out4.project.slug} \u2014 ${out4.project.ratio} ${out4.project.resolution}`,
13960
13608
  `\uAD8C\uC7A5 \uBC29\uC2DD: ${out4.recommended_mode} \xB7 \uAC00\uB2A5\uD55C \uBC29\uC2DD: ${modes}`,
13961
- `\uBCF4\uC774\uC2A4 ${(out4.voices ?? []).length}\uAC1C \xB7 \uC544\uBC14\uD0C0 ${(out4.characters ?? []).length}\uAC1C \xB7 \uBC30\uACBD ${(out4.backgrounds ?? []).length}\uAC1C`,
13609
+ `\uBCF4\uC774\uC2A4 ${(out4.voices ?? []).length}\uAC1C \xB7 \uC544\uBC14\uD0C0 ${(out4.characters ?? []).length}\uAC1C`,
13962
13610
  `\uC794\uC561 ${krw(out4.balance_krw)} \xB7 \uC694\uC728 v${out4.rate_version}`,
13963
13611
  "\uB2E8\uAC00\uB294 \uCC38\uACE0\uAC12\uC785\uB2C8\uB2E4 \u2014 \uCCAD\uAD6C\uB294 democut_estimate_cuts \uAC00 \uC900 total_krw\xB7rate_version \uC73C\uB85C \uD569\uB2C8\uB2E4."
13964
13612
  ].join("\n"),
@@ -14988,26 +14636,6 @@ function characterLine(c) {
14988
14636
  const photos = c.photos?.length ? `\uC0AC\uC9C4 ${c.photos.length}\uC7A5` : "\uC0AC\uC9C4 \uC5C6\uC74C";
14989
14637
  return `${c.name} [${c.id}] rev=${c.rev} \xB7 ${photos}${c.current_photo_id ? " (\uB300\uD45C \uC788\uC74C)" : ""}`;
14990
14638
  }
14991
- function listBackgrounds(_a3 = {}, deps = {}) {
14992
- return guarded(READ_ONLY, async () => {
14993
- const base = resolveBaseUrl(deps.baseUrl);
14994
- const out4 = await apiRequest(base, "/api/backgrounds", {}, deps);
14995
- if (!out4.backgrounds?.length) {
14996
- return {
14997
- text: "\uBC30\uACBD\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC6F9\uC758 \uBC30\uACBD \uB77C\uC774\uBE0C\uB7EC\uB9AC(ultra)\uC5D0\uC11C \uC62C\uB9AC\uAC70\uB098, democut_upload_asset \uC73C\uB85C \uC62C\uB9B0 \uC774\uBBF8\uC9C0 \uC790\uC0B0\uC758 id \uB97C pip.background_asset_id \uC5D0 \uADF8\uB300\uB85C \uC368\uB3C4 \uB429\uB2C8\uB2E4.",
14998
- structured: callableStructured(out4)
14999
- };
15000
- }
15001
- const lines = [`\uBC30\uACBD ${out4.backgrounds.length}\uC7A5 \u2014 pip.background_asset_id \uC5D0 id \uB97C \uB123\uC73C\uC138\uC694.`];
15002
- for (const a of out4.backgrounds.slice(0, 20)) {
15003
- const meta2 = a.meta ?? {};
15004
- const label = typeof meta2.label === "string" && meta2.label || typeof meta2.filename === "string" && meta2.filename || "";
15005
- lines.push(` ${a.id}: ${label} (${a.mime}, ${a.bytes} bytes)`);
15006
- }
15007
- if (out4.backgrounds.length > 20) lines.push(` \u2026\uC678 ${out4.backgrounds.length - 20}\uC7A5`);
15008
- return { text: lines.join("\n"), structured: callableStructured(out4) };
15009
- });
15010
- }
15011
14639
  function listCharacters(_a3 = {}, deps = {}) {
15012
14640
  return guarded(READ_ONLY, async () => {
15013
14641
  const base = resolveBaseUrl(deps.baseUrl);
@@ -15229,97 +14857,6 @@ function makeCharacterPhoto(a = {}, deps = {}) {
15229
14857
  };
15230
14858
  });
15231
14859
  }
15232
- function backgroundImageBody(a) {
15233
- return {
15234
- ...a.label !== void 0 ? { label: a.label } : {},
15235
- ...a.description !== void 0 ? { description: a.description } : {},
15236
- ...a.quality !== void 0 ? { quality: a.quality } : {},
15237
- ...a.replaces_asset_id ? { replaces_asset_id: a.replaces_asset_id } : {}
15238
- };
15239
- }
15240
- function estimateBackgroundImage(a = {}, deps = {}) {
15241
- return guarded(READ_ONLY, async () => {
15242
- const base = resolveBaseUrl(deps.baseUrl);
15243
- const out4 = await apiRequest(
15244
- base,
15245
- "/api/backgrounds/estimate",
15246
- { method: "POST", body: backgroundImageBody(a) },
15247
- deps
15248
- );
15249
- const item = out4.items?.[0];
15250
- if (!item || item.blocked_reason) {
15251
- const reason = item?.blocked_reason ?? "\uACAC\uC801\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4";
15252
- return {
15253
- text: `\uC544\uC9C1 \uBC30\uACBD\uC744 \uB9CC\uB4E4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${reason}
15254
- \uAD00\uB9AC\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC138\uC694(\uC0C1\uD55C \uBBF8\uC2E4\uCE21\uC740 \uC6B4\uC601\uC790 \uBAAB\uC785\uB2C8\uB2E4).`,
15255
- structured: callableStructured(out4)
15256
- };
15257
- }
15258
- const rows = (item.rows ?? []).map((r) => `${r.display_name || r.key} ${krw(r.krw)}`).join(", ") || "\uD589 \uC5C6\uC74C";
15259
- const lines = [
15260
- `\uBC30\uACBD \uACAC\uC801 (\uC694\uC728 v${out4.rate_version}) \u2014 \uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4`,
15261
- ` ${krw(item.total_krw ?? 0)} (${rows})`,
15262
- `\uC794\uC561 ${krw(out4.balance_krw)} \u2192 \uB0A8\uC744 \uC794\uC561 ${krw(out4.balance_after_krw)}`,
15263
- 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.",
15264
- "\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."
15265
- ];
15266
- if (out4.mock) lines.push("(mock \uB2E8\uAC00\uC785\uB2C8\uB2E4 \u2014 \uC2E4\uC81C \uCCAD\uAD6C\uC640 \uB2E4\uB97C \uC218 \uC788\uC2B5\uB2C8\uB2E4.)");
15267
- return { text: lines.join("\n"), structured: callableStructured(out4) };
15268
- });
15269
- }
15270
- function makeBackgroundImage(a = {}, deps = {}) {
15271
- return guarded(SUBMITTING, async () => {
15272
- const base = resolveBaseUrl(deps.baseUrl);
15273
- const out4 = await apiRequest(
15274
- base,
15275
- "/api/backgrounds/generate",
15276
- {
15277
- method: "POST",
15278
- body: {
15279
- ...backgroundImageBody(a),
15280
- // ★ 동의는 **명시**다 — 없으면 서버가 0원 동의로 읽고 409 로 거부한다(그것이 옳다).
15281
- confirmed_cost_krw: a.confirmed_cost_krw ?? 0,
15282
- rate_version: a.rate_version
15283
- }
15284
- },
15285
- deps
15286
- );
15287
- const total = out4.quote?.total_krw ?? 0;
15288
- return {
15289
- text: [
15290
- `\uBC30\uACBD\uC744 \uB9CC\uB4DC\uB294 \uC911\uC785\uB2C8\uB2E4 \u2014 ${out4.job_id}`,
15291
- `\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.`,
15292
- "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.",
15293
- ...a.replaces_asset_id ? [`\uB05D\uB098\uBA74 ${a.replaces_asset_id} \uB97C \uC9C0\uC6C1\uB2C8\uB2E4 \u2014 \uCEF7\uC774 \uC4F0\uACE0 \uC788\uC73C\uBA74 \uB0A8\uAE30\uACE0 wait_jobs \uACB0\uACFC\uC758 extra.replaced \uAC00 \uADF8\uB807\uAC8C \uB9D0\uD569\uB2C8\uB2E4.`] : []
15294
- ].join("\n"),
15295
- structured: callableStructured(out4)
15296
- };
15297
- });
15298
- }
15299
- function updateBackground(a = {}, deps = {}) {
15300
- return guarded(READ_ONLY, async () => {
15301
- const id = (a.asset_id ?? "").trim();
15302
- if (!id) return { isError: true, text: "asset_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4." };
15303
- const base = resolveBaseUrl(deps.baseUrl);
15304
- const out4 = await apiRequest(
15305
- base,
15306
- `/api/backgrounds/${encodeURIComponent(id)}`,
15307
- {
15308
- method: "PATCH",
15309
- body: {
15310
- ...a.label !== void 0 ? { label: a.label } : {},
15311
- ...a.description !== void 0 ? { description: a.description } : {}
15312
- }
15313
- },
15314
- deps
15315
- );
15316
- const meta2 = out4.meta ?? {};
15317
- return {
15318
- text: `\uBC30\uACBD ${out4.id} \uC744 \uACE0\uCCE4\uC2B5\uB2C8\uB2E4 \u2014 \uB77C\uBCA8 \u300C${meta2.label ?? ""}\u300D, \uC124\uBA85 \u300C${meta2.description ?? ""}\u300D.`,
15319
- structured: callableStructured(out4)
15320
- };
15321
- });
15322
- }
15323
14860
  function estimateCharacterSheet(a = {}, deps = {}) {
15324
14861
  return guarded(READ_ONLY, async () => {
15325
14862
  const id = (a.character_id ?? "").trim();
@@ -15968,14 +15505,6 @@ function dispatch(name, args, deps = {}) {
15968
15505
  return makeCharacterSheet(args, deps);
15969
15506
  case "democut_delete_character":
15970
15507
  return deleteCharacter(args, deps);
15971
- case "democut_list_backgrounds":
15972
- return listBackgrounds(args, deps);
15973
- case "democut_estimate_background_image":
15974
- return estimateBackgroundImage(args, deps);
15975
- case "democut_make_background_image":
15976
- return makeBackgroundImage(args, deps);
15977
- case "democut_update_background":
15978
- return updateBackground(args, deps);
15979
15508
  default:
15980
15509
  return Promise.resolve({ isError: true, text: `\uC54C \uC218 \uC5C6\uB294 \uB3C4\uAD6C: ${name}` });
15981
15510
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "democut",
3
- "version": "1.0.51",
3
+ "version": "1.0.54",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",