@numa-tech/numa 1.11.10
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 +602 -0
- package/THIRD_PARTY_NOTICES.md +13 -0
- package/assets/codex-shortcut-icon.icns +0 -0
- package/assets/codex-shortcut-icon.ico +0 -0
- package/dist/app-config.d.ts +26 -0
- package/dist/app-config.js +135 -0
- package/dist/app-config.js.map +1 -0
- package/dist/backend.d.ts +16 -0
- package/dist/backend.js +106 -0
- package/dist/backend.js.map +1 -0
- package/dist/branding.d.ts +7 -0
- package/dist/branding.js +13 -0
- package/dist/branding.js.map +1 -0
- package/dist/chatgpt-console.d.ts +53 -0
- package/dist/chatgpt-console.js +105 -0
- package/dist/chatgpt-console.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +451 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-auth-agent.d.ts +60 -0
- package/dist/codex-auth-agent.js +331 -0
- package/dist/codex-auth-agent.js.map +1 -0
- package/dist/codex-commands.d.ts +2 -0
- package/dist/codex-commands.js +528 -0
- package/dist/codex-commands.js.map +1 -0
- package/dist/codex-legacy-cleanup.d.ts +5 -0
- package/dist/codex-legacy-cleanup.js +77 -0
- package/dist/codex-legacy-cleanup.js.map +1 -0
- package/dist/codex-process.d.ts +13 -0
- package/dist/codex-process.js +193 -0
- package/dist/codex-process.js.map +1 -0
- package/dist/codex-protocol.d.ts +352 -0
- package/dist/codex-protocol.js +116 -0
- package/dist/codex-protocol.js.map +1 -0
- package/dist/codex-quota-cache.d.ts +20 -0
- package/dist/codex-quota-cache.js +82 -0
- package/dist/codex-quota-cache.js.map +1 -0
- package/dist/codex-selection.d.ts +18 -0
- package/dist/codex-selection.js +47 -0
- package/dist/codex-selection.js.map +1 -0
- package/dist/codex-service-client.d.ts +11 -0
- package/dist/codex-service-client.js +91 -0
- package/dist/codex-service-client.js.map +1 -0
- package/dist/codex-shortcuts.d.ts +43 -0
- package/dist/codex-shortcuts.js +429 -0
- package/dist/codex-shortcuts.js.map +1 -0
- package/dist/codex-tui.d.ts +15 -0
- package/dist/codex-tui.js +235 -0
- package/dist/codex-tui.js.map +1 -0
- package/dist/command-catalog.d.ts +9 -0
- package/dist/command-catalog.js +206 -0
- package/dist/command-catalog.js.map +1 -0
- package/dist/config-page.d.ts +2 -0
- package/dist/config-page.js +51 -0
- package/dist/config-page.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.js +99 -0
- package/dist/config.js.map +1 -0
- package/dist/identity.d.ts +23 -0
- package/dist/identity.js +78 -0
- package/dist/identity.js.map +1 -0
- package/dist/media/client.d.ts +79 -0
- package/dist/media/client.js +175 -0
- package/dist/media/client.js.map +1 -0
- package/dist/media/commands.d.ts +2 -0
- package/dist/media/commands.js +193 -0
- package/dist/media/commands.js.map +1 -0
- package/dist/media/errors.d.ts +8 -0
- package/dist/media/errors.js +37 -0
- package/dist/media/errors.js.map +1 -0
- package/dist/media/schemas.d.ts +62 -0
- package/dist/media/schemas.js +71 -0
- package/dist/media/schemas.js.map +1 -0
- package/dist/media/transfers.d.ts +38 -0
- package/dist/media/transfers.js +169 -0
- package/dist/media/transfers.js.map +1 -0
- package/dist/oauth.d.ts +30 -0
- package/dist/oauth.js +295 -0
- package/dist/oauth.js.map +1 -0
- package/dist/private-file.d.ts +3 -0
- package/dist/private-file.js +51 -0
- package/dist/private-file.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +197 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +40 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/web-console-page.d.ts +3 -0
- package/dist/web-console-page.js +59 -0
- package/dist/web-console-page.js.map +1 -0
- package/dist/web-console.d.ts +22 -0
- package/dist/web-console.js +335 -0
- package/dist/web-console.js.map +1 -0
- package/examples/claude-desktop-installed-binary.json +11 -0
- package/examples/claude-desktop-npx.json +12 -0
- package/examples/codex-installed-binary.json +11 -0
- package/examples/codex-npx.json +12 -0
- package/package.json +67 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { loadAppConfig } from "../app-config.js";
|
|
3
|
+
import { loadConfig } from "../config.js";
|
|
4
|
+
import { MediaClient, readLibraryManifest, readSubmitRequest } from "./client.js";
|
|
5
|
+
import { MediaError, sanitizeForOutput } from "./errors.js";
|
|
6
|
+
import { IdempotencyKeySchema, IdentifierSchema, LibraryReferenceSchema } from "./schemas.js";
|
|
7
|
+
function jsonEnabled(command, configuredOutput) {
|
|
8
|
+
return Boolean(command.optsWithGlobals().json || configuredOutput === "json");
|
|
9
|
+
}
|
|
10
|
+
function printJson(value) {
|
|
11
|
+
process.stdout.write(`${JSON.stringify(sanitizeForOutput(value), null, 2)}\n`);
|
|
12
|
+
}
|
|
13
|
+
function addExamples(command, examples) {
|
|
14
|
+
return command.addHelpText("after", `\nExamples:\n${examples.map((item) => ` ${item}`).join("\n")}\n`);
|
|
15
|
+
}
|
|
16
|
+
function identifier(value, label) {
|
|
17
|
+
const parsed = IdentifierSchema.safeParse(value);
|
|
18
|
+
if (!parsed.success)
|
|
19
|
+
throw new MediaError(`${label} is invalid.`, "media_input_invalid");
|
|
20
|
+
return parsed.data;
|
|
21
|
+
}
|
|
22
|
+
function libraryReference(value) {
|
|
23
|
+
const parsed = LibraryReferenceSchema.safeParse(value);
|
|
24
|
+
if (!parsed.success)
|
|
25
|
+
throw new MediaError("Library reference must use exact id@semver form.", "media_input_invalid");
|
|
26
|
+
return parsed.data;
|
|
27
|
+
}
|
|
28
|
+
function idempotencyKey(value) {
|
|
29
|
+
if (value == null)
|
|
30
|
+
return undefined;
|
|
31
|
+
const parsed = IdempotencyKeySchema.safeParse(value);
|
|
32
|
+
if (!parsed.success)
|
|
33
|
+
throw new MediaError("Idempotency key must contain 1-200 characters.", "media_input_invalid");
|
|
34
|
+
return parsed.data;
|
|
35
|
+
}
|
|
36
|
+
function limit(value) {
|
|
37
|
+
const parsed = Number.parseInt(value, 10);
|
|
38
|
+
if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) {
|
|
39
|
+
throw new MediaError("Library limit must be an integer between 1 and 100.", "media_input_invalid");
|
|
40
|
+
}
|
|
41
|
+
return parsed;
|
|
42
|
+
}
|
|
43
|
+
async function output(command, jsonPayload, text) {
|
|
44
|
+
const config = await loadAppConfig();
|
|
45
|
+
if (jsonEnabled(command, config.output))
|
|
46
|
+
printJson(jsonPayload);
|
|
47
|
+
else
|
|
48
|
+
process.stdout.write(`${text}\n`);
|
|
49
|
+
}
|
|
50
|
+
export function registerMediaCommands(program) {
|
|
51
|
+
const media = program
|
|
52
|
+
.command("media")
|
|
53
|
+
.description("通过当前 Keycloak 身份安全调用平台托管的媒体服务(不输出第三方凭据)");
|
|
54
|
+
addExamples(media
|
|
55
|
+
.command("capabilities")
|
|
56
|
+
.description("查询媒体 API、Provider 和最低 CLI 版本能力(需要登录)")
|
|
57
|
+
.action(async (_options, command) => {
|
|
58
|
+
const capabilities = await new MediaClient(loadConfig()).capabilities();
|
|
59
|
+
await output(command, { ok: true, capabilities }, `媒体 API: ${capabilities.apiVersion ?? "available"}`);
|
|
60
|
+
}), ["numa media capabilities", "numa media capabilities --json"]);
|
|
61
|
+
const tts = media.command("tts").description("平台托管的语音合成任务");
|
|
62
|
+
addExamples(tts
|
|
63
|
+
.command("submit")
|
|
64
|
+
.description("从 JSON 文件提交 TTS 任务(需要登录)")
|
|
65
|
+
.requiredOption("--input <file>", "lowerCamelCase JSON 请求文件")
|
|
66
|
+
.option("--idempotency-key <key>", "幂等键;重试同一任务时复用")
|
|
67
|
+
.action(async (options, command) => {
|
|
68
|
+
const request = await readSubmitRequest(options.input);
|
|
69
|
+
const job = await new MediaClient(loadConfig()).submitTts(request, idempotencyKey(options.idempotencyKey));
|
|
70
|
+
await output(command, { ok: true, job }, `TTS 任务已提交: ${job.jobId} (${job.status})`);
|
|
71
|
+
}), ["numa media tts submit --input narration.json --idempotency-key project-scene-01 --json"]);
|
|
72
|
+
const video = media.command("video").description("平台托管的视频生成任务");
|
|
73
|
+
addExamples(video
|
|
74
|
+
.command("submit")
|
|
75
|
+
.description("从 JSON 文件提交视频生成任务(需要登录)")
|
|
76
|
+
.requiredOption("--input <file>", "lowerCamelCase JSON 请求文件")
|
|
77
|
+
.option("--idempotency-key <key>", "幂等键;重试同一任务时复用")
|
|
78
|
+
.action(async (options, command) => {
|
|
79
|
+
const request = await readSubmitRequest(options.input);
|
|
80
|
+
const job = await new MediaClient(loadConfig()).submitVideo(request, idempotencyKey(options.idempotencyKey));
|
|
81
|
+
await output(command, { ok: true, job }, `视频任务已提交: ${job.jobId} (${job.status})`);
|
|
82
|
+
}), ["numa media video submit --input seedance.json --idempotency-key project-shot-01 --json"]);
|
|
83
|
+
const job = media.command("job").description("查询异步媒体任务");
|
|
84
|
+
addExamples(job
|
|
85
|
+
.command("inspect <jobId>")
|
|
86
|
+
.description("查询任务状态和结果(需要登录)")
|
|
87
|
+
.action(async (jobId, _options, command) => {
|
|
88
|
+
const result = await new MediaClient(loadConfig()).inspectJob(identifier(jobId, "jobId"));
|
|
89
|
+
await output(command, { ok: true, job: result }, `任务 ${result.jobId}: ${result.status}`);
|
|
90
|
+
}), ["numa media job inspect job_123 --json"]);
|
|
91
|
+
addExamples(job
|
|
92
|
+
.command("resolve")
|
|
93
|
+
.description("按类型和幂等键解析已有任务,提交结果不明时先使用此命令(需要登录)")
|
|
94
|
+
.requiredOption("--type <tts|video>", "任务类型")
|
|
95
|
+
.requiredOption("--idempotency-key <key>", "原提交使用的幂等键")
|
|
96
|
+
.action(async (options, command) => {
|
|
97
|
+
if (options.type !== "tts" && options.type !== "video") {
|
|
98
|
+
throw new MediaError("Job type must be tts or video.", "media_input_invalid");
|
|
99
|
+
}
|
|
100
|
+
const result = await new MediaClient(loadConfig()).resolveJob(options.type, idempotencyKey(options.idempotencyKey));
|
|
101
|
+
await output(command, { ok: true, job: result }, `任务 ${result.jobId}: ${result.status}`);
|
|
102
|
+
}), ["numa media job resolve --type video --idempotency-key project-shot-01 --json"]);
|
|
103
|
+
const artifact = media.command("artifact").description("安全下载平台媒体产物");
|
|
104
|
+
addExamples(artifact
|
|
105
|
+
.command("pull <artifactId>")
|
|
106
|
+
.description("流式下载产物,校验 SHA-256 后原子落盘(需要登录)")
|
|
107
|
+
.requiredOption("--output <file>", "目标文件;为保护现有文件,路径必须不存在")
|
|
108
|
+
.option("--sha256 <hex>", "期望 SHA-256;缺省时使用服务端响应头")
|
|
109
|
+
.action(async (artifactId, options, command) => {
|
|
110
|
+
if (options.sha256 && !/^[a-f0-9]{64}$/iu.test(options.sha256)) {
|
|
111
|
+
throw new MediaError("--sha256 must be a 64-character hexadecimal digest.", "media_input_invalid");
|
|
112
|
+
}
|
|
113
|
+
const result = await new MediaClient(loadConfig()).pullArtifact(identifier(artifactId, "artifactId"), options.output, options.sha256);
|
|
114
|
+
await output(command, {
|
|
115
|
+
ok: true,
|
|
116
|
+
artifact: {
|
|
117
|
+
artifact_id: result.artifactId,
|
|
118
|
+
output_path: result.outputPath,
|
|
119
|
+
size_bytes: result.sizeBytes,
|
|
120
|
+
sha256: result.sha256,
|
|
121
|
+
request_id: result.requestId ?? null
|
|
122
|
+
}
|
|
123
|
+
}, `产物已下载: ${result.outputPath} (${result.sizeBytes} bytes, sha256=${result.sha256})`);
|
|
124
|
+
}), ["numa media artifact pull artifact_123 --output ./result.mp4 --json"]);
|
|
125
|
+
const asset = media.command("asset").description("上传媒体输入资产");
|
|
126
|
+
addExamples(asset
|
|
127
|
+
.command("upload <file>")
|
|
128
|
+
.description("使用流式 multipart 上传文件(需要登录)")
|
|
129
|
+
.option("--kind <kind>", "资产类型,例如 image、audio、video")
|
|
130
|
+
.option("--project-id <id>", "关联项目 ID")
|
|
131
|
+
.option("--idempotency-key <key>", "幂等键;重试同一上传时复用")
|
|
132
|
+
.action(async (file, options, command) => {
|
|
133
|
+
const result = await new MediaClient(loadConfig()).uploadAsset(file, {
|
|
134
|
+
kind: options.kind,
|
|
135
|
+
projectId: options.projectId,
|
|
136
|
+
idempotencyKey: idempotencyKey(options.idempotencyKey)
|
|
137
|
+
});
|
|
138
|
+
await output(command, {
|
|
139
|
+
ok: true,
|
|
140
|
+
asset: result.asset,
|
|
141
|
+
transfer: {
|
|
142
|
+
source_path: result.sourcePath,
|
|
143
|
+
size_bytes: result.sizeBytes,
|
|
144
|
+
sha256: result.sha256
|
|
145
|
+
}
|
|
146
|
+
}, `资产已上传: ${result.asset.artifactId} (${result.sizeBytes} bytes)`);
|
|
147
|
+
}), ["numa media asset upload ./reference.png --kind image --project-id project_123 --json"]);
|
|
148
|
+
const library = media.command("library").description("查询平台媒体素材库");
|
|
149
|
+
addExamples(library
|
|
150
|
+
.command("search")
|
|
151
|
+
.description("按关键词分页查询素材(需要登录)")
|
|
152
|
+
.option("--query <text>", "搜索关键词")
|
|
153
|
+
.option("--cursor <cursor>", "分页游标")
|
|
154
|
+
.option("--limit <number>", "返回条数,1-100", limit, 20)
|
|
155
|
+
.action(async (options, command) => {
|
|
156
|
+
const result = await new MediaClient(loadConfig()).searchLibrary(options);
|
|
157
|
+
await output(command, { ok: true, library: result }, `找到 ${result.items.length} 个素材`);
|
|
158
|
+
}), ["numa media library search --query product --limit 20 --json"]);
|
|
159
|
+
addExamples(library
|
|
160
|
+
.command("inspect <reference>")
|
|
161
|
+
.description("按精确 id@semver 查询素材及锁定信息(需要登录)")
|
|
162
|
+
.action(async (reference, _options, command) => {
|
|
163
|
+
const entry = await new MediaClient(loadConfig()).inspectLibrary(libraryReference(reference));
|
|
164
|
+
await output(command, { ok: true, entry }, `素材: ${reference} -> ${entry.artifactId}`);
|
|
165
|
+
}), ["numa media library inspect logo-main@1.2.0 --json"]);
|
|
166
|
+
addExamples(library
|
|
167
|
+
.command("pull <reference>")
|
|
168
|
+
.description("解析精确 id@semver 并流式下载素材(需要登录)")
|
|
169
|
+
.requiredOption("--output <path>", "不存在的目标文件,或已存在的目标目录")
|
|
170
|
+
.action(async (reference, options, command) => {
|
|
171
|
+
const result = await new MediaClient(loadConfig()).pullLibrary(libraryReference(reference), options.output);
|
|
172
|
+
await output(command, {
|
|
173
|
+
ok: true,
|
|
174
|
+
artifact: {
|
|
175
|
+
artifact_id: result.artifactId,
|
|
176
|
+
output_path: result.outputPath,
|
|
177
|
+
size_bytes: result.sizeBytes,
|
|
178
|
+
sha256: result.sha256,
|
|
179
|
+
request_id: result.requestId ?? null
|
|
180
|
+
}
|
|
181
|
+
}, `素材已下载: ${result.outputPath}`);
|
|
182
|
+
}), ["numa media library pull logo-main@1.2.0 --output ./assets --json"]);
|
|
183
|
+
addExamples(library
|
|
184
|
+
.command("publish")
|
|
185
|
+
.description("发布引用已上传 artifactId 的素材清单(需要登录)")
|
|
186
|
+
.requiredOption("--manifest <file>", "lowerCamelCase JSON 清单;必须包含 artifactId")
|
|
187
|
+
.action(async (options, command) => {
|
|
188
|
+
const manifest = await readLibraryManifest(options.manifest);
|
|
189
|
+
const entry = await new MediaClient(loadConfig()).publishLibrary(manifest);
|
|
190
|
+
await output(command, { ok: true, entry }, `素材已发布: ${entry.artifactId}`);
|
|
191
|
+
}), ["numa media library publish --manifest library-entry.json --json"]);
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/media/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function redactSensitiveText(value: string): string;
|
|
2
|
+
export declare function sanitizeForOutput(value: unknown, key?: string): unknown;
|
|
3
|
+
export declare class MediaError extends Error {
|
|
4
|
+
readonly code: string;
|
|
5
|
+
readonly status?: number | undefined;
|
|
6
|
+
readonly requestId?: string | undefined;
|
|
7
|
+
constructor(message: string, code: string, status?: number | undefined, requestId?: string | undefined);
|
|
8
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export function redactSensitiveText(value) {
|
|
2
|
+
return value
|
|
3
|
+
.replace(/\bBearer\s+[A-Za-z0-9._~+/=-]+/giu, "Bearer [REDACTED]")
|
|
4
|
+
.replace(/([?&](?:access_token|token|signature|x-oss-signature|x-oss-credential)=)[^&#\s]+/giu, "$1[REDACTED]")
|
|
5
|
+
.replace(/("(?:accessToken|refreshToken|token|signature)"\s*:\s*")[^"]+("?)/giu, "$1[REDACTED]$2");
|
|
6
|
+
}
|
|
7
|
+
function isSensitiveOutputKey(key) {
|
|
8
|
+
return /^(?:authorization|accessToken|refreshToken|token|secret|signature|signedUrl|presignedUrl)$/iu.test(key);
|
|
9
|
+
}
|
|
10
|
+
function looksLikeSignedUrl(value) {
|
|
11
|
+
return /^https?:\/\//iu.test(value) && /[?&](?:signature|x-oss-signature|x-amz-signature|ossaccesskeyid)=/iu.test(value);
|
|
12
|
+
}
|
|
13
|
+
export function sanitizeForOutput(value, key = "") {
|
|
14
|
+
if (isSensitiveOutputKey(key))
|
|
15
|
+
return "[REDACTED]";
|
|
16
|
+
if (typeof value === "string")
|
|
17
|
+
return looksLikeSignedUrl(value) ? "[REDACTED]" : redactSensitiveText(value);
|
|
18
|
+
if (Array.isArray(value))
|
|
19
|
+
return value.map((item) => sanitizeForOutput(item));
|
|
20
|
+
if (value && typeof value === "object") {
|
|
21
|
+
return Object.fromEntries(Object.entries(value).map(([name, item]) => [name, sanitizeForOutput(item, name)]));
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
export class MediaError extends Error {
|
|
26
|
+
code;
|
|
27
|
+
status;
|
|
28
|
+
requestId;
|
|
29
|
+
constructor(message, code, status, requestId) {
|
|
30
|
+
super(redactSensitiveText(message));
|
|
31
|
+
this.code = code;
|
|
32
|
+
this.status = status;
|
|
33
|
+
this.requestId = requestId;
|
|
34
|
+
this.name = "MediaError";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/media/errors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,KAAK;SACT,OAAO,CAAC,mCAAmC,EAAE,mBAAmB,CAAC;SACjE,OAAO,CACN,qFAAqF,EACrF,cAAc,CACf;SACA,OAAO,CAAC,sEAAsE,EAAE,gBAAgB,CAAC,CAAC;AACvG,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IACvC,OAAO,8FAA8F,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,qEAAqE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3H,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,GAAG,GAAG,EAAE;IACxD,IAAI,oBAAoB,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC5G,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IAGjB,IAAI;IACJ,MAAM;IACN,SAAS;IAJ3B,YACE,OAAe,EACC,IAAY,EACZ,MAAe,EACf,SAAkB;QAElC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;oBAJpB,IAAI;sBACJ,MAAM;yBACN,SAAS;QAGzB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const IdempotencyKeySchema: z.ZodString;
|
|
3
|
+
export declare const IdentifierSchema: z.ZodString;
|
|
4
|
+
export declare const LibraryReferenceSchema: z.ZodString;
|
|
5
|
+
export declare const SubmitRequestSchema: z.ZodObject<{
|
|
6
|
+
idempotencyKey: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, z.core.$loose>;
|
|
8
|
+
export declare const JobSchema: z.ZodObject<{
|
|
9
|
+
jobId: z.ZodString;
|
|
10
|
+
status: z.ZodString;
|
|
11
|
+
requestId: z.ZodString;
|
|
12
|
+
}, z.core.$loose>;
|
|
13
|
+
export declare const CapabilitiesSchema: z.ZodObject<{
|
|
14
|
+
apiVersion: z.ZodOptional<z.ZodString>;
|
|
15
|
+
minCliVersion: z.ZodOptional<z.ZodString>;
|
|
16
|
+
features: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
17
|
+
providers: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
|
|
18
|
+
requestId: z.ZodOptional<z.ZodString>;
|
|
19
|
+
}, z.core.$loose>;
|
|
20
|
+
export declare const AssetSchema: z.ZodPipe<z.ZodObject<{
|
|
21
|
+
artifactId: z.ZodOptional<z.ZodString>;
|
|
22
|
+
assetId: z.ZodOptional<z.ZodString>;
|
|
23
|
+
requestId: z.ZodString;
|
|
24
|
+
}, z.core.$loose>, z.ZodTransform<{
|
|
25
|
+
assetId?: string | undefined;
|
|
26
|
+
requestId: string;
|
|
27
|
+
artifactId: string;
|
|
28
|
+
}, {
|
|
29
|
+
[x: string]: unknown;
|
|
30
|
+
artifactId?: string | undefined;
|
|
31
|
+
assetId?: string | undefined;
|
|
32
|
+
requestId: string;
|
|
33
|
+
}>>;
|
|
34
|
+
export declare const LibraryResultSchema: z.ZodObject<{
|
|
35
|
+
items: z.ZodArray<z.ZodUnknown>;
|
|
36
|
+
nextCursor: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
37
|
+
requestId: z.ZodOptional<z.ZodString>;
|
|
38
|
+
}, z.core.$loose>;
|
|
39
|
+
export declare const LibraryEntrySchema: z.ZodObject<{
|
|
40
|
+
artifactId: z.ZodString;
|
|
41
|
+
requestId: z.ZodOptional<z.ZodString>;
|
|
42
|
+
fileName: z.ZodOptional<z.ZodString>;
|
|
43
|
+
sha256: z.ZodOptional<z.ZodString>;
|
|
44
|
+
}, z.core.$loose>;
|
|
45
|
+
export declare const LibraryManifestSchema: z.ZodObject<{
|
|
46
|
+
id: z.ZodString;
|
|
47
|
+
version: z.ZodString;
|
|
48
|
+
artifactId: z.ZodString;
|
|
49
|
+
sha256: z.ZodString;
|
|
50
|
+
manifest: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
51
|
+
}, z.core.$loose>;
|
|
52
|
+
export declare const ApiErrorSchema: z.ZodObject<{
|
|
53
|
+
code: z.ZodOptional<z.ZodString>;
|
|
54
|
+
message: z.ZodOptional<z.ZodString>;
|
|
55
|
+
requestId: z.ZodOptional<z.ZodString>;
|
|
56
|
+
}, z.core.$loose>;
|
|
57
|
+
export type SubmitRequest = z.infer<typeof SubmitRequestSchema>;
|
|
58
|
+
export type MediaJob = z.infer<typeof JobSchema>;
|
|
59
|
+
export type MediaCapabilities = z.infer<typeof CapabilitiesSchema>;
|
|
60
|
+
export type MediaAsset = z.infer<typeof AssetSchema>;
|
|
61
|
+
export type MediaLibraryResult = z.infer<typeof LibraryResultSchema>;
|
|
62
|
+
export type MediaLibraryEntry = z.infer<typeof LibraryEntrySchema>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const IdempotencyKeySchema = z.string().trim().min(1).max(200);
|
|
3
|
+
export const IdentifierSchema = z.string().trim().min(1).max(512);
|
|
4
|
+
export const LibraryReferenceSchema = z
|
|
5
|
+
.string()
|
|
6
|
+
.trim()
|
|
7
|
+
.min(1)
|
|
8
|
+
.max(512)
|
|
9
|
+
.regex(/^.+@\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u);
|
|
10
|
+
export const SubmitRequestSchema = z
|
|
11
|
+
.object({
|
|
12
|
+
idempotencyKey: IdempotencyKeySchema.optional()
|
|
13
|
+
})
|
|
14
|
+
.passthrough();
|
|
15
|
+
export const JobSchema = z
|
|
16
|
+
.object({
|
|
17
|
+
jobId: IdentifierSchema,
|
|
18
|
+
status: z.string().trim().min(1),
|
|
19
|
+
requestId: z.string().trim().min(1)
|
|
20
|
+
})
|
|
21
|
+
.passthrough();
|
|
22
|
+
export const CapabilitiesSchema = z
|
|
23
|
+
.object({
|
|
24
|
+
apiVersion: z.string().optional(),
|
|
25
|
+
minCliVersion: z.string().optional(),
|
|
26
|
+
features: z.record(z.string(), z.unknown()).optional(),
|
|
27
|
+
providers: z.array(z.unknown()).optional(),
|
|
28
|
+
requestId: z.string().optional()
|
|
29
|
+
})
|
|
30
|
+
.passthrough();
|
|
31
|
+
export const AssetSchema = z
|
|
32
|
+
.object({
|
|
33
|
+
artifactId: IdentifierSchema.optional(),
|
|
34
|
+
assetId: IdentifierSchema.optional(),
|
|
35
|
+
requestId: z.string().trim().min(1)
|
|
36
|
+
})
|
|
37
|
+
.passthrough()
|
|
38
|
+
.refine((value) => Boolean(value.artifactId || value.assetId), { message: "artifactId is required" })
|
|
39
|
+
.transform((value) => ({ ...value, artifactId: value.artifactId ?? value.assetId }));
|
|
40
|
+
export const LibraryResultSchema = z
|
|
41
|
+
.object({
|
|
42
|
+
items: z.array(z.unknown()),
|
|
43
|
+
nextCursor: z.string().nullable().optional(),
|
|
44
|
+
requestId: z.string().optional()
|
|
45
|
+
})
|
|
46
|
+
.passthrough();
|
|
47
|
+
export const LibraryEntrySchema = z
|
|
48
|
+
.object({
|
|
49
|
+
artifactId: IdentifierSchema,
|
|
50
|
+
requestId: z.string().optional(),
|
|
51
|
+
fileName: z.string().optional(),
|
|
52
|
+
sha256: z.string().regex(/^[a-f0-9]{64}$/iu).optional()
|
|
53
|
+
})
|
|
54
|
+
.passthrough();
|
|
55
|
+
export const LibraryManifestSchema = z
|
|
56
|
+
.object({
|
|
57
|
+
id: z.string().trim().regex(/^[A-Za-z0-9][A-Za-z0-9._-]{0,159}$/u),
|
|
58
|
+
version: z.string().trim().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u),
|
|
59
|
+
artifactId: IdentifierSchema,
|
|
60
|
+
sha256: z.string().trim().regex(/^[a-f0-9]{64}$/iu),
|
|
61
|
+
manifest: z.record(z.string(), z.unknown())
|
|
62
|
+
})
|
|
63
|
+
.passthrough();
|
|
64
|
+
export const ApiErrorSchema = z
|
|
65
|
+
.object({
|
|
66
|
+
code: z.string().optional(),
|
|
67
|
+
message: z.string().optional(),
|
|
68
|
+
requestId: z.string().optional()
|
|
69
|
+
})
|
|
70
|
+
.passthrough();
|
|
71
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/media/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AuthConfig } from "../config.js";
|
|
2
|
+
import { type KeycloakTokenProvider } from "../oauth.js";
|
|
3
|
+
export interface DownloadResult {
|
|
4
|
+
artifactId: string;
|
|
5
|
+
outputPath: string;
|
|
6
|
+
sizeBytes: number;
|
|
7
|
+
sha256: string;
|
|
8
|
+
requestId?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface UploadOptions {
|
|
11
|
+
kind?: string;
|
|
12
|
+
projectId?: string;
|
|
13
|
+
idempotencyKey?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface UploadResult {
|
|
16
|
+
asset: unknown;
|
|
17
|
+
sourcePath: string;
|
|
18
|
+
sizeBytes: number;
|
|
19
|
+
sha256: string;
|
|
20
|
+
}
|
|
21
|
+
interface DownloadInput {
|
|
22
|
+
config: AuthConfig;
|
|
23
|
+
fetchImpl: typeof fetch;
|
|
24
|
+
tokenProvider: KeycloakTokenProvider;
|
|
25
|
+
artifactId: string;
|
|
26
|
+
outputPath: string;
|
|
27
|
+
expectedSha256?: string;
|
|
28
|
+
}
|
|
29
|
+
interface UploadInput {
|
|
30
|
+
config: AuthConfig;
|
|
31
|
+
fetchImpl: typeof fetch;
|
|
32
|
+
tokenProvider: KeycloakTokenProvider;
|
|
33
|
+
filePath: string;
|
|
34
|
+
options: UploadOptions;
|
|
35
|
+
}
|
|
36
|
+
export declare function downloadArtifact(input: DownloadInput): Promise<DownloadResult>;
|
|
37
|
+
export declare function uploadAsset(input: UploadInput): Promise<UploadResult>;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { createReadStream, createWriteStream } from "node:fs";
|
|
3
|
+
import { access, mkdir, rename, rm, stat } from "node:fs/promises";
|
|
4
|
+
import { basename, dirname, resolve } from "node:path";
|
|
5
|
+
import { Readable, Transform } from "node:stream";
|
|
6
|
+
import { pipeline } from "node:stream/promises";
|
|
7
|
+
import { resolveBackendUrl } from "../backend.js";
|
|
8
|
+
import { fetchWithKeycloakIdentity } from "../oauth.js";
|
|
9
|
+
import { MediaError, redactSensitiveText } from "./errors.js";
|
|
10
|
+
function safeHeaderValue(value) {
|
|
11
|
+
return value.replace(/[\r\n"]/gu, "_");
|
|
12
|
+
}
|
|
13
|
+
async function pathExists(path) {
|
|
14
|
+
try {
|
|
15
|
+
await access(path);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function errorFromResponse(response) {
|
|
23
|
+
const text = redactSensitiveText(await response.text());
|
|
24
|
+
let code = "media_transfer_failed";
|
|
25
|
+
let message = text || response.statusText;
|
|
26
|
+
let requestId = response.headers.get("x-request-id") ?? undefined;
|
|
27
|
+
try {
|
|
28
|
+
const body = JSON.parse(text);
|
|
29
|
+
code = body.code ?? code;
|
|
30
|
+
message = body.message ?? message;
|
|
31
|
+
requestId = body.requestId ?? requestId;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Non-JSON error bodies are represented by their redacted text.
|
|
35
|
+
}
|
|
36
|
+
return new MediaError(`Media transfer HTTP ${response.status}: ${message}`, code, response.status, requestId);
|
|
37
|
+
}
|
|
38
|
+
export async function downloadArtifact(input) {
|
|
39
|
+
const outputPath = resolve(input.outputPath);
|
|
40
|
+
if (await pathExists(outputPath)) {
|
|
41
|
+
throw new MediaError(`Output already exists: ${outputPath}`, "media_output_exists");
|
|
42
|
+
}
|
|
43
|
+
await mkdir(dirname(outputPath), { recursive: true });
|
|
44
|
+
const temporaryPath = `${outputPath}.${randomUUID()}.part`;
|
|
45
|
+
const url = resolveBackendUrl(input.config, {
|
|
46
|
+
method: "GET",
|
|
47
|
+
path: `/api/v1/media/artifacts/${encodeURIComponent(input.artifactId)}/content`
|
|
48
|
+
});
|
|
49
|
+
const response = await fetchWithKeycloakIdentity(input.config, url, () => ({ headers: { Accept: "application/octet-stream" } }), { fetch: input.fetchImpl, tokenProvider: input.tokenProvider });
|
|
50
|
+
if (!response.ok)
|
|
51
|
+
throw await errorFromResponse(response);
|
|
52
|
+
if (!response.body)
|
|
53
|
+
throw new MediaError("Artifact response has no body.", "media_download_failed", response.status);
|
|
54
|
+
const hash = createHash("sha256");
|
|
55
|
+
let sizeBytes = 0;
|
|
56
|
+
const checksum = new Transform({
|
|
57
|
+
transform(chunk, _encoding, callback) {
|
|
58
|
+
hash.update(chunk);
|
|
59
|
+
sizeBytes += chunk.length;
|
|
60
|
+
callback(null, chunk);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
try {
|
|
64
|
+
await pipeline(Readable.fromWeb(response.body), checksum, createWriteStream(temporaryPath, { flags: "wx", mode: 0o600 }));
|
|
65
|
+
const sha256 = hash.digest("hex");
|
|
66
|
+
const contentLengthHeader = response.headers.get("content-length");
|
|
67
|
+
if (contentLengthHeader != null) {
|
|
68
|
+
const contentLength = /^\d+$/u.test(contentLengthHeader) ? Number.parseInt(contentLengthHeader, 10) : Number.NaN;
|
|
69
|
+
if (!Number.isSafeInteger(contentLength) || contentLength < 0 || contentLength !== sizeBytes) {
|
|
70
|
+
throw new MediaError(`Artifact size mismatch: Content-Length declared ${contentLengthHeader}, received ${sizeBytes}.`, "media_integrity_mismatch", response.status, response.headers.get("x-request-id") ?? undefined);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const expected = (input.expectedSha256 ??
|
|
74
|
+
response.headers.get("x-content-sha256") ??
|
|
75
|
+
response.headers.get("x-artifact-sha256") ??
|
|
76
|
+
"").toLowerCase();
|
|
77
|
+
if (expected && expected !== sha256) {
|
|
78
|
+
throw new MediaError(`Artifact checksum mismatch: expected ${expected}, received ${sha256}.`, "media_integrity_mismatch", response.status, response.headers.get("x-request-id") ?? undefined);
|
|
79
|
+
}
|
|
80
|
+
await rename(temporaryPath, outputPath);
|
|
81
|
+
return {
|
|
82
|
+
artifactId: input.artifactId,
|
|
83
|
+
outputPath,
|
|
84
|
+
sizeBytes,
|
|
85
|
+
sha256,
|
|
86
|
+
requestId: response.headers.get("x-request-id") ?? undefined
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
await rm(temporaryPath, { force: true }).catch(() => undefined);
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function* multipartBody(boundary, filePath, fields, uploadHash) {
|
|
95
|
+
for (const [name, value] of Object.entries(fields)) {
|
|
96
|
+
if (value == null || value === "")
|
|
97
|
+
continue;
|
|
98
|
+
yield Buffer.from(`--${boundary}\r\nContent-Disposition: form-data; name="${safeHeaderValue(name)}"\r\n\r\n${value}\r\n`);
|
|
99
|
+
}
|
|
100
|
+
yield Buffer.from(`--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${safeHeaderValue(basename(filePath))}"\r\nContent-Type: application/octet-stream\r\n\r\n`);
|
|
101
|
+
for await (const chunk of createReadStream(filePath)) {
|
|
102
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
103
|
+
uploadHash.update(buffer);
|
|
104
|
+
yield buffer;
|
|
105
|
+
}
|
|
106
|
+
yield Buffer.from(`\r\n--${boundary}--\r\n`);
|
|
107
|
+
}
|
|
108
|
+
async function streamFileDigest(filePath) {
|
|
109
|
+
const hash = createHash("sha256");
|
|
110
|
+
let sizeBytes = 0;
|
|
111
|
+
for await (const chunk of createReadStream(filePath)) {
|
|
112
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
113
|
+
hash.update(buffer);
|
|
114
|
+
sizeBytes += buffer.length;
|
|
115
|
+
}
|
|
116
|
+
return { sha256: hash.digest("hex"), sizeBytes };
|
|
117
|
+
}
|
|
118
|
+
export async function uploadAsset(input) {
|
|
119
|
+
const sourcePath = resolve(input.filePath);
|
|
120
|
+
const source = await stat(sourcePath).catch((error) => {
|
|
121
|
+
throw new MediaError(`Cannot read upload file: ${error.message}`, "media_input_invalid");
|
|
122
|
+
});
|
|
123
|
+
if (!source.isFile())
|
|
124
|
+
throw new MediaError(`Upload source is not a regular file: ${sourcePath}`, "media_input_invalid");
|
|
125
|
+
const digest = await streamFileDigest(sourcePath);
|
|
126
|
+
if (digest.sizeBytes !== source.size) {
|
|
127
|
+
throw new MediaError("Upload file changed while it was being hashed.", "media_input_changed");
|
|
128
|
+
}
|
|
129
|
+
const url = resolveBackendUrl(input.config, { method: "POST", path: "/api/v1/media/assets" });
|
|
130
|
+
let uploadHash = createHash("sha256");
|
|
131
|
+
const response = await fetchWithKeycloakIdentity(input.config, url, () => {
|
|
132
|
+
const boundary = `numa-${randomUUID()}`;
|
|
133
|
+
uploadHash = createHash("sha256");
|
|
134
|
+
const body = Readable.from(multipartBody(boundary, sourcePath, {
|
|
135
|
+
kind: input.options.kind,
|
|
136
|
+
projectId: input.options.projectId,
|
|
137
|
+
idempotencyKey: input.options.idempotencyKey,
|
|
138
|
+
sha256: digest.sha256,
|
|
139
|
+
sizeBytes: String(digest.sizeBytes)
|
|
140
|
+
}, uploadHash));
|
|
141
|
+
const headers = {
|
|
142
|
+
Accept: "application/json",
|
|
143
|
+
"Content-Type": `multipart/form-data; boundary=${boundary}`
|
|
144
|
+
};
|
|
145
|
+
if (input.options.idempotencyKey)
|
|
146
|
+
headers["Idempotency-Key"] = input.options.idempotencyKey;
|
|
147
|
+
return {
|
|
148
|
+
method: "POST",
|
|
149
|
+
headers,
|
|
150
|
+
body,
|
|
151
|
+
duplex: "half"
|
|
152
|
+
};
|
|
153
|
+
}, { fetch: input.fetchImpl, tokenProvider: input.tokenProvider });
|
|
154
|
+
if (!response.ok)
|
|
155
|
+
throw await errorFromResponse(response);
|
|
156
|
+
let asset;
|
|
157
|
+
try {
|
|
158
|
+
asset = JSON.parse(await response.text());
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
throw new MediaError("Media API returned invalid JSON after asset upload.", "media_invalid_response", response.status);
|
|
162
|
+
}
|
|
163
|
+
const uploadedSha256 = uploadHash.digest("hex");
|
|
164
|
+
if (uploadedSha256 !== digest.sha256) {
|
|
165
|
+
throw new MediaError("Upload file changed between hashing and transfer.", "media_input_changed", response.status);
|
|
166
|
+
}
|
|
167
|
+
return { asset, sourcePath, sizeBytes: digest.sizeBytes, sha256: digest.sha256 };
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=transfers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfers.js","sourceRoot":"","sources":["../../src/media/transfers.ts"],"names":[],"mappings":"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"}
|