@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.
Files changed (99) hide show
  1. package/README.md +602 -0
  2. package/THIRD_PARTY_NOTICES.md +13 -0
  3. package/assets/codex-shortcut-icon.icns +0 -0
  4. package/assets/codex-shortcut-icon.ico +0 -0
  5. package/dist/app-config.d.ts +26 -0
  6. package/dist/app-config.js +135 -0
  7. package/dist/app-config.js.map +1 -0
  8. package/dist/backend.d.ts +16 -0
  9. package/dist/backend.js +106 -0
  10. package/dist/backend.js.map +1 -0
  11. package/dist/branding.d.ts +7 -0
  12. package/dist/branding.js +13 -0
  13. package/dist/branding.js.map +1 -0
  14. package/dist/chatgpt-console.d.ts +53 -0
  15. package/dist/chatgpt-console.js +105 -0
  16. package/dist/chatgpt-console.js.map +1 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.js +451 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/codex-auth-agent.d.ts +60 -0
  21. package/dist/codex-auth-agent.js +331 -0
  22. package/dist/codex-auth-agent.js.map +1 -0
  23. package/dist/codex-commands.d.ts +2 -0
  24. package/dist/codex-commands.js +528 -0
  25. package/dist/codex-commands.js.map +1 -0
  26. package/dist/codex-legacy-cleanup.d.ts +5 -0
  27. package/dist/codex-legacy-cleanup.js +77 -0
  28. package/dist/codex-legacy-cleanup.js.map +1 -0
  29. package/dist/codex-process.d.ts +13 -0
  30. package/dist/codex-process.js +193 -0
  31. package/dist/codex-process.js.map +1 -0
  32. package/dist/codex-protocol.d.ts +352 -0
  33. package/dist/codex-protocol.js +116 -0
  34. package/dist/codex-protocol.js.map +1 -0
  35. package/dist/codex-quota-cache.d.ts +20 -0
  36. package/dist/codex-quota-cache.js +82 -0
  37. package/dist/codex-quota-cache.js.map +1 -0
  38. package/dist/codex-selection.d.ts +18 -0
  39. package/dist/codex-selection.js +47 -0
  40. package/dist/codex-selection.js.map +1 -0
  41. package/dist/codex-service-client.d.ts +11 -0
  42. package/dist/codex-service-client.js +91 -0
  43. package/dist/codex-service-client.js.map +1 -0
  44. package/dist/codex-shortcuts.d.ts +43 -0
  45. package/dist/codex-shortcuts.js +429 -0
  46. package/dist/codex-shortcuts.js.map +1 -0
  47. package/dist/codex-tui.d.ts +15 -0
  48. package/dist/codex-tui.js +235 -0
  49. package/dist/codex-tui.js.map +1 -0
  50. package/dist/command-catalog.d.ts +9 -0
  51. package/dist/command-catalog.js +206 -0
  52. package/dist/command-catalog.js.map +1 -0
  53. package/dist/config-page.d.ts +2 -0
  54. package/dist/config-page.js +51 -0
  55. package/dist/config-page.js.map +1 -0
  56. package/dist/config.d.ts +22 -0
  57. package/dist/config.js +99 -0
  58. package/dist/config.js.map +1 -0
  59. package/dist/identity.d.ts +23 -0
  60. package/dist/identity.js +78 -0
  61. package/dist/identity.js.map +1 -0
  62. package/dist/media/client.d.ts +79 -0
  63. package/dist/media/client.js +175 -0
  64. package/dist/media/client.js.map +1 -0
  65. package/dist/media/commands.d.ts +2 -0
  66. package/dist/media/commands.js +193 -0
  67. package/dist/media/commands.js.map +1 -0
  68. package/dist/media/errors.d.ts +8 -0
  69. package/dist/media/errors.js +37 -0
  70. package/dist/media/errors.js.map +1 -0
  71. package/dist/media/schemas.d.ts +62 -0
  72. package/dist/media/schemas.js +71 -0
  73. package/dist/media/schemas.js.map +1 -0
  74. package/dist/media/transfers.d.ts +38 -0
  75. package/dist/media/transfers.js +169 -0
  76. package/dist/media/transfers.js.map +1 -0
  77. package/dist/oauth.d.ts +30 -0
  78. package/dist/oauth.js +295 -0
  79. package/dist/oauth.js.map +1 -0
  80. package/dist/private-file.d.ts +3 -0
  81. package/dist/private-file.js +51 -0
  82. package/dist/private-file.js.map +1 -0
  83. package/dist/server.d.ts +2 -0
  84. package/dist/server.js +197 -0
  85. package/dist/server.js.map +1 -0
  86. package/dist/types.d.ts +40 -0
  87. package/dist/types.js +2 -0
  88. package/dist/types.js.map +1 -0
  89. package/dist/web-console-page.d.ts +3 -0
  90. package/dist/web-console-page.js +59 -0
  91. package/dist/web-console-page.js.map +1 -0
  92. package/dist/web-console.d.ts +22 -0
  93. package/dist/web-console.js +335 -0
  94. package/dist/web-console.js.map +1 -0
  95. package/examples/claude-desktop-installed-binary.json +11 -0
  96. package/examples/claude-desktop-npx.json +12 -0
  97. package/examples/codex-installed-binary.json +11 -0
  98. package/examples/codex-npx.json +12 -0
  99. package/package.json +67 -0
package/dist/config.js ADDED
@@ -0,0 +1,99 @@
1
+ import { join } from "node:path";
2
+ import { appConfigDirectory, loadAppConfigSync } from "./app-config.js";
3
+ export const DEFAULT_DISCOVERY_URL = "https://kc.mcisaas.com/auth/realms/numa-realm/.well-known/openid-configuration";
4
+ export const DEFAULT_CLIENT_ID = "mcp-client";
5
+ export const DEFAULT_SCOPE = "openid profile email offline_access";
6
+ export function defaultTokenFile() {
7
+ return join(appConfigDirectory(), "keycloak-token.json");
8
+ }
9
+ export const DEFAULT_REDIRECT_HOST = "127.0.0.1";
10
+ export const DEFAULT_REDIRECT_PORT = 8765;
11
+ function trimTrailingSlash(value) {
12
+ return value.replace(/\/+$/, "");
13
+ }
14
+ function discoveryUrlFromEnv() {
15
+ const explicitDiscovery = process.env.NUMA_KEYCLOAK_DISCOVERY_URL;
16
+ if (explicitDiscovery)
17
+ return { discoveryUrl: explicitDiscovery };
18
+ const explicitIssuer = process.env.NUMA_KEYCLOAK_ISSUER_URL;
19
+ if (explicitIssuer) {
20
+ const issuerUrl = trimTrailingSlash(explicitIssuer);
21
+ return {
22
+ issuerUrl,
23
+ discoveryUrl: `${issuerUrl}/.well-known/openid-configuration`
24
+ };
25
+ }
26
+ const baseUrl = process.env.NUMA_KEYCLOAK_BASE_URL;
27
+ const realm = process.env.NUMA_KEYCLOAK_REALM;
28
+ if (baseUrl && realm) {
29
+ const issuerUrl = `${trimTrailingSlash(baseUrl)}/realms/${encodeURIComponent(realm)}`;
30
+ return {
31
+ issuerUrl,
32
+ discoveryUrl: `${issuerUrl}/.well-known/openid-configuration`
33
+ };
34
+ }
35
+ return { discoveryUrl: DEFAULT_DISCOVERY_URL };
36
+ }
37
+ function redirectHostFromEnv() {
38
+ const redirectUri = process.env.NUMA_KEYCLOAK_REDIRECT_URI;
39
+ if (!redirectUri)
40
+ return process.env.NUMA_AUTH_REDIRECT_HOST ?? DEFAULT_REDIRECT_HOST;
41
+ const url = new URL(redirectUri);
42
+ return url.hostname;
43
+ }
44
+ function redirectPortFromEnv() {
45
+ const redirectUri = process.env.NUMA_KEYCLOAK_REDIRECT_URI;
46
+ if (!redirectUri)
47
+ return envInteger("NUMA_AUTH_REDIRECT_PORT", DEFAULT_REDIRECT_PORT);
48
+ const url = new URL(redirectUri);
49
+ if (url.port)
50
+ return Number.parseInt(url.port, 10);
51
+ return url.protocol === "https:" ? 443 : 80;
52
+ }
53
+ function redirectPathFromEnv() {
54
+ const redirectUri = process.env.NUMA_KEYCLOAK_REDIRECT_URI;
55
+ if (!redirectUri)
56
+ return "/callback";
57
+ const path = new URL(redirectUri).pathname;
58
+ return path || "/callback";
59
+ }
60
+ function envBoolean(name, defaultValue) {
61
+ const value = process.env[name];
62
+ if (value == null || value === "")
63
+ return defaultValue;
64
+ return ["1", "true", "yes", "on"].includes(value.toLowerCase());
65
+ }
66
+ function envInteger(name, defaultValue) {
67
+ const value = process.env[name];
68
+ if (!value)
69
+ return defaultValue;
70
+ const parsed = Number.parseInt(value, 10);
71
+ if (!Number.isInteger(parsed) || parsed <= 0 || parsed > 65535) {
72
+ throw new Error(`${name} must be an integer port between 1 and 65535`);
73
+ }
74
+ return parsed;
75
+ }
76
+ export function loadConfig() {
77
+ const discovery = discoveryUrlFromEnv();
78
+ const appConfig = loadAppConfigSync();
79
+ return {
80
+ discoveryUrl: discovery.discoveryUrl,
81
+ issuerUrl: discovery.issuerUrl,
82
+ clientId: process.env.NUMA_KEYCLOAK_CLIENT_ID ?? DEFAULT_CLIENT_ID,
83
+ clientSecret: process.env.NUMA_KEYCLOAK_CLIENT_SECRET || undefined,
84
+ scope: process.env.NUMA_KEYCLOAK_SCOPES ?? process.env.NUMA_KEYCLOAK_SCOPE ?? DEFAULT_SCOPE,
85
+ tokenFile: process.env.NUMA_TOKEN_CACHE_PATH ?? process.env.NUMA_AUTH_TOKEN_FILE ?? defaultTokenFile(),
86
+ redirectHost: redirectHostFromEnv(),
87
+ redirectPort: redirectPortFromEnv(),
88
+ redirectPath: redirectPathFromEnv(),
89
+ openBrowser: envBoolean("NUMA_AUTH_OPEN_BROWSER", true),
90
+ backendBaseUrl: process.env.NUMA_BACKEND_BASE_URL || appConfig.apiBaseUrl || undefined,
91
+ allowAbsoluteBackendUrls: envBoolean("NUMA_BACKEND_ALLOW_ABSOLUTE_URLS", false)
92
+ };
93
+ }
94
+ export function redirectUri(config) {
95
+ if (process.env.NUMA_KEYCLOAK_REDIRECT_URI)
96
+ return process.env.NUMA_KEYCLOAK_REDIRECT_URI;
97
+ return `http://${config.redirectHost}:${config.redirectPort}${config.redirectPath}`;
98
+ }
99
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { AuthConfig } from "./config.js";
2
+ export interface UserIdentity {
3
+ subject?: string;
4
+ username?: string;
5
+ displayName?: string;
6
+ email?: string;
7
+ emailVerified?: boolean;
8
+ realmRoles: string[];
9
+ clientRoles: Record<string, string[]>;
10
+ roles: string[];
11
+ groups: string[];
12
+ raw: Record<string, unknown>;
13
+ }
14
+ export declare function buildIdentity(userinfo: Record<string, unknown>, tokenClaims: Record<string, unknown>): UserIdentity;
15
+ export declare function currentIdentity(config: AuthConfig, forceRefresh?: boolean): Promise<UserIdentity>;
16
+ export declare function hasAnyRole(identity: UserIdentity, requiredRoles: string[]): boolean;
17
+ export declare class RoleRequiredError extends Error {
18
+ readonly requiredRoles: string[];
19
+ readonly actualRoles: string[];
20
+ readonly code = "role_required";
21
+ constructor(requiredRoles: string[], actualRoles: string[]);
22
+ }
23
+ export declare function requireAnyRole(config: AuthConfig, requiredRoles: string[]): Promise<UserIdentity>;
@@ -0,0 +1,78 @@
1
+ import { readTokenCache, whoami } from "./oauth.js";
2
+ function stringArray(value) {
3
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
4
+ }
5
+ function decodeJwtPayload(token) {
6
+ if (!token)
7
+ return {};
8
+ try {
9
+ const [, payload] = token.split(".");
10
+ if (!payload)
11
+ return {};
12
+ return JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
13
+ }
14
+ catch {
15
+ return {};
16
+ }
17
+ }
18
+ function record(value) {
19
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
20
+ }
21
+ export function buildIdentity(userinfo, tokenClaims) {
22
+ const claims = { ...tokenClaims, ...userinfo };
23
+ const realmRoles = Array.from(new Set([
24
+ ...stringArray(record(tokenClaims.realm_access).roles),
25
+ ...stringArray(record(userinfo.realm_access).roles),
26
+ ...stringArray(userinfo.realm_roles)
27
+ ])).sort();
28
+ const clientRoles = {};
29
+ for (const source of [record(tokenClaims.resource_access), record(userinfo.resource_access)]) {
30
+ for (const [client, value] of Object.entries(source)) {
31
+ clientRoles[client] = Array.from(new Set([...(clientRoles[client] ?? []), ...stringArray(record(value).roles)])).sort();
32
+ }
33
+ }
34
+ const directRoles = stringArray(claims.roles);
35
+ const roles = Array.from(new Set([...realmRoles, ...directRoles, ...Object.values(clientRoles).flat()])).sort();
36
+ return {
37
+ subject: typeof claims.sub === "string" ? claims.sub : undefined,
38
+ username: typeof claims.preferred_username === "string"
39
+ ? claims.preferred_username
40
+ : typeof claims.username === "string"
41
+ ? claims.username
42
+ : undefined,
43
+ displayName: typeof claims.name === "string" ? claims.name : undefined,
44
+ email: typeof claims.email === "string" ? claims.email : undefined,
45
+ emailVerified: typeof claims.email_verified === "boolean" ? claims.email_verified : undefined,
46
+ realmRoles,
47
+ clientRoles,
48
+ roles,
49
+ groups: stringArray(claims.groups).sort(),
50
+ raw: userinfo
51
+ };
52
+ }
53
+ export async function currentIdentity(config, forceRefresh = false) {
54
+ const userinfo = await whoami(config, forceRefresh);
55
+ const cache = await readTokenCache(config);
56
+ return buildIdentity(userinfo, decodeJwtPayload(cache?.token.access_token));
57
+ }
58
+ export function hasAnyRole(identity, requiredRoles) {
59
+ return requiredRoles.some((role) => identity.roles.includes(role));
60
+ }
61
+ export class RoleRequiredError extends Error {
62
+ requiredRoles;
63
+ actualRoles;
64
+ code = "role_required";
65
+ constructor(requiredRoles, actualRoles) {
66
+ super(`该命令要求至少一个角色: ${requiredRoles.join(", ")};当前角色: ${actualRoles.join(", ") || "无"}`);
67
+ this.requiredRoles = requiredRoles;
68
+ this.actualRoles = actualRoles;
69
+ }
70
+ }
71
+ export async function requireAnyRole(config, requiredRoles) {
72
+ const identity = await currentIdentity(config);
73
+ if (!hasAnyRole(identity, requiredRoles)) {
74
+ throw new RoleRequiredError(requiredRoles, identity.roles);
75
+ }
76
+ return identity;
77
+ }
78
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import type { AuthConfig } from "../config.js";
2
+ import { type KeycloakTokenProvider } from "../oauth.js";
3
+ import { type MediaAsset } from "./schemas.js";
4
+ import { type DownloadResult, type UploadOptions, type UploadResult } from "./transfers.js";
5
+ export interface MediaClientDependencies {
6
+ fetch?: typeof fetch;
7
+ tokenProvider?: KeycloakTokenProvider;
8
+ }
9
+ export declare function readSubmitRequest(path: string): Promise<Record<string, unknown>>;
10
+ export declare function readLibraryManifest(path: string): Promise<Record<string, unknown>>;
11
+ export declare class MediaClient {
12
+ private readonly config;
13
+ private readonly fetchImpl;
14
+ private readonly tokenProvider;
15
+ constructor(config: AuthConfig, dependencies?: MediaClientDependencies);
16
+ private authenticatedFetch;
17
+ private json;
18
+ capabilities(): Promise<{
19
+ [x: string]: unknown;
20
+ apiVersion?: string | undefined;
21
+ minCliVersion?: string | undefined;
22
+ features?: Record<string, unknown> | undefined;
23
+ providers?: unknown[] | undefined;
24
+ requestId?: string | undefined;
25
+ }>;
26
+ submitTts(request: Record<string, unknown>, idempotencyKey?: string): Promise<{
27
+ [x: string]: unknown;
28
+ jobId: string;
29
+ status: string;
30
+ requestId: string;
31
+ }>;
32
+ submitVideo(request: Record<string, unknown>, idempotencyKey?: string): Promise<{
33
+ [x: string]: unknown;
34
+ jobId: string;
35
+ status: string;
36
+ requestId: string;
37
+ }>;
38
+ inspectJob(jobId: string): Promise<{
39
+ [x: string]: unknown;
40
+ jobId: string;
41
+ status: string;
42
+ requestId: string;
43
+ }>;
44
+ resolveJob(type: "tts" | "video", idempotencyKey: string): Promise<{
45
+ [x: string]: unknown;
46
+ jobId: string;
47
+ status: string;
48
+ requestId: string;
49
+ }>;
50
+ searchLibrary(options: {
51
+ query?: string;
52
+ cursor?: string;
53
+ limit?: number;
54
+ }): Promise<{
55
+ [x: string]: unknown;
56
+ items: unknown[];
57
+ nextCursor?: string | null | undefined;
58
+ requestId?: string | undefined;
59
+ }>;
60
+ inspectLibrary(reference: string): Promise<{
61
+ [x: string]: unknown;
62
+ artifactId: string;
63
+ requestId?: string | undefined;
64
+ fileName?: string | undefined;
65
+ sha256?: string | undefined;
66
+ }>;
67
+ pullLibrary(reference: string, outputPath: string): Promise<DownloadResult>;
68
+ publishLibrary(manifest: Record<string, unknown>): Promise<{
69
+ [x: string]: unknown;
70
+ artifactId: string;
71
+ requestId?: string | undefined;
72
+ fileName?: string | undefined;
73
+ sha256?: string | undefined;
74
+ }>;
75
+ pullArtifact(artifactId: string, outputPath: string, expectedSha256?: string): Promise<DownloadResult>;
76
+ uploadAsset(filePath: string, options: UploadOptions): Promise<Omit<UploadResult, "asset"> & {
77
+ asset: MediaAsset;
78
+ }>;
79
+ }
@@ -0,0 +1,175 @@
1
+ import { readFile, stat } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { resolveBackendUrl } from "../backend.js";
4
+ import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
5
+ import { ApiErrorSchema, AssetSchema, CapabilitiesSchema, JobSchema, LibraryEntrySchema, LibraryManifestSchema, LibraryResultSchema, SubmitRequestSchema } from "./schemas.js";
6
+ import { MediaError, redactSensitiveText } from "./errors.js";
7
+ import { downloadArtifact, uploadAsset } from "./transfers.js";
8
+ function requestIdFrom(response, body) {
9
+ if (body && typeof body === "object" && "requestId" in body && typeof body.requestId === "string") {
10
+ return body.requestId;
11
+ }
12
+ return response.headers.get("x-request-id") ?? undefined;
13
+ }
14
+ async function responseBody(response) {
15
+ const text = await response.text();
16
+ if (!text)
17
+ return {};
18
+ try {
19
+ return JSON.parse(text);
20
+ }
21
+ catch {
22
+ return text;
23
+ }
24
+ }
25
+ function apiFailure(response, body) {
26
+ const parsed = ApiErrorSchema.safeParse(body);
27
+ const message = parsed.success
28
+ ? parsed.data.message ?? response.statusText ?? "Media API request failed."
29
+ : typeof body === "string"
30
+ ? body
31
+ : response.statusText || "Media API request failed.";
32
+ return new MediaError(`Media API HTTP ${response.status}: ${redactSensitiveText(message)}`, parsed.success ? parsed.data.code ?? "media_api_error" : "media_api_error", response.status, requestIdFrom(response, body));
33
+ }
34
+ export async function readSubmitRequest(path) {
35
+ let parsed;
36
+ try {
37
+ parsed = JSON.parse(await readFile(path, "utf8"));
38
+ }
39
+ catch (error) {
40
+ const message = error instanceof Error ? error.message : String(error);
41
+ throw new MediaError(`Cannot read media request JSON: ${message}`, "media_input_invalid");
42
+ }
43
+ const result = SubmitRequestSchema.safeParse(parsed);
44
+ if (!result.success) {
45
+ throw new MediaError(`Media request must be a JSON object: ${result.error.message}`, "media_input_invalid");
46
+ }
47
+ return result.data;
48
+ }
49
+ export async function readLibraryManifest(path) {
50
+ let parsed;
51
+ try {
52
+ parsed = JSON.parse(await readFile(path, "utf8"));
53
+ }
54
+ catch (error) {
55
+ const message = error instanceof Error ? error.message : String(error);
56
+ throw new MediaError(`Cannot read library manifest JSON: ${message}`, "media_input_invalid");
57
+ }
58
+ const result = LibraryManifestSchema.safeParse(parsed);
59
+ if (!result.success) {
60
+ throw new MediaError(`Library manifest is invalid: ${result.error.message}`, "media_input_invalid");
61
+ }
62
+ return result.data;
63
+ }
64
+ function safeLibraryFileName(reference, fileName) {
65
+ if (fileName && fileName === fileName.split(/[\\/]/u).pop() && fileName !== "." && fileName !== "..")
66
+ return fileName;
67
+ return reference.replace(/[^0-9A-Za-z._@-]+/gu, "_");
68
+ }
69
+ export class MediaClient {
70
+ config;
71
+ fetchImpl;
72
+ tokenProvider;
73
+ constructor(config, dependencies = {}) {
74
+ this.config = config;
75
+ this.fetchImpl = dependencies.fetch ?? fetch;
76
+ this.tokenProvider = dependencies.tokenProvider ?? ensureAccessToken;
77
+ }
78
+ async authenticatedFetch(path, init = {}) {
79
+ const url = resolveBackendUrl(this.config, { method: "GET", path });
80
+ const headers = new Headers(init.headers);
81
+ headers.set("Accept", "application/json");
82
+ return fetchWithKeycloakIdentity(this.config, url, () => ({ ...init, headers }), { fetch: this.fetchImpl, tokenProvider: this.tokenProvider });
83
+ }
84
+ async json(path, schema, init = {}, expectedStatuses) {
85
+ const headers = new Headers(init.headers);
86
+ if (init.body != null)
87
+ headers.set("Content-Type", "application/json");
88
+ const response = await this.authenticatedFetch(path, { ...init, headers });
89
+ const body = await responseBody(response);
90
+ if (!response.ok)
91
+ throw apiFailure(response, body);
92
+ if (expectedStatuses && !expectedStatuses.includes(response.status)) {
93
+ throw new MediaError(`Media API returned HTTP ${response.status}; expected ${expectedStatuses.join(" or ")}.`, "media_invalid_response", response.status, requestIdFrom(response, body));
94
+ }
95
+ const parsed = schema.safeParse(body);
96
+ if (!parsed.success) {
97
+ throw new MediaError(`Media API returned an invalid response: ${parsed.error.message}`, "media_invalid_response", response.status, requestIdFrom(response, body));
98
+ }
99
+ return parsed.data;
100
+ }
101
+ async capabilities() {
102
+ return this.json("/api/v1/media/capabilities", CapabilitiesSchema);
103
+ }
104
+ async submitTts(request, idempotencyKey) {
105
+ const body = { ...request, ...(idempotencyKey ? { idempotencyKey } : {}) };
106
+ const headers = idempotencyKey ? { "Idempotency-Key": idempotencyKey } : undefined;
107
+ return this.json("/api/v1/media/tts/jobs", JobSchema, { method: "POST", headers, body: JSON.stringify(body) }, [200, 202]);
108
+ }
109
+ async submitVideo(request, idempotencyKey) {
110
+ const body = { ...request, ...(idempotencyKey ? { idempotencyKey } : {}) };
111
+ const headers = idempotencyKey ? { "Idempotency-Key": idempotencyKey } : undefined;
112
+ return this.json("/api/v1/media/video/jobs", JobSchema, { method: "POST", headers, body: JSON.stringify(body) }, [200, 202]);
113
+ }
114
+ async inspectJob(jobId) {
115
+ return this.json(`/api/v1/media/jobs/${encodeURIComponent(jobId)}`, JobSchema);
116
+ }
117
+ async resolveJob(type, idempotencyKey) {
118
+ const query = new URLSearchParams({ type, idempotencyKey });
119
+ return this.json(`/api/v1/media/jobs?${query.toString()}`, JobSchema);
120
+ }
121
+ async searchLibrary(options) {
122
+ const query = new URLSearchParams();
123
+ if (options.query)
124
+ query.set("query", options.query);
125
+ if (options.cursor)
126
+ query.set("cursor", options.cursor);
127
+ if (options.limit != null)
128
+ query.set("limit", String(options.limit));
129
+ const suffix = query.size ? `?${query.toString()}` : "";
130
+ return this.json(`/api/v1/media/library${suffix}`, LibraryResultSchema);
131
+ }
132
+ async inspectLibrary(reference) {
133
+ return this.json(`/api/v1/media/library/${encodeURIComponent(reference)}`, LibraryEntrySchema);
134
+ }
135
+ async pullLibrary(reference, outputPath) {
136
+ const entry = await this.inspectLibrary(reference);
137
+ let destination = outputPath;
138
+ const outputStat = await stat(outputPath).catch((error) => {
139
+ if (error.code === "ENOENT")
140
+ return undefined;
141
+ throw error;
142
+ });
143
+ if (outputStat?.isDirectory())
144
+ destination = join(outputPath, safeLibraryFileName(reference, entry.fileName));
145
+ return this.pullArtifact(entry.artifactId, destination, entry.sha256);
146
+ }
147
+ async publishLibrary(manifest) {
148
+ return this.json("/api/v1/media/library", LibraryEntrySchema, { method: "POST", body: JSON.stringify(manifest) }, [200, 201]);
149
+ }
150
+ async pullArtifact(artifactId, outputPath, expectedSha256) {
151
+ return downloadArtifact({
152
+ config: this.config,
153
+ fetchImpl: this.fetchImpl,
154
+ tokenProvider: this.tokenProvider,
155
+ artifactId,
156
+ outputPath,
157
+ expectedSha256
158
+ });
159
+ }
160
+ async uploadAsset(filePath, options) {
161
+ const result = await uploadAsset({
162
+ config: this.config,
163
+ fetchImpl: this.fetchImpl,
164
+ tokenProvider: this.tokenProvider,
165
+ filePath,
166
+ options
167
+ });
168
+ const parsed = AssetSchema.safeParse(result.asset);
169
+ if (!parsed.success) {
170
+ throw new MediaError(`Media API returned an invalid asset: ${parsed.error.message}`, "media_invalid_response");
171
+ }
172
+ return { ...result, asset: parsed.data };
173
+ }
174
+ }
175
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/media/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerMediaCommands(program: Command): void;