@floomhq/floom 3.1.0 → 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 -8278
- package/dist/version.d.ts +0 -1
- package/dist/version.js +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { FloomApiError } from "./api.js";
|
|
2
|
+
import { getCommandName } from "./command-name.js";
|
|
3
|
+
import { log } from "./output.js";
|
|
4
|
+
// Maps auth failures to a friendly message + exit code 1; returns null for
|
|
5
|
+
// everything else so callers can rethrow.
|
|
6
|
+
export function handleAuthError(error) {
|
|
7
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
8
|
+
if (message.includes("Not logged in")) {
|
|
9
|
+
log.err("Not authenticated.");
|
|
10
|
+
process.stderr.write(`Run: ${getCommandName()} login\n`);
|
|
11
|
+
return 1;
|
|
12
|
+
}
|
|
13
|
+
if (error instanceof FloomApiError && (error.status === 401 || error.status === 403)) {
|
|
14
|
+
log.err("Your session expired.");
|
|
15
|
+
process.stderr.write(`Re-run: ${getCommandName()} login\n`);
|
|
16
|
+
return 1;
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=cli-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-errors.js","sourceRoot":"","sources":["../../src/lib/cli-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,2EAA2E;AAC3E,0CAA0C;AAC1C,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACtC,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,cAAc,EAAE,UAAU,CAAC,CAAC;QACzD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,YAAY,aAAa,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,cAAc,EAAE,UAAU,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
// Name of the binary the user actually invoked, captured once by main() so
|
|
3
|
+
// every command, hint, and generated script renders the same name.
|
|
4
|
+
let invokedCommandName = null;
|
|
5
|
+
// Resolve the invoked binary name from argv[1]'s basename. npm installs both
|
|
6
|
+
// `workeros` and `floom` bins pointing at the same script, so the basename of
|
|
7
|
+
// the executed path tells us which alias the user ran. Anything else (e.g. the
|
|
8
|
+
// raw `cli.js` path used in tests) falls back to the legacy `floom` name.
|
|
9
|
+
export function resolveCommandName(argv = process.argv) {
|
|
10
|
+
const invoked = argv[1] ? basename(argv[1]) : "";
|
|
11
|
+
return invoked === "workeros" ? "workeros" : "floom";
|
|
12
|
+
}
|
|
13
|
+
// Record the invoked name so downstream command/message code renders it.
|
|
14
|
+
export function setCommandName(name) {
|
|
15
|
+
invokedCommandName = name;
|
|
16
|
+
}
|
|
17
|
+
// The invoked binary name for user-facing hints, scripts, and headers. Falls
|
|
18
|
+
// back to resolving from argv when main() has not run (e.g. unit tests calling
|
|
19
|
+
// a command function directly).
|
|
20
|
+
export function getCommandName() {
|
|
21
|
+
return invokedCommandName ?? resolveCommandName();
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=command-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-name.js","sourceRoot":"","sources":["../../src/lib/command-name.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAIrC,2EAA2E;AAC3E,mEAAmE;AACnE,IAAI,kBAAkB,GAAuB,IAAI,CAAC;AAElD,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,OAAiB,OAAO,CAAC,IAAI;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;AACvD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,IAAiB;IAC9C,kBAAkB,GAAG,IAAI,CAAC;AAC5B,CAAC;AAED,6EAA6E;AAC7E,+EAA+E;AAC/E,gCAAgC;AAChC,MAAM,UAAU,cAAc;IAC5B,OAAO,kBAAkB,IAAI,kBAAkB,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type AuthMode = "oss" | "cloud";
|
|
2
|
+
export type StoredCredentials = {
|
|
3
|
+
api_base: string;
|
|
4
|
+
mode: AuthMode;
|
|
5
|
+
api_secret?: string;
|
|
6
|
+
api_token?: string;
|
|
7
|
+
refresh_token?: string;
|
|
8
|
+
supabase_url?: string;
|
|
9
|
+
supabase_anon_key?: string;
|
|
10
|
+
user?: string;
|
|
11
|
+
workspace_id?: string;
|
|
12
|
+
workspace_name?: string;
|
|
13
|
+
active_mcp_label?: string;
|
|
14
|
+
authed_at: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function credentialsPath(): string;
|
|
17
|
+
export declare function readCredentials(): Promise<StoredCredentials | null>;
|
|
18
|
+
export declare function writeCredentials(credentials: StoredCredentials): Promise<void>;
|
|
19
|
+
export declare function updateCredentials(partial: Partial<StoredCredentials>): Promise<StoredCredentials>;
|
|
20
|
+
export declare function clearCredentials(): Promise<boolean>;
|
|
21
|
+
export declare function maskSecret(secret: string): string;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { chmodSync, existsSync } from "node:fs";
|
|
2
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { getCommandName } from "./command-name.js";
|
|
5
|
+
const DEFAULT_OSS_API_BASE = "https://localhost:8000";
|
|
6
|
+
const DEFAULT_CLOUD_API_BASE = "https://workeros-api.floom.dev";
|
|
7
|
+
function envApiBase(defaultBase) {
|
|
8
|
+
return (process.env.WORKEROS_API_BASE || process.env.FLOOM_API_BASE || defaultBase).replace(/\/+$/, "");
|
|
9
|
+
}
|
|
10
|
+
function envUser() {
|
|
11
|
+
return (process.env.WORKEROS_USER || process.env.FLOOM_USER || "").trim() || undefined;
|
|
12
|
+
}
|
|
13
|
+
function envCloudRequested() {
|
|
14
|
+
const value = (process.env.WORKEROS_CLOUD || "").trim().toLowerCase();
|
|
15
|
+
return value === "1" || value === "true" || value === "yes" || value === "on";
|
|
16
|
+
}
|
|
17
|
+
function resolveHomeDir() {
|
|
18
|
+
return process.env.HOME || process.env.USERPROFILE || "";
|
|
19
|
+
}
|
|
20
|
+
export function credentialsPath() {
|
|
21
|
+
const home = resolveHomeDir();
|
|
22
|
+
if (!home) {
|
|
23
|
+
throw new Error("HOME is required to read CLI credentials");
|
|
24
|
+
}
|
|
25
|
+
return join(home, ".config", "floom", "credentials.json");
|
|
26
|
+
}
|
|
27
|
+
function legacyCredentialsPath() {
|
|
28
|
+
const home = resolveHomeDir();
|
|
29
|
+
if (!home) {
|
|
30
|
+
throw new Error("HOME is required to read CLI credentials");
|
|
31
|
+
}
|
|
32
|
+
return join(home, ".config", "workeros", "credentials.json");
|
|
33
|
+
}
|
|
34
|
+
export async function readCredentials() {
|
|
35
|
+
const envCloudToken = process.env.WORKEROS_API_TOKEN?.trim();
|
|
36
|
+
if (envCloudToken) {
|
|
37
|
+
return {
|
|
38
|
+
api_base: envApiBase(DEFAULT_CLOUD_API_BASE),
|
|
39
|
+
mode: "cloud",
|
|
40
|
+
api_token: envCloudToken,
|
|
41
|
+
workspace_id: process.env.WORKEROS_WORKSPACE_ID?.trim() || undefined,
|
|
42
|
+
workspace_name: process.env.WORKEROS_WORKSPACE_NAME?.trim() || undefined,
|
|
43
|
+
authed_at: new Date().toISOString(),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const envOssSecret = (process.env.WORKEROS_API_SECRET || process.env.FLOOM_API_SECRET || "").trim();
|
|
47
|
+
if (envOssSecret && !envCloudRequested()) {
|
|
48
|
+
return {
|
|
49
|
+
api_base: envApiBase(DEFAULT_OSS_API_BASE),
|
|
50
|
+
mode: "oss",
|
|
51
|
+
api_secret: envOssSecret,
|
|
52
|
+
user: envUser(),
|
|
53
|
+
workspace_id: process.env.WORKEROS_WORKSPACE_ID?.trim() || undefined,
|
|
54
|
+
workspace_name: process.env.WORKEROS_WORKSPACE_NAME?.trim() || undefined,
|
|
55
|
+
authed_at: new Date().toISOString(),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const path = existsSync(credentialsPath()) ? credentialsPath() : legacyCredentialsPath();
|
|
59
|
+
if (!existsSync(path)) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const raw = (await readFile(path, "utf8")).trim();
|
|
63
|
+
if (!raw) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const parsed = JSON.parse(raw);
|
|
67
|
+
// Back-compat: existing creds files only have api_base + api_secret +
|
|
68
|
+
// authed_at. Treat them as OSS mode.
|
|
69
|
+
const mode = parsed.mode === "cloud" ? "cloud" : "oss";
|
|
70
|
+
if (envCloudRequested() && mode !== "cloud") {
|
|
71
|
+
// WORKEROS_CLOUD=1 must not silently continue using a saved OSS secret.
|
|
72
|
+
// Return "not logged in" so callers tell the user to run `floom login --cloud`.
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
if (mode === "oss" && !parsed.api_secret) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
if (mode === "cloud" && !parsed.api_token && (!parsed.refresh_token || !parsed.supabase_url)) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
api_base: (parsed.api_base || (mode === "cloud" ? DEFAULT_CLOUD_API_BASE : DEFAULT_OSS_API_BASE)).replace(/\/+$/, ""),
|
|
83
|
+
mode,
|
|
84
|
+
api_secret: parsed.api_secret,
|
|
85
|
+
api_token: parsed.api_token,
|
|
86
|
+
refresh_token: parsed.refresh_token,
|
|
87
|
+
supabase_url: parsed.supabase_url ? parsed.supabase_url.replace(/\/+$/, "") : undefined,
|
|
88
|
+
supabase_anon_key: parsed.supabase_anon_key,
|
|
89
|
+
// Env/flag wins so `--user` overrides a saved OSS creds file on a single call.
|
|
90
|
+
user: envUser() || parsed.user,
|
|
91
|
+
workspace_id: parsed.workspace_id,
|
|
92
|
+
workspace_name: parsed.workspace_name,
|
|
93
|
+
active_mcp_label: parsed.active_mcp_label,
|
|
94
|
+
authed_at: parsed.authed_at || new Date().toISOString(),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export async function writeCredentials(credentials) {
|
|
98
|
+
const path = credentialsPath();
|
|
99
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
100
|
+
const payload = JSON.stringify(credentials, null, 2);
|
|
101
|
+
await writeFile(path, `${payload}\n`, "utf8");
|
|
102
|
+
chmodSync(path, 0o600);
|
|
103
|
+
}
|
|
104
|
+
export async function updateCredentials(partial) {
|
|
105
|
+
const current = await readCredentials();
|
|
106
|
+
if (!current) {
|
|
107
|
+
throw new Error(`Not logged in. Run ${getCommandName()} login first.`);
|
|
108
|
+
}
|
|
109
|
+
const next = { ...current, ...partial };
|
|
110
|
+
await writeCredentials(next);
|
|
111
|
+
return next;
|
|
112
|
+
}
|
|
113
|
+
export async function clearCredentials() {
|
|
114
|
+
const paths = [credentialsPath(), legacyCredentialsPath()];
|
|
115
|
+
const existing = paths.filter((path) => existsSync(path));
|
|
116
|
+
await Promise.all(existing.map((path) => rm(path, { force: true })));
|
|
117
|
+
return existing.length > 0;
|
|
118
|
+
}
|
|
119
|
+
export function maskSecret(secret) {
|
|
120
|
+
if (!secret)
|
|
121
|
+
return "";
|
|
122
|
+
if (secret.length <= 4)
|
|
123
|
+
return "*".repeat(secret.length);
|
|
124
|
+
return `${"*".repeat(secret.length - 4)}${secret.slice(-4)}`;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const log: {
|
|
2
|
+
info: (msg: string) => void;
|
|
3
|
+
ok: (msg: string) => void;
|
|
4
|
+
warn: (msg: string) => void;
|
|
5
|
+
err: (msg: string) => void;
|
|
6
|
+
step: (msg: string) => void;
|
|
7
|
+
heading: (msg: string) => void;
|
|
8
|
+
kv: (key: string, value: string) => void;
|
|
9
|
+
blank: () => void;
|
|
10
|
+
};
|
|
11
|
+
export declare function exitWith(code: number, msg?: string): never;
|
|
12
|
+
type TableColumn<T> = {
|
|
13
|
+
key: keyof T;
|
|
14
|
+
label: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function renderTable<T extends Record<string, unknown>>(rows: T[], columns: TableColumn<T>[]): string;
|
|
17
|
+
export declare function printJson(value: unknown): void;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
export const log = {
|
|
3
|
+
info: (msg) => { process.stdout.write(`${msg}\n`); },
|
|
4
|
+
ok: (msg) => { process.stdout.write(`${chalk.green("✓ ")}${msg}\n`); },
|
|
5
|
+
warn: (msg) => { process.stderr.write(`${chalk.yellow("! ")}${msg}\n`); },
|
|
6
|
+
err: (msg) => { process.stderr.write(`${chalk.red("✗ ")}${msg}\n`); },
|
|
7
|
+
step: (msg) => { process.stdout.write(`${chalk.dim("· ")}${msg}\n`); },
|
|
8
|
+
heading: (msg) => { process.stdout.write(`\n${chalk.bold(msg)}\n`); },
|
|
9
|
+
kv: (key, value) => { process.stdout.write(` ${chalk.dim(key.padEnd(18))}${value}\n`); },
|
|
10
|
+
blank: () => { process.stdout.write("\n"); },
|
|
11
|
+
};
|
|
12
|
+
export function exitWith(code, msg) {
|
|
13
|
+
if (msg)
|
|
14
|
+
log.err(msg);
|
|
15
|
+
process.exit(code);
|
|
16
|
+
}
|
|
17
|
+
export function renderTable(rows, columns) {
|
|
18
|
+
if (!rows.length)
|
|
19
|
+
return "(no rows)";
|
|
20
|
+
const widths = columns.map((column) => {
|
|
21
|
+
const maxCell = rows.reduce((max, row) => {
|
|
22
|
+
const value = row[column.key];
|
|
23
|
+
const text = value === undefined || value === null ? "" : String(value);
|
|
24
|
+
return Math.max(max, text.length);
|
|
25
|
+
}, column.label.length);
|
|
26
|
+
return maxCell;
|
|
27
|
+
});
|
|
28
|
+
const header = columns
|
|
29
|
+
.map((column, idx) => column.label.padEnd(widths[idx], " "))
|
|
30
|
+
.join(" ");
|
|
31
|
+
const separator = columns.map((_, idx) => "-".repeat(widths[idx])).join(" ");
|
|
32
|
+
const body = rows.map((row) => columns
|
|
33
|
+
.map((column, idx) => {
|
|
34
|
+
const value = row[column.key];
|
|
35
|
+
const text = value === undefined || value === null ? "" : String(value);
|
|
36
|
+
return text.padEnd(widths[idx], " ");
|
|
37
|
+
})
|
|
38
|
+
.join(" "));
|
|
39
|
+
return [header, separator, ...body].join("\n");
|
|
40
|
+
}
|
|
41
|
+
export function printJson(value) {
|
|
42
|
+
console.log(JSON.stringify(value, null, 2));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { stdin, stdout } from "node:process";
|
|
3
|
+
export async function promptYesNo(question, defaultYes = true) {
|
|
4
|
+
if (!stdin.isTTY || !stdout.isTTY) {
|
|
5
|
+
return defaultYes;
|
|
6
|
+
}
|
|
7
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
8
|
+
try {
|
|
9
|
+
const answer = (await rl.question(question)).trim().toLowerCase();
|
|
10
|
+
if (!answer)
|
|
11
|
+
return defaultYes;
|
|
12
|
+
return answer === "y" || answer === "yes";
|
|
13
|
+
}
|
|
14
|
+
finally {
|
|
15
|
+
rl.close();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function promptHidden(question) {
|
|
19
|
+
if (!stdin.isTTY || !stdout.isTTY) {
|
|
20
|
+
throw new Error("Cannot prompt for a secret in a non-interactive terminal");
|
|
21
|
+
}
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
let value = "";
|
|
24
|
+
stdout.write(question);
|
|
25
|
+
stdin.setRawMode?.(true);
|
|
26
|
+
stdin.resume();
|
|
27
|
+
stdin.setEncoding("utf8");
|
|
28
|
+
const onData = (chunk) => {
|
|
29
|
+
const char = chunk;
|
|
30
|
+
if (char === "\u0003") {
|
|
31
|
+
cleanup();
|
|
32
|
+
reject(new Error("Cancelled"));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (char === "\r" || char === "\n") {
|
|
36
|
+
stdout.write("\n");
|
|
37
|
+
cleanup();
|
|
38
|
+
resolve(value.trim());
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (char === "\u007f") {
|
|
42
|
+
value = value.slice(0, -1);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
value += char;
|
|
46
|
+
};
|
|
47
|
+
const cleanup = () => {
|
|
48
|
+
stdin.off("data", onData);
|
|
49
|
+
stdin.setRawMode?.(false);
|
|
50
|
+
stdin.pause();
|
|
51
|
+
};
|
|
52
|
+
stdin.on("data", onData);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,UAAU,GAAG,IAAI;IACnE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClE,IAAI,CAAC,MAAM;YAAE,OAAO,UAAU,CAAC;QAC/B,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,CAAC;IAC5C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvB,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,KAAK,CAAC;YACnB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC/B,OAAO;YACT,CAAC;YACD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,KAAK,IAAI,IAAI,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;YAC1B,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC,CAAC;QAEF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/server.d.ts
ADDED