bdy 1.22.88 → 1.22.89-beta
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/distTs/package.json +4 -2
- package/distTs/src/cliIndex.js +2 -0
- package/distTs/src/command/mcp.js +189 -0
- package/distTs/src/command/pre.js +4 -0
- package/distTs/src/texts.js +12 -5
- package/distTs/src/utils.js +21 -5
- package/package.json +4 -2
package/distTs/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bdy",
|
|
3
3
|
"preferGlobal": false,
|
|
4
|
-
"version": "1.22.
|
|
4
|
+
"version": "1.22.89-beta",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://buddy.works/docs/cli",
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"e2e:artifact": "vitest run --config e2e/vitest.config.ts e2e/modules/artifact/",
|
|
23
23
|
"e2e:sandbox": "vitest run --config e2e/vitest.config.ts e2e/modules/sandbox/",
|
|
24
24
|
"e2e:api": "vitest run --config e2e/vitest.config.ts e2e/modules/api/",
|
|
25
|
+
"e2e:mcp": "vitest run --config e2e/vitest.config.ts e2e/modules/mcp/",
|
|
25
26
|
"e2e:pipeline": "vitest run --config e2e/vitest.config.ts e2e/modules/pipeline/",
|
|
26
27
|
"e2e:tunnel": "vitest run --config e2e/vitest.config.ts e2e/modules/tunnel/",
|
|
27
28
|
"e2e:agent": "vitest run --config e2e/vitest.config.ts e2e/modules/agent/",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"@fastify/accept-negotiator": "2.0.1",
|
|
42
43
|
"@fastify/cors": "11.2.0",
|
|
43
44
|
"@inquirer/prompts": "8.5.2",
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
44
46
|
"@puppeteer/browsers": "2.13.0",
|
|
45
47
|
"@scalar/json-magic": "0.12.16",
|
|
46
48
|
"@scalar/openapi-parser": "0.28.7",
|
|
@@ -83,12 +85,12 @@
|
|
|
83
85
|
"zod": "3.25.76"
|
|
84
86
|
},
|
|
85
87
|
"devDependencies": {
|
|
86
|
-
"@scalar/types": "0.13.2",
|
|
87
88
|
"@eslint/js": "10.0.1",
|
|
88
89
|
"@rollup/plugin-commonjs": "29.0.3",
|
|
89
90
|
"@rollup/plugin-json": "6.1.0",
|
|
90
91
|
"@rollup/plugin-node-resolve": "16.0.3",
|
|
91
92
|
"@rollup/plugin-replace": "6.0.3",
|
|
93
|
+
"@scalar/types": "0.13.2",
|
|
92
94
|
"@stylistic/eslint-plugin": "5.10.0",
|
|
93
95
|
"@types/basic-auth": "1.1.8",
|
|
94
96
|
"@types/content-disposition": "0.5.9",
|
package/distTs/src/cliIndex.js
CHANGED
|
@@ -25,6 +25,7 @@ const api_1 = __importDefault(require("./command/api"));
|
|
|
25
25
|
const domain_1 = __importDefault(require("./command/domain"));
|
|
26
26
|
const distro_1 = __importDefault(require("./command/distro"));
|
|
27
27
|
const register_1 = __importDefault(require("./command/register"));
|
|
28
|
+
const mcp_1 = __importDefault(require("./command/mcp"));
|
|
28
29
|
function cliIndex() {
|
|
29
30
|
const program = (0, utils_1.newCommand)('', texts_1.DESC_PROGRAM);
|
|
30
31
|
program.hook('preAction', pre_1.default);
|
|
@@ -53,6 +54,7 @@ function cliIndex() {
|
|
|
53
54
|
program.addCommand(workspace_1.default);
|
|
54
55
|
program.addCommand(project_1.default);
|
|
55
56
|
program.addCommand(api_1.default);
|
|
57
|
+
program.addCommand(mcp_1.default);
|
|
56
58
|
program.action((_, cmd) => {
|
|
57
59
|
if (cmd.args.length > 0) {
|
|
58
60
|
output_1.default.exitError((0, texts_1.ERR_COMMAND_NOT_FOUND)(cmd.args[0]));
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("../utils");
|
|
7
|
+
const texts_1 = require("../texts");
|
|
8
|
+
const input_1 = __importDefault(require("../input"));
|
|
9
|
+
const output_1 = __importDefault(require("../output"));
|
|
10
|
+
// stdout carries only the MCP JSON-RPC stream - every diagnostic goes to stderr
|
|
11
|
+
const logErr = (msg) => {
|
|
12
|
+
process.stderr.write(`${msg}\n`);
|
|
13
|
+
};
|
|
14
|
+
const commandMcp = (0, utils_1.newCommand)('mcp', texts_1.DESC_COMMAND_MCP);
|
|
15
|
+
commandMcp.skipPre = true;
|
|
16
|
+
commandMcp.addHelpText('after', `EXAMPLE:
|
|
17
|
+
Register in Claude Code:
|
|
18
|
+
claude mcp add buddy -- bdy mcp
|
|
19
|
+
`);
|
|
20
|
+
commandMcp.action(async () => {
|
|
21
|
+
const { token, refreshToken, clientId, clientSecret, clientToken } = input_1.default.restApiToken();
|
|
22
|
+
const baseUrl = input_1.default.restApiBaseUrl('', '', token);
|
|
23
|
+
// BUDDY_MCP_ENDPOINT is intentionally undocumented - it exists only for
|
|
24
|
+
// tests and local development against a non-region MCP server
|
|
25
|
+
const urlOverride = process.env.BUDDY_MCP_ENDPOINT;
|
|
26
|
+
let mcpUrl;
|
|
27
|
+
if (urlOverride) {
|
|
28
|
+
try {
|
|
29
|
+
mcpUrl = new URL(urlOverride);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
output_1.default.exitError((0, texts_1.ERR_MCP_URL_INVALID)(urlOverride));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const resolved = (0, utils_1.getMcpUrlByApiBaseUrl)(baseUrl);
|
|
37
|
+
if (!resolved) {
|
|
38
|
+
output_1.default.exitError((0, texts_1.ERR_MCP_ENDPOINT)(baseUrl.hostname));
|
|
39
|
+
}
|
|
40
|
+
mcpUrl = new URL(resolved);
|
|
41
|
+
}
|
|
42
|
+
const ApiClient = require('../api/client').default;
|
|
43
|
+
const api = new ApiClient(baseUrl, token, refreshToken, clientId, clientSecret, clientToken);
|
|
44
|
+
// Single-flight refresh: concurrent 401s share one attempt, while later
|
|
45
|
+
// expiries (the proxy may live for hours) trigger a fresh one
|
|
46
|
+
let refreshing = null;
|
|
47
|
+
const tryRefresh = () => {
|
|
48
|
+
if (refreshing)
|
|
49
|
+
return refreshing;
|
|
50
|
+
if (!refreshToken || !clientId || !clientSecret) {
|
|
51
|
+
return Promise.resolve(false);
|
|
52
|
+
}
|
|
53
|
+
const refresh = api.tryRefreshToken().finally(() => {
|
|
54
|
+
refreshing = null;
|
|
55
|
+
});
|
|
56
|
+
refreshing = refresh;
|
|
57
|
+
return refresh;
|
|
58
|
+
};
|
|
59
|
+
let local = null;
|
|
60
|
+
let remote = null;
|
|
61
|
+
let shuttingDown = false;
|
|
62
|
+
const shutdown = async (code) => {
|
|
63
|
+
if (shuttingDown)
|
|
64
|
+
return;
|
|
65
|
+
shuttingDown = true;
|
|
66
|
+
try {
|
|
67
|
+
await remote?.close();
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// do nothing
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
await local?.close();
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// do nothing
|
|
77
|
+
}
|
|
78
|
+
process.exit(code);
|
|
79
|
+
};
|
|
80
|
+
const fatal = (msg) => {
|
|
81
|
+
logErr(msg);
|
|
82
|
+
void shutdown(1);
|
|
83
|
+
};
|
|
84
|
+
// The bundled undici fetch is required here: a dispatcher created from the
|
|
85
|
+
// bundled undici cannot be passed to the node built-in fetch.
|
|
86
|
+
// TLS verification is skipped only for local/dev hosts (see canSkipSslVerify)
|
|
87
|
+
const undici = require('undici');
|
|
88
|
+
const dispatcher = (0, utils_1.canSkipSslVerify)(mcpUrl.hostname)
|
|
89
|
+
? output_1.default.getUndiciUnauthorizedAgent()
|
|
90
|
+
: undefined;
|
|
91
|
+
// Attaches the bearer token to every remote call; on 401 refreshes the token
|
|
92
|
+
// once (through the shared ApiClient mechanism) and retries the request
|
|
93
|
+
const proxyFetch = async (url, init) => {
|
|
94
|
+
const attempt = () => {
|
|
95
|
+
const headers = new Headers(init?.headers);
|
|
96
|
+
headers.set('authorization', `Bearer ${api.token}`);
|
|
97
|
+
const attemptInit = {
|
|
98
|
+
...init,
|
|
99
|
+
headers,
|
|
100
|
+
};
|
|
101
|
+
if (dispatcher)
|
|
102
|
+
attemptInit.dispatcher = dispatcher;
|
|
103
|
+
// the undici and dom RequestInit/Response types are structurally
|
|
104
|
+
// equivalent here but nominally incompatible
|
|
105
|
+
return undici.fetch(url, attemptInit);
|
|
106
|
+
};
|
|
107
|
+
let response = await attempt();
|
|
108
|
+
if (response.status === 401 && !shuttingDown) {
|
|
109
|
+
const refreshed = await tryRefresh();
|
|
110
|
+
if (!refreshed) {
|
|
111
|
+
fatal(texts_1.ERR_MCP_REFRESH_FAILED);
|
|
112
|
+
return response;
|
|
113
|
+
}
|
|
114
|
+
response = await attempt();
|
|
115
|
+
if (response.status === 401) {
|
|
116
|
+
fatal(texts_1.ERR_MCP_REFRESH_FAILED);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return response;
|
|
120
|
+
};
|
|
121
|
+
// Transport-level proxy: pipe raw JSON-RPC between stdio and the remote
|
|
122
|
+
// streamable http endpoint so notifications, progress, sampling and future
|
|
123
|
+
// protocol additions pass through untouched
|
|
124
|
+
const { StdioServerTransport: LocalTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
|
|
125
|
+
const { StreamableHTTPClientTransport: RemoteTransport } = require('@modelcontextprotocol/sdk/client/streamableHttp.js');
|
|
126
|
+
remote = new RemoteTransport(mcpUrl, { fetch: proxyFetch });
|
|
127
|
+
local = new LocalTransport();
|
|
128
|
+
// On stdin EOF responses to piped one-shot requests (e.g. `echo <initialize
|
|
129
|
+
// message> | bdy mcp`) may still be in flight - exit once they all got their
|
|
130
|
+
// response, with a hard cap as remote.send() can resolve before an
|
|
131
|
+
// SSE-delivered response arrives
|
|
132
|
+
const pendingRequests = new Set();
|
|
133
|
+
let stdinClosed = false;
|
|
134
|
+
const exitWhenDrained = () => {
|
|
135
|
+
if (stdinClosed && !pendingRequests.size)
|
|
136
|
+
void shutdown(0);
|
|
137
|
+
};
|
|
138
|
+
local.onmessage = (message) => {
|
|
139
|
+
const m = message;
|
|
140
|
+
if (m.id !== undefined && m.method !== undefined)
|
|
141
|
+
pendingRequests.add(m.id);
|
|
142
|
+
remote.send(message).catch((err) => {
|
|
143
|
+
if (m.id !== undefined)
|
|
144
|
+
pendingRequests.delete(m.id);
|
|
145
|
+
fatal(`Remote MCP endpoint error: ${err.message}`);
|
|
146
|
+
});
|
|
147
|
+
};
|
|
148
|
+
remote.onmessage = (message) => {
|
|
149
|
+
const m = message;
|
|
150
|
+
local
|
|
151
|
+
.send(message)
|
|
152
|
+
.catch((err) => {
|
|
153
|
+
fatal(`Failed to write to stdout: ${err.message}`);
|
|
154
|
+
})
|
|
155
|
+
.finally(() => {
|
|
156
|
+
// a message with an id and no method is a response to a local request
|
|
157
|
+
if (m.id !== undefined && m.method === undefined) {
|
|
158
|
+
pendingRequests.delete(m.id);
|
|
159
|
+
exitWhenDrained();
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
local.onerror = (err) => {
|
|
164
|
+
logErr(`Local transport error: ${err.message}`);
|
|
165
|
+
};
|
|
166
|
+
remote.onerror = (err) => {
|
|
167
|
+
logErr(`Remote transport error: ${err.message}`);
|
|
168
|
+
};
|
|
169
|
+
local.onclose = () => void shutdown(0);
|
|
170
|
+
remote.onclose = () => void shutdown(1);
|
|
171
|
+
// StdioServerTransport only listens for stdin data - EOF must end the proxy
|
|
172
|
+
process.stdin.on('end', () => {
|
|
173
|
+
stdinClosed = true;
|
|
174
|
+
setTimeout(() => void shutdown(0), 10000);
|
|
175
|
+
exitWhenDrained();
|
|
176
|
+
});
|
|
177
|
+
process.on('SIGINT', () => void shutdown(0));
|
|
178
|
+
process.on('SIGTERM', () => void shutdown(0));
|
|
179
|
+
try {
|
|
180
|
+
await remote.start();
|
|
181
|
+
await local.start();
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
fatal(`Failed to start MCP proxy: ${err instanceof Error ? err.message : err}`);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
logErr(`Buddy MCP proxy: forwarding stdio to ${mcpUrl.href}`);
|
|
188
|
+
});
|
|
189
|
+
exports.default = commandMcp;
|
|
@@ -6,6 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const utils_1 = require("../utils");
|
|
7
7
|
const output_1 = __importDefault(require("../output"));
|
|
8
8
|
const commandPre = async (_, command) => {
|
|
9
|
+
// commands whose stdout is machine-read (e.g. mcp) skip agent/version checks
|
|
10
|
+
// entirely - no banners and no startup latency from the version fetch
|
|
11
|
+
if (command.skipPre)
|
|
12
|
+
return;
|
|
9
13
|
const AgentManager = require('../agent/manager').default;
|
|
10
14
|
const ApiAgent = require('../tunnel/api/agent').default;
|
|
11
15
|
command.agentStatus = null;
|
package/distTs/src/texts.js
CHANGED
|
@@ -13,11 +13,11 @@ exports.DESC_COMMAND_SANDBOX_EXEC = exports.DESC_COMMAND_SANDBOX_STATUS = export
|
|
|
13
13
|
exports.DESC_COMMAND_SANDBOX_EXEC_STATUS = exports.DESC_COMMAND_SANDBOX_EXEC_LIST = exports.DESC_COMMAND_SANDBOX_APP_REMOVE = exports.DESC_COMMAND_SANDBOX_APP_ADD = exports.DESC_COMMAND_SANDBOX_APP_LIST = exports.TXT_SANDBOX_WAITING_START = exports.TXT_SANDBOX_WAITING_STOP = exports.TXT_SANDBOX_WAITING_APPS = exports.TXT_SANDBOX_WAITING_SETUP = exports.TXT_SANDBOX_WAITING_RUNNING = exports.TXT_SANDBOX_STOPPED = exports.TXT_SANDBOX_STARTED = exports.TXT_SANDBOX_DESTROYED = exports.TXT_SANDBOX_DESTROY_CONFIRM = exports.TXT_SANDBOX_UPDATED = exports.TXT_SANDBOX_CREATED = exports.TXT_SANDBOX_CREATING = exports.TXT_SANDBOX_APP_STARTED = exports.TXT_SANDBOX_APP_STOPPED = exports.OPTION_SANDBOX_WAIT = exports.OPTION_SANDBOX_WAIT_APPS = exports.OPTION_SANDBOX_WAIT_CONFIGURED = exports.OPTION_SANDBOX_WAIT_RUNNING = exports.ERR_SANDBOX_STOP_FAILED = exports.ERR_SANDBOX_NO_COMMANDS = exports.ERR_SANDBOX_RUNNING_FAILED = exports.ERR_SANDBOX_STOP_TIMEOUT = exports.ERR_SANDBOX_SNAPSHOT_TIMEOUT = exports.ERR_SANDBOX_RUNNING_TIMEOUT = exports.ERR_SANDBOX_APPS_TIMEOUT = exports.ERR_SANDBOX_SETUP_TIMEOUT = exports.ERR_SANDBOX_APP_FAILED = exports.ERR_SANDBOX_SETUP_FAILED = exports.ERR_SANDBOX_INVALID_RESOURCES = exports.ERR_SANDBOX_APP_NOT_FOUND = exports.ERR_SANDBOX_NOT_FOUND = exports.OPTION_SANDBOX_RUNTIME = exports.OPTION_SANDBOX_TIMEOUT = exports.OPTION_SANDBOX_FETCH = exports.OPTION_SANDBOX_APP_DIR = exports.OPTION_SANDBOX_APP_COMMAND = exports.OPTION_SANDBOX_YAML = exports.OPTION_SANDBOX_TAGS = exports.OPTION_SANDBOX_INSTALL_SCRIPT = exports.OPTION_SANDBOX_INSTALL_COMMANDS = exports.OPTION_SANDBOX_RESOURCES = exports.OPTION_SANDBOX_OS = exports.OPTION_SANDBOX_NAME = exports.OPTION_SANDBOX_IDENTIFIER = exports.DESC_COMMAND_SANDBOX_APP = void 0;
|
|
14
14
|
exports.OPTION_SANDBOX_CP_IGNORE = exports.OPTION_SANDBOX_CP_USER = exports.OPTION_SANDBOX_CP_DOWNLOAD_REPLACE = exports.OPTION_SANDBOX_CP_DOWNLOAD_MERGE = exports.OPTION_SANDBOX_CP_DEST = exports.OPTION_SANDBOX_CP_SOURCE = exports.DESC_COMMAND_SANDBOX_CP = exports.ERR_SANDBOX_ENDPOINTS_NOT_FOUND = exports.ERR_SANDBOX_ENDPOINT_NOT_FOUND = exports.ERR_SANDBOX_ENDPOINT_EXISTS = exports.TXT_SANDBOX_ENDPOINT_DELETED = exports.TXT_SANDBOX_ENDPOINT_DELETE_CONFIRM = exports.TXT_SANDBOX_ENDPOINT_ADDED = exports.TXT_SANDBOX_APP_REMOVED = exports.TXT_SANDBOX_APP_ADDED = exports.OPTION_SANDBOX_ENDPOINT_TYPE = exports.OPTION_SANDBOX_ENDPOINT_PORT = exports.OPTION_SANDBOX_ENDPOINT_NAME_ARG = exports.OPTION_SANDBOX_ENDPOINT_NAME = exports.DESC_COMMAND_SANDBOX_ENDPOINT_DELETE = exports.DESC_COMMAND_SANDBOX_ENDPOINT_ADD = exports.DESC_COMMAND_SANDBOX_ENDPOINT_GET = exports.DESC_COMMAND_SANDBOX_ENDPOINT_LIST = exports.DESC_COMMAND_SANDBOX_ENDPOINT = exports.ERR_SANDBOX_SNAPSHOTS_NOT_FOUND = exports.ERR_SANDBOX_SNAPSHOT_NOT_FOUND = exports.ERR_SANDBOX_SNAPSHOT_FAILED = exports.TXT_SANDBOX_SNAPSHOT_WAITING = exports.TXT_SANDBOX_SNAPSHOT_DELETE_CONFIRM = exports.TXT_SANDBOX_SNAPSHOT_DELETED = exports.TXT_SANDBOX_SNAPSHOT_CREATED = exports.OPTION_SANDBOX_FROM_SNAPSHOT = exports.OPTION_SANDBOX_SNAPSHOT_NAME_ARG = exports.OPTION_SANDBOX_SNAPSHOT_NAME = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_DELETE = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_GET = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_CREATE = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_LIST = exports.DESC_COMMAND_SANDBOX_SNAPSHOT = exports.TXT_SANDBOX_COMMAND_KILLED = exports.OPTION_SANDBOX_COMMAND_KILL_CONFIRM = exports.OPTION_SANDBOX_LOGS_LIMIT = exports.OPTION_SANDBOX_APP_ID = exports.OPTION_SANDBOX_COMMAND_ID = exports.DESC_COMMAND_SANDBOX_EXEC_KILL = exports.DESC_COMMAND_SANDBOX_EXEC_LOGS = exports.DESC_COMMAND_SANDBOX_APP_START = exports.DESC_COMMAND_SANDBOX_APP_STOP = exports.DESC_COMMAND_SANDBOX_APP_STATUS = exports.DESC_COMMAND_SANDBOX_APP_LOGS = void 0;
|
|
15
15
|
exports.OPT_COMMAND_API_INFO_URL = exports.OPT_COMMAND_API_INFO_SCHEMA = exports.OPT_COMMAND_API_INFO_METHOD = exports.OPT_COMMAND_API_LIST_SEARCH = exports.OPT_COMMAND_API_LIST_METHOD = exports.ERR_API_REQUEST_BODY_VALUE = exports.ERR_API_REQUEST_QUERY_VALUE = exports.ERR_API_REQUEST_INVALID_JSON = exports.ERR_API_REQUEST_FILE_ERROR = exports.ERR_API_REQUEST_OUTPUT_EXISTS = exports.DESC_COMMAND_API_INFO = exports.DESC_COMMAND_API_FORM = exports.DESC_COMMAND_API_JSON = exports.DESC_COMMAND_API_DATA = exports.DESC_COMMAND_API_OUTPUT = exports.DESC_COMMAND_API_REQUEST_QUERY = exports.DESC_COMMAND_API_PROJECT = exports.DESC_COMMAND_API_WORKSPACE = exports.DESC_COMMAND_API_REQUEST_URL = exports.DESC_COMMAND_API_GET = exports.DESC_COMMAND_API_PATCH = exports.DESC_COMMAND_API_DELETE = exports.DESC_COMMAND_API_PUT = exports.DESC_COMMAND_API_POST = exports.DESC_COMMAND_API_LIST = exports.DESC_COMMAND_API = exports.ERR_WHOAMI_LOGOUT = exports.TXT_WHOAMI_NO_WORKSPACE = exports.DESC_COMMAND_WHOAMI = exports.TXT_SANDBOX_EXEC_FAILED = exports.TXT_SANDBOX_EXEC_INPROGRESS = exports.TXT_SANDBOX_EXEC_SUCCESS = exports.TXT_SANDBOX_EXEC_BACKGROUND = exports.TXT_SANDBOX_EXEC_ID = exports.ERR_SANDBOX_CP_INVALID_SOURCE = exports.ERR_SANDBOX_CP_INVALID_DEST = exports.ERR_SANDBOX_CP_REPLACE = exports.ERR_SANDBOX_CP_MKDIR = exports.ERR_SANDBOX_CP_PATH_EXISTS = exports.ERR_SANDBOX_CP_NOT_EMPTY_DIR = exports.ERR_SANDBOX_CP_READDIR = exports.ERR_SANDBOX_CP_DEST_NOT_FOLDER = exports.ERR_SANDBOX_CP_SOURCE_NOT_FOUND = exports.TXT_SANDBOX_CP_DONE = exports.TXT_SANDBOX_CP_PROGRESS = exports.TXT_SANDBOX_UNZIPPING_COUNT = exports.TXT_SANDBOX_UNZIP_DONE = exports.TXT_SANDBOX_UNZIP = exports.TXT_SANDBOX_CP_DOWNLOAD_DONE = exports.TXT_SANDBOX_CP_DOWNLOAD = void 0;
|
|
16
|
-
exports.
|
|
17
|
-
exports.
|
|
18
|
-
exports.
|
|
19
|
-
exports.
|
|
20
|
-
exports.EXAMPLE_CRAWL_LINK = exports.EXAMPLE_CRAWL_RUN = exports.EXAMPLE_TESTS_CAPTURE = exports.EXAMPLE_TESTS_VISUAL_SESSION_CLOSE = exports.EXAMPLE_TESTS_VISUAL_SESSION_CREATE = exports.EXAMPLE_TESTS_VISUAL_LINK = exports.EXAMPLE_TESTS_VISUAL_UPLOAD = exports.EXAMPLE_TESTS_VISUAL_SETUP = exports.EXAMPLE_TESTS_UNIT_LINK = exports.EXAMPLE_TESTS_UNIT_UPLOAD = exports.EXAMPLE_ARTIFACT_VERSION_DELETE = exports.EXAMPLE_ARTIFACT_VERSION_GET = exports.EXAMPLE_ARTIFACT_VERSION_LIST = exports.EXAMPLE_ARTIFACT_CREATE = exports.EXAMPLE_ARTIFACT_DELETE = exports.EXAMPLE_ARTIFACT_DOWNLOAD = exports.EXAMPLE_ARTIFACT_PUBLISH = exports.EXAMPLE_ARTIFACT_VERSION_CREATE = void 0;
|
|
16
|
+
exports.DESC_COMMAND_ROUTE_CREATE = exports.DESC_COMMAND_DISTRO_CREATE = exports.DESC_COMMAND_DISTRO = exports.ERR_API_MESSAGE_REPLACER = exports.ERR_LOGIN_INVALID_BASE_URL = exports.ERR_LOGIN_NO_WORKSPACE_FOUND = exports.ERR_LOGIN_NO_WORKSPACES = exports.ERR_REGISTER_HTTP_CANCEL = exports.ERR_LOGIN_HTTP_CANCEL = exports.ERR_LOGIN_HTTP_FAILED = exports.ERR_LOGIN_HTTP_SERVER_PORT_TAKEN = exports.TXT_REGISTER_SUCCESS = exports.TXT_LOGIN_SUCCESS = exports.TXT_LOGIN_SELECT_WORKSPACE = exports.TXT_LOGIN_ENTER_BASE_URL = exports.TXT_LOGIN_PROVIDE_CODE = exports.TXT_REGISTER_OPEN_URL = exports.TXT_LOGIN_OPEN_URL = exports.TXT_REGISTER_OPENING_STAR = exports.TXT_LOGIN_OPENING_STAR = exports.TXT_REGISTER_OPENING = exports.TXT_LOGIN_OPENING = exports.TXT_LOGIN_SELECT_REGION = exports.TXT_WORKSPACE_NONE = exports.TXT_WORKSPACE_SET_SUCCESS = exports.ARG_COMMAND_WORKSPACE = exports.DESC_COMMAND_WORKSPACE_GET = exports.DESC_COMMAND_WORKSPACE_SET = exports.DESC_COMMAND_WORKSPACE_LIST = exports.DESC_COMMAND_WORKSPACE = exports.TXT_COMMAND_REGISTER_PROVIDE_NAME = exports.TXT_COMMAND_REGISTER_PROVIDE_EMAIL = exports.ERR_COMMAND_REGISTER_INVALID_NAME = exports.ERR_COMMAND_REGISTER_INVALID_EMAIL = exports.OPT_COMMAND_REGISTER_NAME = exports.OPT_COMMAND_REGISTER_EMAIL = exports.DESC_COMMAND_REGISTER = exports.TXT_LOGOUT_SUCCESS = exports.DESC_COMMAND_LOGOUT = exports.DESC_COMMAND_LOGIN = exports.ERR_MCP_REFRESH_FAILED = exports.ERR_MCP_URL_INVALID = exports.ERR_MCP_ENDPOINT = exports.DESC_COMMAND_MCP = exports.ERR_API_MEDIA_TYPE_NOT_IMPLEMENTED = exports.ERR_API_PARAMETER_NOT_REPLACED = exports.TXT_API_ENDPOINT_REQUIRED_SCOPES = exports.ERR_API_ENDPOINT_NOT_FOUND = exports.ERR_API_WRONG_METHOD = exports.ERR_SCHEMA_FETCH_FAILED = void 0;
|
|
17
|
+
exports.ERR_COMMAND_DOMAIN_UNAVAILABLE = exports.OPTION_COMMAND_DOMAIN_IDENTIFIER = exports.ERR_COMMAND_DOMAIN_NO_DOMAINS = exports.TXT_COMMAND_DOMAIN_PROMPT_REQUIRED = exports.TXT_COMMAND_DOMAIN_BUY_SELECT_DOMAIN = exports.TXT_COMMAND_DOMAIN_PROVIDE_PROMPT = exports.ERR_COMMAND_DOMAIN_NOT_FOUND = exports.OPT_COMMAND_DOMAIN_ONLY_AVAILABLE = exports.OPT_COMMAND_DOMAIN_SORT = exports.OPT_COMMAND_DOMAIN_PHRASE = exports.OPT_COMMAND_DOMAIN_BUY_OWNER = exports.OPT_COMMAND_DOMAIN_BUY_TLD = exports.DESC_COMMAND_DOMAIN_GET = exports.DESC_COMMAND_DOMAIN_LIST = exports.DESC_COMMAND_DOMAIN_SEARCH = exports.DESC_COMMAND_DOMAIN_BUY = exports.DESC_COMMAND_DOMAIN = exports.ERR_ROUTE_NO_DEFAULT = exports.ERR_WRONG_ROUTE_TARGET = exports.ERR_COMMAND_ROUTE_NO_TARGET = exports.ERR_COMMAND_ROUTE_TYPE = exports.TXT_COMMAND_ROUTES_NOT_FOUND = exports.TXT_COMMAND_DISTROS_NOT_FOUND = exports.TXT_COMMAND_ROUTE_DELETED = exports.TXT_COMMAND_DISTRO_DELETED = exports.TXT_COMMAND_ROUTE_DELETE_CONFIRM = exports.TXT_COMMAND_DISTRO_DELETE_CONFIRM = exports.ERR_COMMAND_ROUTE_NO_UPDATE = exports.ERR_COMMAND_DISTRO_NOT_FOUND = exports.ERR_COMMAND_SCOPE = exports.TXT_COMMAND_ROUTE_UPDATED = exports.TXT_ROUTE_SERVE = exports.TXT_COMMAND_ROUTE_CREATED = exports.TXT_COMMAND_DISTRO_CREATED = exports.ERR_COMMAND_SCOPE_NO_PROJECT = exports.OPT_COMMAND_DISTRO_NAME = exports.OPT_COMMAND_ROUTE_TARGET = exports.OPT_COMMAND_ROUTE_PATH = exports.OPT_COMMAND_ROUTE_DOMAIN = exports.OPT_COMMAND_ROUTE_SUBDOMAIN = exports.OPT_COMMAND_ROUTE_TYPE = exports.OPT_COMMAND_ROUTE_ID = exports.OPT_COMMAND_DISTRO_IDENTIFIER = exports.OPT_COMMAND_SCOPE = exports.DESC_COMMAND_ROUTE = exports.DESC_COMMAND_ROUTE_UPDATE = exports.DESC_COMMAND_ROUTE_DELETE = exports.DESC_COMMAND_ROUTE_LIST = exports.DESC_COMMAND_DISTRO_LIST = exports.DESC_COMMAND_DISTRO_DELETE = void 0;
|
|
18
|
+
exports.TXT_COMMAND_PROJECT_LINK_NOT_FOUND = exports.TXT_COMMAND_PROJECT_LINK_NAME = exports.TXT_COMMAND_PROJECT_LINK_SELECT_PROJECT = exports.TXT_COMMAND_PROJECT_LINK_TO = exports.TXT_COMMAND_PROJECT_LINK_EXISTING_DESC = exports.TXT_COMMAND_PROJECT_LINK_EXISTING = exports.TXT_COMMAND_PROJECT_LINK_CREATE_NEW_DESC = exports.TXT_COMMAND_PROJECT_LINK_CREATE_NEW = exports.ERR_COMMAND_PROJECT_LINK_DIR_NOT_DIR = exports.TXT_COMMAND_PROJECT_LINK_GIT_REPO_INITIALIZED = exports.TXT_COMMAND_PROJECT_LINK_GIT_REPO = exports.TXT_COMMAND_PROJECT_LINK_DIR_CONFIRM = exports.TXT_COMMAND_PROJECT_LINK_DIR_LINKED = exports.ERR_COMMAND_PROJECT_LINK_DIR_CREATE = exports.OPT_COMMAND_PROJECT_LINK_TRY_NOW = exports.OPT_COMMAND_PROJECT_LINK_SET_GIT_REMOTE = exports.OPT_COMMAND_PROJECT_LINK_HAS_REMOTE = exports.OPT_COMMAND_PROJECT_LINK_DIRECTORY = exports.OPT_COMMAND_PROJECT_LINK_GIT = exports.OPT_COMMAND_PROJECT_LINK_RELINK = exports.DESC_COMMAND_PROJECT_LINK = exports.DESC_COMMAND_PROJECT_LIST = exports.DESC_COMMAND_PROJECT_GIT = exports.DESC_COMMAND_PROJECT_GIT_CREDENTIAL = exports.DESC_COMMAND_PROJECT = exports.TXT_ARTIFACT_VERSION_DOWNLOAD = exports.TXT_ARTIFACT_PUBLISH = exports.TXT_ARTIFACT_CREATED = exports.TXT_ARTIFACT_VERSION_DELETED = exports.TXT_ARTIFACT_DELETED = exports.ERR_COMMAND_ARTIFACT_TYPE = exports.OPT_COMMAND_ARTIFACT_VERSION = exports.OPT_COMMAND_ARTIFACT_IDENTIFIER = exports.OPT_COMMAND_ARTIFACT_CREATE_IDENTIFIER = exports.OPT_COMMAND_ARTIFACT_NAME = exports.OPT_COMMAND_ARTIFACT_TYPE = exports.DESC_COMMAND_ARTIFACT_CREATE = exports.DESC_COMMAND_ARTIFACT_GET = exports.TXT_ARTIFACT_DOCKER_LOGIN_FAILED = exports.TXT_ARTIFACT_DOCKER_LOGIN_SUCCESS = exports.TXT_ARTIFACT_VERSION_DELETE_CONFIRM = exports.TXT_ARTIFACT_DELETE_CONFIRM = exports.DESC_COMMAND_ARTIFACT_DELETE = exports.ERR_COMMAND_ARTIFACT_NO_PROJECTS = exports.DESC_COMMAND_ARTIFACT_VERSION_GET = exports.DESC_COMMAND_ARTIFACT_VERSION_LIST = exports.DESC_COMMAND_ARTIFACT_VERSION_DELETE = exports.DESC_COMMAND_ARTIFACT_DOCKER_LOGIN = exports.DESC_COMMAND_ARTIFACT_LIST = exports.DESC_COMMAND_ARTIFACT_VERSION = void 0;
|
|
19
|
+
exports.EXAMPLE_PIPELINE_GET = exports.EXAMPLE_PIPELINE_UPDATE = exports.EXAMPLE_PIPELINE_DELETE = exports.EXAMPLE_PIPELINE_CREATE = exports.EXAMPLE_PIPELINE_RUN_CANCEL = exports.EXAMPLE_PIPELINE_RUN_APPLY = exports.EXAMPLE_PIPELINE_RUN_LOGS = exports.EXAMPLE_PIPELINE_RUN_JSONL = exports.EXAMPLE_PIPELINE_RUN_STATUS = exports.EXAMPLE_PIPELINE_RUN_START = exports.EXAMPLE_SANDBOX_ENDPOINT_LIST = exports.EXAMPLE_SANDBOX_ENDPOINT_GET = exports.EXAMPLE_SANDBOX_ENDPOINT_DELETE = exports.EXAMPLE_SANDBOX_ENDPOINT_CREATE = exports.EXAMPLE_SANDBOX_SNAPSHOT_LIST = exports.EXAMPLE_SANDBOX_SNAPSHOT_GET = exports.EXAMPLE_SANDBOX_SNAPSHOT_DELETE = exports.EXAMPLE_SANDBOX_SNAPSHOT_CREATE = exports.EXAMPLE_SANDBOX_EXEC_STATUS = exports.EXAMPLE_SANDBOX_EXEC_LOGS = exports.EXAMPLE_SANDBOX_APP_STATUS = exports.EXAMPLE_SANDBOX_APP_STOP = exports.EXAMPLE_SANDBOX_APP_REMOVE = exports.EXAMPLE_SANDBOX_APP_ADD = exports.EXAMPLE_SANDBOX_APP_START = exports.EXAMPLE_SANDBOX_APP_LOGS = exports.EXAMPLE_SANDBOX_EXEC_LIST = exports.EXAMPLE_SANDBOX_APP_LIST = exports.EXAMPLE_SANDBOX_EXEC_KILL = exports.EXAMPLE_SANDBOX_EXEC_COMMAND = exports.EXAMPLE_TUNNEL_START = exports.EXAMPLE_TUNNEL_TCP = exports.EXAMPLE_TUNNEL_TLS = exports.EXAMPLE_AGENT_TUNNEL_START = exports.EXAMPLE_AGENT_TUNNEL_STATUS = exports.EXAMPLE_AGENT_TUNNEL_REMOVE = exports.EXAMPLE_AGENT_TUNNEL_LIST = exports.EXAMPLE_TUNNEL_HTTP = exports.EXAMPLE_SANDBOX_CREATE = exports.EXAMPLE_DISTRO_CREATE = exports.EXAMPLE_ROUTE_CREATE = exports.EXAMPLE_ROUTE_LIST = exports.EXAMPLE_ROUTE_UPDATE = exports.EXAMPLE_ROUTE_DELETE = exports.EXAMPLE_DISTRO_DELETE = exports.EXAMPLE_DISTRO_LIST = exports.EXAMPLE_SANDBOX_CP = exports.ERR_PROJECT_NO_PROJECTS = exports.TXT_LOGIN_SELECT_PROJECT = exports.TXT_COMMAND_PROJECT_CREATED = void 0;
|
|
20
|
+
exports.EXAMPLE_CRAWL_LINK = exports.EXAMPLE_CRAWL_RUN = exports.EXAMPLE_TESTS_CAPTURE = exports.EXAMPLE_TESTS_VISUAL_SESSION_CLOSE = exports.EXAMPLE_TESTS_VISUAL_SESSION_CREATE = exports.EXAMPLE_TESTS_VISUAL_LINK = exports.EXAMPLE_TESTS_VISUAL_UPLOAD = exports.EXAMPLE_TESTS_VISUAL_SETUP = exports.EXAMPLE_TESTS_UNIT_LINK = exports.EXAMPLE_TESTS_UNIT_UPLOAD = exports.EXAMPLE_ARTIFACT_VERSION_DELETE = exports.EXAMPLE_ARTIFACT_VERSION_GET = exports.EXAMPLE_ARTIFACT_VERSION_LIST = exports.EXAMPLE_ARTIFACT_CREATE = exports.EXAMPLE_ARTIFACT_DELETE = exports.EXAMPLE_ARTIFACT_DOWNLOAD = exports.EXAMPLE_ARTIFACT_PUBLISH = exports.EXAMPLE_ARTIFACT_VERSION_CREATE = exports.EXAMPLE_PIPELINE_RUN_RETRY = exports.EXAMPLE_PIPELINE_RUN_LIST = exports.EXAMPLE_PIPELINE_LIST = exports.EXAMPLE_PIPELINE_YML = void 0;
|
|
21
21
|
const utils_1 = require("./utils");
|
|
22
22
|
exports.ERR_CANCELLED = 'Cancelled';
|
|
23
23
|
exports.ERR_REST_API_GENERAL_ERROR = 'Something went wrong';
|
|
@@ -826,6 +826,13 @@ const ERR_API_PARAMETER_NOT_REPLACED = (param) => `Replace URL parameter ${param
|
|
|
826
826
|
exports.ERR_API_PARAMETER_NOT_REPLACED = ERR_API_PARAMETER_NOT_REPLACED;
|
|
827
827
|
const ERR_API_MEDIA_TYPE_NOT_IMPLEMENTED = (type) => `Media type not implemented (${type})`;
|
|
828
828
|
exports.ERR_API_MEDIA_TYPE_NOT_IMPLEMENTED = ERR_API_MEDIA_TYPE_NOT_IMPLEMENTED;
|
|
829
|
+
// Mcp command
|
|
830
|
+
exports.DESC_COMMAND_MCP = 'Run a local stdio MCP server proxying to the Buddy remote MCP server';
|
|
831
|
+
const ERR_MCP_ENDPOINT = (host) => `Unable to resolve the MCP endpoint for '${host}'`;
|
|
832
|
+
exports.ERR_MCP_ENDPOINT = ERR_MCP_ENDPOINT;
|
|
833
|
+
const ERR_MCP_URL_INVALID = (url) => `Invalid MCP url: ${url}`;
|
|
834
|
+
exports.ERR_MCP_URL_INVALID = ERR_MCP_URL_INVALID;
|
|
835
|
+
exports.ERR_MCP_REFRESH_FAILED = 'Session expired and token refresh failed. Run `bdy login` to authenticate';
|
|
829
836
|
// Login command
|
|
830
837
|
exports.DESC_COMMAND_LOGIN = 'Log in to Buddy';
|
|
831
838
|
exports.DESC_COMMAND_LOGOUT = 'Log out from Buddy';
|
package/distTs/src/utils.js
CHANGED
|
@@ -44,6 +44,7 @@ exports.getAppWorkspaceUrl = getAppWorkspaceUrl;
|
|
|
44
44
|
exports.getAppWorkspaceSettingsUrl = getAppWorkspaceSettingsUrl;
|
|
45
45
|
exports.getAppUrl = getAppUrl;
|
|
46
46
|
exports.getDockerRegistryHostByApiBaseUrl = getDockerRegistryHostByApiBaseUrl;
|
|
47
|
+
exports.getMcpUrlByApiBaseUrl = getMcpUrlByApiBaseUrl;
|
|
47
48
|
exports.openApiPrepareUrl = openApiPrepareUrl;
|
|
48
49
|
exports.getOpenApiEndpointByApiBaseUrl = getOpenApiEndpointByApiBaseUrl;
|
|
49
50
|
exports.isValidDomain = isValidDomain;
|
|
@@ -629,8 +630,8 @@ function getDockerRegistryHostByApiBaseUrl(baseUrl) {
|
|
|
629
630
|
else if (baseUrl.hostname.includes('api.eu.buddy.works')) {
|
|
630
631
|
return 'container.eu.registry.sh';
|
|
631
632
|
}
|
|
632
|
-
else if (baseUrl.hostname.includes('api.
|
|
633
|
-
return 'container.
|
|
633
|
+
else if (baseUrl.hostname.includes('api.asia.buddy.works')) {
|
|
634
|
+
return 'container.asia.registry.sh';
|
|
634
635
|
}
|
|
635
636
|
else if (baseUrl.hostname.includes('api.awsdev.net')) {
|
|
636
637
|
return 'container.awsdev.net';
|
|
@@ -684,6 +685,21 @@ function getDockerRegistryHostByApiBaseUrl(baseUrl) {
|
|
|
684
685
|
return baseUrl.hostname;
|
|
685
686
|
}
|
|
686
687
|
}
|
|
688
|
+
// Region MCP hosts mirror REST_API_ENDPOINT (api.* -> mcp.*). Returns null for
|
|
689
|
+
// hosts without a known MCP endpoint (onprem/dev) - callers must point
|
|
690
|
+
// BUDDY_MCP_ENDPOINT at it.
|
|
691
|
+
function getMcpUrlByApiBaseUrl(baseUrl) {
|
|
692
|
+
if (baseUrl.hostname.includes('api.eu.buddy.works')) {
|
|
693
|
+
return 'https://mcp.eu.buddy.works/mcp';
|
|
694
|
+
}
|
|
695
|
+
else if (baseUrl.hostname.includes('api.asia.buddy.works')) {
|
|
696
|
+
return 'https://mcp.asia.buddy.works/mcp';
|
|
697
|
+
}
|
|
698
|
+
else if (baseUrl.hostname.includes('api.buddy.works')) {
|
|
699
|
+
return 'https://mcp.buddy.works/mcp';
|
|
700
|
+
}
|
|
701
|
+
return null;
|
|
702
|
+
}
|
|
687
703
|
function openApiPrepareUrl(url, workspace, project) {
|
|
688
704
|
let preparedUrl = url.replaceAll('{workspace_domain}', workspace);
|
|
689
705
|
if (project)
|
|
@@ -693,7 +709,7 @@ function openApiPrepareUrl(url, workspace, project) {
|
|
|
693
709
|
function getOpenApiEndpointByApiBaseUrl(baseUrl) {
|
|
694
710
|
if (baseUrl.hostname.includes('api.buddy.works') ||
|
|
695
711
|
baseUrl.hostname.includes('api.eu.buddy.works') ||
|
|
696
|
-
baseUrl.hostname.includes('api.
|
|
712
|
+
baseUrl.hostname.includes('api.asia.buddy.works')) {
|
|
697
713
|
return 'https://es.buddy.works/openapi/production/restapi.json';
|
|
698
714
|
}
|
|
699
715
|
else if (baseUrl.hostname.includes('api.awsstage.net') ||
|
|
@@ -833,8 +849,8 @@ function getAppHostByApiBaseUrl(baseUrl) {
|
|
|
833
849
|
else if (baseUrl.hostname.includes('api.eu.buddy.works')) {
|
|
834
850
|
return 'eu.buddy.works';
|
|
835
851
|
}
|
|
836
|
-
else if (baseUrl.hostname.includes('api.
|
|
837
|
-
return '
|
|
852
|
+
else if (baseUrl.hostname.includes('api.asia.buddy.works')) {
|
|
853
|
+
return 'asia.buddy.works';
|
|
838
854
|
}
|
|
839
855
|
else if (baseUrl.hostname.includes('api.awsdev.net')) {
|
|
840
856
|
return 'app.awsdev.net';
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bdy",
|
|
3
3
|
"preferGlobal": false,
|
|
4
|
-
"version": "1.22.
|
|
4
|
+
"version": "1.22.89-beta",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://buddy.works/docs/cli",
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"e2e:artifact": "vitest run --config e2e/vitest.config.ts e2e/modules/artifact/",
|
|
23
23
|
"e2e:sandbox": "vitest run --config e2e/vitest.config.ts e2e/modules/sandbox/",
|
|
24
24
|
"e2e:api": "vitest run --config e2e/vitest.config.ts e2e/modules/api/",
|
|
25
|
+
"e2e:mcp": "vitest run --config e2e/vitest.config.ts e2e/modules/mcp/",
|
|
25
26
|
"e2e:pipeline": "vitest run --config e2e/vitest.config.ts e2e/modules/pipeline/",
|
|
26
27
|
"e2e:tunnel": "vitest run --config e2e/vitest.config.ts e2e/modules/tunnel/",
|
|
27
28
|
"e2e:agent": "vitest run --config e2e/vitest.config.ts e2e/modules/agent/",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"@fastify/accept-negotiator": "2.0.1",
|
|
42
43
|
"@fastify/cors": "11.2.0",
|
|
43
44
|
"@inquirer/prompts": "8.5.2",
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
44
46
|
"@puppeteer/browsers": "2.13.0",
|
|
45
47
|
"@scalar/json-magic": "0.12.16",
|
|
46
48
|
"@scalar/openapi-parser": "0.28.7",
|
|
@@ -83,12 +85,12 @@
|
|
|
83
85
|
"zod": "3.25.76"
|
|
84
86
|
},
|
|
85
87
|
"devDependencies": {
|
|
86
|
-
"@scalar/types": "0.13.2",
|
|
87
88
|
"@eslint/js": "10.0.1",
|
|
88
89
|
"@rollup/plugin-commonjs": "29.0.3",
|
|
89
90
|
"@rollup/plugin-json": "6.1.0",
|
|
90
91
|
"@rollup/plugin-node-resolve": "16.0.3",
|
|
91
92
|
"@rollup/plugin-replace": "6.0.3",
|
|
93
|
+
"@scalar/types": "0.13.2",
|
|
92
94
|
"@stylistic/eslint-plugin": "5.10.0",
|
|
93
95
|
"@types/basic-auth": "1.1.8",
|
|
94
96
|
"@types/content-disposition": "0.5.9",
|