democut 0.6.17 → 0.6.19

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 +141 -22
  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 = "0.6.17";
6919
+ var VERSION = "0.6.19";
6920
6920
 
6921
6921
  // src/device-flow.ts
6922
6922
  var DeviceFlowError = class extends Error {
@@ -18343,6 +18343,74 @@ var GENERATED_TOOLS = [
18343
18343
  "idempotentHint": true,
18344
18344
  "openWorldHint": false
18345
18345
  }
18346
+ },
18347
+ {
18348
+ "name": "democut_add_character_photo",
18349
+ "description": "\uC62C\uB9B0 \uC774\uBBF8\uC9C0\uB97C \uC0AC\uC9C4 \uD310\uC73C\uB85C \uCD94\uAC00\uD55C\uB2E4(0\uC6D0). \uC18C\uAE09 \uC5C6\uC74C.",
18350
+ "inputSchema": {
18351
+ "type": "object",
18352
+ "properties": {
18353
+ "character_id": {
18354
+ "type": "string",
18355
+ "description": "\uC544\uBC14\uD0C0 id(chr_\u2026)"
18356
+ },
18357
+ "asset_id": {
18358
+ "title": "Asset Id",
18359
+ "type": "string"
18360
+ },
18361
+ "note": {
18362
+ "anyOf": [
18363
+ {
18364
+ "type": "string"
18365
+ },
18366
+ {
18367
+ "type": "null"
18368
+ }
18369
+ ],
18370
+ "default": null,
18371
+ "title": "Note"
18372
+ }
18373
+ },
18374
+ "required": [
18375
+ "character_id",
18376
+ "asset_id"
18377
+ ],
18378
+ "additionalProperties": false
18379
+ },
18380
+ "annotations": {
18381
+ "readOnlyHint": false,
18382
+ "destructiveHint": false,
18383
+ "idempotentHint": false,
18384
+ "openWorldHint": false
18385
+ }
18386
+ },
18387
+ {
18388
+ "name": "democut_select_character_photo",
18389
+ "description": "\uB300\uD45C \uC0AC\uC9C4\uC744 \uACE0\uB978\uB2E4(\uC774\uBBF8 \uB9CC\uB4E0 \uCEF7\uC5D0\uB294 \uC18C\uAE09\uD558\uC9C0 \uC54A\uB294\uB2E4).",
18390
+ "inputSchema": {
18391
+ "type": "object",
18392
+ "properties": {
18393
+ "character_id": {
18394
+ "type": "string",
18395
+ "description": "\uC544\uBC14\uD0C0 id(chr_\u2026)"
18396
+ },
18397
+ "photo_id": {
18398
+ "title": "Photo Id",
18399
+ "type": "string"
18400
+ }
18401
+ },
18402
+ "required": [
18403
+ "character_id",
18404
+ "photo_id"
18405
+ ],
18406
+ "additionalProperties": false
18407
+ },
18408
+ "annotations": {
18409
+ "readOnlyHint": false,
18410
+ "destructiveHint": false,
18411
+ "idempotentHint": true,
18412
+ "openWorldHint": false
18413
+ }
18346
18414
  }
18347
18415
  ];
18348
18416
 
@@ -18825,19 +18893,6 @@ function listProjects(a = {}, deps = {}) {
18825
18893
  return { text: lines.join("\n") };
18826
18894
  });
18827
18895
  }
18828
- var PROJECT_FIELD_DEFAULTS = {
18829
- ratio: "16:9",
18830
- resolution: "1080p",
18831
- folder_id: null,
18832
- defaults: null
18833
- };
18834
- function unsupportedProjectFields(a) {
18835
- const given = a;
18836
- return Object.keys(PROJECT_FIELD_DEFAULTS).filter((key) => {
18837
- const v = given[key];
18838
- return v !== void 0 && v !== null && v !== PROJECT_FIELD_DEFAULTS[key];
18839
- });
18840
- }
18841
18896
  function createProject(a = {}, deps = {}) {
18842
18897
  return guarded(READ_ONLY, async () => {
18843
18898
  const title = (a.title ?? "").trim();
@@ -18847,24 +18902,38 @@ function createProject(a = {}, deps = {}) {
18847
18902
  text: "title \uC774 \uD544\uC694\uD569\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uAC00 \uC54C\uC544\uBCFC \uC218 \uC788\uB294 \uD504\uB85C\uC81D\uD2B8 \uC774\uB984\uC744 \uB123\uC5B4 \uB2E4\uC2DC \uD638\uCD9C\uD558\uC138\uC694."
18848
18903
  };
18849
18904
  }
18850
- const unsupported = unsupportedProjectFields(a);
18851
- if (unsupported.length > 0) {
18852
- return {
18853
- isError: true,
18854
- text: `${unsupported.join(", ")} \uC740 \uC544\uC9C1 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4(\uAE30\uBCF8\uAC12\uB9CC \uAC00\uB2A5). \uADF8 \uC778\uC790\uB97C \uBE7C\uACE0 \uB2E4\uC2DC \uD638\uCD9C\uD558\uBA74 ${PROJECT_FIELD_DEFAULTS.ratio}\xB7${PROJECT_FIELD_DEFAULTS.resolution} \uB85C \uB9CC\uB4E4\uC5B4\uC9D1\uB2C8\uB2E4.`
18855
- };
18856
- }
18857
18905
  const base = resolveBaseUrl(deps.baseUrl);
18858
18906
  const voiceId = await defaultVoiceId(base, deps);
18859
18907
  const p = await create(
18860
18908
  base,
18861
- { title, voice_id: voiceId, external_ref: `mcp:project:${title}` },
18909
+ {
18910
+ title,
18911
+ voice_id: voiceId,
18912
+ external_ref: `mcp:project:${title}`,
18913
+ ...a.ratio !== void 0 ? { ratio: a.ratio } : {},
18914
+ ...a.resolution !== void 0 ? { resolution: a.resolution } : {},
18915
+ ...a.folder_id !== void 0 ? { folder_id: a.folder_id } : {},
18916
+ ...a.defaults !== void 0 ? { defaults: a.defaults } : {}
18917
+ },
18862
18918
  deps
18863
18919
  );
18920
+ const asked = a.ratio;
18921
+ const mismatch = asked && p.ratio && p.ratio !== asked;
18864
18922
  return {
18865
18923
  text: [
18866
18924
  `\uD504\uB85C\uC81D\uD2B8 \uC900\uBE44\uB428 \u2014 slug: ${p.slug}`,
18867
18925
  `\uC81C\uBAA9: ${p.title}`,
18926
+ // ⚠️ 롤링 중 옛 api 는 이 둘을 내지 않는다 — 없으면 **말하지 않는다**(undefined 를 찍으면
18927
+ // 모델이 그것을 사실로 읽는다).
18928
+ ...p.ratio && p.resolution ? [
18929
+ `\uBE44\uC728\xB7\uD574\uC0C1\uB3C4: ${p.ratio} \xB7 ${p.resolution}` + (p.ratio !== "16:9" ? " (\uBE44\uC728\uC740 \uC774\uD6C4 \uBC14\uAFC0 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4)" : "")
18930
+ ] : [],
18931
+ ...mismatch ? [
18932
+ `\u26A0\uFE0F ${asked} \uB85C \uC694\uCCAD\uD588\uC9C0\uB9CC ${p.ratio} \uB85C \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4 \u2014 \uC11C\uBC84\uAC00 \uC544\uC9C1 \uC774 \uC635\uC158\uC744 \uBC1B\uC9C0 \uC54A\uB294 \uBC84\uC804\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uBE44\uC728\uC740 \uBC14\uAFC0 \uC218 \uC5C6\uC73C\uB2C8, ${asked} \uAC00 \uD544\uC694\uD558\uBA74 \uC774 \uD504\uB85C\uC81D\uD2B8\uB97C \uC4F0\uC9C0 \uB9D0\uACE0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC54C\uB9B0 \uB4A4 \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uB9CC\uB4DC\uC138\uC694.`
18933
+ ] : [],
18934
+ ...asked && !p.ratio ? [
18935
+ `\u26A0\uFE0F \uC11C\uBC84\uAC00 \uBE44\uC728\uC744 \uC54C\uB824\uC8FC\uC9C0 \uC54A\uC544 ${asked} \uB85C \uB9CC\uB4E4\uC5B4\uC84C\uB294\uC9C0 \uD655\uC778\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 (\uC61B \uBC84\uC804\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4). democut_get_options \uB85C \uD655\uC778\uD558\uC138\uC694.`
18936
+ ] : [],
18868
18937
  "",
18869
18938
  "\uD504\uB85C\uC81D\uD2B8\uB97C \uC694\uAD6C\uD558\uB294 \uB3C4\uAD6C\uC758 project_slug \uC5D0 \uC704 slug \uB97C \uADF8\uB300\uB85C \uB123\uC73C\uC138\uC694.",
18870
18939
  "\uAC19\uC740 \uC81C\uBAA9\uC73C\uB85C \uC774 \uB3C4\uAD6C\uB97C \uB2E4\uC2DC \uBD88\uB7EC\uB3C4 \uC0C8\uB85C \uB9CC\uB4E4\uC9C0 \uC54A\uACE0 \uC774 \uD504\uB85C\uC81D\uD2B8\uAC00 \uB098\uC635\uB2C8\uB2E4."
@@ -19244,6 +19313,52 @@ function putCharacter(a = {}, deps = {}) {
19244
19313
  return { text: `\uC544\uBC14\uD0C0\uB97C \uBC14\uAFE8\uC2B5\uB2C8\uB2E4: ${characterLine(out2)}` };
19245
19314
  });
19246
19315
  }
19316
+ function addCharacterPhoto(a = {}, deps = {}) {
19317
+ return guarded(READ_ONLY, async () => {
19318
+ const id = (a.character_id ?? "").trim();
19319
+ if (!id) return { isError: true, text: "character_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4." };
19320
+ const assetId = (a.asset_id ?? "").trim();
19321
+ if (!assetId) {
19322
+ return {
19323
+ isError: true,
19324
+ text: "asset_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4 \u2014 democut_upload_asset \uC73C\uB85C \uC774\uBBF8\uC9C0\uB97C \uBA3C\uC800 \uC62C\uB9AC\uC138\uC694."
19325
+ };
19326
+ }
19327
+ const base = resolveBaseUrl(deps.baseUrl);
19328
+ const out2 = await apiRequest(
19329
+ base,
19330
+ `/api/characters/${encodeURIComponent(id)}/photos`,
19331
+ { method: "POST", body: { asset_id: assetId, ...a.note ? { note: a.note } : {} } },
19332
+ deps
19333
+ );
19334
+ const added = out2.photos?.[out2.photos.length - 1];
19335
+ const tail = added && out2.current_photo_id === added.id ? " \uCCAB \uC0AC\uC9C4\uC774\uB77C \uB300\uD45C\uB85C \uC815\uD588\uC2B5\uB2C8\uB2E4." : "";
19336
+ return { text: `\uC0AC\uC9C4\uC744 \uCD94\uAC00\uD588\uC2B5\uB2C8\uB2E4: ${characterLine(out2)}${tail}` };
19337
+ });
19338
+ }
19339
+ function selectCharacterPhoto(a = {}, deps = {}) {
19340
+ return guarded(READ_ONLY, async () => {
19341
+ const id = (a.character_id ?? "").trim();
19342
+ if (!id) return { isError: true, text: "character_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4." };
19343
+ const photoId = (a.photo_id ?? "").trim();
19344
+ if (!photoId) {
19345
+ return {
19346
+ isError: true,
19347
+ text: "photo_id \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4 \u2014 democut_get_character \uC758 photos[].id \uB97C \uC4F0\uC138\uC694."
19348
+ };
19349
+ }
19350
+ const base = resolveBaseUrl(deps.baseUrl);
19351
+ const out2 = await apiRequest(
19352
+ base,
19353
+ `/api/characters/${encodeURIComponent(id)}/photos/current`,
19354
+ { method: "PUT", body: { photo_id: photoId } },
19355
+ deps
19356
+ );
19357
+ return {
19358
+ text: `\uB300\uD45C \uC0AC\uC9C4\uC744 \uBC14\uAFE8\uC2B5\uB2C8\uB2E4: ${characterLine(out2)} \u2014 \uC774\uBBF8 \uB9CC\uB4E0 \uCEF7\uC740 \uADF8\uB300\uB85C\uC785\uB2C8\uB2E4.`
19359
+ };
19360
+ });
19361
+ }
19247
19362
  function deleteCharacter(a = {}, deps = {}) {
19248
19363
  return guarded(READ_ONLY, async () => {
19249
19364
  const id = (a.character_id ?? "").trim();
@@ -19302,6 +19417,10 @@ function dispatch(name, args, deps = {}) {
19302
19417
  return getCharacter(args, deps);
19303
19418
  case "democut_put_character":
19304
19419
  return putCharacter(args, deps);
19420
+ case "democut_add_character_photo":
19421
+ return addCharacterPhoto(args, deps);
19422
+ case "democut_select_character_photo":
19423
+ return selectCharacterPhoto(args, deps);
19305
19424
  case "democut_delete_character":
19306
19425
  return deleteCharacter(args, deps);
19307
19426
  default:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "democut",
3
- "version": "0.6.17",
3
+ "version": "0.6.19",
4
4
  "description": "DemoCut 에이전트 CLI — device flow 로그인(RFC 8628) + 영상 생성",
5
5
  "license": "MIT",
6
6
  "author": "InfoGrab",