@floomhq/floom 5.0.3 → 5.0.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.
@@ -11,11 +11,28 @@ export type StoredCredentials = {
11
11
  workspace_id?: string;
12
12
  workspace_name?: string;
13
13
  active_mcp_label?: string;
14
+ account_id?: string;
15
+ account_label?: string;
14
16
  authed_at: string;
15
17
  };
16
18
  export declare function credentialsPath(): string;
19
+ export declare function credentialsAccountsDir(): string;
20
+ export declare function activeAccountPath(): string;
17
21
  export declare function readCredentials(): Promise<StoredCredentials | null>;
18
22
  export declare function writeCredentials(credentials: StoredCredentials): Promise<void>;
19
23
  export declare function updateCredentials(partial: Partial<StoredCredentials>): Promise<StoredCredentials>;
20
24
  export declare function clearCredentials(): Promise<boolean>;
25
+ export type CredentialAccount = {
26
+ id: string;
27
+ label: string;
28
+ mode: AuthMode;
29
+ api_base: string;
30
+ workspace_id?: string;
31
+ workspace_name?: string;
32
+ active: boolean;
33
+ authed_at: string;
34
+ };
35
+ export declare function listCredentialAccounts(): Promise<CredentialAccount[]>;
36
+ export declare function switchCredentialAccount(target: string): Promise<StoredCredentials>;
37
+ export declare function removeCredentialAccount(target?: string): Promise<boolean>;
21
38
  export declare function maskSecret(secret: string): string;
@@ -1,6 +1,6 @@
1
1
  import { chmodSync, existsSync } from "node:fs";
2
- import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
- import { dirname, join } from "node:path";
2
+ import { mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { basename, dirname, join } from "node:path";
4
4
  import { getCommandName } from "./command-name.js";
5
5
  const DEFAULT_OSS_API_BASE = "https://localhost:8000";
6
6
  const DEFAULT_CLOUD_API_BASE = "https://workeros-api.floom.dev";
@@ -29,19 +29,28 @@ function normalizeStoredApiBase(mode, value) {
29
29
  function resolveHomeDir() {
30
30
  return process.env.HOME || process.env.USERPROFILE || "";
31
31
  }
32
- export function credentialsPath() {
32
+ function resolveConfigDir() {
33
+ const xdgConfigHome = process.env.XDG_CONFIG_HOME?.trim();
34
+ if (xdgConfigHome) {
35
+ return xdgConfigHome;
36
+ }
33
37
  const home = resolveHomeDir();
34
38
  if (!home) {
35
39
  throw new Error("HOME is required to read CLI credentials");
36
40
  }
37
- return join(home, ".config", "floom", "credentials.json");
41
+ return join(home, ".config");
42
+ }
43
+ export function credentialsPath() {
44
+ return join(resolveConfigDir(), "floom", "credentials.json");
45
+ }
46
+ export function credentialsAccountsDir() {
47
+ return join(dirname(credentialsPath()), "credentials");
48
+ }
49
+ export function activeAccountPath() {
50
+ return join(dirname(credentialsPath()), "active");
38
51
  }
39
52
  function legacyCredentialsPath() {
40
- const home = resolveHomeDir();
41
- if (!home) {
42
- throw new Error("HOME is required to read CLI credentials");
43
- }
44
- return join(home, ".config", "workeros", "credentials.json");
53
+ return join(resolveConfigDir(), "workeros", "credentials.json");
45
54
  }
46
55
  export async function readCredentials() {
47
56
  const envCloudToken = process.env.WORKEROS_API_TOKEN?.trim();
@@ -67,7 +76,14 @@ export async function readCredentials() {
67
76
  authed_at: new Date().toISOString(),
68
77
  };
69
78
  }
70
- const path = existsSync(credentialsPath()) ? credentialsPath() : legacyCredentialsPath();
79
+ const active = await readActiveAccountCredentials();
80
+ const path = active ? "" : (existsSync(credentialsPath()) ? credentialsPath() : legacyCredentialsPath());
81
+ if (active) {
82
+ if (envCloudRequested() && active.mode !== "cloud") {
83
+ return null;
84
+ }
85
+ return active;
86
+ }
71
87
  if (!existsSync(path)) {
72
88
  return null;
73
89
  }
@@ -103,15 +119,23 @@ export async function readCredentials() {
103
119
  workspace_id: parsed.workspace_id,
104
120
  workspace_name: parsed.workspace_name,
105
121
  active_mcp_label: parsed.active_mcp_label,
122
+ account_id: parsed.account_id,
123
+ account_label: parsed.account_label,
106
124
  authed_at: parsed.authed_at || new Date().toISOString(),
107
125
  };
108
126
  }
109
127
  export async function writeCredentials(credentials) {
110
128
  const path = credentialsPath();
111
129
  await mkdir(dirname(path), { recursive: true, mode: 0o700 });
112
- const payload = JSON.stringify(credentials, null, 2);
130
+ const accountId = credentials.account_id || inferAccountId(credentials);
131
+ const accountLabel = credentials.account_label || inferAccountLabel(credentials);
132
+ const normalized = { ...credentials, account_id: accountId, account_label: accountLabel };
133
+ const payload = JSON.stringify(normalized, null, 2);
113
134
  await writeFile(path, `${payload}\n`, "utf8");
114
135
  chmodSync(path, 0o600);
136
+ await writeAccountCredentials(normalized);
137
+ await writeFile(activeAccountPath(), `${accountId}\n`, "utf8");
138
+ chmodSync(activeAccountPath(), 0o600);
115
139
  }
116
140
  export async function updateCredentials(partial) {
117
141
  const current = await readCredentials();
@@ -123,10 +147,163 @@ export async function updateCredentials(partial) {
123
147
  return next;
124
148
  }
125
149
  export async function clearCredentials() {
126
- const paths = [credentialsPath(), legacyCredentialsPath()];
150
+ const paths = [credentialsPath(), legacyCredentialsPath(), activeAccountPath()];
127
151
  const existing = paths.filter((path) => existsSync(path));
128
- await Promise.all(existing.map((path) => rm(path, { force: true })));
129
- return existing.length > 0;
152
+ const accountDirExists = existsSync(credentialsAccountsDir());
153
+ await Promise.all([
154
+ ...existing.map((path) => rm(path, { force: true })),
155
+ rm(credentialsAccountsDir(), { recursive: true, force: true }),
156
+ ]);
157
+ return existing.length > 0 || accountDirExists;
158
+ }
159
+ function sanitizeAccountId(value) {
160
+ const cleaned = value.trim().toLowerCase().replace(/[^a-z0-9._@-]+/g, "-").replace(/^-+|-+$/g, "");
161
+ return cleaned.slice(0, 120) || "default";
162
+ }
163
+ function inferAccountLabel(credentials) {
164
+ return (credentials.account_label ||
165
+ credentials.user ||
166
+ credentials.account_id ||
167
+ credentials.workspace_name ||
168
+ credentials.workspace_id ||
169
+ credentials.api_base);
170
+ }
171
+ function inferAccountId(credentials) {
172
+ return sanitizeAccountId(credentials.account_id ||
173
+ credentials.user ||
174
+ credentials.account_label ||
175
+ [credentials.mode, credentials.workspace_id || credentials.workspace_name || credentials.api_base].join("-"));
176
+ }
177
+ function accountPath(accountId) {
178
+ return join(credentialsAccountsDir(), `${sanitizeAccountId(accountId)}.json`);
179
+ }
180
+ function isValidCredentials(parsed) {
181
+ const mode = parsed.mode === "cloud" ? "cloud" : "oss";
182
+ if (mode === "oss")
183
+ return Boolean(parsed.api_secret);
184
+ return Boolean(parsed.api_token || (parsed.refresh_token && parsed.supabase_url));
185
+ }
186
+ async function readCredentialFile(path) {
187
+ if (!existsSync(path))
188
+ return null;
189
+ const raw = (await readFile(path, "utf8")).trim();
190
+ if (!raw)
191
+ return null;
192
+ const parsed = JSON.parse(raw);
193
+ if (!isValidCredentials(parsed))
194
+ return null;
195
+ const mode = parsed.mode === "cloud" ? "cloud" : "oss";
196
+ return {
197
+ api_base: normalizeStoredApiBase(mode, parsed.api_base),
198
+ mode,
199
+ api_secret: parsed.api_secret,
200
+ api_token: parsed.api_token,
201
+ refresh_token: parsed.refresh_token,
202
+ supabase_url: parsed.supabase_url ? parsed.supabase_url.replace(/\/+$/, "") : undefined,
203
+ supabase_anon_key: parsed.supabase_anon_key,
204
+ user: envUser() || parsed.user,
205
+ workspace_id: parsed.workspace_id,
206
+ workspace_name: parsed.workspace_name,
207
+ active_mcp_label: parsed.active_mcp_label,
208
+ account_id: parsed.account_id,
209
+ account_label: parsed.account_label,
210
+ authed_at: parsed.authed_at || new Date().toISOString(),
211
+ };
212
+ }
213
+ async function readActiveAccountCredentials() {
214
+ if (!existsSync(activeAccountPath()))
215
+ return null;
216
+ const accountId = (await readFile(activeAccountPath(), "utf8")).trim();
217
+ if (!accountId)
218
+ return null;
219
+ return readCredentialFile(accountPath(accountId));
220
+ }
221
+ async function writeAccountCredentials(credentials) {
222
+ const accountId = credentials.account_id || inferAccountId(credentials);
223
+ await mkdir(credentialsAccountsDir(), { recursive: true, mode: 0o700 });
224
+ const path = accountPath(accountId);
225
+ await writeFile(path, `${JSON.stringify({ ...credentials, account_id: accountId }, null, 2)}\n`, "utf8");
226
+ chmodSync(path, 0o600);
227
+ }
228
+ export async function listCredentialAccounts() {
229
+ const activeId = existsSync(activeAccountPath()) ? (await readFile(activeAccountPath(), "utf8")).trim() : "";
230
+ const ids = new Set();
231
+ if (existsSync(credentialsAccountsDir())) {
232
+ for (const entry of await readdir(credentialsAccountsDir())) {
233
+ if (entry.endsWith(".json"))
234
+ ids.add(basename(entry, ".json"));
235
+ }
236
+ }
237
+ const active = await readCredentialFile(credentialsPath());
238
+ if (active)
239
+ ids.add(active.account_id || inferAccountId(active));
240
+ const rows = [];
241
+ for (const id of [...ids].sort()) {
242
+ const creds = await readCredentialFile(accountPath(id));
243
+ const account = creds || (active && (active.account_id || inferAccountId(active)) === id ? active : null);
244
+ if (!account)
245
+ continue;
246
+ const accountId = account.account_id || inferAccountId(account);
247
+ rows.push({
248
+ id: accountId,
249
+ label: account.account_label || inferAccountLabel(account),
250
+ mode: account.mode,
251
+ api_base: account.api_base,
252
+ workspace_id: account.workspace_id,
253
+ workspace_name: account.workspace_name,
254
+ active: activeId ? accountId === activeId : Boolean(active && (active.account_id || inferAccountId(active)) === accountId),
255
+ authed_at: account.authed_at,
256
+ });
257
+ }
258
+ return rows;
259
+ }
260
+ function accountMatches(account, target) {
261
+ const needle = target.trim().toLowerCase();
262
+ return [
263
+ account.account_id,
264
+ account.account_label,
265
+ account.user,
266
+ account.workspace_id,
267
+ account.workspace_name,
268
+ ].some((value) => typeof value === "string" && value.trim().toLowerCase() === needle);
269
+ }
270
+ export async function switchCredentialAccount(target) {
271
+ for (const entry of existsSync(credentialsAccountsDir()) ? await readdir(credentialsAccountsDir()) : []) {
272
+ if (!entry.endsWith(".json"))
273
+ continue;
274
+ const creds = await readCredentialFile(join(credentialsAccountsDir(), entry));
275
+ if (!creds || !accountMatches(creds, target))
276
+ continue;
277
+ await writeCredentials(creds);
278
+ return creds;
279
+ }
280
+ const current = await readCredentialFile(credentialsPath());
281
+ if (current && accountMatches(current, target)) {
282
+ await writeCredentials(current);
283
+ return current;
284
+ }
285
+ throw new Error(`No saved account matches ${JSON.stringify(target)}.`);
286
+ }
287
+ export async function removeCredentialAccount(target) {
288
+ if (!target)
289
+ return clearCredentials();
290
+ let removed = false;
291
+ for (const entry of existsSync(credentialsAccountsDir()) ? await readdir(credentialsAccountsDir()) : []) {
292
+ if (!entry.endsWith(".json"))
293
+ continue;
294
+ const path = join(credentialsAccountsDir(), entry);
295
+ const creds = await readCredentialFile(path);
296
+ if (!creds || !accountMatches(creds, target))
297
+ continue;
298
+ await rm(path, { force: true });
299
+ removed = true;
300
+ }
301
+ const current = await readCredentialFile(credentialsPath());
302
+ if (current && accountMatches(current, target)) {
303
+ await rm(credentialsPath(), { force: true });
304
+ await rm(activeAccountPath(), { force: true });
305
+ }
306
+ return removed;
130
307
  }
131
308
  export function maskSecret(secret) {
132
309
  if (!secret)
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -312,10 +312,19 @@ async function listTriggers(workerId, app) {
312
312
  async function watchRunEvents(runId, timeoutMs) {
313
313
  const controller = new AbortController();
314
314
  const timeout = setTimeout(() => controller.abort(), timeoutMs);
315
+ const pollIntervalMs = Math.min(1000, Math.max(100, timeoutMs));
315
316
  const events = [];
316
317
  let status;
317
318
  let buffer = "";
318
319
  let sawTerminalStatus = false;
320
+ async function finalRunStatus() {
321
+ const run = await request("GET", `/runs/${encodeURIComponent(runId)}`);
322
+ const finalStatus = typeof run.status === "string" ? run.status : undefined;
323
+ if (finalStatus && TERMINAL_RUN_STATUSES.has(finalStatus)) {
324
+ return { run_id: runId, status: finalStatus, run, events };
325
+ }
326
+ return null;
327
+ }
319
328
  try {
320
329
  const response = await fetch(buildUrl(`/runs/${encodeURIComponent(runId)}/events`), {
321
330
  method: "GET",
@@ -338,11 +347,30 @@ async function watchRunEvents(runId, timeoutMs) {
338
347
  }
339
348
  const reader = response.body.getReader();
340
349
  const decoder = new TextDecoder();
350
+ let pendingRead = reader.read().then((result) => ({ kind: "read", result }), (error) => ({ kind: "readError", error }));
341
351
  while (true) {
342
- const { done, value } = await reader.read();
352
+ const raced = await Promise.race([
353
+ pendingRead,
354
+ new Promise((resolve) => {
355
+ setTimeout(() => resolve({ kind: "poll" }), pollIntervalMs);
356
+ }),
357
+ ]);
358
+ if (raced.kind === "poll") {
359
+ const final = await finalRunStatus();
360
+ if (final) {
361
+ await reader.cancel();
362
+ return final;
363
+ }
364
+ continue;
365
+ }
366
+ if (raced.kind === "readError") {
367
+ throw raced.error;
368
+ }
369
+ const { done, value } = raced.result;
343
370
  if (done) {
344
371
  break;
345
372
  }
373
+ pendingRead = reader.read().then((result) => ({ kind: "read", result }), (error) => ({ kind: "readError", error }));
346
374
  buffer += decoder.decode(value, { stream: true });
347
375
  const chunks = buffer.split(/\r?\n\r?\n/);
348
376
  buffer = chunks.pop() || "";
@@ -372,6 +400,10 @@ async function watchRunEvents(runId, timeoutMs) {
372
400
  }
373
401
  catch (error) {
374
402
  if (error instanceof DOMException && error.name === "AbortError") {
403
+ const final = await finalRunStatus();
404
+ if (final) {
405
+ return final;
406
+ }
375
407
  throw new FloomApiError(`Timed out watching run ${runId} after ${timeoutMs}ms`);
376
408
  }
377
409
  throw error;
@@ -379,6 +411,10 @@ async function watchRunEvents(runId, timeoutMs) {
379
411
  finally {
380
412
  clearTimeout(timeout);
381
413
  }
414
+ const final = await finalRunStatus();
415
+ if (final) {
416
+ return final;
417
+ }
382
418
  return { run_id: runId, status: status || "unknown", events };
383
419
  }
384
420
  function parseSseEvent(chunk) {