@numa-tech/numa 1.11.13 → 1.12.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 +197 -25
- package/dist/ai-registry/client.d.ts +65 -0
- package/dist/ai-registry/client.js +260 -0
- package/dist/ai-registry/client.js.map +1 -0
- package/dist/ai-registry/commands.d.ts +2 -0
- package/dist/ai-registry/commands.js +438 -0
- package/dist/ai-registry/commands.js.map +1 -0
- package/dist/ai-registry/errors.d.ts +8 -0
- package/dist/ai-registry/errors.js +40 -0
- package/dist/ai-registry/errors.js.map +1 -0
- package/dist/ai-registry/mcp-installer.d.ts +37 -0
- package/dist/ai-registry/mcp-installer.js +273 -0
- package/dist/ai-registry/mcp-installer.js.map +1 -0
- package/dist/ai-registry/schemas.d.ts +86 -0
- package/dist/ai-registry/schemas.js +39 -0
- package/dist/ai-registry/schemas.js.map +1 -0
- package/dist/ai-registry/skill-installer.d.ts +21 -0
- package/dist/ai-registry/skill-installer.js +262 -0
- package/dist/ai-registry/skill-installer.js.map +1 -0
- package/dist/app-config.d.ts +4 -2
- package/dist/app-config.js +15 -3
- package/dist/app-config.js.map +1 -1
- package/dist/cli.js +40 -12
- package/dist/cli.js.map +1 -1
- package/dist/codex-module.d.ts +8 -0
- package/dist/codex-module.js +152 -0
- package/dist/codex-module.js.map +1 -0
- package/dist/command-catalog.js +170 -64
- package/dist/command-catalog.js.map +1 -1
- package/dist/config-page.js +17 -0
- package/dist/config-page.js.map +1 -1
- package/dist/config.d.ts +4 -1
- package/dist/config.js +26 -7
- package/dist/config.js.map +1 -1
- package/dist/media/commands.js +12 -11
- package/dist/media/commands.js.map +1 -1
- package/dist/oauth.d.ts +2 -30
- package/dist/oauth.js +1 -294
- package/dist/oauth.js.map +1 -1
- package/dist/pipeline/client.d.ts +126 -0
- package/dist/pipeline/client.js +105 -0
- package/dist/pipeline/client.js.map +1 -0
- package/dist/pipeline/commands.d.ts +17 -0
- package/dist/pipeline/commands.js +283 -0
- package/dist/pipeline/commands.js.map +1 -0
- package/dist/pipeline/errors.d.ts +8 -0
- package/dist/pipeline/errors.js +37 -0
- package/dist/pipeline/errors.js.map +1 -0
- package/dist/pipeline/schemas.d.ts +243 -0
- package/dist/pipeline/schemas.js +60 -0
- package/dist/pipeline/schemas.js.map +1 -0
- package/dist/platform-profile.d.ts +75 -0
- package/dist/platform-profile.js +169 -0
- package/dist/platform-profile.js.map +1 -0
- package/dist/types.d.ts +1 -40
- package/dist/web-console-page.d.ts +2 -2
- package/dist/web-console-page.js +21 -7
- package/dist/web-console-page.js.map +1 -1
- package/dist/web-console.d.ts +17 -3
- package/dist/web-console.js +70 -5
- package/dist/web-console.js.map +1 -1
- package/examples/claude-desktop-npx.json +1 -1
- package/examples/codex-npx.json +1 -1
- package/package.json +30 -14
- package/skills/numa-ai-registry/SKILL.md +47 -0
- package/skills/numa-ai-registry/evals/evals.json +35 -0
- package/skills/numa-ai-registry/references/command-contract.md +53 -0
- package/assets/codex-shortcut-icon.icns +0 -0
- package/assets/codex-shortcut-icon.ico +0 -0
- package/dist/chatgpt-console.d.ts +0 -53
- package/dist/chatgpt-console.js +0 -105
- package/dist/chatgpt-console.js.map +0 -1
- package/dist/codex-auth-agent.d.ts +0 -60
- package/dist/codex-auth-agent.js +0 -331
- package/dist/codex-auth-agent.js.map +0 -1
- package/dist/codex-commands.d.ts +0 -13
- package/dist/codex-commands.js +0 -571
- package/dist/codex-commands.js.map +0 -1
- package/dist/codex-legacy-cleanup.d.ts +0 -5
- package/dist/codex-legacy-cleanup.js +0 -77
- package/dist/codex-legacy-cleanup.js.map +0 -1
- package/dist/codex-process.d.ts +0 -13
- package/dist/codex-process.js +0 -193
- package/dist/codex-process.js.map +0 -1
- package/dist/codex-protocol.d.ts +0 -352
- package/dist/codex-protocol.js +0 -116
- package/dist/codex-protocol.js.map +0 -1
- package/dist/codex-quota-cache.d.ts +0 -20
- package/dist/codex-quota-cache.js +0 -82
- package/dist/codex-quota-cache.js.map +0 -1
- package/dist/codex-selection.d.ts +0 -18
- package/dist/codex-selection.js +0 -47
- package/dist/codex-selection.js.map +0 -1
- package/dist/codex-service-client.d.ts +0 -11
- package/dist/codex-service-client.js +0 -91
- package/dist/codex-service-client.js.map +0 -1
- package/dist/codex-shortcuts.d.ts +0 -43
- package/dist/codex-shortcuts.js +0 -429
- package/dist/codex-shortcuts.js.map +0 -1
- package/dist/codex-tui.d.ts +0 -15
- package/dist/codex-tui.js +0 -235
- package/dist/codex-tui.js.map +0 -1
package/dist/media/commands.js
CHANGED
|
@@ -55,7 +55,7 @@ export function registerMediaCommands(program) {
|
|
|
55
55
|
.command("capabilities")
|
|
56
56
|
.description("查询媒体 API、Provider 和最低 CLI 版本能力(需要登录)")
|
|
57
57
|
.action(async (_options, command) => {
|
|
58
|
-
const capabilities = await new MediaClient(loadConfig()).capabilities();
|
|
58
|
+
const capabilities = await new MediaClient(loadConfig("media")).capabilities();
|
|
59
59
|
await output(command, { ok: true, capabilities }, `媒体 API: ${capabilities.apiVersion ?? "available"}`);
|
|
60
60
|
}), ["numa media capabilities", "numa media capabilities --json"]);
|
|
61
61
|
const tts = media.command("tts").description("平台托管的语音合成任务");
|
|
@@ -66,7 +66,7 @@ export function registerMediaCommands(program) {
|
|
|
66
66
|
.option("-k, --idempotency-key <key>", "幂等键;重试同一任务时复用")
|
|
67
67
|
.action(async (options, command) => {
|
|
68
68
|
const request = await readSubmitRequest(options.input);
|
|
69
|
-
const job = await new MediaClient(loadConfig()).submitTts(request, idempotencyKey(options.idempotencyKey));
|
|
69
|
+
const job = await new MediaClient(loadConfig("media")).submitTts(request, idempotencyKey(options.idempotencyKey));
|
|
70
70
|
await output(command, { ok: true, job }, `TTS 任务已提交: ${job.jobId} (${job.status})`);
|
|
71
71
|
}), ["numa media tts submit --input narration.json --idempotency-key project-scene-01 --json"]);
|
|
72
72
|
const video = media.command("video").description("平台托管的视频生成任务");
|
|
@@ -77,7 +77,7 @@ export function registerMediaCommands(program) {
|
|
|
77
77
|
.option("-k, --idempotency-key <key>", "幂等键;重试同一任务时复用")
|
|
78
78
|
.action(async (options, command) => {
|
|
79
79
|
const request = await readSubmitRequest(options.input);
|
|
80
|
-
const job = await new MediaClient(loadConfig()).submitVideo(request, idempotencyKey(options.idempotencyKey));
|
|
80
|
+
const job = await new MediaClient(loadConfig("media")).submitVideo(request, idempotencyKey(options.idempotencyKey));
|
|
81
81
|
await output(command, { ok: true, job }, `视频任务已提交: ${job.jobId} (${job.status})`);
|
|
82
82
|
}), ["numa media video submit --input seedance.json --idempotency-key project-shot-01 --json"]);
|
|
83
83
|
const job = media.command("job").description("查询异步媒体任务");
|
|
@@ -85,7 +85,7 @@ export function registerMediaCommands(program) {
|
|
|
85
85
|
.command("inspect <jobId>")
|
|
86
86
|
.description("查询任务状态和结果(需要登录)")
|
|
87
87
|
.action(async (jobId, _options, command) => {
|
|
88
|
-
const result = await new MediaClient(loadConfig()).inspectJob(identifier(jobId, "jobId"));
|
|
88
|
+
const result = await new MediaClient(loadConfig("media")).inspectJob(identifier(jobId, "jobId"));
|
|
89
89
|
await output(command, { ok: true, job: result }, `任务 ${result.jobId}: ${result.status}`);
|
|
90
90
|
}), ["numa media job inspect job_123 --json"]);
|
|
91
91
|
addExamples(job
|
|
@@ -97,7 +97,7 @@ export function registerMediaCommands(program) {
|
|
|
97
97
|
if (options.type !== "tts" && options.type !== "video") {
|
|
98
98
|
throw new MediaError("Job type must be tts or video.", "media_input_invalid");
|
|
99
99
|
}
|
|
100
|
-
const result = await new MediaClient(loadConfig()).resolveJob(options.type, idempotencyKey(options.idempotencyKey));
|
|
100
|
+
const result = await new MediaClient(loadConfig("media")).resolveJob(options.type, idempotencyKey(options.idempotencyKey));
|
|
101
101
|
await output(command, { ok: true, job: result }, `任务 ${result.jobId}: ${result.status}`);
|
|
102
102
|
}), ["numa media job resolve --type video --idempotency-key project-shot-01 --json"]);
|
|
103
103
|
const artifact = media.command("artifact").description("安全下载平台媒体产物");
|
|
@@ -110,7 +110,7 @@ export function registerMediaCommands(program) {
|
|
|
110
110
|
if (options.sha256 && !/^[a-f0-9]{64}$/iu.test(options.sha256)) {
|
|
111
111
|
throw new MediaError("--sha256 must be a 64-character hexadecimal digest.", "media_input_invalid");
|
|
112
112
|
}
|
|
113
|
-
const result = await new MediaClient(loadConfig()).pullArtifact(identifier(artifactId, "artifactId"), options.output, options.sha256);
|
|
113
|
+
const result = await new MediaClient(loadConfig("media")).pullArtifact(identifier(artifactId, "artifactId"), options.output, options.sha256);
|
|
114
114
|
await output(command, {
|
|
115
115
|
ok: true,
|
|
116
116
|
artifact: {
|
|
@@ -130,7 +130,7 @@ export function registerMediaCommands(program) {
|
|
|
130
130
|
.option("-p, --project-id <id>", "关联项目 ID")
|
|
131
131
|
.option("-k, --idempotency-key <key>", "幂等键;重试同一上传时复用")
|
|
132
132
|
.action(async (file, options, command) => {
|
|
133
|
-
const result = await new MediaClient(loadConfig()).uploadAsset(file, {
|
|
133
|
+
const result = await new MediaClient(loadConfig("media")).uploadAsset(file, {
|
|
134
134
|
kind: options.kind,
|
|
135
135
|
projectId: options.projectId,
|
|
136
136
|
idempotencyKey: idempotencyKey(options.idempotencyKey)
|
|
@@ -153,14 +153,15 @@ export function registerMediaCommands(program) {
|
|
|
153
153
|
.option("-c, --cursor <cursor>", "分页游标")
|
|
154
154
|
.option("-l, --limit <number>", "返回条数,1-100", limit, 20)
|
|
155
155
|
.action(async (options, command) => {
|
|
156
|
-
const result = await new MediaClient(loadConfig()).searchLibrary(options);
|
|
156
|
+
const result = await new MediaClient(loadConfig("media")).searchLibrary(options);
|
|
157
157
|
await output(command, { ok: true, library: result }, `找到 ${result.items.length} 个素材`);
|
|
158
158
|
}), ["numa media library search --query product --limit 20 --json"]);
|
|
159
159
|
addExamples(library
|
|
160
160
|
.command("inspect <reference>")
|
|
161
161
|
.description("按精确 id@semver 查询素材及锁定信息(需要登录)")
|
|
162
162
|
.action(async (reference, _options, command) => {
|
|
163
|
-
const
|
|
163
|
+
const exactReference = libraryReference(reference);
|
|
164
|
+
const entry = await new MediaClient(loadConfig("media")).inspectLibrary(exactReference);
|
|
164
165
|
await output(command, { ok: true, entry }, `素材: ${reference} -> ${entry.artifactId}`);
|
|
165
166
|
}), ["numa media library inspect logo-main@1.2.0 --json"]);
|
|
166
167
|
addExamples(library
|
|
@@ -168,7 +169,7 @@ export function registerMediaCommands(program) {
|
|
|
168
169
|
.description("解析精确 id@semver 并流式下载素材(需要登录)")
|
|
169
170
|
.requiredOption("-o, --output <path>", "不存在的目标文件,或已存在的目标目录")
|
|
170
171
|
.action(async (reference, options, command) => {
|
|
171
|
-
const result = await new MediaClient(loadConfig()).pullLibrary(libraryReference(reference), options.output);
|
|
172
|
+
const result = await new MediaClient(loadConfig("media")).pullLibrary(libraryReference(reference), options.output);
|
|
172
173
|
await output(command, {
|
|
173
174
|
ok: true,
|
|
174
175
|
artifact: {
|
|
@@ -186,7 +187,7 @@ export function registerMediaCommands(program) {
|
|
|
186
187
|
.requiredOption("-m, --manifest <file>", "lowerCamelCase JSON 清单;必须包含 artifactId")
|
|
187
188
|
.action(async (options, command) => {
|
|
188
189
|
const manifest = await readLibraryManifest(options.manifest);
|
|
189
|
-
const entry = await new MediaClient(loadConfig()).publishLibrary(manifest);
|
|
190
|
+
const entry = await new MediaClient(loadConfig("media")).publishLibrary(manifest);
|
|
190
191
|
await output(command, { ok: true, entry }, `素材已发布: ${entry.artifactId}`);
|
|
191
192
|
}), ["numa media library publish --manifest library-entry.json --json"]);
|
|
192
193
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/media/commands.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE9F,SAAS,WAAW,CAAC,OAAgB,EAAE,gBAAiC;IACtE,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,EAAsB,CAAC,IAAI,IAAI,gBAAgB,KAAK,MAAM,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,WAAW,CAAC,OAAgB,EAAE,QAAkB;IACvD,OAAO,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,gBAAgB,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1G,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,KAAa;IAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,cAAc,EAAE,qBAAqB,CAAC,CAAC;IACzF,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,UAAU,CAAC,kDAAkD,EAAE,qBAAqB,CAAC,CAAC;IACrH,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,UAAU,CAAC,gDAAgD,EAAE,qBAAqB,CAAC,CAAC;IACnH,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,KAAK,CAAC,KAAa;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QAC5D,MAAM,IAAI,UAAU,CAAC,qDAAqD,EAAE,qBAAqB,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,OAAgB,EAAE,WAAoB,EAAE,IAAY;IACxE,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;IACrC,IAAI,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QAAE,SAAS,CAAC,WAAW,CAAC,CAAC;;QAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yCAAyC,CAAC,CAAC;IAE1D,WAAW,CACT,KAAK;SACF,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAgB,EAAE,EAAE;QAC3C,MAAM,YAAY,GAAG,MAAM,IAAI,WAAW,CAAC,UAAU,
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/media/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth.d.ts
CHANGED
|
@@ -1,30 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export declare class AuthError extends Error {
|
|
4
|
-
readonly code: string;
|
|
5
|
-
constructor(message: string, code?: string);
|
|
6
|
-
}
|
|
7
|
-
export declare class LoginRequiredError extends AuthError {
|
|
8
|
-
constructor(message?: string);
|
|
9
|
-
}
|
|
10
|
-
export declare function nowSeconds(): number;
|
|
11
|
-
export declare function loadDiscovery(config: AuthConfig): Promise<OidcDiscovery>;
|
|
12
|
-
export declare function readTokenCache(config: AuthConfig): Promise<TokenCache | undefined>;
|
|
13
|
-
export declare function deleteTokenCache(config: AuthConfig): Promise<void>;
|
|
14
|
-
export declare function getUserinfo(config: AuthConfig, discovery: OidcDiscovery, accessToken: string): Promise<Record<string, unknown>>;
|
|
15
|
-
export declare function refreshAccessToken(config: AuthConfig, cache: TokenCache): Promise<TokenCache>;
|
|
16
|
-
export declare function ensureAccessToken(config: AuthConfig, forceRefresh?: boolean): Promise<string>;
|
|
17
|
-
export type KeycloakTokenProvider = (config: AuthConfig, forceRefresh?: boolean) => Promise<string>;
|
|
18
|
-
export interface KeycloakFetchDependencies {
|
|
19
|
-
fetch?: typeof fetch;
|
|
20
|
-
tokenProvider?: KeycloakTokenProvider;
|
|
21
|
-
}
|
|
22
|
-
export declare function fetchWithKeycloakIdentity(config: AuthConfig, url: string, requestFactory: () => RequestInit, dependencies?: KeycloakFetchDependencies): Promise<Response>;
|
|
23
|
-
export declare function whoami(config: AuthConfig, forceRefresh?: boolean): Promise<Record<string, unknown>>;
|
|
24
|
-
export interface BrowserLoginOptions {
|
|
25
|
-
successRedirectUrl?: string;
|
|
26
|
-
failureRedirectUrl?: string;
|
|
27
|
-
}
|
|
28
|
-
export declare function startBrowserLogin(config: AuthConfig, options?: BrowserLoginOptions): Promise<LoginSession>;
|
|
29
|
-
export declare function completeBrowserLogin(config: AuthConfig, session: LoginSession): Promise<Record<string, unknown>>;
|
|
30
|
-
export declare function blockingBrowserLogin(config: AuthConfig, options?: BrowserLoginOptions): Promise<Record<string, unknown>>;
|
|
1
|
+
export { AuthError, blockingBrowserLogin, completeBrowserLogin, deleteTokenCache, ensureAccessToken, fetchWithKeycloakIdentity, getUserinfo, loadDiscovery, LoginRequiredError, nowSeconds, readTokenCache, refreshAccessToken, startBrowserLogin, whoami } from "@numa-tech/cli-auth";
|
|
2
|
+
export type { AccessTokenProvider as KeycloakTokenProvider, AuthenticatedFetchDependencies as KeycloakFetchDependencies, BrowserLoginOptions } from "@numa-tech/cli-auth";
|
package/dist/oauth.js
CHANGED
|
@@ -1,295 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
-
import { createServer } from "node:http";
|
|
4
|
-
import { dirname } from "node:path";
|
|
5
|
-
import open from "open";
|
|
6
|
-
import { redirectUri } from "./config.js";
|
|
7
|
-
const REFRESH_LEEWAY_SECONDS = 60;
|
|
8
|
-
const LOGIN_SESSION_TTL_SECONDS = 300;
|
|
9
|
-
export class AuthError extends Error {
|
|
10
|
-
code;
|
|
11
|
-
constructor(message, code = "auth_error") {
|
|
12
|
-
super(message);
|
|
13
|
-
this.code = code;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
export class LoginRequiredError extends AuthError {
|
|
17
|
-
constructor(message = "No usable Keycloak login is available.") {
|
|
18
|
-
super(message, "login_required");
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
export function nowSeconds() {
|
|
22
|
-
return Math.floor(Date.now() / 1000);
|
|
23
|
-
}
|
|
24
|
-
async function parseJsonResponse(response, url) {
|
|
25
|
-
const text = await response.text();
|
|
26
|
-
let parsed = {};
|
|
27
|
-
if (text) {
|
|
28
|
-
try {
|
|
29
|
-
parsed = JSON.parse(text);
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
parsed = { raw: text };
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
if (!response.ok) {
|
|
36
|
-
const body = parsed;
|
|
37
|
-
const detail = body.error_description ?? body.error ?? body.raw ?? response.statusText;
|
|
38
|
-
throw new AuthError(`HTTP ${response.status} from ${url}: ${String(detail)}`, "http_error");
|
|
39
|
-
}
|
|
40
|
-
return parsed;
|
|
41
|
-
}
|
|
42
|
-
async function requestJson(url, init) {
|
|
43
|
-
const response = await fetch(url, {
|
|
44
|
-
...init,
|
|
45
|
-
headers: {
|
|
46
|
-
Accept: "application/json",
|
|
47
|
-
...(init?.body ? { "Content-Type": "application/x-www-form-urlencoded" } : {}),
|
|
48
|
-
...(init?.headers ?? {})
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
return parseJsonResponse(response, url);
|
|
52
|
-
}
|
|
53
|
-
function formBody(values) {
|
|
54
|
-
const body = new URLSearchParams();
|
|
55
|
-
for (const [key, value] of Object.entries(values)) {
|
|
56
|
-
if (value != null && value !== "")
|
|
57
|
-
body.set(key, value);
|
|
58
|
-
}
|
|
59
|
-
return body;
|
|
60
|
-
}
|
|
61
|
-
function addClientAuth(config, values) {
|
|
62
|
-
return formBody({
|
|
63
|
-
...values,
|
|
64
|
-
client_id: config.clientId,
|
|
65
|
-
client_secret: config.clientSecret
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
export async function loadDiscovery(config) {
|
|
69
|
-
return requestJson(config.discoveryUrl);
|
|
70
|
-
}
|
|
71
|
-
function pkcePair() {
|
|
72
|
-
const verifier = randomBytes(32).toString("base64url");
|
|
73
|
-
const challenge = createHash("sha256").update(verifier).digest("base64url");
|
|
74
|
-
return { verifier, challenge };
|
|
75
|
-
}
|
|
76
|
-
async function writeTokenCache(path, cache) {
|
|
77
|
-
await mkdir(dirname(path), { recursive: true });
|
|
78
|
-
const tmp = `${path}.tmp`;
|
|
79
|
-
await writeFile(tmp, `${JSON.stringify(cache, null, 2)}\n`, { mode: 0o600 });
|
|
80
|
-
await rename(tmp, path);
|
|
81
|
-
}
|
|
82
|
-
export async function readTokenCache(config) {
|
|
83
|
-
try {
|
|
84
|
-
const raw = await readFile(config.tokenFile, "utf8");
|
|
85
|
-
return JSON.parse(raw);
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
if (error.code === "ENOENT")
|
|
89
|
-
return undefined;
|
|
90
|
-
throw error;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
export async function deleteTokenCache(config) {
|
|
94
|
-
await rm(config.tokenFile, { force: true });
|
|
95
|
-
}
|
|
96
|
-
async function saveToken(config, discovery, token, userinfo, existingRefreshExpiresAt) {
|
|
97
|
-
const obtainedAt = nowSeconds();
|
|
98
|
-
const expiresAt = obtainedAt + (token.expires_in ?? 0);
|
|
99
|
-
const refreshExpiresAt = token.refresh_expires_in && token.refresh_expires_in > 0
|
|
100
|
-
? obtainedAt + token.refresh_expires_in
|
|
101
|
-
: existingRefreshExpiresAt;
|
|
102
|
-
const cache = {
|
|
103
|
-
issuer: discovery.issuer,
|
|
104
|
-
discoveryUrl: config.discoveryUrl,
|
|
105
|
-
clientId: config.clientId,
|
|
106
|
-
scope: token.scope ?? config.scope,
|
|
107
|
-
obtainedAt,
|
|
108
|
-
expiresAt,
|
|
109
|
-
refreshExpiresAt,
|
|
110
|
-
token,
|
|
111
|
-
userinfo
|
|
112
|
-
};
|
|
113
|
-
await writeTokenCache(config.tokenFile, cache);
|
|
114
|
-
return cache;
|
|
115
|
-
}
|
|
116
|
-
export async function getUserinfo(config, discovery, accessToken) {
|
|
117
|
-
return requestJson(discovery.userinfo_endpoint, {
|
|
118
|
-
headers: { Authorization: `Bearer ${accessToken}` }
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
export async function refreshAccessToken(config, cache) {
|
|
122
|
-
if (!cache.token.refresh_token) {
|
|
123
|
-
throw new LoginRequiredError("Saved token has no refresh token. Start login again.");
|
|
124
|
-
}
|
|
125
|
-
const discovery = await loadDiscovery(config);
|
|
126
|
-
const refreshed = await requestJson(discovery.token_endpoint, {
|
|
127
|
-
method: "POST",
|
|
128
|
-
body: addClientAuth(config, {
|
|
129
|
-
grant_type: "refresh_token",
|
|
130
|
-
refresh_token: cache.token.refresh_token
|
|
131
|
-
})
|
|
132
|
-
});
|
|
133
|
-
const token = {
|
|
134
|
-
...refreshed,
|
|
135
|
-
// Some OIDC servers reuse the existing refresh token instead of returning
|
|
136
|
-
// it again. Keep it until the server explicitly rejects the refresh grant.
|
|
137
|
-
refresh_token: refreshed.refresh_token ?? cache.token.refresh_token
|
|
138
|
-
};
|
|
139
|
-
const userinfo = await getUserinfo(config, discovery, token.access_token);
|
|
140
|
-
return saveToken(config, discovery, token, userinfo, cache.refreshExpiresAt);
|
|
141
|
-
}
|
|
142
|
-
export async function ensureAccessToken(config, forceRefresh = false) {
|
|
143
|
-
let cache = await readTokenCache(config);
|
|
144
|
-
if (!cache)
|
|
145
|
-
throw new LoginRequiredError("No token cache exists. Start login first.");
|
|
146
|
-
if (cache.discoveryUrl !== config.discoveryUrl || cache.clientId !== config.clientId) {
|
|
147
|
-
throw new LoginRequiredError("Token cache was created for a different Keycloak discovery URL or client.");
|
|
148
|
-
}
|
|
149
|
-
if (forceRefresh || cache.expiresAt <= nowSeconds() + REFRESH_LEEWAY_SECONDS) {
|
|
150
|
-
cache = await refreshAccessToken(config, cache);
|
|
151
|
-
}
|
|
152
|
-
return cache.token.access_token;
|
|
153
|
-
}
|
|
154
|
-
export async function fetchWithKeycloakIdentity(config, url, requestFactory, dependencies = {}) {
|
|
155
|
-
const fetchImpl = dependencies.fetch ?? fetch;
|
|
156
|
-
const tokenProvider = dependencies.tokenProvider ?? ensureAccessToken;
|
|
157
|
-
const send = async (forceRefresh) => {
|
|
158
|
-
const token = await tokenProvider(config, forceRefresh);
|
|
159
|
-
const init = requestFactory();
|
|
160
|
-
const headers = new Headers(init.headers);
|
|
161
|
-
headers.set("Authorization", `Bearer ${token}`);
|
|
162
|
-
return fetchImpl(url, { ...init, headers });
|
|
163
|
-
};
|
|
164
|
-
let response = await send(false);
|
|
165
|
-
if (response.status === 401) {
|
|
166
|
-
await response.body?.cancel().catch(() => undefined);
|
|
167
|
-
response = await send(true);
|
|
168
|
-
}
|
|
169
|
-
return response;
|
|
170
|
-
}
|
|
171
|
-
export async function whoami(config, forceRefresh = false) {
|
|
172
|
-
const discovery = await loadDiscovery(config);
|
|
173
|
-
if (forceRefresh)
|
|
174
|
-
await ensureAccessToken(config, true);
|
|
175
|
-
const response = await fetchWithKeycloakIdentity(config, discovery.userinfo_endpoint, () => ({ headers: { Accept: "application/json" } }));
|
|
176
|
-
const info = await parseJsonResponse(response, discovery.userinfo_endpoint);
|
|
177
|
-
const cache = await readTokenCache(config);
|
|
178
|
-
if (cache)
|
|
179
|
-
await writeTokenCache(config.tokenFile, { ...cache, userinfo: info });
|
|
180
|
-
return info;
|
|
181
|
-
}
|
|
182
|
-
export async function startBrowserLogin(config, options = {}) {
|
|
183
|
-
const discovery = await loadDiscovery(config);
|
|
184
|
-
const { verifier, challenge } = pkcePair();
|
|
185
|
-
const state = randomBytes(24).toString("base64url");
|
|
186
|
-
const callback = redirectUri(config);
|
|
187
|
-
const id = randomUUID();
|
|
188
|
-
let server;
|
|
189
|
-
const session = {
|
|
190
|
-
id,
|
|
191
|
-
authorizationUrl: "",
|
|
192
|
-
redirectUri: callback,
|
|
193
|
-
codeVerifier: verifier,
|
|
194
|
-
state,
|
|
195
|
-
createdAt: nowSeconds(),
|
|
196
|
-
expiresAt: nowSeconds() + LOGIN_SESSION_TTL_SECONDS,
|
|
197
|
-
close: async () => {
|
|
198
|
-
if (!server)
|
|
199
|
-
return;
|
|
200
|
-
await new Promise((resolve, reject) => {
|
|
201
|
-
server?.close((error) => (error ? reject(error) : resolve()));
|
|
202
|
-
});
|
|
203
|
-
server = undefined;
|
|
204
|
-
}
|
|
205
|
-
};
|
|
206
|
-
const authUrl = new URL(discovery.authorization_endpoint);
|
|
207
|
-
authUrl.searchParams.set("client_id", config.clientId);
|
|
208
|
-
authUrl.searchParams.set("redirect_uri", callback);
|
|
209
|
-
authUrl.searchParams.set("response_type", "code");
|
|
210
|
-
authUrl.searchParams.set("scope", config.scope);
|
|
211
|
-
authUrl.searchParams.set("state", state);
|
|
212
|
-
authUrl.searchParams.set("code_challenge", challenge);
|
|
213
|
-
authUrl.searchParams.set("code_challenge_method", "S256");
|
|
214
|
-
session.authorizationUrl = authUrl.toString();
|
|
215
|
-
server = createServer((request, response) => {
|
|
216
|
-
const requestUrl = new URL(request.url ?? "/", callback);
|
|
217
|
-
if (requestUrl.pathname !== config.redirectPath) {
|
|
218
|
-
response.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
|
|
219
|
-
response.end("Not found\n");
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
const returnedState = requestUrl.searchParams.get("state");
|
|
223
|
-
if (returnedState !== state) {
|
|
224
|
-
session.error = "State mismatch";
|
|
225
|
-
}
|
|
226
|
-
else if (requestUrl.searchParams.get("error")) {
|
|
227
|
-
session.error = requestUrl.searchParams.get("error_description") ?? requestUrl.searchParams.get("error") ?? "Login failed";
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
session.code = requestUrl.searchParams.get("code") ?? undefined;
|
|
231
|
-
}
|
|
232
|
-
const redirect = session.code ? options.successRedirectUrl : options.failureRedirectUrl;
|
|
233
|
-
if (redirect) {
|
|
234
|
-
response.writeHead(303, {
|
|
235
|
-
Location: redirect,
|
|
236
|
-
"Cache-Control": "no-store",
|
|
237
|
-
"Referrer-Policy": "no-referrer"
|
|
238
|
-
});
|
|
239
|
-
response.end();
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
response.writeHead(session.code ? 200 : 400, {
|
|
243
|
-
"Content-Type": "text/plain; charset=utf-8",
|
|
244
|
-
"Cache-Control": "no-store"
|
|
245
|
-
});
|
|
246
|
-
response.end(session.code ? "Login complete. You may close this tab.\n" : `Login failed: ${session.error}\n`);
|
|
247
|
-
});
|
|
248
|
-
await new Promise((resolve, reject) => {
|
|
249
|
-
server?.once("error", reject);
|
|
250
|
-
server?.listen(config.redirectPort, config.redirectHost, () => resolve());
|
|
251
|
-
});
|
|
252
|
-
if (config.openBrowser) {
|
|
253
|
-
await open(session.authorizationUrl).catch(() => undefined);
|
|
254
|
-
}
|
|
255
|
-
return session;
|
|
256
|
-
}
|
|
257
|
-
export async function completeBrowserLogin(config, session) {
|
|
258
|
-
if (session.error)
|
|
259
|
-
throw new AuthError(session.error, "login_failed");
|
|
260
|
-
if (!session.code) {
|
|
261
|
-
if (session.expiresAt <= nowSeconds()) {
|
|
262
|
-
await session.close();
|
|
263
|
-
throw new AuthError("Login session expired before callback was received.", "login_expired");
|
|
264
|
-
}
|
|
265
|
-
throw new AuthError("Login callback has not been received yet.", "login_pending");
|
|
266
|
-
}
|
|
267
|
-
const discovery = await loadDiscovery(config);
|
|
268
|
-
const token = await requestJson(discovery.token_endpoint, {
|
|
269
|
-
method: "POST",
|
|
270
|
-
body: addClientAuth(config, {
|
|
271
|
-
grant_type: "authorization_code",
|
|
272
|
-
code: session.code,
|
|
273
|
-
redirect_uri: session.redirectUri,
|
|
274
|
-
code_verifier: session.codeVerifier
|
|
275
|
-
})
|
|
276
|
-
});
|
|
277
|
-
const info = await getUserinfo(config, discovery, token.access_token);
|
|
278
|
-
await saveToken(config, discovery, token, info);
|
|
279
|
-
await session.close();
|
|
280
|
-
return info;
|
|
281
|
-
}
|
|
282
|
-
export async function blockingBrowserLogin(config, options = {}) {
|
|
283
|
-
const session = await startBrowserLogin(config, options);
|
|
284
|
-
process.stderr.write(`Open this URL to log in:\n${session.authorizationUrl}\n`);
|
|
285
|
-
try {
|
|
286
|
-
while (!session.code && !session.error && session.expiresAt > nowSeconds()) {
|
|
287
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
288
|
-
}
|
|
289
|
-
return await completeBrowserLogin(config, session);
|
|
290
|
-
}
|
|
291
|
-
finally {
|
|
292
|
-
await session.close().catch(() => undefined);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
1
|
+
export { AuthError, blockingBrowserLogin, completeBrowserLogin, deleteTokenCache, ensureAccessToken, fetchWithKeycloakIdentity, getUserinfo, loadDiscovery, LoginRequiredError, nowSeconds, readTokenCache, refreshAccessToken, startBrowserLogin, whoami } from "@numa-tech/cli-auth";
|
|
295
2
|
//# sourceMappingURL=oauth.js.map
|
package/dist/oauth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAEtC,MAAM,OAAO,SAAU,SAAQ,KAAK;IAGhB,IAAI;IAFtB,YACE,OAAe,EACC,IAAI,GAAG,YAAY;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAFC,IAAI;IAGtB,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAC/C,YAAY,OAAO,GAAG,wCAAwC;QAC5D,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACnC,CAAC;CACF;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAI,QAAkB,EAAE,GAAW;IACjE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,MAAM,GAAY,EAAE,CAAC;IACzB,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAiC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC;QACvF,MAAM,IAAI,SAAS,CAAC,QAAQ,QAAQ,CAAC,MAAM,SAAS,GAAG,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,WAAW,CAAI,GAAW,EAAE,IAAkB;IAC3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,GAAG,IAAI;QACP,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,mCAAmC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;SACzB;KACF,CAAC,CAAC;IACH,OAAO,iBAAiB,CAAI,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,QAAQ,CAAC,MAA0C;IAC1D,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,MAAkB,EAAE,MAA0C;IACnF,OAAO,QAAQ,CAAC;QACd,GAAG,MAAM;QACT,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,aAAa,EAAE,MAAM,CAAC,YAAY;KACnC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAkB;IACpD,OAAO,WAAW,CAAgB,MAAM,CAAC,YAAY,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,QAAQ;IACf,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,KAAiB;IAC5D,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC;IAC1B,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAkB;IACrD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAkB;IACvD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,MAAkB,EAClB,SAAwB,EACxB,KAAoB,EACpB,QAAkC,EAClC,wBAAiC;IAEjC,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;IACvD,MAAM,gBAAgB,GACpB,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC;QACtD,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,kBAAkB;QACvC,CAAC,CAAC,wBAAwB,CAAC;IAC/B,MAAM,KAAK,GAAe;QACxB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;QAClC,UAAU;QACV,SAAS;QACT,gBAAgB;QAChB,KAAK;QACL,QAAQ;KACT,CAAC;IACF,MAAM,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAkB,EAClB,SAAwB,EACxB,WAAmB;IAEnB,OAAO,WAAW,CAA0B,SAAS,CAAC,iBAAiB,EAAE;QACvE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE;KACpD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAkB,EAAE,KAAiB;IAC5E,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC/B,MAAM,IAAI,kBAAkB,CAAC,sDAAsD,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,WAAW,CAAgB,SAAS,CAAC,cAAc,EAAE;QAC3E,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE;YAC1B,UAAU,EAAE,eAAe;YAC3B,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa;SACzC,CAAC;KACH,CAAC,CAAC;IACH,MAAM,KAAK,GAAkB;QAC3B,GAAG,SAAS;QACZ,0EAA0E;QAC1E,2EAA2E;QAC3E,aAAa,EAAE,SAAS,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,aAAa;KACpE,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1E,OAAO,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAkB,EAAE,YAAY,GAAG,KAAK;IAC9E,IAAI,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,kBAAkB,CAAC,2CAA2C,CAAC,CAAC;IACtF,IAAI,KAAK,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrF,MAAM,IAAI,kBAAkB,CAAC,2EAA2E,CAAC,CAAC;IAC5G,CAAC;IACD,IAAI,YAAY,IAAI,KAAK,CAAC,SAAS,IAAI,UAAU,EAAE,GAAG,sBAAsB,EAAE,CAAC;QAC7E,KAAK,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;AAClC,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAkB,EAClB,GAAW,EACX,cAAiC,EACjC,YAAY,GAA8B,EAAE;IAE5C,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,IAAI,KAAK,CAAC;IAC9C,MAAM,aAAa,GAAG,YAAY,CAAC,aAAa,IAAI,iBAAiB,CAAC;IACtE,MAAM,IAAI,GAAG,KAAK,EAAE,YAAqB,EAAqB,EAAE;QAC9D,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;QAChD,OAAO,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACrD,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,MAAkB,EAAE,YAAY,GAAG,KAAK;IACnE,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,YAAY;QAAE,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAC9C,MAAM,EACN,SAAS,CAAC,iBAAiB,EAC3B,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CACpD,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAClC,QAAQ,EACR,SAAS,CAAC,iBAAiB,CAC5B,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,KAAK;QAAE,MAAM,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC;AACd,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAkB,EAClB,OAAO,GAAwB,EAAE;IAEjC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,IAAI,MAA0B,CAAC;IAE/B,MAAM,OAAO,GAAiB;QAC5B,EAAE;QACF,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,QAAQ;QACrB,YAAY,EAAE,QAAQ;QACtB,KAAK;QACL,SAAS,EAAE,UAAU,EAAE;QACvB,SAAS,EAAE,UAAU,EAAE,GAAG,yBAAyB;QACnD,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;YACH,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;KACF,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAC1D,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACnD,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAClD,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACtD,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,gBAAgB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAE9C,MAAM,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QAC1C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,UAAU,CAAC,QAAQ,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC;YAChD,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACzE,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,MAAM,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC;QACnC,CAAC;aAAM,IAAI,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC;QAC7H,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;QAClE,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;QACxF,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE;gBACtB,QAAQ,EAAE,QAAQ;gBAClB,eAAe,EAAE,UAAU;gBAC3B,iBAAiB,EAAE,aAAa;aACjC,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;YAC3C,cAAc,EAAE,2BAA2B;YAC3C,eAAe,EAAE,UAAU;SAC5B,CAAC,CAAC;QACH,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC,iBAAiB,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAkB,EAAE,OAAqB;IAClF,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACtE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,OAAO,CAAC,SAAS,IAAI,UAAU,EAAE,EAAE,CAAC;YACtC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,SAAS,CAAC,qDAAqD,EAAE,eAAe,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,2CAA2C,EAAE,eAAe,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAgB,SAAS,CAAC,cAAc,EAAE;QACvE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE;YAC1B,UAAU,EAAE,oBAAoB;YAChC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,YAAY,EAAE,OAAO,CAAC,WAAW;YACjC,aAAa,EAAE,OAAO,CAAC,YAAY;SACpC,CAAC;KACH,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IACtE,MAAM,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAkB,EAClB,OAAO,GAAwB,EAAE;IAEjC,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,OAAO,CAAC,gBAAgB,IAAI,CAAC,CAAC;IAChF,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,SAAS,GAAG,UAAU,EAAE,EAAE,CAAC;YAC3E,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,MAAM,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,EACP,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { AuthConfig } from "../config.js";
|
|
2
|
+
import { type KeycloakTokenProvider } from "../oauth.js";
|
|
3
|
+
import { type BuildState, type PipelineTier } from "./schemas.js";
|
|
4
|
+
export interface PipelineClientDependencies {
|
|
5
|
+
fetch?: typeof fetch;
|
|
6
|
+
tokenProvider?: KeycloakTokenProvider;
|
|
7
|
+
}
|
|
8
|
+
export interface ListPipelineOptions {
|
|
9
|
+
application?: string;
|
|
10
|
+
tier?: PipelineTier;
|
|
11
|
+
branch?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ListBuildOptions extends ListPipelineOptions {
|
|
14
|
+
state?: BuildState;
|
|
15
|
+
cursor?: string;
|
|
16
|
+
limit?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface TriggerBuildInput {
|
|
19
|
+
applicationCode: string;
|
|
20
|
+
tier: PipelineTier;
|
|
21
|
+
branch?: string;
|
|
22
|
+
parameters: Record<string, string>;
|
|
23
|
+
idempotencyKey: string;
|
|
24
|
+
}
|
|
25
|
+
export declare class PipelineClient {
|
|
26
|
+
private readonly config;
|
|
27
|
+
private readonly fetchImpl;
|
|
28
|
+
private readonly tokenProvider;
|
|
29
|
+
constructor(config: AuthConfig, dependencies?: PipelineClientDependencies);
|
|
30
|
+
private authenticatedFetch;
|
|
31
|
+
private json;
|
|
32
|
+
listPipelines(options?: ListPipelineOptions): Promise<{
|
|
33
|
+
[x: string]: unknown;
|
|
34
|
+
items: {
|
|
35
|
+
[x: string]: unknown;
|
|
36
|
+
applicationCode: string;
|
|
37
|
+
tier: "DEVELOP" | "PRODUCTION" | "STAGING";
|
|
38
|
+
branch?: string | null | undefined;
|
|
39
|
+
buildable?: boolean | undefined;
|
|
40
|
+
productionLocked?: boolean | undefined;
|
|
41
|
+
}[];
|
|
42
|
+
nextCursor: string | null;
|
|
43
|
+
stale: boolean;
|
|
44
|
+
lastSuccessfulSyncAt: string | null;
|
|
45
|
+
requestId?: string | undefined;
|
|
46
|
+
}>;
|
|
47
|
+
inspectPipeline(applicationCode: string): Promise<{
|
|
48
|
+
[x: string]: unknown;
|
|
49
|
+
applicationCode: string;
|
|
50
|
+
tier: "DEVELOP" | "PRODUCTION" | "STAGING";
|
|
51
|
+
branch?: string | null | undefined;
|
|
52
|
+
buildable?: boolean | undefined;
|
|
53
|
+
productionLocked?: boolean | undefined;
|
|
54
|
+
parameters?: unknown[] | undefined;
|
|
55
|
+
recentBuilds?: unknown[] | undefined;
|
|
56
|
+
}>;
|
|
57
|
+
listBuilds(options?: ListBuildOptions): Promise<{
|
|
58
|
+
[x: string]: unknown;
|
|
59
|
+
items: {
|
|
60
|
+
[x: string]: unknown;
|
|
61
|
+
requestId?: string | undefined;
|
|
62
|
+
buildNumber?: number | null | undefined;
|
|
63
|
+
state: "ABORTED" | "ACCEPTED" | "CANCELLED" | "FAILED" | "NOT_BUILT" | "QUEUED" | "RUNNING" | "SUCCESS" | "UNKNOWN";
|
|
64
|
+
applicationCode?: string | undefined;
|
|
65
|
+
tier?: "DEVELOP" | "PRODUCTION" | "STAGING" | undefined;
|
|
66
|
+
branch?: string | null | undefined;
|
|
67
|
+
queueId?: number | null | undefined;
|
|
68
|
+
pollUrl?: string | undefined;
|
|
69
|
+
}[];
|
|
70
|
+
nextCursor: string | null;
|
|
71
|
+
stale: boolean;
|
|
72
|
+
lastSuccessfulSyncAt: string | null;
|
|
73
|
+
requestId?: string | undefined;
|
|
74
|
+
}>;
|
|
75
|
+
triggerBuild(input: TriggerBuildInput): Promise<{
|
|
76
|
+
[x: string]: unknown;
|
|
77
|
+
requestId?: string | undefined;
|
|
78
|
+
buildNumber?: number | null | undefined;
|
|
79
|
+
state: "ABORTED" | "ACCEPTED" | "CANCELLED" | "FAILED" | "NOT_BUILT" | "QUEUED" | "RUNNING" | "SUCCESS" | "UNKNOWN";
|
|
80
|
+
applicationCode?: string | undefined;
|
|
81
|
+
tier?: "DEVELOP" | "PRODUCTION" | "STAGING" | undefined;
|
|
82
|
+
branch?: string | null | undefined;
|
|
83
|
+
queueId?: number | null | undefined;
|
|
84
|
+
pollUrl?: string | undefined;
|
|
85
|
+
}>;
|
|
86
|
+
getBuild(identifier: string): Promise<{
|
|
87
|
+
[x: string]: unknown;
|
|
88
|
+
requestId?: string | undefined;
|
|
89
|
+
buildNumber?: number | null | undefined;
|
|
90
|
+
state: "ABORTED" | "ACCEPTED" | "CANCELLED" | "FAILED" | "NOT_BUILT" | "QUEUED" | "RUNNING" | "SUCCESS" | "UNKNOWN";
|
|
91
|
+
applicationCode?: string | undefined;
|
|
92
|
+
tier?: "DEVELOP" | "PRODUCTION" | "STAGING" | undefined;
|
|
93
|
+
branch?: string | null | undefined;
|
|
94
|
+
queueId?: number | null | undefined;
|
|
95
|
+
pollUrl?: string | undefined;
|
|
96
|
+
}>;
|
|
97
|
+
stopBuild(identifier: string): Promise<{
|
|
98
|
+
[x: string]: unknown;
|
|
99
|
+
requestId?: string | undefined;
|
|
100
|
+
buildNumber?: number | null | undefined;
|
|
101
|
+
state: "ABORTED" | "ACCEPTED" | "CANCELLED" | "FAILED" | "NOT_BUILT" | "QUEUED" | "RUNNING" | "SUCCESS" | "UNKNOWN";
|
|
102
|
+
applicationCode?: string | undefined;
|
|
103
|
+
tier?: "DEVELOP" | "PRODUCTION" | "STAGING" | undefined;
|
|
104
|
+
branch?: string | null | undefined;
|
|
105
|
+
queueId?: number | null | undefined;
|
|
106
|
+
pollUrl?: string | undefined;
|
|
107
|
+
}>;
|
|
108
|
+
retryBuild(identifier: string, parameters: Record<string, string>): Promise<{
|
|
109
|
+
[x: string]: unknown;
|
|
110
|
+
requestId?: string | undefined;
|
|
111
|
+
buildNumber?: number | null | undefined;
|
|
112
|
+
state: "ABORTED" | "ACCEPTED" | "CANCELLED" | "FAILED" | "NOT_BUILT" | "QUEUED" | "RUNNING" | "SUCCESS" | "UNKNOWN";
|
|
113
|
+
applicationCode?: string | undefined;
|
|
114
|
+
tier?: "DEVELOP" | "PRODUCTION" | "STAGING" | undefined;
|
|
115
|
+
branch?: string | null | undefined;
|
|
116
|
+
queueId?: number | null | undefined;
|
|
117
|
+
pollUrl?: string | undefined;
|
|
118
|
+
}>;
|
|
119
|
+
getLog(identifier: string, offset?: number, limit?: number): Promise<{
|
|
120
|
+
[x: string]: unknown;
|
|
121
|
+
text: string;
|
|
122
|
+
nextOffset: number;
|
|
123
|
+
moreData: boolean;
|
|
124
|
+
requestId?: string | undefined;
|
|
125
|
+
}>;
|
|
126
|
+
}
|