@floomhq/floom 3.0.4 → 5.0.0
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/LICENSE +6 -0
- package/README.md +346 -168
- package/bin/floom-mcp +9 -0
- package/bin/workeros-mcp +13 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +336 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/completion.d.ts +2 -0
- package/dist/commands/completion.js +81 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/connections.d.ts +22 -0
- package/dist/commands/connections.js +158 -0
- package/dist/commands/connections.js.map +1 -0
- package/dist/commands/contexts.d.ts +34 -0
- package/dist/commands/contexts.js +247 -0
- package/dist/commands/contexts.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.js +158 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/login.d.ts +14 -0
- package/dist/commands/login.js +349 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +1 -0
- package/dist/commands/logout.js +15 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/mcp.d.ts +42 -0
- package/dist/commands/mcp.js +382 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/run.d.ts +15 -0
- package/dist/commands/run.js +154 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/runs.d.ts +25 -0
- package/dist/commands/runs.js +324 -0
- package/dist/commands/runs.js.map +1 -0
- package/dist/commands/secrets.d.ts +9 -0
- package/dist/commands/secrets.js +97 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.js +70 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/commands/workers.d.ts +30 -0
- package/dist/commands/workers.js +773 -0
- package/dist/commands/workers.js.map +1 -0
- package/dist/commands/workspaces.d.ts +10 -0
- package/dist/commands/workspaces.js +171 -0
- package/dist/commands/workspaces.js.map +1 -0
- package/dist/lib/api.d.ts +38 -0
- package/dist/lib/api.js +311 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/cli-errors.d.ts +1 -0
- package/dist/lib/cli-errors.js +20 -0
- package/dist/lib/cli-errors.js.map +1 -0
- package/dist/lib/command-name.d.ts +4 -0
- package/dist/lib/command-name.js +23 -0
- package/dist/lib/command-name.js.map +1 -0
- package/dist/lib/credentials.d.ts +21 -0
- package/dist/lib/credentials.js +126 -0
- package/dist/lib/credentials.js.map +1 -0
- package/dist/lib/output.d.ts +18 -0
- package/dist/lib/output.js +44 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/prompt.d.ts +2 -0
- package/dist/lib/prompt.js +55 -0
- package/dist/lib/prompt.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.js +1171 -0
- package/dist/server.js.map +1 -0
- package/package.json +43 -51
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -8276
- package/dist/version.d.ts +0 -1
- package/dist/version.js +0 -1
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import open from "open";
|
|
2
|
+
import { mkdir, open as openFile, readFile, rm } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { FloomApiClient, FloomApiError, resolveLoginApiBase, } from "../lib/api.js";
|
|
5
|
+
import { promptYesNo } from "../lib/prompt.js";
|
|
6
|
+
import { getCommandName } from "../lib/command-name.js";
|
|
7
|
+
import { log } from "../lib/output.js";
|
|
8
|
+
import { writeCredentials, credentialsPath, } from "../lib/credentials.js";
|
|
9
|
+
function sleep(ms) {
|
|
10
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
11
|
+
}
|
|
12
|
+
function loginLockPath() {
|
|
13
|
+
return join(dirname(credentialsPath()), "login.lock");
|
|
14
|
+
}
|
|
15
|
+
function processAppearsAlive(pid) {
|
|
16
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
17
|
+
return false;
|
|
18
|
+
try {
|
|
19
|
+
process.kill(pid, 0);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function acquireLoginLock() {
|
|
27
|
+
const path = loginLockPath();
|
|
28
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
29
|
+
const payload = {
|
|
30
|
+
pid: process.pid,
|
|
31
|
+
started_at: new Date().toISOString(),
|
|
32
|
+
};
|
|
33
|
+
try {
|
|
34
|
+
const handle = await openFile(path, "wx", 0o600);
|
|
35
|
+
await handle.writeFile(JSON.stringify(payload, null, 2) + "\n", "utf8");
|
|
36
|
+
await handle.close();
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
const existing = await readFile(path, "utf8").then((raw) => JSON.parse(raw), () => ({}));
|
|
40
|
+
const pid = typeof existing.pid === "number" ? existing.pid : 0;
|
|
41
|
+
if (processAppearsAlive(pid)) {
|
|
42
|
+
throw new Error(`Another ${getCommandName()} login is already running (pid ${pid}). ` +
|
|
43
|
+
"Finish it or stop that process before starting a new device code.");
|
|
44
|
+
}
|
|
45
|
+
await rm(path, { force: true });
|
|
46
|
+
const handle = await openFile(path, "wx", 0o600);
|
|
47
|
+
await handle.writeFile(JSON.stringify(payload, null, 2) + "\n", "utf8");
|
|
48
|
+
await handle.close();
|
|
49
|
+
}
|
|
50
|
+
return async () => {
|
|
51
|
+
const existing = await readFile(path, "utf8").then((raw) => JSON.parse(raw), () => ({}));
|
|
52
|
+
if (existing.pid === process.pid) {
|
|
53
|
+
await rm(path, { force: true });
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function retryAfterSecondsFromBody(body) {
|
|
58
|
+
if (!body || typeof body !== "object")
|
|
59
|
+
return null;
|
|
60
|
+
const detail = "detail" in body ? body.detail : undefined;
|
|
61
|
+
if (!detail || typeof detail !== "object")
|
|
62
|
+
return null;
|
|
63
|
+
const retryAfter = detail.retry_after;
|
|
64
|
+
if (typeof retryAfter === "number" && Number.isFinite(retryAfter) && retryAfter > 0) {
|
|
65
|
+
return retryAfter;
|
|
66
|
+
}
|
|
67
|
+
if (typeof retryAfter === "string") {
|
|
68
|
+
const parsed = Number(retryAfter);
|
|
69
|
+
if (Number.isFinite(parsed) && parsed > 0)
|
|
70
|
+
return parsed;
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
function retryAfterSecondsFromHeader(headers) {
|
|
75
|
+
const raw = headers?.get("retry-after");
|
|
76
|
+
if (!raw)
|
|
77
|
+
return null;
|
|
78
|
+
const seconds = Number(raw);
|
|
79
|
+
if (Number.isFinite(seconds) && seconds > 0)
|
|
80
|
+
return seconds;
|
|
81
|
+
const dateMs = Date.parse(raw);
|
|
82
|
+
if (Number.isFinite(dateMs)) {
|
|
83
|
+
return Math.max(1, Math.ceil((dateMs - Date.now()) / 1000));
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
export function cloudRateLimitRetryMs(error, pollingIntervalSeconds) {
|
|
88
|
+
const retryAfterSeconds = retryAfterSecondsFromHeader(error.headers) ?? retryAfterSecondsFromBody(error.body);
|
|
89
|
+
const fallbackSeconds = Math.max(pollingIntervalSeconds, 5);
|
|
90
|
+
return Math.ceil((retryAfterSeconds ?? fallbackSeconds) * 1000);
|
|
91
|
+
}
|
|
92
|
+
// Heuristic: the cloud verification_url points at floom.example.com
|
|
93
|
+
// (or /app/cli-auth). The OSS engine points at localhost:3000/cli-auth.
|
|
94
|
+
// Lets the CLI auto-detect cloud-vs-oss even when --cloud is omitted, so a
|
|
95
|
+
// user running `floom login` against WORKEROS_API_BASE=<cloud> still gets
|
|
96
|
+
// the right flow.
|
|
97
|
+
function detectCloudFromVerificationUrl(url) {
|
|
98
|
+
try {
|
|
99
|
+
const u = new URL(url);
|
|
100
|
+
if (u.hostname === "floom.example.com")
|
|
101
|
+
return true;
|
|
102
|
+
if (u.pathname.startsWith("/app/"))
|
|
103
|
+
return true;
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function fetchCloudBootstrap(apiBase) {
|
|
111
|
+
// Optional: cloud may expose /auth/cli-bootstrap to hand the CLI the
|
|
112
|
+
// Supabase project URL + anon key it needs to refresh JWTs. If absent,
|
|
113
|
+
// the cli-exchange response carries the same fields and we still succeed.
|
|
114
|
+
try {
|
|
115
|
+
const response = await fetch(`${apiBase}/auth/cli-bootstrap`, {
|
|
116
|
+
headers: { accept: "application/json" },
|
|
117
|
+
});
|
|
118
|
+
if (!response.ok)
|
|
119
|
+
return null;
|
|
120
|
+
const parsed = (await response.json());
|
|
121
|
+
if (parsed.supabase_url && parsed.supabase_anon_key) {
|
|
122
|
+
return {
|
|
123
|
+
supabase_url: parsed.supabase_url,
|
|
124
|
+
supabase_anon_key: parsed.supabase_anon_key,
|
|
125
|
+
api_base: parsed.api_base,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
export async function runLoginCommand(options = {}) {
|
|
135
|
+
const releaseLoginLock = await acquireLoginLock();
|
|
136
|
+
try {
|
|
137
|
+
log.heading("Login");
|
|
138
|
+
log.step("Requesting device authorization...");
|
|
139
|
+
const loginApiBase = resolveLoginApiBase(options);
|
|
140
|
+
const client = new FloomApiClient(loginApiBase);
|
|
141
|
+
// The engine endpoint /cli-auth/devices lives at /api/cli-auth/devices
|
|
142
|
+
// when the cloud FastAPI app mounts the engine under /api. We don't have
|
|
143
|
+
// saved credentials yet, so resolvePath in the client can't help. Probe
|
|
144
|
+
// the hosted path first when --cloud (or WORKEROS_CLOUD=1) is set;
|
|
145
|
+
// otherwise default to the OSS path.
|
|
146
|
+
const explicitCloud = options.cloud === true ||
|
|
147
|
+
(process.env.WORKEROS_CLOUD || "").trim() === "1" ||
|
|
148
|
+
(process.env.WORKEROS_CLOUD || "").trim().toLowerCase() === "true";
|
|
149
|
+
const devicesPath = explicitCloud ? "/api/cli-auth/devices" : "/cli-auth/devices";
|
|
150
|
+
const pollPathPrefix = explicitCloud ? "/api/cli-auth/poll" : "/cli-auth/poll";
|
|
151
|
+
const started = (await client.requestJson("POST", devicesPath, {
|
|
152
|
+
auth: false,
|
|
153
|
+
body: { client_name: "floom-cli", scopes: [] },
|
|
154
|
+
}));
|
|
155
|
+
log.ok(`Open: ${started.verification_url}`);
|
|
156
|
+
// Anti-phishing: show the user_code prominently and tell the user to verify
|
|
157
|
+
// it matches the code on the approval page. A device flow approval can be
|
|
158
|
+
// phished (an attacker starts a flow and tricks the owner into approving it),
|
|
159
|
+
// so the only safe approval is one where the code on screen equals the code
|
|
160
|
+
// shown HERE, in the terminal the user actually started.
|
|
161
|
+
log.heading(`Verification code: ${started.user_code}`);
|
|
162
|
+
log.warn("Approve ONLY if this exact code appears on the page. " +
|
|
163
|
+
"If it differs, someone may be trying to hijack your login — deny it.");
|
|
164
|
+
const shouldOpen = await promptYesNo("Or open the URL automatically? [Y/n] ", true);
|
|
165
|
+
if (shouldOpen) {
|
|
166
|
+
try {
|
|
167
|
+
await open(started.verification_url);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Best effort only.
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const isCloud = options.cloud === true || detectCloudFromVerificationUrl(started.verification_url);
|
|
174
|
+
log.step("Waiting for approval... (Ctrl+C to cancel)");
|
|
175
|
+
const deadline = Date.now() + started.expires_in_seconds * 1000;
|
|
176
|
+
while (Date.now() < deadline) {
|
|
177
|
+
try {
|
|
178
|
+
if (isCloud) {
|
|
179
|
+
const result = await pollCloudExchange({
|
|
180
|
+
client,
|
|
181
|
+
loginApiBase,
|
|
182
|
+
deviceCode: started.device_code,
|
|
183
|
+
userCode: started.user_code,
|
|
184
|
+
});
|
|
185
|
+
if (result === "pending") {
|
|
186
|
+
await sleep(started.polling_interval_seconds * 1000);
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
const polled = (await client.requestJson("GET", `${pollPathPrefix}/${encodeURIComponent(started.device_code)}`, { auth: false }));
|
|
192
|
+
if (polled.status === "pending") {
|
|
193
|
+
await sleep(started.polling_interval_seconds * 1000);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (polled.status === "approved") {
|
|
197
|
+
const creds = {
|
|
198
|
+
api_base: polled.api_base,
|
|
199
|
+
mode: "oss",
|
|
200
|
+
api_secret: polled.api_secret,
|
|
201
|
+
authed_at: new Date().toISOString(),
|
|
202
|
+
};
|
|
203
|
+
await writeCredentials(creds);
|
|
204
|
+
log.ok(`Logged in`);
|
|
205
|
+
log.kv("API", polled.api_base);
|
|
206
|
+
log.kv("Token saved to", credentialsPath());
|
|
207
|
+
log.blank();
|
|
208
|
+
log.info(`Try: ${getCommandName()} workers list`);
|
|
209
|
+
return 0;
|
|
210
|
+
}
|
|
211
|
+
await sleep(started.polling_interval_seconds * 1000);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
if (error instanceof FloomApiError) {
|
|
215
|
+
if (error.status === 403) {
|
|
216
|
+
log.err("CLI authorization was denied.");
|
|
217
|
+
log.info(`Run: ${getCommandName()} login to try again`);
|
|
218
|
+
return 1;
|
|
219
|
+
}
|
|
220
|
+
if (error.status === 410) {
|
|
221
|
+
log.err("Device code expired before approval.");
|
|
222
|
+
log.info(`Run: ${getCommandName()} login to start a new session`);
|
|
223
|
+
return 1;
|
|
224
|
+
}
|
|
225
|
+
if (error.status === 404) {
|
|
226
|
+
// Hosted: 404 from /auth/cli-exchange means the user code has not
|
|
227
|
+
// yet been approved by a signed-in dashboard user. Keep polling.
|
|
228
|
+
if (isCloud) {
|
|
229
|
+
await sleep(started.polling_interval_seconds * 1000);
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
log.err("Device code not found.");
|
|
233
|
+
log.info(`Run: ${getCommandName()} login to start a new session`);
|
|
234
|
+
return 1;
|
|
235
|
+
}
|
|
236
|
+
if (error.status === 409 && isCloud) {
|
|
237
|
+
// Hosted: device code is still pending approval.
|
|
238
|
+
await sleep(started.polling_interval_seconds * 1000);
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if (error.status === 429 && isCloud) {
|
|
242
|
+
// Hosted: pending approval polls can collide with the cloud rate
|
|
243
|
+
// limiter. Treat it as OAuth device-flow slow_down and honor the
|
|
244
|
+
// server retry window so we do not keep re-tripping the same bucket.
|
|
245
|
+
const retryMs = cloudRateLimitRetryMs(error, started.polling_interval_seconds);
|
|
246
|
+
await sleep(Math.min(retryMs, Math.max(0, deadline - Date.now())));
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
throw error;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
log.err("Timed out waiting for CLI approval.");
|
|
254
|
+
log.info(`Run: ${getCommandName()} login to try again`);
|
|
255
|
+
return 1;
|
|
256
|
+
}
|
|
257
|
+
finally {
|
|
258
|
+
await releaseLoginLock();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async function pollCloudExchange(args) {
|
|
262
|
+
const { client, loginApiBase, deviceCode, userCode } = args;
|
|
263
|
+
const exchanged = (await client.requestJson("POST", "/auth/cli-exchange", {
|
|
264
|
+
auth: false,
|
|
265
|
+
body: { device_code: deviceCode, user_code: userCode },
|
|
266
|
+
}));
|
|
267
|
+
let supabaseUrl = exchanged.supabase_url;
|
|
268
|
+
let supabaseAnonKey = exchanged.supabase_anon_key;
|
|
269
|
+
let apiBase = exchanged.api_base || loginApiBase;
|
|
270
|
+
if (exchanged.api_token) {
|
|
271
|
+
const creds = {
|
|
272
|
+
api_base: apiBase,
|
|
273
|
+
mode: "cloud",
|
|
274
|
+
api_token: exchanged.api_token,
|
|
275
|
+
authed_at: new Date().toISOString(),
|
|
276
|
+
};
|
|
277
|
+
return saveCloudCredentials(creds, apiBase);
|
|
278
|
+
}
|
|
279
|
+
if (!exchanged.refresh_token) {
|
|
280
|
+
throw new Error("Hosted login succeeded but the server did not return a usable CLI credential.");
|
|
281
|
+
}
|
|
282
|
+
if (!supabaseUrl || !supabaseAnonKey) {
|
|
283
|
+
const bootstrap = await fetchCloudBootstrap(loginApiBase);
|
|
284
|
+
if (!bootstrap) {
|
|
285
|
+
throw new Error("Hosted login succeeded but the server did not return supabase_url / supabase_anon_key. " +
|
|
286
|
+
"Upgrade the cloud API to include /auth/cli-bootstrap or extend /auth/cli-exchange.");
|
|
287
|
+
}
|
|
288
|
+
supabaseUrl = supabaseUrl || bootstrap.supabase_url;
|
|
289
|
+
supabaseAnonKey = supabaseAnonKey || bootstrap.supabase_anon_key;
|
|
290
|
+
apiBase = exchanged.api_base || bootstrap.api_base || loginApiBase;
|
|
291
|
+
}
|
|
292
|
+
const creds = {
|
|
293
|
+
api_base: apiBase,
|
|
294
|
+
mode: "cloud",
|
|
295
|
+
refresh_token: exchanged.refresh_token,
|
|
296
|
+
supabase_url: supabaseUrl,
|
|
297
|
+
supabase_anon_key: supabaseAnonKey,
|
|
298
|
+
authed_at: new Date().toISOString(),
|
|
299
|
+
};
|
|
300
|
+
return saveCloudCredentials(creds, apiBase);
|
|
301
|
+
}
|
|
302
|
+
async function saveCloudCredentials(creds, apiBase) {
|
|
303
|
+
const workspace = await resolveInitialCloudWorkspace(creds);
|
|
304
|
+
const savedCreds = {
|
|
305
|
+
...creds,
|
|
306
|
+
...(workspace
|
|
307
|
+
? {
|
|
308
|
+
workspace_id: workspace.id,
|
|
309
|
+
workspace_name: workspace.name || workspace.id,
|
|
310
|
+
}
|
|
311
|
+
: {}),
|
|
312
|
+
};
|
|
313
|
+
await writeCredentials(savedCreds);
|
|
314
|
+
log.ok(`Logged in`);
|
|
315
|
+
log.kv("API", apiBase);
|
|
316
|
+
if (workspace) {
|
|
317
|
+
log.kv("Workspace", `${workspace.name || workspace.id} (${workspace.id})`);
|
|
318
|
+
}
|
|
319
|
+
log.kv("Token saved to", credentialsPath());
|
|
320
|
+
log.blank();
|
|
321
|
+
if (workspace) {
|
|
322
|
+
log.info(`Tip: run \`${getCommandName()} workers list\` to inspect this workspace.`);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
log.info(`Tip: run \`${getCommandName()} workspaces list\` to pick a workspace.`);
|
|
326
|
+
}
|
|
327
|
+
return 0;
|
|
328
|
+
}
|
|
329
|
+
export async function resolveInitialCloudWorkspace(credentials) {
|
|
330
|
+
try {
|
|
331
|
+
const client = new FloomApiClient(credentials.api_base, credentials);
|
|
332
|
+
const data = (await client.requestJson("GET", "/workspaces"));
|
|
333
|
+
const workspaces = Array.isArray(data.workspaces) ? data.workspaces : [];
|
|
334
|
+
if (data.active_id) {
|
|
335
|
+
const active = workspaces.find((row) => row.id === data.active_id);
|
|
336
|
+
if (active)
|
|
337
|
+
return active;
|
|
338
|
+
return { id: data.active_id, name: data.active_id };
|
|
339
|
+
}
|
|
340
|
+
if (workspaces.length === 1) {
|
|
341
|
+
return workspaces[0];
|
|
342
|
+
}
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
return null;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runLogoutCommand(): Promise<number>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { clearCredentials } from "../lib/credentials.js";
|
|
2
|
+
import { getCommandName } from "../lib/command-name.js";
|
|
3
|
+
import { log } from "../lib/output.js";
|
|
4
|
+
export async function runLogoutCommand() {
|
|
5
|
+
const removed = await clearCredentials();
|
|
6
|
+
if (removed) {
|
|
7
|
+
log.ok("Logged out.");
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
log.warn("No saved credentials were found.");
|
|
11
|
+
log.info(`Run: ${getCommandName()} login to authenticate`);
|
|
12
|
+
}
|
|
13
|
+
return 0;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACzC,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC7C,GAAG,CAAC,IAAI,CAAC,QAAQ,cAAc,EAAE,wBAAwB,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
declare const FILE_CLIENTS: readonly [{
|
|
2
|
+
readonly target: "claude";
|
|
3
|
+
readonly name: "Claude Code";
|
|
4
|
+
readonly path: ".claude/settings.json";
|
|
5
|
+
readonly kind: "object";
|
|
6
|
+
}, {
|
|
7
|
+
readonly target: "cursor";
|
|
8
|
+
readonly name: "Cursor";
|
|
9
|
+
readonly path: ".cursor/mcp.json";
|
|
10
|
+
readonly kind: "object";
|
|
11
|
+
}, {
|
|
12
|
+
readonly target: "windsurf";
|
|
13
|
+
readonly name: "Windsurf";
|
|
14
|
+
readonly path: ".codeium/windsurf/mcp_config.json";
|
|
15
|
+
readonly kind: "object";
|
|
16
|
+
}, {
|
|
17
|
+
readonly target: "vscode";
|
|
18
|
+
readonly name: "VS Code";
|
|
19
|
+
readonly path: ".vscode/mcp.json";
|
|
20
|
+
readonly kind: "object";
|
|
21
|
+
}, {
|
|
22
|
+
readonly target: "continue";
|
|
23
|
+
readonly name: "Continue";
|
|
24
|
+
readonly path: ".continue/.continuerc.json";
|
|
25
|
+
readonly kind: "array";
|
|
26
|
+
}];
|
|
27
|
+
type FileTarget = (typeof FILE_CLIENTS)[number]["target"];
|
|
28
|
+
export type ClientTarget = FileTarget | "generic";
|
|
29
|
+
export declare function mcpInstallCommand(options: {
|
|
30
|
+
target?: ClientTarget;
|
|
31
|
+
}): Promise<number>;
|
|
32
|
+
export declare function mcpUninstallCommand(options: {
|
|
33
|
+
target?: ClientTarget;
|
|
34
|
+
}): Promise<number>;
|
|
35
|
+
export declare function mcpListCommand(options: {
|
|
36
|
+
json?: boolean;
|
|
37
|
+
}): Promise<number>;
|
|
38
|
+
export declare function mcpSwitchCommand(target: string): Promise<number>;
|
|
39
|
+
export declare function mcpTestCommand(target: string | undefined, options: {
|
|
40
|
+
json?: boolean;
|
|
41
|
+
}): Promise<number>;
|
|
42
|
+
export {};
|