democut 0.5.0 → 0.6.1
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.
- package/README.md +5 -0
- package/dist/cli.js +53 -11
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -224,6 +224,11 @@ SSOT 는 `apps/api/app/mcp/auth.py` docstring.
|
|
|
224
224
|
promote(사람이 누르는 버튼) → npm-publish-cli → deploy-dgx
|
|
225
225
|
```
|
|
226
226
|
|
|
227
|
+
게시본에는 **sigstore provenance 서명**이 붙는다 — npmjs.com 의 패키지 페이지에서
|
|
228
|
+
"Provenance" 배지로 "이 레포의 이 파이프라인이 만들었다" 를 확인할 수 있다.
|
|
229
|
+
⚠️ 서명은 **fail-soft** 다: sigstore·OIDC 장애 시 경고를 남기고 서명 없이 게시한다
|
|
230
|
+
(외부 서비스 장애가 프로덕션 배포를 막지 않게). 그 릴리스에는 배지가 없다.
|
|
231
|
+
|
|
227
232
|
`deploy-dgx` 가 게시 성공을 `needs` 로 요구하므로, **게시가 실패하면 문서가 프로덕션에
|
|
228
233
|
나가지 않는다.** `/docs/agents` 가 아직 없는 패키지를 안내하는 창이 구조적으로 열리지 않는다
|
|
229
234
|
(무스코프 이름이라 그 창에서 제3자가 선점하면 토큰 탈취로 이어질 수 있다 — CWE-829).
|
package/dist/cli.js
CHANGED
|
@@ -6915,6 +6915,9 @@ var require_dist = __commonJS({
|
|
|
6915
6915
|
import { realpathSync } from "fs";
|
|
6916
6916
|
import { fileURLToPath } from "url";
|
|
6917
6917
|
|
|
6918
|
+
// src/version.ts
|
|
6919
|
+
var VERSION = "0.6.1";
|
|
6920
|
+
|
|
6918
6921
|
// src/device-flow.ts
|
|
6919
6922
|
var DeviceFlowError = class extends Error {
|
|
6920
6923
|
constructor(code, message) {
|
|
@@ -6929,7 +6932,9 @@ var SLOW_DOWN_INCREMENT_MS = 5e3;
|
|
|
6929
6932
|
async function postJson(url, body, fetchImpl) {
|
|
6930
6933
|
const res = await fetchImpl(url, {
|
|
6931
6934
|
method: "POST",
|
|
6932
|
-
|
|
6935
|
+
// api-client 와 같은 이유로 버전을 밝힌다 — device flow 는 그 파일을 거치지 않는
|
|
6936
|
+
// 별도 HTTP 경로라, 여기를 빼면 로그인 경로의 설치본 분포만 보이지 않는다.
|
|
6937
|
+
headers: { "Content-Type": "application/json", "User-Agent": `democut/${VERSION}` },
|
|
6933
6938
|
body: JSON.stringify(body)
|
|
6934
6939
|
});
|
|
6935
6940
|
const text = await res.text();
|
|
@@ -7286,7 +7291,10 @@ function parseDetail(status2, body) {
|
|
|
7286
7291
|
async function apiRequest(baseUrl, path, init = {}, deps = {}) {
|
|
7287
7292
|
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
7288
7293
|
const token = await getValidAccessToken(baseUrl, deps);
|
|
7289
|
-
const headers = {
|
|
7294
|
+
const headers = {
|
|
7295
|
+
Authorization: `Bearer ${token}`,
|
|
7296
|
+
"User-Agent": `democut/${VERSION}`
|
|
7297
|
+
};
|
|
7290
7298
|
if (init.body !== void 0) headers["Content-Type"] = "application/json";
|
|
7291
7299
|
const res = await fetchImpl(`${baseUrl}${path}`, {
|
|
7292
7300
|
method: init.method ?? "GET",
|
|
@@ -7322,6 +7330,28 @@ function usd(v) {
|
|
|
7322
7330
|
}
|
|
7323
7331
|
function classifyApiError(e, ctx) {
|
|
7324
7332
|
const hint = ctx.statusHint ?? "\uC0C1\uD0DC \uC870\uD68C";
|
|
7333
|
+
if (e.status === 422 && e.code === "VIDEOGEN_UPSTREAM_REJECTED") {
|
|
7334
|
+
return {
|
|
7335
|
+
safety: "unsafe",
|
|
7336
|
+
// 돈이 나갔다가 돌아왔다 — "애초에 과금이 없었다" 와는 다르다. 그 구분을 흐리면
|
|
7337
|
+
// 원장을 보는 사람이 이 거래를 설명하지 못한다.
|
|
7338
|
+
notCharged: false,
|
|
7339
|
+
lines: [
|
|
7340
|
+
"\uC5C5\uC2A4\uD2B8\uB9BC\uC774 \uC774 \uC791\uC5C5\uC744 \uC601\uAD6C \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC870\uD68C\uD574\uB3C4 \uBCF5\uAD6C\uB418\uC9C0 \uC54A\uC73C\uBA70, \uACFC\uAE08\uC740 \uD658\uBD88\uB410\uC2B5\uB2C8\uB2E4.",
|
|
7341
|
+
"\uACE0\uCE60 \uD30C\uB77C\uBBF8\uD130\uAC00 \uC788\uB294 \uC624\uB958\uAC00 \uC544\uB2D9\uB2C8\uB2E4 \u2014 \uC0C8\uB85C \uB9CC\uB4E4\uB824\uBA74 \uD504\uB86C\uD504\uD2B8\xB7\uC124\uC815\uC744 \uBC14\uAFD4 **\uC0C8\uB85C \uC81C\uCD9C**\uD574\uC57C \uD558\uACE0, \uADF8\uAC74 \uB2E4\uC2DC \uACFC\uAE08\uB429\uB2C8\uB2E4(\uC0AC\uC6A9\uC790 \uB3D9\uC758\uB97C \uBC1B\uC73C\uC138\uC694)."
|
|
7342
|
+
]
|
|
7343
|
+
};
|
|
7344
|
+
}
|
|
7345
|
+
if (e.status === 404 && e.code === "VIDEOGEN_JOB_NOT_FOUND") {
|
|
7346
|
+
return {
|
|
7347
|
+
safety: "unsafe",
|
|
7348
|
+
notCharged: false,
|
|
7349
|
+
lines: [
|
|
7350
|
+
"\uADF8 \uC791\uC5C5\uC744 \uD655\uC778\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. job_id \uAC00 \uB9DE\uB294\uC9C0 \uBA3C\uC800 \uD655\uC778\uD558\uC138\uC694.",
|
|
7351
|
+
"\u26A0\uFE0F \uC791\uC5C5\uC774 \uC0B4\uC544 \uC788\uB294\uB370 \uC870\uD68C\uB9CC \uC5B4\uAE0B\uB0AC\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4 \u2014 \uC0C8\uB85C \uC81C\uCD9C\uD558\uBA74 **\uBCC4\uB3C4 \uC791\uC5C5\uC73C\uB85C \uB2E4\uC2DC \uACFC\uAE08**\uB429\uB2C8\uB2E4."
|
|
7352
|
+
]
|
|
7353
|
+
};
|
|
7354
|
+
}
|
|
7325
7355
|
if (e.status === 402) {
|
|
7326
7356
|
const lines = [];
|
|
7327
7357
|
const limit = e.extra.limit_usd;
|
|
@@ -7553,7 +7583,10 @@ function buildEstimateIn(opts) {
|
|
|
7553
7583
|
duration_s: parseIntOpt(opts.duration, "duration") ?? 5,
|
|
7554
7584
|
resolution: opts.resolution ?? "720p",
|
|
7555
7585
|
ratio: opts.ratio ?? "16:9",
|
|
7556
|
-
...opts.model ? { model: opts.model } : {}
|
|
7586
|
+
...opts.model ? { model: opts.model } : {},
|
|
7587
|
+
// ★ 이미지 유무가 모델 계열을, 계열이 단가를 정한다 — 추정과 생성이 같은 값을 봐야
|
|
7588
|
+
// 승인받은 금액과 실제 청구가 일치한다.
|
|
7589
|
+
has_image: Boolean(opts.imageUrls?.length)
|
|
7557
7590
|
};
|
|
7558
7591
|
}
|
|
7559
7592
|
function estimateCommand(opts, deps = {}) {
|
|
@@ -16312,9 +16345,6 @@ var StdioServerTransport = class {
|
|
|
16312
16345
|
}
|
|
16313
16346
|
};
|
|
16314
16347
|
|
|
16315
|
-
// src/version.ts
|
|
16316
|
-
var VERSION = "0.5.0";
|
|
16317
|
-
|
|
16318
16348
|
// src/mcp/tools.ts
|
|
16319
16349
|
import { existsSync as existsSync2 } from "fs";
|
|
16320
16350
|
|
|
@@ -16413,7 +16443,10 @@ function toEstimateIn(a) {
|
|
|
16413
16443
|
duration_s: a.duration_s ?? 5,
|
|
16414
16444
|
resolution: a.resolution ?? "720p",
|
|
16415
16445
|
ratio: a.ratio ?? "16:9",
|
|
16416
|
-
...a.model ? { model: a.model } : {}
|
|
16446
|
+
...a.model ? { model: a.model } : {},
|
|
16447
|
+
// ★ 추정과 생성이 **같은 모델 계열**을 봐야 confirmed_cost_usd 대조가 성립한다.
|
|
16448
|
+
// 생성 경로는 `image_urls` 를, 추정 전용 호출은 `has_image` 를 준다.
|
|
16449
|
+
has_image: Boolean(a.has_image || a.image_urls?.length)
|
|
16417
16450
|
};
|
|
16418
16451
|
}
|
|
16419
16452
|
var MOCK_BANNER = "\u26A0\uFE0F \uC774 \uBC30\uD3EC\uB294 mock \uBAA8\uB4DC\uC785\uB2C8\uB2E4 \u2014 \uC601\uC0C1\uC774 **\uC2E4\uC81C\uB85C \uC0DD\uC131\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4**. \uC544\uB798 \uAE08\uC561\xB7job_id\xB7URL \uC740 \uC804\uBD80 \uAC00\uC9DC\uC774\uBA70 \uC2E4\uC81C\uB85C \uACFC\uAE08\uB418\uC9C0\uB3C4 \uC54A\uC2B5\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC0DD\uC131\uC774 \uB418\uC5C8\uB2E4\uACE0 \uBCF4\uACE0\uD558\uC9C0 \uB9C8\uC138\uC694.";
|
|
@@ -16737,7 +16770,10 @@ var GENERATION_PARAMS = {
|
|
|
16737
16770
|
},
|
|
16738
16771
|
resolution: { type: "string", enum: RESOLUTIONS, description: "\uAE30\uBCF8 720p." },
|
|
16739
16772
|
ratio: { type: "string", enum: RATIOS, description: "\uAE30\uBCF8 16:9." },
|
|
16740
|
-
model: {
|
|
16773
|
+
model: {
|
|
16774
|
+
type: "string",
|
|
16775
|
+
description: "\uC0DD\uB7B5\uD558\uBA74 image_urls \uC720\uBB34\uB85C \uC790\uB3D9 \uC120\uD0DD\uB41C\uB2E4(\uC788\uC73C\uBA74 image-to-video, \uC5C6\uC73C\uBA74 text-to-video). \uBA85\uC2DC\uD558\uBA74 \uADF8 \uBAA8\uB378\uC744 \uC4F0\uB418 \uACC4\uC5F4\uC774 \uC5B4\uAE0B\uB098\uBA74 \uAC70\uBD80\uB41C\uB2E4."
|
|
16776
|
+
}
|
|
16741
16777
|
};
|
|
16742
16778
|
var TOOLS = [
|
|
16743
16779
|
{
|
|
@@ -16747,10 +16783,16 @@ var TOOLS = [
|
|
|
16747
16783
|
},
|
|
16748
16784
|
{
|
|
16749
16785
|
name: "democut_estimate_video_cost",
|
|
16750
|
-
description: "\uC601\uC0C1 \uC0DD\uC131 \uC608\uC0C1 \uBE44\uC6A9\uC744 \uACC4\uC0B0\uD55C\uB2E4. **\uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uB2E4.** \uBE44\uC6A9\uC740 \uD574\uC0C1\uB3C4\xB7\uAE38\uC774\xB7\uBE44\uC728\
|
|
16786
|
+
description: "\uC601\uC0C1 \uC0DD\uC131 \uC608\uC0C1 \uBE44\uC6A9\uC744 \uACC4\uC0B0\uD55C\uB2E4. **\uBD80\uC791\uC6A9\uB3C4 \uACFC\uAE08\uB3C4 \uC5C6\uB2E4.** \uBE44\uC6A9\uC740 \uD574\uC0C1\uB3C4\xB7\uAE38\uC774\xB7\uBE44\uC728\uC5D0 \uB354\uD574 **\uBAA8\uB378 \uACC4\uC5F4**\uB85C \uACB0\uC815\uB41C\uB2E4 \u2014 \uCC38\uC870 \uC774\uBBF8\uC9C0\uB97C \uB123\uC744 \uAC70\uBA74 has_image=true \uB85C \uACC4\uC0B0\uD574\uC57C \uC2E4\uC81C \uCCAD\uAD6C\uC640 \uB9DE\uB294\uB2E4(\uACC4\uC5F4\uB9C8\uB2E4 \uD1A0\uD070 \uB2E8\uAC00\uAC00 \uB2E4\uB974\uB2E4). democut_generate_video \uB97C \uBD80\uB974\uAE30 \uC804\uC5D0 \uBA3C\uC800 \uD638\uCD9C\uD574 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uAE08\uC561\uC744 \uC54C\uB9AC\uACE0 \uB3D9\uC758\uB97C \uBC1B\uC544\uB77C.",
|
|
16751
16787
|
inputSchema: {
|
|
16752
16788
|
type: "object",
|
|
16753
|
-
properties: {
|
|
16789
|
+
properties: {
|
|
16790
|
+
...GENERATION_PARAMS,
|
|
16791
|
+
has_image: {
|
|
16792
|
+
type: "boolean",
|
|
16793
|
+
description: "\uC0DD\uC131 \uC2DC \uCC38\uC870 \uC774\uBBF8\uC9C0\uB97C \uB123\uC744 \uC608\uC815\uC778\uAC00(\uAE30\uBCF8 false). \u2605 \uAE08\uC561\uC774 \uB2EC\uB77C\uC9C4\uB2E4 \u2014 \uC774\uBBF8\uC9C0 \uC720\uBB34\uAC00 \uBAA8\uB378 \uACC4\uC5F4\uC744 \uC815\uD558\uACE0 \uACC4\uC5F4\uB9C8\uB2E4 \uD1A0\uD070 \uB2E8\uAC00\uAC00 \uB2E4\uB974\uB2E4. \uC0DD\uC131 \uB54C image_urls \uB97C \uB123\uC744 \uAC70\uBA74 \uC5EC\uAE30\uC11C\uB3C4 true \uB85C \uB450\uC5B4\uC57C \uCD94\uC815 \uAE08\uC561\uACFC \uC2E4\uC81C \uCCAD\uAD6C\uAC00 \uC77C\uCE58\uD55C\uB2E4."
|
|
16794
|
+
}
|
|
16795
|
+
},
|
|
16754
16796
|
additionalProperties: false
|
|
16755
16797
|
}
|
|
16756
16798
|
},
|
|
@@ -16770,7 +16812,7 @@ var TOOLS = [
|
|
|
16770
16812
|
image_urls: {
|
|
16771
16813
|
type: "array",
|
|
16772
16814
|
items: { type: "string" },
|
|
16773
|
-
description: "
|
|
16815
|
+
description: "\uCC38\uC870 \uC774\uBBF8\uC9C0. **\uACF5\uAC1C HTTPS URL** \uB9CC \uAC00\uB2A5(\uC2DC\uC791 \uD504\uB808\uC784 1\uC7A5 + \uB05D \uD504\uB808\uC784 1\uC7A5, \uCD5C\uB300 2\uAC1C). \u2605 \uC774 \uAC12\uC774 **\uBAA8\uB378\uACFC \uB2E8\uAC00\uB97C \uC815\uD55C\uB2E4** \u2014 \uC8FC\uBA74 image-to-video, \uBE44\uC6B0\uBA74 text-to-video \uB85C \uC790\uB3D9 \uC120\uD0DD\uB418\uACE0 \uD1A0\uD070 \uB2E8\uAC00\uAC00 \uB2E4\uB974\uB2E4. \uC778\uBB3C\xB7\uC81C\uD488 \uB4F1 \uD2B9\uC815 \uB300\uC0C1\uC744 \uC720\uC9C0\uD574\uC57C \uD558\uBA74 \uBC18\uB4DC\uC2DC \uB123\uC5B4\uB77C."
|
|
16774
16816
|
},
|
|
16775
16817
|
generate_audio: { type: "boolean", description: "\uC624\uB514\uC624 \uD568\uAED8 \uC0DD\uC131. \uAE30\uBCF8 false." },
|
|
16776
16818
|
watermark: { type: "boolean", description: "\uC6CC\uD130\uB9C8\uD06C. \uAE30\uBCF8 false." },
|