@runapi.ai/mcp-core 0.1.4 → 0.1.5
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 +7 -2
- package/dist/config.d.ts +14 -1
- package/dist/config.js +16 -9
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +2 -2
- package/dist/constants.js +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/login.d.ts +68 -0
- package/dist/login.js +579 -0
- package/dist/login.js.map +1 -0
- package/dist/runapi-client.d.ts +5 -2
- package/dist/runapi-client.js +9 -5
- package/dist/runapi-client.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.js +7 -2
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -90,7 +90,12 @@ Connect the returned server with an MCP transport, for example `StdioServerTrans
|
|
|
90
90
|
|
|
91
91
|
## Authentication
|
|
92
92
|
|
|
93
|
-
Authenticated RunAPI calls
|
|
93
|
+
Authenticated RunAPI calls resolve auth in this order:
|
|
94
|
+
|
|
95
|
+
1. `RUNAPI_API_KEY`, useful for headless and CI hosts.
|
|
96
|
+
2. `~/.config/runapi/config.json`, created by the MCP `login` tool or `runapi login`.
|
|
97
|
+
|
|
98
|
+
Headless hosts can set:
|
|
94
99
|
|
|
95
100
|
```bash
|
|
96
101
|
export RUNAPI_API_KEY=your_key_here
|
|
@@ -100,7 +105,7 @@ export RUNAPI_API_KEY=your_key_here
|
|
|
100
105
|
|
|
101
106
|
## Package Design
|
|
102
107
|
|
|
103
|
-
`@runapi.ai/mcp-core` does not read files at runtime. Server packages pass their embedded contract and pricing JSON into the library, which keeps published MCP packages deterministic and easy to smoke test.
|
|
108
|
+
`@runapi.ai/mcp-core` does not read catalog or pricing files at runtime. Server packages pass their embedded contract and pricing JSON into the library, which keeps published MCP packages deterministic and easy to smoke test.
|
|
104
109
|
|
|
105
110
|
The package is ESM-only and ships TypeScript declarations.
|
|
106
111
|
|
package/dist/config.d.ts
CHANGED
|
@@ -2,6 +2,19 @@ export type RunApiConfig = {
|
|
|
2
2
|
apiKey?: string;
|
|
3
3
|
baseUrl: string;
|
|
4
4
|
};
|
|
5
|
+
export type CredentialSource = "env" | "config";
|
|
6
|
+
export type ConfigFile = {
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
api_key?: string;
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
base_url?: string;
|
|
11
|
+
};
|
|
12
|
+
export type RunApiConfigDetails = RunApiConfig & {
|
|
13
|
+
apiKeySource?: CredentialSource;
|
|
14
|
+
configFile: string;
|
|
15
|
+
};
|
|
5
16
|
export declare function configPath(): string;
|
|
6
|
-
export declare function loadConfig(env?: NodeJS.ProcessEnv): RunApiConfig;
|
|
17
|
+
export declare function loadConfig(env?: NodeJS.ProcessEnv, filePath?: string): RunApiConfig;
|
|
18
|
+
export declare function loadConfigDetails(env?: NodeJS.ProcessEnv, filePath?: string): RunApiConfigDetails;
|
|
7
19
|
export declare function requireApiKey(config?: RunApiConfig): string;
|
|
20
|
+
export declare function readConfigFile(filePath?: string): ConfigFile;
|
package/dist/config.js
CHANGED
|
@@ -5,25 +5,32 @@ import { DEFAULT_BASE_URL, RUNAPI_API_KEY_ENV } from "./constants.js";
|
|
|
5
5
|
export function configPath() {
|
|
6
6
|
return path.join(os.homedir(), ".config", "runapi", "config.json");
|
|
7
7
|
}
|
|
8
|
-
export function loadConfig(env = process.env) {
|
|
9
|
-
const
|
|
10
|
-
const apiKey = env[RUNAPI_API_KEY_ENV]?.trim() || file.apiKey || file.api_key || undefined;
|
|
11
|
-
const baseUrl = env.RUNAPI_BASE_URL?.trim() || file.baseUrl || file.base_url || DEFAULT_BASE_URL;
|
|
8
|
+
export function loadConfig(env = process.env, filePath = configPath()) {
|
|
9
|
+
const { apiKey, baseUrl } = loadConfigDetails(env, filePath);
|
|
12
10
|
return { apiKey, baseUrl };
|
|
13
11
|
}
|
|
12
|
+
export function loadConfigDetails(env = process.env, filePath = configPath()) {
|
|
13
|
+
const file = readConfigFile(filePath);
|
|
14
|
+
const envApiKey = env[RUNAPI_API_KEY_ENV]?.trim();
|
|
15
|
+
const fileApiKey = file.api_key || file.apiKey || undefined;
|
|
16
|
+
const apiKey = envApiKey || fileApiKey;
|
|
17
|
+
const apiKeySource = envApiKey ? "env" : fileApiKey ? "config" : undefined;
|
|
18
|
+
const baseUrl = env.RUNAPI_BASE_URL?.trim() || file.baseUrl || file.base_url || DEFAULT_BASE_URL;
|
|
19
|
+
return { apiKey, apiKeySource, baseUrl, configFile: filePath };
|
|
20
|
+
}
|
|
14
21
|
export function requireApiKey(config = loadConfig()) {
|
|
15
22
|
if (!config.apiKey) {
|
|
16
|
-
throw new Error("RunAPI API key is required.
|
|
23
|
+
throw new Error("RunAPI API key is required. In an MCP host, call the login tool for browser login at https://runapi.ai. In a terminal, run `runapi login`. Headless hosts can set RUNAPI_API_KEY or pre-provision ~/.config/runapi/config.json.");
|
|
17
24
|
}
|
|
18
25
|
return config.apiKey;
|
|
19
26
|
}
|
|
20
|
-
function readConfigFile() {
|
|
21
|
-
|
|
22
|
-
if (!fs.existsSync(file)) {
|
|
27
|
+
export function readConfigFile(filePath = configPath()) {
|
|
28
|
+
if (!fs.existsSync(filePath)) {
|
|
23
29
|
return {};
|
|
24
30
|
}
|
|
25
31
|
try {
|
|
26
|
-
|
|
32
|
+
const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
33
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
27
34
|
}
|
|
28
35
|
catch {
|
|
29
36
|
return {};
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAqBtE,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,UAAU,EAAE;IACtF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,UAAU,EAAE;IAC7F,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,GAAG,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;IAC5D,MAAM,MAAM,GAAG,SAAS,IAAI,UAAU,CAAC;IACvC,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC;IAEjG,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAM,GAAG,UAAU,EAAE;IACjD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,iOAAiO,CAAC,CAAC;IACrP,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAQ,GAAG,UAAU,EAAE;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;IACpG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const CORE_PACKAGE_NAME = "@runapi.ai/mcp-core";
|
|
2
|
-
export declare const CORE_PACKAGE_VERSION = "0.1.
|
|
2
|
+
export declare const CORE_PACKAGE_VERSION = "0.1.5";
|
|
3
3
|
export declare const DEFAULT_BASE_URL = "https://runapi.ai";
|
|
4
4
|
export declare const RUNAPI_API_KEY_ENV = "RUNAPI_API_KEY";
|
|
5
|
-
export declare const USER_AGENT = "@runapi.ai/mcp-core/0.1.
|
|
5
|
+
export declare const USER_AGENT = "@runapi.ai/mcp-core/0.1.5";
|
package/dist/constants.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const CORE_PACKAGE_NAME = "@runapi.ai/mcp-core";
|
|
2
|
-
export const CORE_PACKAGE_VERSION = "0.1.
|
|
2
|
+
export const CORE_PACKAGE_VERSION = "0.1.5";
|
|
3
3
|
export const DEFAULT_BASE_URL = "https://runapi.ai";
|
|
4
4
|
export const RUNAPI_API_KEY_ENV = "RUNAPI_API_KEY";
|
|
5
5
|
export const USER_AGENT = `${CORE_PACKAGE_NAME}/${CORE_PACKAGE_VERSION}`;
|
package/dist/errors.js
CHANGED
|
@@ -18,7 +18,7 @@ export function friendlyError(error) {
|
|
|
18
18
|
if (error instanceof RunApiClientError) {
|
|
19
19
|
switch (error.status) {
|
|
20
20
|
case 401:
|
|
21
|
-
return "RunAPI rejected the API key.
|
|
21
|
+
return "RunAPI rejected the API key. Call the login tool or run `runapi login`, then retry. Headless hosts can update RUNAPI_API_KEY or ~/.config/runapi/config.json.";
|
|
22
22
|
case 402:
|
|
23
23
|
return "The RunAPI account has insufficient credits. Add credits in the RunAPI dashboard, then retry.";
|
|
24
24
|
case 429:
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAG/B;IACA;IAHX,YACE,OAAe,EACN,MAAe,EACf,OAAiB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,WAAM,GAAN,MAAM,CAAS;QACf,YAAO,GAAP,OAAO,CAAU;QAG1B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;QACvC,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,KAAK,GAAG;gBACN,OAAO,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export * from "./tool-response.js";
|
|
|
7
7
|
export * from "./schema.js";
|
|
8
8
|
export * from "./contract.js";
|
|
9
9
|
export * from "./pricing.js";
|
|
10
|
+
export * from "./login.js";
|
|
10
11
|
export { validateInputRules } from "./input-rules.js";
|
|
11
12
|
export * from "./runapi-client.js";
|
|
12
13
|
export * from "./server.js";
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,7 @@ export * from "./tool-response.js";
|
|
|
7
7
|
export * from "./schema.js";
|
|
8
8
|
export * from "./contract.js";
|
|
9
9
|
export * from "./pricing.js";
|
|
10
|
+
export * from "./login.js";
|
|
10
11
|
export { validateInputRules } from "./input-rules.js";
|
|
11
12
|
export * from "./runapi-client.js";
|
|
12
13
|
export * from "./server.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC"}
|
package/dist/login.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export type LoginInput = {
|
|
3
|
+
force?: boolean;
|
|
4
|
+
};
|
|
5
|
+
export type LoginResult = {
|
|
6
|
+
authenticated: boolean;
|
|
7
|
+
source?: "env" | "config";
|
|
8
|
+
base_url: string;
|
|
9
|
+
config_path: string;
|
|
10
|
+
wrote_config: boolean;
|
|
11
|
+
verified?: boolean;
|
|
12
|
+
browser_opened?: boolean;
|
|
13
|
+
open_browser_error?: string;
|
|
14
|
+
authorize_url?: string;
|
|
15
|
+
callback_url?: string;
|
|
16
|
+
callback_port?: number;
|
|
17
|
+
display_code?: string;
|
|
18
|
+
expires_in_seconds?: number;
|
|
19
|
+
user?: {
|
|
20
|
+
email?: string;
|
|
21
|
+
};
|
|
22
|
+
token_name?: string;
|
|
23
|
+
error?: string;
|
|
24
|
+
hint?: string;
|
|
25
|
+
};
|
|
26
|
+
export type CallbackPayload = {
|
|
27
|
+
code?: string;
|
|
28
|
+
state?: string;
|
|
29
|
+
error?: string;
|
|
30
|
+
error_description?: string;
|
|
31
|
+
};
|
|
32
|
+
export type CallbackListener = {
|
|
33
|
+
port: number;
|
|
34
|
+
wait: () => Promise<CallbackPayload>;
|
|
35
|
+
close: () => Promise<void> | void;
|
|
36
|
+
};
|
|
37
|
+
export type LoginPendingPayload = Pick<LoginResult, "authorize_url" | "callback_url" | "callback_port" | "display_code" | "expires_in_seconds" | "browser_opened" | "open_browser_error">;
|
|
38
|
+
export type LoginDependencies = {
|
|
39
|
+
env?: NodeJS.ProcessEnv;
|
|
40
|
+
configFile?: string;
|
|
41
|
+
fetchImpl?: typeof fetch;
|
|
42
|
+
hostname?: string;
|
|
43
|
+
userAgent?: string;
|
|
44
|
+
timeoutMs?: number;
|
|
45
|
+
openBrowserTimeoutMs?: number;
|
|
46
|
+
randomBytes?: (size: number) => Buffer;
|
|
47
|
+
signal?: AbortSignal;
|
|
48
|
+
openBrowser?: (url: string) => Promise<void>;
|
|
49
|
+
createCallbackListener?: (options: {
|
|
50
|
+
state: string;
|
|
51
|
+
timeoutMs: number;
|
|
52
|
+
}) => Promise<CallbackListener>;
|
|
53
|
+
onPending?: (payload: LoginPendingPayload) => Promise<void> | void;
|
|
54
|
+
};
|
|
55
|
+
export type PkcePair = {
|
|
56
|
+
codeVerifier: string;
|
|
57
|
+
codeChallenge: string;
|
|
58
|
+
codeChallengeMethod: "S256";
|
|
59
|
+
};
|
|
60
|
+
export declare function generatePkcePair(bytes?: Uint8Array): PkcePair;
|
|
61
|
+
export declare function generateDisplayCode(bytes?: Uint8Array): string;
|
|
62
|
+
export declare function login(input?: LoginInput, deps?: LoginDependencies): Promise<LoginResult>;
|
|
63
|
+
export declare function registerLoginTool(server: McpServer, deps?: LoginDependencies): void;
|
|
64
|
+
export declare function openSystemBrowser(url: string, platform?: NodeJS.Platform, timeoutMs?: number): Promise<void>;
|
|
65
|
+
export declare function browserCommand(url: string, platform: NodeJS.Platform): {
|
|
66
|
+
command: string;
|
|
67
|
+
args: string[];
|
|
68
|
+
} | undefined;
|
package/dist/login.js
ADDED
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import crypto from "node:crypto";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import http from "node:http";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { DEFAULT_BASE_URL, RUNAPI_API_KEY_ENV, USER_AGENT } from "./constants.js";
|
|
9
|
+
import { configPath, loadConfigDetails, readConfigFile } from "./config.js";
|
|
10
|
+
import { errorFromResponse, friendlyError, RunApiClientError } from "./errors.js";
|
|
11
|
+
import { RunApiClient } from "./runapi-client.js";
|
|
12
|
+
import { jsonText } from "./tool-response.js";
|
|
13
|
+
const LOGIN_TIMEOUT_MS = 300_000;
|
|
14
|
+
const OPEN_BROWSER_TIMEOUT_MS = 10_000;
|
|
15
|
+
const DISPLAY_CODE_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
|
|
16
|
+
class LoginCancelledError extends Error {
|
|
17
|
+
constructor() {
|
|
18
|
+
super("RunAPI login was cancelled.");
|
|
19
|
+
this.name = "LoginCancelledError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function generatePkcePair(bytes = crypto.randomBytes(32)) {
|
|
23
|
+
const codeVerifier = base64Url(bytes);
|
|
24
|
+
return {
|
|
25
|
+
codeVerifier,
|
|
26
|
+
codeChallenge: base64Url(crypto.createHash("sha256").update(codeVerifier).digest()),
|
|
27
|
+
codeChallengeMethod: "S256"
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function generateDisplayCode(bytes = crypto.randomBytes(5)) {
|
|
31
|
+
let buffer = 0;
|
|
32
|
+
let bits = 0;
|
|
33
|
+
let output = "";
|
|
34
|
+
for (const byte of bytes) {
|
|
35
|
+
buffer = (buffer << 8) | byte;
|
|
36
|
+
bits += 8;
|
|
37
|
+
while (bits >= 5 && output.length < 8) {
|
|
38
|
+
bits -= 5;
|
|
39
|
+
output += DISPLAY_CODE_ALPHABET[(buffer >> bits) & 31];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
while (output.length < 8) {
|
|
43
|
+
output += DISPLAY_CODE_ALPHABET[0];
|
|
44
|
+
}
|
|
45
|
+
return `${output.slice(0, 4)}-${output.slice(4, 8)}`;
|
|
46
|
+
}
|
|
47
|
+
export async function login(input = {}, deps = {}) {
|
|
48
|
+
const env = deps.env ?? process.env;
|
|
49
|
+
const configFile = deps.configFile ?? configPath();
|
|
50
|
+
const config = loadConfigDetails(env, configFile);
|
|
51
|
+
const baseResult = {
|
|
52
|
+
base_url: config.baseUrl,
|
|
53
|
+
config_path: configFile,
|
|
54
|
+
wrote_config: false
|
|
55
|
+
};
|
|
56
|
+
if (config.apiKeySource === "env") {
|
|
57
|
+
if (input.force) {
|
|
58
|
+
return {
|
|
59
|
+
...baseResult,
|
|
60
|
+
authenticated: true,
|
|
61
|
+
source: "env",
|
|
62
|
+
hint: `${RUNAPI_API_KEY_ENV} is set and takes precedence over local config. Unset or update it before forcing browser login.`
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
...baseResult,
|
|
67
|
+
authenticated: true,
|
|
68
|
+
source: "env",
|
|
69
|
+
hint: `Using ${RUNAPI_API_KEY_ENV}. If authenticated tools fail, update or unset the environment variable.`
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (config.apiKeySource === "config" && !input.force) {
|
|
73
|
+
return {
|
|
74
|
+
...baseResult,
|
|
75
|
+
authenticated: true,
|
|
76
|
+
source: "config"
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const randomBytes = deps.randomBytes ?? ((size) => crypto.randomBytes(size));
|
|
80
|
+
const state = base64Url(randomBytes(32));
|
|
81
|
+
const pkce = generatePkcePair(randomBytes(32));
|
|
82
|
+
const displayCode = generateDisplayCode(randomBytes(5));
|
|
83
|
+
const timeoutMs = deps.timeoutMs ?? LOGIN_TIMEOUT_MS;
|
|
84
|
+
const hostname = deps.hostname ?? (os.hostname() || "device");
|
|
85
|
+
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
86
|
+
const userAgent = deps.userAgent ?? USER_AGENT;
|
|
87
|
+
const signal = deps.signal;
|
|
88
|
+
const openBrowserTimeoutMs = deps.openBrowserTimeoutMs ?? OPEN_BROWSER_TIMEOUT_MS;
|
|
89
|
+
let listener;
|
|
90
|
+
let callbackUrl;
|
|
91
|
+
let authorizeUrl;
|
|
92
|
+
let browserOpened;
|
|
93
|
+
let openBrowserError;
|
|
94
|
+
try {
|
|
95
|
+
throwIfAborted(signal);
|
|
96
|
+
listener = await (deps.createCallbackListener ?? createLoopbackCallbackListener)({ state, timeoutMs });
|
|
97
|
+
callbackUrl = `http://127.0.0.1:${listener.port}/callback`;
|
|
98
|
+
authorizeUrl = buildAuthorizeUrl(config.baseUrl, {
|
|
99
|
+
state,
|
|
100
|
+
codeChallenge: pkce.codeChallenge,
|
|
101
|
+
redirectPort: listener.port,
|
|
102
|
+
displayCode,
|
|
103
|
+
hostname
|
|
104
|
+
});
|
|
105
|
+
browserOpened = true;
|
|
106
|
+
try {
|
|
107
|
+
await withCancellation(withTimeout((deps.openBrowser ?? openSystemBrowser)(authorizeUrl), openBrowserTimeoutMs, "Opening the browser timed out."), signal);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (error instanceof LoginCancelledError) {
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
browserOpened = false;
|
|
114
|
+
openBrowserError = friendlyError(error);
|
|
115
|
+
await notifyPending(deps.onPending, pendingPayload({
|
|
116
|
+
authorizeUrl,
|
|
117
|
+
callbackUrl,
|
|
118
|
+
callbackPort: listener.port,
|
|
119
|
+
displayCode,
|
|
120
|
+
timeoutMs,
|
|
121
|
+
browserOpened,
|
|
122
|
+
openBrowserError
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
const callback = await withCancellation(listener.wait(), signal);
|
|
126
|
+
if (callback.state !== state) {
|
|
127
|
+
return {
|
|
128
|
+
...baseResult,
|
|
129
|
+
authenticated: false,
|
|
130
|
+
browser_opened: browserOpened,
|
|
131
|
+
open_browser_error: openBrowserError,
|
|
132
|
+
authorize_url: authorizeUrl,
|
|
133
|
+
callback_url: callbackUrl,
|
|
134
|
+
callback_port: listener.port,
|
|
135
|
+
display_code: displayCode,
|
|
136
|
+
expires_in_seconds: Math.floor(timeoutMs / 1000),
|
|
137
|
+
error: "Authorization callback state did not match.",
|
|
138
|
+
hint: "Retry login and only approve the browser window opened for this request."
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (callback.error) {
|
|
142
|
+
return {
|
|
143
|
+
...baseResult,
|
|
144
|
+
authenticated: false,
|
|
145
|
+
browser_opened: browserOpened,
|
|
146
|
+
open_browser_error: openBrowserError,
|
|
147
|
+
authorize_url: authorizeUrl,
|
|
148
|
+
callback_url: callbackUrl,
|
|
149
|
+
callback_port: listener.port,
|
|
150
|
+
display_code: displayCode,
|
|
151
|
+
expires_in_seconds: Math.floor(timeoutMs / 1000),
|
|
152
|
+
error: callback.error_description || callback.error
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
if (!callback.code) {
|
|
156
|
+
return {
|
|
157
|
+
...baseResult,
|
|
158
|
+
authenticated: false,
|
|
159
|
+
browser_opened: browserOpened,
|
|
160
|
+
open_browser_error: openBrowserError,
|
|
161
|
+
authorize_url: authorizeUrl,
|
|
162
|
+
callback_url: callbackUrl,
|
|
163
|
+
callback_port: listener.port,
|
|
164
|
+
display_code: displayCode,
|
|
165
|
+
expires_in_seconds: Math.floor(timeoutMs / 1000),
|
|
166
|
+
error: "Authorization callback did not include a code."
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
throwIfAborted(signal);
|
|
170
|
+
const exchanged = await exchangeCode({
|
|
171
|
+
baseUrl: config.baseUrl,
|
|
172
|
+
code: callback.code,
|
|
173
|
+
codeVerifier: pkce.codeVerifier,
|
|
174
|
+
redirectPort: listener.port,
|
|
175
|
+
hostname,
|
|
176
|
+
userAgent,
|
|
177
|
+
fetchImpl
|
|
178
|
+
});
|
|
179
|
+
if (!exchanged.key) {
|
|
180
|
+
return {
|
|
181
|
+
...baseResult,
|
|
182
|
+
authenticated: false,
|
|
183
|
+
browser_opened: browserOpened,
|
|
184
|
+
open_browser_error: openBrowserError,
|
|
185
|
+
authorize_url: authorizeUrl,
|
|
186
|
+
callback_url: callbackUrl,
|
|
187
|
+
callback_port: listener.port,
|
|
188
|
+
display_code: displayCode,
|
|
189
|
+
expires_in_seconds: Math.floor(timeoutMs / 1000),
|
|
190
|
+
error: "RunAPI did not return an API key."
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
throwIfAborted(signal);
|
|
194
|
+
await writeConfigApiKey(configFile, exchanged.key);
|
|
195
|
+
try {
|
|
196
|
+
await new RunApiClient({ apiKey: exchanged.key, baseUrl: config.baseUrl }, fetchImpl, userAgent).balance();
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
return {
|
|
200
|
+
...baseResult,
|
|
201
|
+
authenticated: false,
|
|
202
|
+
source: "config",
|
|
203
|
+
wrote_config: true,
|
|
204
|
+
verified: false,
|
|
205
|
+
browser_opened: browserOpened,
|
|
206
|
+
open_browser_error: openBrowserError,
|
|
207
|
+
authorize_url: authorizeUrl,
|
|
208
|
+
callback_url: callbackUrl,
|
|
209
|
+
callback_port: listener.port,
|
|
210
|
+
display_code: displayCode,
|
|
211
|
+
expires_in_seconds: Math.floor(timeoutMs / 1000),
|
|
212
|
+
user: exchanged.user,
|
|
213
|
+
token_name: exchanged.name,
|
|
214
|
+
error: friendlyError(error),
|
|
215
|
+
hint: "The token was saved, but verification failed. Retry an authenticated tool or run login again."
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
...baseResult,
|
|
220
|
+
authenticated: true,
|
|
221
|
+
source: "config",
|
|
222
|
+
wrote_config: true,
|
|
223
|
+
verified: true,
|
|
224
|
+
browser_opened: browserOpened,
|
|
225
|
+
open_browser_error: openBrowserError,
|
|
226
|
+
authorize_url: authorizeUrl,
|
|
227
|
+
callback_url: callbackUrl,
|
|
228
|
+
callback_port: listener.port,
|
|
229
|
+
display_code: displayCode,
|
|
230
|
+
expires_in_seconds: Math.floor(timeoutMs / 1000),
|
|
231
|
+
user: exchanged.user,
|
|
232
|
+
token_name: exchanged.name
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
return {
|
|
237
|
+
...baseResult,
|
|
238
|
+
authenticated: false,
|
|
239
|
+
browser_opened: browserOpened,
|
|
240
|
+
open_browser_error: openBrowserError,
|
|
241
|
+
authorize_url: authorizeUrl,
|
|
242
|
+
callback_url: callbackUrl,
|
|
243
|
+
callback_port: listener?.port,
|
|
244
|
+
display_code: displayCode,
|
|
245
|
+
expires_in_seconds: Math.floor(timeoutMs / 1000),
|
|
246
|
+
error: friendlyLoginError(error)
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
await listener?.close();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
export function registerLoginTool(server, deps = {}) {
|
|
254
|
+
server.tool("login", "Authenticate RunAPI by opening a browser PKCE login flow and saving the API key to ~/.config/runapi/config.json.", {
|
|
255
|
+
force: z.boolean().default(false).describe("Re-run browser login when the current credential comes from the local config file.")
|
|
256
|
+
}, async ({ force }, extra) => jsonText(await login({ force }, {
|
|
257
|
+
...deps,
|
|
258
|
+
signal: extra.signal,
|
|
259
|
+
onPending: async (payload) => {
|
|
260
|
+
await notifyPending(deps.onPending, payload);
|
|
261
|
+
await Promise.allSettled([
|
|
262
|
+
extra.sendNotification({
|
|
263
|
+
method: "notifications/message",
|
|
264
|
+
params: {
|
|
265
|
+
level: "notice",
|
|
266
|
+
logger: "runapi.login",
|
|
267
|
+
data: {
|
|
268
|
+
message: "Open this RunAPI login URL in your browser to continue authentication.",
|
|
269
|
+
...payload
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}),
|
|
273
|
+
extra.sendNotification({
|
|
274
|
+
method: "notifications/progress",
|
|
275
|
+
params: {
|
|
276
|
+
progressToken: extra._meta?.progressToken ?? "runapi-login",
|
|
277
|
+
progress: 0,
|
|
278
|
+
total: payload.expires_in_seconds ?? Math.floor(LOGIN_TIMEOUT_MS / 1000),
|
|
279
|
+
message: `RunAPI login URL: ${payload.authorize_url}`
|
|
280
|
+
}
|
|
281
|
+
})
|
|
282
|
+
]);
|
|
283
|
+
}
|
|
284
|
+
})));
|
|
285
|
+
}
|
|
286
|
+
export async function openSystemBrowser(url, platform = process.platform, timeoutMs = OPEN_BROWSER_TIMEOUT_MS) {
|
|
287
|
+
const command = browserCommand(url, platform);
|
|
288
|
+
if (!command) {
|
|
289
|
+
throw new Error(`Opening a browser is not supported on ${platform}.`);
|
|
290
|
+
}
|
|
291
|
+
await new Promise((resolve, reject) => {
|
|
292
|
+
let settled = false;
|
|
293
|
+
const child = spawn(command.command, command.args, { stdio: "ignore", shell: false });
|
|
294
|
+
const timeout = setTimeout(() => {
|
|
295
|
+
finish(new Error("Opening the browser timed out."));
|
|
296
|
+
child.kill();
|
|
297
|
+
}, timeoutMs);
|
|
298
|
+
function finish(error) {
|
|
299
|
+
if (settled) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
settled = true;
|
|
303
|
+
clearTimeout(timeout);
|
|
304
|
+
if (error) {
|
|
305
|
+
reject(error);
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
resolve();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
child.once("error", finish);
|
|
312
|
+
child.once("close", (code) => {
|
|
313
|
+
if (code === 0) {
|
|
314
|
+
finish();
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
finish(new Error(`${command.command} exited with status ${code ?? "unknown"}.`));
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
export function browserCommand(url, platform) {
|
|
323
|
+
switch (platform) {
|
|
324
|
+
case "darwin":
|
|
325
|
+
return { command: "open", args: [url] };
|
|
326
|
+
case "linux":
|
|
327
|
+
return { command: "xdg-open", args: [url] };
|
|
328
|
+
case "win32":
|
|
329
|
+
return { command: "rundll32.exe", args: ["url.dll,FileProtocolHandler", url] };
|
|
330
|
+
default:
|
|
331
|
+
return undefined;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
async function exchangeCode(options) {
|
|
335
|
+
const response = await options.fetchImpl(new URL("/api/v1/cli/exchange", trimBaseUrl(options.baseUrl)), {
|
|
336
|
+
method: "POST",
|
|
337
|
+
headers: {
|
|
338
|
+
accept: "application/json",
|
|
339
|
+
"content-type": "application/json",
|
|
340
|
+
"user-agent": options.userAgent,
|
|
341
|
+
"x-cli-hostname": options.hostname
|
|
342
|
+
},
|
|
343
|
+
body: JSON.stringify({
|
|
344
|
+
code: options.code,
|
|
345
|
+
code_verifier: options.codeVerifier,
|
|
346
|
+
redirect_port: options.redirectPort
|
|
347
|
+
})
|
|
348
|
+
});
|
|
349
|
+
if (!response.ok) {
|
|
350
|
+
throw await errorFromResponse(response);
|
|
351
|
+
}
|
|
352
|
+
return await response.json();
|
|
353
|
+
}
|
|
354
|
+
function buildAuthorizeUrl(baseUrl, params) {
|
|
355
|
+
const url = new URL("/cli/authorize", trimBaseUrl(baseUrl));
|
|
356
|
+
url.searchParams.set("state", params.state);
|
|
357
|
+
url.searchParams.set("code_challenge", params.codeChallenge);
|
|
358
|
+
url.searchParams.set("code_challenge_method", "S256");
|
|
359
|
+
url.searchParams.set("redirect_port", String(params.redirectPort));
|
|
360
|
+
url.searchParams.set("display_code", params.displayCode);
|
|
361
|
+
url.searchParams.set("hostname", params.hostname);
|
|
362
|
+
return url.toString();
|
|
363
|
+
}
|
|
364
|
+
async function writeConfigApiKey(filePath, apiKey) {
|
|
365
|
+
const dir = path.dirname(filePath);
|
|
366
|
+
await fs.promises.mkdir(dir, { recursive: true, mode: 0o700 });
|
|
367
|
+
await chmodIfSupported(dir, 0o700);
|
|
368
|
+
const existing = readConfigObject(filePath);
|
|
369
|
+
const next = {
|
|
370
|
+
...existing,
|
|
371
|
+
api_key: apiKey
|
|
372
|
+
};
|
|
373
|
+
delete next.apiKey;
|
|
374
|
+
const tmp = path.join(dir, `.config.json.${process.pid}.${Date.now()}.${crypto.randomBytes(6).toString("hex")}.tmp`);
|
|
375
|
+
try {
|
|
376
|
+
await fs.promises.writeFile(tmp, `${JSON.stringify(next, null, 2)}\n`, { mode: 0o600 });
|
|
377
|
+
await chmodIfSupported(tmp, 0o600);
|
|
378
|
+
await fs.promises.rename(tmp, filePath);
|
|
379
|
+
await chmodIfSupported(filePath, 0o600);
|
|
380
|
+
}
|
|
381
|
+
catch (error) {
|
|
382
|
+
await removeTempFile(tmp);
|
|
383
|
+
throw error;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
function readConfigObject(filePath) {
|
|
387
|
+
const parsed = readConfigFile(filePath);
|
|
388
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
389
|
+
}
|
|
390
|
+
function pendingPayload(options) {
|
|
391
|
+
return {
|
|
392
|
+
authorize_url: options.authorizeUrl,
|
|
393
|
+
callback_url: options.callbackUrl,
|
|
394
|
+
callback_port: options.callbackPort,
|
|
395
|
+
display_code: options.displayCode,
|
|
396
|
+
expires_in_seconds: Math.floor(options.timeoutMs / 1000),
|
|
397
|
+
browser_opened: options.browserOpened,
|
|
398
|
+
open_browser_error: options.openBrowserError
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
async function notifyPending(onPending, payload) {
|
|
402
|
+
try {
|
|
403
|
+
await onPending?.(payload);
|
|
404
|
+
}
|
|
405
|
+
catch {
|
|
406
|
+
// Best effort only; authentication should continue even if the host cannot
|
|
407
|
+
// surface the manual login URL notification.
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
function friendlyLoginError(error) {
|
|
411
|
+
if (error instanceof RunApiClientError) {
|
|
412
|
+
return friendlyError(error);
|
|
413
|
+
}
|
|
414
|
+
if (error instanceof LoginCancelledError) {
|
|
415
|
+
return error.message;
|
|
416
|
+
}
|
|
417
|
+
if (error instanceof Error && error.message === "Timed out waiting for browser authorization.") {
|
|
418
|
+
return error.message;
|
|
419
|
+
}
|
|
420
|
+
return "RunAPI login could not complete.";
|
|
421
|
+
}
|
|
422
|
+
function throwIfAborted(signal) {
|
|
423
|
+
if (signal?.aborted) {
|
|
424
|
+
throw new LoginCancelledError();
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
async function withCancellation(promise, signal) {
|
|
428
|
+
if (!signal) {
|
|
429
|
+
return promise;
|
|
430
|
+
}
|
|
431
|
+
throwIfAborted(signal);
|
|
432
|
+
return await new Promise((resolve, reject) => {
|
|
433
|
+
const abort = () => reject(new LoginCancelledError());
|
|
434
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
435
|
+
promise.then(resolve, reject).finally(() => {
|
|
436
|
+
signal.removeEventListener("abort", abort);
|
|
437
|
+
});
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
async function withTimeout(promise, timeoutMs, message) {
|
|
441
|
+
let timeout;
|
|
442
|
+
try {
|
|
443
|
+
return await Promise.race([
|
|
444
|
+
promise,
|
|
445
|
+
new Promise((_, reject) => {
|
|
446
|
+
timeout = setTimeout(() => reject(new Error(message)), timeoutMs);
|
|
447
|
+
})
|
|
448
|
+
]);
|
|
449
|
+
}
|
|
450
|
+
finally {
|
|
451
|
+
clearTimeout(timeout);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
async function removeTempFile(filePath) {
|
|
455
|
+
try {
|
|
456
|
+
await fs.promises.rm(filePath, { force: true });
|
|
457
|
+
}
|
|
458
|
+
catch {
|
|
459
|
+
// Best effort cleanup; preserve the original config write error.
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
async function chmodIfSupported(filePath, mode) {
|
|
463
|
+
if (process.platform === "win32") {
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
try {
|
|
467
|
+
await fs.promises.chmod(filePath, mode);
|
|
468
|
+
}
|
|
469
|
+
catch {
|
|
470
|
+
// Best effort only; the login flow should not fail on filesystems that
|
|
471
|
+
// cannot apply POSIX modes.
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
async function createLoopbackCallbackListener(options) {
|
|
475
|
+
let settled = false;
|
|
476
|
+
let resolvePayload;
|
|
477
|
+
let rejectPayload;
|
|
478
|
+
let timeout;
|
|
479
|
+
const waitPromise = new Promise((resolve, reject) => {
|
|
480
|
+
resolvePayload = resolve;
|
|
481
|
+
rejectPayload = reject;
|
|
482
|
+
});
|
|
483
|
+
const server = http.createServer((request, response) => {
|
|
484
|
+
const payload = parseCallback(request, serverAddressPort(server));
|
|
485
|
+
if (!payload) {
|
|
486
|
+
writeCallbackHtml(response, 404, "Not found.");
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
if (payload.state !== options.state) {
|
|
490
|
+
writeCallbackHtml(response, 400, "Authorization failed. You can close this tab.");
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
if (payload.error) {
|
|
494
|
+
writeCallbackHtml(response, 400, "Authorization canceled. You can close this tab.");
|
|
495
|
+
settle(payload);
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
writeCallbackHtml(response, 200, "Authorization received. You can close this tab and return to your MCP client.");
|
|
499
|
+
settle(payload);
|
|
500
|
+
});
|
|
501
|
+
const port = await new Promise((resolve, reject) => {
|
|
502
|
+
server.once("error", reject);
|
|
503
|
+
server.listen(0, "127.0.0.1", () => resolve(serverAddressPort(server)));
|
|
504
|
+
});
|
|
505
|
+
timeout = setTimeout(() => {
|
|
506
|
+
settleError(new Error("Timed out waiting for browser authorization."));
|
|
507
|
+
}, options.timeoutMs);
|
|
508
|
+
function settle(payload) {
|
|
509
|
+
if (settled) {
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
settled = true;
|
|
513
|
+
clearTimeout(timeout);
|
|
514
|
+
resolvePayload(payload);
|
|
515
|
+
}
|
|
516
|
+
function settleError(error) {
|
|
517
|
+
if (settled) {
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
settled = true;
|
|
521
|
+
clearTimeout(timeout);
|
|
522
|
+
rejectPayload(error);
|
|
523
|
+
}
|
|
524
|
+
return {
|
|
525
|
+
port,
|
|
526
|
+
wait: () => waitPromise,
|
|
527
|
+
close: async () => {
|
|
528
|
+
clearTimeout(timeout);
|
|
529
|
+
await new Promise((resolve) => {
|
|
530
|
+
server.close(() => resolve());
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
function parseCallback(request, port) {
|
|
536
|
+
if (!request.url) {
|
|
537
|
+
return undefined;
|
|
538
|
+
}
|
|
539
|
+
const url = new URL(request.url, `http://127.0.0.1:${port}`);
|
|
540
|
+
if (url.pathname !== "/callback") {
|
|
541
|
+
return undefined;
|
|
542
|
+
}
|
|
543
|
+
return {
|
|
544
|
+
code: url.searchParams.get("code") || undefined,
|
|
545
|
+
state: url.searchParams.get("state") || undefined,
|
|
546
|
+
error: url.searchParams.get("error") || undefined,
|
|
547
|
+
error_description: url.searchParams.get("error_description") || undefined
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
function writeCallbackHtml(response, status, message) {
|
|
551
|
+
response.writeHead(status, {
|
|
552
|
+
"content-type": "text/html; charset=utf-8",
|
|
553
|
+
"cache-control": "no-store",
|
|
554
|
+
"access-control-allow-origin": "*"
|
|
555
|
+
});
|
|
556
|
+
response.end(`<!doctype html><html><head><meta charset="utf-8"><title>RunAPI authorization</title></head><body><p>${escapeHtml(message)}</p></body></html>`);
|
|
557
|
+
}
|
|
558
|
+
function serverAddressPort(server) {
|
|
559
|
+
const address = server.address();
|
|
560
|
+
if (!address || typeof address === "string") {
|
|
561
|
+
throw new Error("Unable to determine callback listener port.");
|
|
562
|
+
}
|
|
563
|
+
return address.port;
|
|
564
|
+
}
|
|
565
|
+
function base64Url(bytes) {
|
|
566
|
+
return Buffer.from(bytes).toString("base64url");
|
|
567
|
+
}
|
|
568
|
+
function trimBaseUrl(baseUrl) {
|
|
569
|
+
return baseUrl.replace(/\/+$/, "") || DEFAULT_BASE_URL;
|
|
570
|
+
}
|
|
571
|
+
function escapeHtml(value) {
|
|
572
|
+
return value
|
|
573
|
+
.replace(/&/g, "&")
|
|
574
|
+
.replace(/</g, "<")
|
|
575
|
+
.replace(/>/g, ">")
|
|
576
|
+
.replace(/"/g, """)
|
|
577
|
+
.replace(/'/g, "'");
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAmD,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAuE9C,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACjC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AACvC,MAAM,qBAAqB,GAAG,kCAAkC,CAAC;AAEjE,MAAM,mBAAoB,SAAQ,KAAK;IACrC;QACE,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAoB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;IACzE,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO;QACL,YAAY;QACZ,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC;QACnF,mBAAmB,EAAE,MAAM;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAoB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAC3E,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;QAC9B,IAAI,IAAI,CAAC,CAAC;QACV,OAAO,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,CAAC;YACV,MAAM,IAAI,qBAAqB,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,QAAoB,EAAE,EAAE,OAA0B,EAAE;IAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,UAAU,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG;QACjB,QAAQ,EAAE,MAAM,CAAC,OAAO;QACxB,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,KAAK;KACpB,CAAC;IAEF,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO;gBACL,GAAG,UAAU;gBACb,aAAa,EAAE,IAAI;gBACnB,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,GAAG,kBAAkB,kGAAkG;aAC9H,CAAC;QACJ,CAAC;QAED,OAAO;YACL,GAAG,UAAU;YACb,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,SAAS,kBAAkB,0EAA0E;SAC5G,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACrD,OAAO;YACL,GAAG,UAAU;YACb,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,QAAQ,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,IAAI,uBAAuB,CAAC;IAClF,IAAI,QAAsC,CAAC;IAC3C,IAAI,WAA+B,CAAC;IACpC,IAAI,YAAgC,CAAC;IACrC,IAAI,aAAkC,CAAC;IACvC,IAAI,gBAAoC,CAAC;IAEzC,IAAI,CAAC;QACH,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,sBAAsB,IAAI,8BAA8B,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACvG,WAAW,GAAG,oBAAoB,QAAQ,CAAC,IAAI,WAAW,CAAC;QAC3D,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE;YAC/C,KAAK;YACL,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,YAAY,EAAE,QAAQ,CAAC,IAAI;YAC3B,WAAW;YACX,QAAQ;SACT,CAAC,CAAC;QACH,aAAa,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC;YACH,MAAM,gBAAgB,CACpB,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,iBAAiB,CAAC,CAAC,YAAY,CAAC,EAAE,oBAAoB,EAAE,gCAAgC,CAAC,EAC1H,MAAM,CACP,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;gBACzC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,aAAa,GAAG,KAAK,CAAC;YACtB,gBAAgB,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC;gBACjD,YAAY;gBACZ,WAAW;gBACX,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,WAAW;gBACX,SAAS;gBACT,aAAa;gBACb,gBAAgB;aACjB,CAAC,CAAC,CAAC;QACN,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO;gBACL,GAAG,UAAU;gBACb,aAAa,EAAE,KAAK;gBACpB,cAAc,EAAE,aAAa;gBAC7B,kBAAkB,EAAE,gBAAgB;gBACpC,aAAa,EAAE,YAAY;gBAC3B,YAAY,EAAE,WAAW;gBACzB,aAAa,EAAE,QAAQ,CAAC,IAAI;gBAC5B,YAAY,EAAE,WAAW;gBACzB,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;gBAChD,KAAK,EAAE,6CAA6C;gBACpD,IAAI,EAAE,0EAA0E;aACjF,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO;gBACL,GAAG,UAAU;gBACb,aAAa,EAAE,KAAK;gBACpB,cAAc,EAAE,aAAa;gBAC7B,kBAAkB,EAAE,gBAAgB;gBACpC,aAAa,EAAE,YAAY;gBAC3B,YAAY,EAAE,WAAW;gBACzB,aAAa,EAAE,QAAQ,CAAC,IAAI;gBAC5B,YAAY,EAAE,WAAW;gBACzB,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;gBAChD,KAAK,EAAE,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,CAAC,KAAK;aACpD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO;gBACL,GAAG,UAAU;gBACb,aAAa,EAAE,KAAK;gBACpB,cAAc,EAAE,aAAa;gBAC7B,kBAAkB,EAAE,gBAAgB;gBACpC,aAAa,EAAE,YAAY;gBAC3B,YAAY,EAAE,WAAW;gBACzB,aAAa,EAAE,QAAQ,CAAC,IAAI;gBAC5B,YAAY,EAAE,WAAW;gBACzB,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;gBAChD,KAAK,EAAE,gDAAgD;aACxD,CAAC;QACJ,CAAC;QAED,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC;YACnC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,QAAQ,CAAC,IAAI;YAC3B,QAAQ;YACR,SAAS;YACT,SAAS;SACV,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;YACnB,OAAO;gBACL,GAAG,UAAU;gBACb,aAAa,EAAE,KAAK;gBACpB,cAAc,EAAE,aAAa;gBAC7B,kBAAkB,EAAE,gBAAgB;gBACpC,aAAa,EAAE,YAAY;gBAC3B,YAAY,EAAE,WAAW;gBACzB,aAAa,EAAE,QAAQ,CAAC,IAAI;gBAC5B,YAAY,EAAE,WAAW;gBACzB,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;gBAChD,KAAK,EAAE,mCAAmC;aAC3C,CAAC;QACJ,CAAC;QAED,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,iBAAiB,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;QAEnD,IAAI,CAAC;YACH,MAAM,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7G,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,GAAG,UAAU;gBACb,aAAa,EAAE,KAAK;gBACpB,MAAM,EAAE,QAAQ;gBAChB,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE,KAAK;gBACf,cAAc,EAAE,aAAa;gBAC7B,kBAAkB,EAAE,gBAAgB;gBACpC,aAAa,EAAE,YAAY;gBAC3B,YAAY,EAAE,WAAW;gBACzB,aAAa,EAAE,QAAQ,CAAC,IAAI;gBAC5B,YAAY,EAAE,WAAW;gBACzB,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;gBAChD,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,UAAU,EAAE,SAAS,CAAC,IAAI;gBAC1B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;gBAC3B,IAAI,EAAE,+FAA+F;aACtG,CAAC;QACJ,CAAC;QAED,OAAO;YACL,GAAG,UAAU;YACb,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,QAAQ;YAChB,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,IAAI;YACd,cAAc,EAAE,aAAa;YAC7B,kBAAkB,EAAE,gBAAgB;YACpC,aAAa,EAAE,YAAY;YAC3B,YAAY,EAAE,WAAW;YACzB,aAAa,EAAE,QAAQ,CAAC,IAAI;YAC5B,YAAY,EAAE,WAAW;YACzB,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;YAChD,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,UAAU,EAAE,SAAS,CAAC,IAAI;SAC3B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,GAAG,UAAU;YACb,aAAa,EAAE,KAAK;YACpB,cAAc,EAAE,aAAa;YAC7B,kBAAkB,EAAE,gBAAgB;YACpC,aAAa,EAAE,YAAY;YAC3B,YAAY,EAAE,WAAW;YACzB,aAAa,EAAE,QAAQ,EAAE,IAAI;YAC7B,YAAY,EAAE,WAAW;YACzB,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;YAChD,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC;SACjC,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,OAA0B,EAAE;IAC/E,MAAM,CAAC,IAAI,CACT,OAAO,EACP,kHAAkH,EAClH;QACE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,oFAAoF,CAAC;KACjI,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE;QAC1D,GAAG,IAAI;QACP,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC3B,MAAM,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,OAAO,CAAC,UAAU,CAAC;gBACvB,KAAK,CAAC,gBAAgB,CAAC;oBACrB,MAAM,EAAE,uBAAuB;oBAC/B,MAAM,EAAE;wBACN,KAAK,EAAE,QAAQ;wBACf,MAAM,EAAE,cAAc;wBACtB,IAAI,EAAE;4BACJ,OAAO,EAAE,wEAAwE;4BACjF,GAAG,OAAO;yBACX;qBACF;iBACF,CAAC;gBACF,KAAK,CAAC,gBAAgB,CAAC;oBACrB,MAAM,EAAE,wBAAwB;oBAChC,MAAM,EAAE;wBACN,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE,aAAa,IAAI,cAAc;wBAC3D,QAAQ,EAAE,CAAC;wBACX,KAAK,EAAE,OAAO,CAAC,kBAAkB,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;wBACxE,OAAO,EAAE,qBAAqB,OAAO,CAAC,aAAa,EAAE;qBACtD;iBACF,CAAC;aACH,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,WAA4B,OAAO,CAAC,QAAQ,EAAE,SAAS,GAAG,uBAAuB;IACpI,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yCAAyC,QAAQ,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACtF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;YACpD,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,SAAS,MAAM,CAAC,KAAa;YAC3B,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YAED,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC3B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,uBAAuB,IAAI,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;YACnF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAyB;IACnE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,KAAK,OAAO;YACV,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,KAAK,OAAO;YACV,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,6BAA6B,EAAE,GAAG,CAAC,EAAE,CAAC;QACjF;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAQ3B;IACC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,sBAAsB,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE;QACtG,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,OAAO,CAAC,SAAS;YAC/B,gBAAgB,EAAE,OAAO,CAAC,QAAQ;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,aAAa,EAAE,OAAO,CAAC,YAAY;YACnC,aAAa,EAAE,OAAO,CAAC,YAAY;SACpC,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAsB,CAAC;AACnD,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,MAM3C;IACC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAC7D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IACtD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IACnE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACzD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAgB,EAAE,MAAc;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,MAAM,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAEnC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,IAAI,GAA4B;QACpC,GAAG,QAAQ;QACX,OAAO,EAAE,MAAM;KAChB,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC;IACnB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAErH,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,MAAM,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxC,MAAM,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAA4B,CAAC;IACnE,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,cAAc,CAAC,OAQvB;IACC,OAAO;QACL,aAAa,EAAE,OAAO,CAAC,YAAY;QACnC,YAAY,EAAE,OAAO,CAAC,WAAW;QACjC,aAAa,EAAE,OAAO,CAAC,YAAY;QACnC,YAAY,EAAE,OAAO,CAAC,WAAW;QACjC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;QACxD,cAAc,EAAE,OAAO,CAAC,aAAa;QACrC,kBAAkB,EAAE,OAAO,CAAC,gBAAgB;KAC7C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,SAAyC,EAAE,OAA4B;IAClG,IAAI,CAAC;QACH,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,6CAA6C;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;QACvC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,8CAA8C,EAAE,CAAC;QAC/F,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,OAAO,kCAAkC,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,MAAoB;IAC1C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,mBAAmB,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAI,OAAmB,EAAE,MAAoB;IAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,OAAO,MAAM,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACzC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CAAI,OAAmB,EAAE,SAAiB,EAAE,OAAe;IACnF,IAAI,OAAmC,CAAC;IAExC,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO;YACP,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACpE,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,IAAY;IAC5D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,4BAA4B;IAC9B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,8BAA8B,CAAC,OAA6C;IACzF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,cAAkD,CAAC;IACvD,IAAI,aAAqC,CAAC;IAC1C,IAAI,OAAmC,CAAC;IAExC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnE,cAAc,GAAG,OAAO,CAAC;QACzB,aAAa,GAAG,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QACrD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,+CAA+C,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,iDAAiD,CAAC,CAAC;YACpF,MAAM,CAAC,OAAO,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,+EAA+E,CAAC,CAAC;QAClH,MAAM,CAAC,OAAO,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;QACxB,WAAW,CAAC,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;IACzE,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAEtB,SAAS,MAAM,CAAC,OAAwB;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,OAAO,GAAG,IAAI,CAAC;QACf,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS,WAAW,CAAC,KAAY;QAC/B,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,OAAO,GAAG,IAAI,CAAC;QACf,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,GAAG,EAAE,CAAC,WAAW;QACvB,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,OAAwB,EAAE,IAAY;IAC3D,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAC;IAC7D,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS;QAC/C,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS;QACjD,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS;QACjD,iBAAiB,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,SAAS;KAC1E,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAwB,EAAE,MAAc,EAAE,OAAe;IAClF,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE;QACzB,cAAc,EAAE,0BAA0B;QAC1C,eAAe,EAAE,UAAU;QAC3B,6BAA6B,EAAE,GAAG;KACnC,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,CAAC,uGAAuG,UAAU,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAC/J,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAmB;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,SAAS,SAAS,CAAC,KAAiB;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC;AACzD,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC"}
|
package/dist/runapi-client.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { type RunApiConfig } from "./config.js";
|
|
2
2
|
import type { PollingOptions, RunApiPromptsResponse, RunApiTaskResponse, SearchPromptsParams } from "./types.js";
|
|
3
|
+
type RunApiConfigSource = RunApiConfig | (() => RunApiConfig);
|
|
3
4
|
export declare class RunApiClient {
|
|
4
|
-
private readonly
|
|
5
|
+
private readonly configSource;
|
|
5
6
|
private readonly fetchImpl;
|
|
6
7
|
private readonly userAgent;
|
|
7
|
-
constructor(
|
|
8
|
+
constructor(configSource?: RunApiConfigSource, fetchImpl?: typeof fetch, userAgent?: string);
|
|
8
9
|
listModels(): Promise<unknown>;
|
|
9
10
|
searchPrompts(params?: SearchPromptsParams): Promise<RunApiPromptsResponse>;
|
|
10
11
|
balance(): Promise<unknown>;
|
|
@@ -12,6 +13,8 @@ export declare class RunApiClient {
|
|
|
12
13
|
getTask(service: string, taskId: string, action?: string): Promise<RunApiTaskResponse>;
|
|
13
14
|
pollTask(service: string, taskId: string, action?: string, options?: PollingOptions): Promise<RunApiTaskResponse>;
|
|
14
15
|
private request;
|
|
16
|
+
private config;
|
|
15
17
|
}
|
|
16
18
|
export declare function taskStatus(task?: RunApiTaskResponse): string;
|
|
17
19
|
export declare function taskIdFromResponse(task: RunApiTaskResponse): string | undefined;
|
|
20
|
+
export {};
|
package/dist/runapi-client.js
CHANGED
|
@@ -4,11 +4,11 @@ import { errorFromResponse, PollTimeoutError } from "./errors.js";
|
|
|
4
4
|
const COMPLETED_STATUSES = new Set(["completed", "complete", "succeeded", "success", "finished"]);
|
|
5
5
|
const FAILED_STATUSES = new Set(["failed", "error", "canceled", "cancelled", "timeout"]);
|
|
6
6
|
export class RunApiClient {
|
|
7
|
-
|
|
7
|
+
configSource;
|
|
8
8
|
fetchImpl;
|
|
9
9
|
userAgent;
|
|
10
|
-
constructor(
|
|
11
|
-
this.
|
|
10
|
+
constructor(configSource = loadConfig, fetchImpl = fetch, userAgent = USER_AGENT) {
|
|
11
|
+
this.configSource = configSource;
|
|
12
12
|
this.fetchImpl = fetchImpl;
|
|
13
13
|
this.userAgent = userAgent;
|
|
14
14
|
}
|
|
@@ -62,7 +62,8 @@ export class RunApiClient {
|
|
|
62
62
|
throw new PollTimeoutError(`Timed out waiting for RunAPI task ${taskId}. Last status: ${taskStatus(lastTask)}.`);
|
|
63
63
|
}
|
|
64
64
|
async request(method, requestPath, options = {}) {
|
|
65
|
-
const
|
|
65
|
+
const config = this.config();
|
|
66
|
+
const url = new URL(requestPath, config.baseUrl.replace(/\/+$/, ""));
|
|
66
67
|
const headers = {
|
|
67
68
|
accept: "application/json",
|
|
68
69
|
"user-agent": this.userAgent,
|
|
@@ -72,7 +73,7 @@ export class RunApiClient {
|
|
|
72
73
|
headers["content-type"] = "application/json";
|
|
73
74
|
}
|
|
74
75
|
if (options.auth !== false) {
|
|
75
|
-
headers.authorization = `Bearer ${requireApiKey(
|
|
76
|
+
headers.authorization = `Bearer ${requireApiKey(config)}`;
|
|
76
77
|
}
|
|
77
78
|
const response = await this.fetchImpl(url, {
|
|
78
79
|
method,
|
|
@@ -87,6 +88,9 @@ export class RunApiClient {
|
|
|
87
88
|
}
|
|
88
89
|
return await response.json();
|
|
89
90
|
}
|
|
91
|
+
config() {
|
|
92
|
+
return typeof this.configSource === "function" ? this.configSource() : this.configSource;
|
|
93
|
+
}
|
|
90
94
|
}
|
|
91
95
|
export function taskStatus(task) {
|
|
92
96
|
const status = task?.status || task?.state || nestedString(task?.data, "status");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runapi-client.js","sourceRoot":"","sources":["../src/runapi-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAE3E,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runapi-client.js","sourceRoot":"","sources":["../src/runapi-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAE3E,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAUlE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAClG,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AAEzF,MAAM,OAAO,YAAY;IAEJ;IACA;IACA;IAHnB,YACmB,eAAmC,UAAU,EAC7C,YAA0B,KAAK,EAC/B,YAAoB,UAAU;QAF9B,iBAAY,GAAZ,YAAY,CAAiC;QAC7C,cAAS,GAAT,SAAS,CAAsB;QAC/B,cAAS,GAAT,SAAS,CAAqB;IAC9C,CAAC;IAEJ,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAA8B,EAAE;QAClD,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChD,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAClC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1C,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAwB,KAAK,EAAE,kBAAkB,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,MAAc,EAAE,MAA+B;QAC/E,OAAO,IAAI,CAAC,OAAO,CAAqB,MAAM,EAAE,WAAW,gBAAgB,CAAC,OAAO,CAAC,IAAI,MAAM,EAAE,EAAE;YAChG,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,MAAc,EAAE,MAAe;QAC5D,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,YAAY,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,WAAW,YAAY,IAAI,MAAM,EAAE,CAAC;QAC1G,OAAO,IAAI,CAAC,OAAO,CAAqB,KAAK,EAAE,IAAI,EAAE;YACnD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,MAAc,EAAE,MAAe,EAAE,UAA0B,EAAE;QAC3F,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,QAAwC,CAAC;QAE7C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACzD,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;YAEjC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClE,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,IAAI,gBAAgB,CAAC,qCAAqC,MAAM,kBAAkB,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACnH,CAAC;IAEO,KAAK,CAAC,OAAO,CAAc,MAAc,EAAE,WAAmB,EAAE,UAA0B,EAAE;QAClG,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,kBAAkB;YAC1B,YAAY,EAAE,IAAI,CAAC,SAAS;YAC5B,GAAG,OAAO,CAAC,OAAO;SACnB,CAAC;QAEF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC/C,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,aAAa,GAAG,UAAU,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;YACzC,MAAM;YACN,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;SAC5E,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,SAAc,CAAC;QACxB,CAAC;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAO,CAAC;IACpC,CAAC;IAEO,MAAM;QACZ,OAAO,OAAO,IAAI,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;IAC3F,CAAC;CACF;AAED,MAAM,UAAU,UAAU,CAAC,IAAyB;IAClD,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjF,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAwB;IACzD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1G,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,GAAW;IAC/C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAC;IACvD,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,WAAW,CAAC,KAAsB,EAAE,GAAW,EAAE,KAA4C;IACpG,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACxC,OAAO;IACT,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { Contract, InputRule, PricingConfig } from "./types.js";
|
|
3
3
|
import { RunApiClient } from "./runapi-client.js";
|
|
4
|
+
import { type LoginDependencies } from "./login.js";
|
|
4
5
|
export type ModelServerTool = {
|
|
5
6
|
name: string;
|
|
6
7
|
description: string;
|
|
@@ -18,6 +19,7 @@ export type CreateModelServerOptions = {
|
|
|
18
19
|
tools: ModelServerTool[];
|
|
19
20
|
client?: RunApiClient;
|
|
20
21
|
instructions?: string;
|
|
22
|
+
authTools?: false | LoginDependencies;
|
|
21
23
|
};
|
|
22
24
|
export declare function createModelServer(options: CreateModelServerOptions): McpServer;
|
|
23
25
|
export declare function defaultTimeout(action: string): number;
|
package/dist/server.js
CHANGED
|
@@ -7,6 +7,7 @@ import { validateParams, zodShapeForFields } from "./schema.js";
|
|
|
7
7
|
import { RunApiClient, taskIdFromResponse, taskStatus } from "./runapi-client.js";
|
|
8
8
|
import { friendlyError } from "./errors.js";
|
|
9
9
|
import { jsonText } from "./tool-response.js";
|
|
10
|
+
import { registerLoginTool } from "./login.js";
|
|
10
11
|
// Builds a per-model RunAPI MCP server from injected catalog data — no disk
|
|
11
12
|
// access. Each tool creates and optionally polls a RunAPI task for its
|
|
12
13
|
// service/action, validating params against the tool's inputSchema and the
|
|
@@ -19,9 +20,13 @@ export function createModelServer(options) {
|
|
|
19
20
|
}, {
|
|
20
21
|
instructions: options.instructions ?? defaultInstructions(lineSlug),
|
|
21
22
|
capabilities: {
|
|
22
|
-
tools: {}
|
|
23
|
+
tools: {},
|
|
24
|
+
logging: {}
|
|
23
25
|
}
|
|
24
26
|
});
|
|
27
|
+
if (options.authTools !== false) {
|
|
28
|
+
registerLoginTool(server, typeof options.authTools === "object" ? options.authTools : undefined);
|
|
29
|
+
}
|
|
25
30
|
for (const tool of tools) {
|
|
26
31
|
const action = findAction(tool.service, tool.action, contract);
|
|
27
32
|
const declaredFields = action ? declaredFieldsForAction(action) : {};
|
|
@@ -129,7 +134,7 @@ function defaultInstructions(lineSlug) {
|
|
|
129
134
|
"2. Confirm before expensive, long-running, or batch requests.",
|
|
130
135
|
"3. Present results as task ID, status, output URLs, and cost fields when available.",
|
|
131
136
|
"4. Do not describe generated media as if you inspected it.",
|
|
132
|
-
"5. On an API key error,
|
|
137
|
+
"5. On an API key error, call the login tool for interactive browser auth; headless hosts can use RUNAPI_API_KEY or ~/.config/runapi/config.json."
|
|
133
138
|
].join("\n");
|
|
134
139
|
}
|
|
135
140
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runapi.ai/mcp-core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Reusable core for building RunAPI MCP servers: client, contract/pricing/schema queries, input-rule engine, and a createModelServer factory.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|