@sequelsh/cli 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -35,7 +35,7 @@ sequel skills show seo # print one playbook
35
35
  | Command | Description |
36
36
  | --- | --- |
37
37
  | `sequel upgrade` | Upgrade the CLI to the latest version from npm. |
38
- | `sequel login` | Sign in to Sequel. `--no-browser` prints the sign-in URL instead of opening it. |
38
+ | `sequel login` | Sign in to Sequel. `--no-browser` prints the sign-in URL instead of opening it; `--detach` (automatic when piped) returns the URL immediately and finishes in the background; `--status` / `--wait` check on or wait for that sign-in. |
39
39
  | `sequel logout` | Sign out and remove cached credentials. |
40
40
  | `sequel switch` | Switch the active organization. |
41
41
  | `sequel connect [source]` | Connect a new data source (interactive, or pass a connector id). |
package/dist/index.js CHANGED
@@ -13,13 +13,13 @@ import * as p$3 from "@clack/prompts";
13
13
  import * as p$2 from "@clack/prompts";
14
14
  import * as p$1 from "@clack/prompts";
15
15
  import * as p from "@clack/prompts";
16
- import { execFileSync } from "node:child_process";
16
+ import { execFileSync, spawn } from "node:child_process";
17
17
  import YAML from "yaml";
18
18
  import { writeFile } from "node:fs/promises";
19
19
 
20
20
  //#region package.json
21
21
  var name = "@sequelsh/cli";
22
- var version = "0.3.0";
22
+ var version = "0.4.1";
23
23
  var description = "Sequel CLI — connect data sources and run tools from your terminal.";
24
24
  var license = "MIT";
25
25
  var type = "module";
@@ -130,6 +130,27 @@ function readConfig() {
130
130
  return emptyConfig();
131
131
  }
132
132
  }
133
+ /**
134
+ * Merge a token entry into auth.json against the file's *current* contents.
135
+ *
136
+ * A plain read-modify-write loses concurrent updates: two `sequel` processes
137
+ * refreshing different orgs (or the same one) would each write back a snapshot
138
+ * taken before the other's, silently dropping a freshly-rotated refresh token
139
+ * and stranding that org at the next call. Re-reading immediately before the
140
+ * write keeps every other org's entry intact.
141
+ */
142
+ function saveTokenEntry(orgId, entry) {
143
+ const current = readConfig();
144
+ const next = {
145
+ ...current,
146
+ tokens: {
147
+ ...current.tokens,
148
+ [orgId]: entry
149
+ }
150
+ };
151
+ writeConfig(next);
152
+ return next;
153
+ }
133
154
  /** Persist auth.json with locked-down permissions (dir 0700, file 0600). */
134
155
  function writeConfig(config) {
135
156
  const dir = configDir();
@@ -264,13 +285,6 @@ function waitForCallback(expectedState) {
264
285
  code
265
286
  };
266
287
  }
267
- /**
268
- * Run the full OAuth 2.0 + PKCE loopback flow: register a client, open the
269
- * browser to the consent page (where the user picks an org), capture the code,
270
- * exchange it for an org-bound token, then cache that token keyed by its org.
271
- *
272
- * Shared by `login` and `switch` (for orgs without a cached token).
273
- */
274
288
  async function runLoginFlow(options) {
275
289
  const config = readConfig();
276
290
  const apiUrl = resolveApiUrl(config);
@@ -290,7 +304,12 @@ async function runLoginFlow(options) {
290
304
  authorizeUrl.searchParams.set("state", state);
291
305
  if (!options?.silent) open(authorizeUrl.toString()).catch(() => {});
292
306
  process.stderr.write(`\nOpen this URL to continue:\n${authorizeUrl.toString()}\n\n`);
293
- const code = await codePromise;
307
+ options?.onUrl?.(authorizeUrl.toString());
308
+ let timer;
309
+ const timeout = new Promise((_, reject) => {
310
+ if (options?.timeoutMs) timer = setTimeout(() => reject(new Error("Timed out waiting for the browser sign-in to complete.")), options.timeoutMs);
311
+ });
312
+ const code = await Promise.race([codePromise, timeout]).finally(() => clearTimeout(timer));
294
313
  const token = await postToken(apiUrl, {
295
314
  grant_type: "authorization_code",
296
315
  code,
@@ -311,7 +330,8 @@ async function runLoginFlow(options) {
311
330
  [me.organizationId]: {
312
331
  accessToken: token.access_token,
313
332
  refreshToken: token.refresh_token,
314
- expiresAt: Date.now() + token.expires_in * 1e3
333
+ expiresAt: Date.now() + token.expires_in * 1e3,
334
+ clientId
315
335
  }
316
336
  },
317
337
  user: {
@@ -351,23 +371,29 @@ async function getValidAccessToken() {
351
371
  config
352
372
  };
353
373
  const apiUrl = resolveApiUrl(config);
374
+ const clientId = entry.clientId ?? config.clientId ?? "";
354
375
  try {
355
376
  const refreshed = await postToken(apiUrl, {
356
377
  grant_type: "refresh_token",
357
378
  refresh_token: entry.refreshToken,
358
- client_id: config.clientId ?? ""
379
+ client_id: clientId
359
380
  });
360
- config.tokens[orgId] = {
381
+ const next = saveTokenEntry(orgId, {
361
382
  accessToken: refreshed.access_token,
362
383
  refreshToken: refreshed.refresh_token,
363
- expiresAt: Date.now() + refreshed.expires_in * 1e3
364
- };
365
- writeConfig(config);
384
+ expiresAt: Date.now() + refreshed.expires_in * 1e3,
385
+ clientId
386
+ });
366
387
  return {
367
388
  token: refreshed.access_token,
368
- config
389
+ config: next
369
390
  };
370
391
  } catch {
392
+ const fresh = readConfig().tokens[orgId];
393
+ if (fresh && fresh.refreshToken !== entry.refreshToken && fresh.expiresAt - EXPIRY_SKEW_MS > Date.now()) return {
394
+ token: fresh.accessToken,
395
+ config: readConfig()
396
+ };
371
397
  throw new Error("Your session for this organization has expired. Run `sequel login` (or `sequel switch`) to sign in again.");
372
398
  }
373
399
  }
@@ -550,26 +576,204 @@ function fail(message) {
550
576
  process.stderr.write(`${pc.red("✗")} ${message}\n`);
551
577
  }
552
578
 
579
+ //#endregion
580
+ //#region src/lib/pending-login.ts
581
+ /** How long the background worker waits for the browser before giving up. */
582
+ const LOGIN_TIMEOUT_MS = 10 * 60 * 1e3;
583
+ /** How long the foreground `login` waits for the worker to report its URL. */
584
+ const URL_WAIT_MS = 2e4;
585
+ function pendingLoginPath() {
586
+ return join(configDir(), "pending-login.json");
587
+ }
588
+ function isAlive(pid) {
589
+ try {
590
+ process.kill(pid, 0);
591
+ return true;
592
+ } catch {
593
+ return false;
594
+ }
595
+ }
596
+ /** The current record, or null if there is none, it expired, or its worker died. */
597
+ function readPendingLogin() {
598
+ const path = pendingLoginPath();
599
+ if (!existsSync(path)) return null;
600
+ let parsed;
601
+ try {
602
+ parsed = JSON.parse(readFileSync(path, "utf8"));
603
+ } catch {
604
+ rmSync(path, { force: true });
605
+ return null;
606
+ }
607
+ if (parsed.status === "pending" && (Date.now() > parsed.expiresAt || !isAlive(parsed.pid))) {
608
+ rmSync(path, { force: true });
609
+ return null;
610
+ }
611
+ return parsed;
612
+ }
613
+ function writePendingLogin(record) {
614
+ mkdirSync(configDir(), {
615
+ recursive: true,
616
+ mode: 448
617
+ });
618
+ writeFileSync(pendingLoginPath(), `${JSON.stringify(record, null, 2)}\n`, { mode: 384 });
619
+ }
620
+ function clearPendingLogin() {
621
+ rmSync(pendingLoginPath(), { force: true });
622
+ }
623
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
624
+ /**
625
+ * Spawn the detached worker and return its record once the URL is known.
626
+ * Reuses a still-pending sign-in rather than starting a second one.
627
+ */
628
+ async function startDetachedLogin(opts) {
629
+ const existing = readPendingLogin();
630
+ if (existing?.status === "pending") return existing;
631
+ clearPendingLogin();
632
+ const args = [
633
+ process.argv[1],
634
+ "login-worker",
635
+ ...opts.browser ? [] : ["--no-browser"]
636
+ ];
637
+ const child = spawn(process.execPath, args, {
638
+ detached: true,
639
+ stdio: "ignore"
640
+ });
641
+ child.unref();
642
+ const deadline = Date.now() + URL_WAIT_MS;
643
+ while (Date.now() < deadline) {
644
+ const record = readPendingLogin();
645
+ if (record && record.pid === child.pid) {
646
+ if (record.status === "failed") throw new Error(record.error ?? "Sign-in failed to start.");
647
+ return record;
648
+ }
649
+ await sleep(200);
650
+ }
651
+ throw new Error("Timed out waiting for the sign-in URL. Run `sequel login` again.");
652
+ }
653
+ /**
654
+ * Block until the pending sign-in finishes (or `timeoutMs` passes). Resolves
655
+ * true when a token is now cached. Returns immediately if nothing is pending.
656
+ */
657
+ async function waitForLogin(timeoutMs) {
658
+ const deadline = Date.now() + timeoutMs;
659
+ while (Date.now() < deadline) {
660
+ const record = readPendingLogin();
661
+ if (!record) return isLoggedIn();
662
+ if (record.status === "failed") return false;
663
+ await sleep(1e3);
664
+ }
665
+ return false;
666
+ }
667
+
553
668
  //#endregion
554
669
  //#region src/commands/login.ts
670
+ /** Instruction that rides along with a pending URL so an agent knows what to do. */
671
+ const PENDING_MESSAGE = "Show this URL to the user and ask them to open it in their browser to sign in. Once they have, run `sequel login --status` to confirm.";
672
+ function printStatus() {
673
+ const json = isJsonMode();
674
+ const pending = readPendingLogin();
675
+ if (pending?.status === "pending") {
676
+ if (json) return printJson({
677
+ status: "pending",
678
+ url: pending.url,
679
+ expiresAt: pending.expiresAt,
680
+ message: PENDING_MESSAGE
681
+ });
682
+ info(`Sign-in pending. Open this URL to finish:\n${pending.url}`);
683
+ return;
684
+ }
685
+ if (pending?.status === "failed") {
686
+ if (json) return printJson({
687
+ status: "failed",
688
+ error: pending.error ?? "Sign-in failed.",
689
+ message: "Run `sequel login` to try again."
690
+ });
691
+ info(`${pc.red("✗")} Last sign-in failed: ${pending.error ?? "unknown error"}. Run \`sequel login\` to try again.`);
692
+ return;
693
+ }
694
+ if (isLoggedIn()) {
695
+ const config = readConfig();
696
+ const org = config.orgs?.find((o) => o.id === config.activeOrgId) ?? null;
697
+ if (json) return printJson({
698
+ status: "logged_in",
699
+ user: config.user ?? null,
700
+ org
701
+ });
702
+ success(`Logged in as ${pc.bold(config.user?.email ?? "unknown")}${org ? ` · ${pc.bold(org.name)}` : ""}`);
703
+ return;
704
+ }
705
+ if (json) return printJson({
706
+ status: "logged_out",
707
+ message: "Run `sequel login` to sign in."
708
+ });
709
+ info("Not logged in. Run `sequel login` to sign in.");
710
+ }
555
711
  async function loginCommand(opts = {}) {
556
712
  const json = isJsonMode();
557
713
  const openBrowser = opts.browser !== false;
558
- const opening = openBrowser ? "Opening your browser to authorize…" : "Sign in with the URL below…";
559
- if (json) info(opening);
560
- else {
561
- p$5.intro(pc.cyan("Sign in to Sequel"));
562
- p$5.log.info(opening);
714
+ if (opts.status) return printStatus();
715
+ if (opts.wait) {
716
+ const pending = readPendingLogin();
717
+ if (pending?.status === "pending") {
718
+ info(`Waiting for the sign-in at ${pending.url} to finish…`);
719
+ await waitForLogin(pending.expiresAt - Date.now());
720
+ }
721
+ return printStatus();
563
722
  }
723
+ if (opts.detach || json) {
724
+ const pending = await startDetachedLogin({ browser: openBrowser });
725
+ if (json) return printJson({
726
+ status: "pending",
727
+ url: pending.url,
728
+ expiresAt: pending.expiresAt,
729
+ message: PENDING_MESSAGE
730
+ });
731
+ info(`Open this URL to sign in:\n${pending.url}\n\nSign-in continues in the background; run \`sequel login --status\` to check.`);
732
+ return;
733
+ }
734
+ p$5.intro(pc.cyan("Sign in to Sequel"));
735
+ p$5.log.info(openBrowser ? "Opening your browser to authorize…" : "Sign in with the URL below…");
564
736
  const res = await runLoginFlow({ silent: !openBrowser });
565
- if (json) return printJson({
566
- status: "logged_in",
567
- user: res.user,
568
- org: res.org ?? null
569
- });
570
737
  success(`Logged in as ${pc.bold(res.user.email)}${res.org ? ` · ${pc.bold(res.org.name)}` : ""}`);
571
738
  p$5.outro("You're all set. Try `sequel sources list` or `sequel connect`.");
572
739
  }
740
+ /**
741
+ * Hidden: the detached process behind a piped `sequel login`. Owns the loopback
742
+ * server, records the URL for the foreground process, and clears the record
743
+ * (or marks it failed) when the browser flow ends.
744
+ */
745
+ async function loginWorkerCommand(opts = {}) {
746
+ const startedAt = Date.now();
747
+ const base = {
748
+ pid: process.pid,
749
+ startedAt,
750
+ expiresAt: startedAt + LOGIN_TIMEOUT_MS
751
+ };
752
+ let url = "";
753
+ try {
754
+ await runLoginFlow({
755
+ silent: opts.browser === false,
756
+ timeoutMs: LOGIN_TIMEOUT_MS,
757
+ onUrl: (u) => {
758
+ url = u;
759
+ writePendingLogin({
760
+ ...base,
761
+ url,
762
+ status: "pending"
763
+ });
764
+ }
765
+ });
766
+ clearPendingLogin();
767
+ } catch (err) {
768
+ writePendingLogin({
769
+ ...base,
770
+ url,
771
+ status: "failed",
772
+ error: err instanceof Error ? err.message : String(err)
773
+ });
774
+ process.exitCode = 1;
775
+ }
776
+ }
573
777
 
574
778
  //#endregion
575
779
  //#region src/commands/logout.ts
@@ -870,7 +1074,7 @@ async function skillsShow(slug) {
870
1074
 
871
1075
  //#endregion
872
1076
  //#region ../mcp-clients/dist/install.js
873
- const SERVER_NAME = "sequel";
1077
+ const SERVER_NAME$1 = "sequel";
874
1078
  /** Folder name of the Sequel skill inside an agent's skills directory. */
875
1079
  const SKILL_NAME = "sequel";
876
1080
  /**
@@ -929,7 +1133,7 @@ function mergeYaml(path, mutate) {
929
1133
  }
930
1134
  function setNested(cfg, key, value) {
931
1135
  const obj = cfg[key] ?? {};
932
- obj[SERVER_NAME] = value;
1136
+ obj[SERVER_NAME$1] = value;
933
1137
  cfg[key] = obj;
934
1138
  }
935
1139
  const mcpClients = [
@@ -954,7 +1158,7 @@ const mcpClients = [
954
1158
  slug: "claude-code",
955
1159
  name: "Claude Code",
956
1160
  scopes: ["global", "local"],
957
- describe: (o) => `claude mcp add --scope ${o.scope === "global" ? "user" : "local"} --transport http ${SERVER_NAME} …`,
1161
+ describe: (o) => `claude mcp add --scope ${o.scope === "global" ? "user" : "local"} --transport http ${SERVER_NAME$1} …`,
958
1162
  skillsDir: (o) => o.scope === "global" ? join(home(o), ".claude", "skills") : join(cwd(o), ".claude", "skills"),
959
1163
  install(o) {
960
1164
  return {
@@ -967,7 +1171,7 @@ const mcpClients = [
967
1171
  o.scope === "global" ? "user" : "local",
968
1172
  "--transport",
969
1173
  "http",
970
- SERVER_NAME,
1174
+ SERVER_NAME$1,
971
1175
  mcpUrl(o.apiUrl),
972
1176
  "--header",
973
1177
  `Authorization: ${bearer(o.apiKey)}`
@@ -1065,7 +1269,7 @@ const mcpClients = [
1065
1269
  slug: "openclaw",
1066
1270
  name: "OpenClaw",
1067
1271
  scopes: ["global"],
1068
- describe: () => `openclaw mcp set ${SERVER_NAME} …`,
1272
+ describe: () => `openclaw mcp set ${SERVER_NAME$1} …`,
1069
1273
  install(o) {
1070
1274
  const def = JSON.stringify({
1071
1275
  url: mcpUrl(o.apiUrl),
@@ -1078,7 +1282,7 @@ const mcpClients = [
1078
1282
  args: [
1079
1283
  "mcp",
1080
1284
  "set",
1081
- SERVER_NAME,
1285
+ SERVER_NAME$1,
1082
1286
  def
1083
1287
  ]
1084
1288
  };
@@ -1129,23 +1333,32 @@ async function fetchSkillMarkdown() {
1129
1333
  //#endregion
1130
1334
  //#region src/commands/install.ts
1131
1335
  const SCOPES = ["global", "local"];
1336
+ /** MCP server name the CLI installs under; used in recovery hints. */
1337
+ const SERVER_NAME = "sequel";
1338
+ /**
1339
+ * Mask credential-bearing argv entries so a failure can show a runnable-looking
1340
+ * command without leaking the bearer token into logs or an agent's transcript.
1341
+ */
1342
+ function redactArgs(args) {
1343
+ return args.map((arg) => /^Authorization:/i.test(arg) ? "Authorization: Bearer sql_your_api_key" : arg);
1344
+ }
1132
1345
  async function installCommand(slugArg, opts = {}) {
1133
1346
  const interactive = !isJsonMode();
1134
1347
  const slugList = mcpClients.map((c) => c.slug).join(", ");
1135
1348
  if (interactive) p$1.intro(pc.cyan("Install the Sequel MCP server and skill"));
1136
1349
  if (slugArg && !getMcpClient(slugArg)) throw new Error(`Unknown agent "${slugArg}". Options: ${slugList}`);
1137
1350
  if (!slugArg && !interactive) throw new Error(`Pass the agent slug when running non-interactively: \`sequel install <agent>\`. Options: ${slugList}`);
1138
- if (!isLoggedIn()) {
1139
- const msg = "You need to sign in to Sequel first — opening your browser…";
1140
- if (interactive) p$1.log.info(msg);
1141
- else info(msg);
1351
+ if (!isLoggedIn()) if (!interactive) {
1352
+ const pending = readPendingLogin();
1353
+ if (pending?.status !== "pending") throw new Error("Not signed in. Run `sequel login` first: it prints a sign-in URL for the user to open. Once they have signed in, rerun this command.");
1354
+ info(`Waiting for the sign-in at ${pending.url} to finish…`);
1355
+ if (!await waitForLogin(pending.expiresAt - Date.now())) throw new Error("The sign-in did not complete. Run `sequel login` to get a fresh URL, then rerun this command.");
1356
+ } else {
1357
+ p$1.log.info("You need to sign in to Sequel first — opening your browser…");
1142
1358
  try {
1143
1359
  const result$1 = await runLoginFlow({ silent: opts.browser === false });
1144
- const signedIn = `Signed in as ${result$1.user.email}${result$1.org ? ` (${result$1.org.name})` : ""}.`;
1145
- if (interactive) p$1.log.success(signedIn);
1146
- else success(signedIn);
1360
+ p$1.log.success(`Signed in as ${result$1.user.email}${result$1.org ? ` (${result$1.org.name})` : ""}.`);
1147
1361
  } catch (err) {
1148
- if (!interactive) throw err;
1149
1362
  p$1.cancel(err instanceof Error ? err.message : String(err));
1150
1363
  return;
1151
1364
  }
@@ -1190,8 +1403,9 @@ async function installCommand(slugArg, opts = {}) {
1190
1403
  const s = interactive ? p$1.spinner() : null;
1191
1404
  s?.start("Creating a Sequel API key for this agent…");
1192
1405
  let key;
1406
+ let keyPrefix;
1193
1407
  try {
1194
- ({key} = await createApiKey(`Sequel CLI (${client.name})`));
1408
+ ({key, keyPrefix} = await createApiKey(`Sequel CLI (${client.name})`));
1195
1409
  } catch (err) {
1196
1410
  s?.stop("Failed to create API key.");
1197
1411
  throw err;
@@ -1206,7 +1420,14 @@ async function installCommand(slugArg, opts = {}) {
1206
1420
  try {
1207
1421
  execFileSync(result.command, result.args, { stdio: "inherit" });
1208
1422
  } catch {
1209
- throw new Error(`Failed to run \`${result.command}\`. Make sure it's installed, or run manually:\n${result.command} ${result.args.join(" ")}`);
1423
+ throw new Error([
1424
+ `Failed to run \`${result.command}\`. Make sure it's installed, then run:`,
1425
+ ` ${result.command} ${redactArgs(result.args).join(" ")}`,
1426
+ "",
1427
+ `A Sequel API key (${keyPrefix}…) was created before this step and is now unused.`,
1428
+ "Revoke it under Settings → API Keys, or rerun this command once the problem is fixed.",
1429
+ `If the MCP server is already configured, remove it first (e.g. \`claude mcp remove ${SERVER_NAME}\`) and rerun.`
1430
+ ].join("\n"));
1210
1431
  }
1211
1432
  success(`Installed Sequel into ${client.name} (${scope}).`);
1212
1433
  } else {
@@ -1395,7 +1616,8 @@ function action(fn) {
1395
1616
  };
1396
1617
  }
1397
1618
  program.command("upgrade").description("Upgrade the Sequel CLI to the latest version").action(action(upgradeCommand));
1398
- program.command("login").description("Sign in to Sequel").option("--no-browser", "print the sign-in URL instead of opening a browser").action(action(loginCommand));
1619
+ program.command("login").description("Sign in to Sequel").option("--no-browser", "print the sign-in URL instead of opening a browser").option("--detach", "print the sign-in URL and return; finish signing in in the background (default when piped)").option("--status", "report whether you are signed in, or a sign-in is pending, without starting one").option("--wait", "block until a pending background sign-in finishes").action(action(loginCommand));
1620
+ program.command("login-worker", { hidden: true }).option("--no-browser").action(action(loginWorkerCommand));
1399
1621
  program.command("logout").description("Sign out and remove cached credentials").action(action(logoutCommand));
1400
1622
  program.command("switch").description("Switch the active organization").action(action(switchCommand));
1401
1623
  program.command("connect").argument("[source]", "connector id (e.g. postgres); omit to choose interactively").description("Connect a new data source").action(action(connectCommand));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["config?: AuthConfig | null","config: AuthConfig","isLoggedIn","buf: Buffer","apiUrl: string","params: Record<string, string>","redirectUri: string","accessToken: string","expectedState: string","resolveCode!: (code: string) => void","rejectCode!: (err: Error) => void","title: string","message: string","options?: { silent?: boolean }","next: AuthConfig","entry: TokenEntry","status: number","message: string","path: string","options: RequestOptions","headers: Record<string, string>","body: string | undefined","text","id: string","appId: string","body: Record<string, unknown>","token: string","connectionId: string","tool: string","params: Record<string, unknown>","useCase: string","connectionIds?: string[]","name: string","sessionId: string","on: boolean","data: unknown","value: unknown","rows: Array<Record<string, unknown>>","columns?: string[]","message: string","opts: LoginOptions","connector: Connector","token: string","source?: string","connector: Connector | undefined","credentials: Record<string, string>","p","name","s","res","result","idOrShort: string","message: string","c: Connection","idOrShort?: string","config: { schemaFilters: string[] | null; instructions: string | null } | null","path: string","skills","slug: string","SCOPES: readonly Scope[]","slugArg?: string","opts: InstallOptions","result","scope: Scope","key: string","useCase: string","opts: { connection?: string[] }","connectionId: string","tool: string","opts: { data?: string }","params: Record<string, unknown>","n: number","sessionId: string","filePath: string","opts: { output?: string }","MANAGERS: Manager[]","cmd: string","pkg","fn: (...args: A) => Promise<void>","id: string","usecase: string","opts: { connection?: string[] }","connectionId: string","tool: string","opts: { data?: string }","sessionId: string","path: string","opts: { output?: string }"],"sources":["../package.json","../src/lib/config.ts","../src/lib/auth.ts","../src/lib/api.ts","../src/lib/output.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/switch.ts","../src/commands/connect.ts","../src/commands/sources.ts","../src/commands/skills.ts","../../mcp-clients/dist/install.js","../src/lib/skills.ts","../src/commands/install.ts","../src/commands/search.ts","../src/commands/execute.ts","../src/commands/download.ts","../src/commands/upgrade.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@sequelsh/cli\",\n \"version\": \"0.3.0\",\n \"description\": \"Sequel CLI — connect data sources and run tools from your terminal.\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"bin\": {\n \"sequel\": \"./dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n }\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/sequelsh/sequel.git\",\n \"directory\": \"packages/cli\"\n },\n \"homepage\": \"https://sequel.sh\",\n \"keywords\": [\n \"sequel\",\n \"cli\",\n \"mcp\",\n \"sql\",\n \"data\",\n \"ai\",\n \"agents\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"dev\": \"bun run src/index.ts\",\n \"cli\": \"bun run src/index.ts\",\n \"build\": \"tsdown\",\n \"build:binaries\": \"bun run scripts/build-binaries.ts\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^0.8.2\",\n \"commander\": \"^12.1.0\",\n \"open\": \"^10.1.0\",\n \"picocolors\": \"^1.1.1\",\n \"yaml\": \"^2.5.1\"\n },\n \"devDependencies\": {\n \"@sequel/mcp-clients\": \"workspace:*\",\n \"@sequel/typescript-config\": \"workspace:*\",\n \"@types/node\": \"^22.10.0\",\n \"tsdown\": \"^0.9.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^3.0.0\"\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdirSync, readFileSync, writeFileSync, rmSync, existsSync, chmodSync } from \"node:fs\";\n\n/** Default production API base. Override with SEQUEL_API_URL for local/dev. */\nexport const DEFAULT_API_URL = \"https://api.sequel.sh\";\n\n/** Default marketing site, which publishes the Sequel skill. Override with SEQUEL_SITE_URL. */\nexport const DEFAULT_SITE_URL = \"https://sequel.sh\";\n\nexport function resolveSiteUrl(): string {\n return process.env.SEQUEL_SITE_URL || DEFAULT_SITE_URL;\n}\n\n/** One OAuth token bundle, scoped to a single organization. */\nexport interface TokenEntry {\n accessToken: string;\n refreshToken: string;\n /** ms epoch when the access token expires. */\n expiresAt: number;\n}\n\nexport interface OrgRef {\n id: string;\n name: string;\n slug: string;\n role: string;\n}\n\nexport interface UserRef {\n id: string;\n email: string;\n name: string;\n}\n\n/**\n * The on-disk shape of ~/.sequel/auth.json.\n *\n * Multi-token cache: one genuine org-bound OAuth token per organization, keyed\n * by org id. `activeOrgId` selects which token requests use right now. Switching\n * orgs is an offline swap when the target org already has a cached token.\n */\nexport interface AuthConfig {\n version: 1;\n apiUrl: string;\n /** Persisted dynamic client registration, reused across logins. */\n clientId?: string;\n activeOrgId?: string;\n tokens: Record<string, TokenEntry>;\n user?: UserRef;\n /** Cached membership list for the `switch` UI. */\n orgs?: OrgRef[];\n}\n\n/** Directory holding the CLI's state. Overridable for tests. */\nexport function configDir(): string {\n return process.env.SEQUEL_CONFIG_DIR || join(homedir(), \".sequel\");\n}\n\nexport function configPath(): string {\n return join(configDir(), \"auth.json\");\n}\n\n/** The API base URL: explicit env wins, then a saved value, then the default. */\nexport function resolveApiUrl(config?: AuthConfig | null): string {\n return process.env.SEQUEL_API_URL || config?.apiUrl || DEFAULT_API_URL;\n}\n\nfunction emptyConfig(): AuthConfig {\n return { version: 1, apiUrl: resolveApiUrl(), tokens: {} };\n}\n\n/** Read auth.json, returning a fresh empty config if missing or corrupt. */\nexport function readConfig(): AuthConfig {\n const path = configPath();\n if (!existsSync(path)) return emptyConfig();\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf8\")) as AuthConfig;\n if (!parsed || typeof parsed !== \"object\" || !parsed.tokens) return emptyConfig();\n parsed.tokens ??= {};\n return parsed;\n } catch {\n // Corrupt file — start clean rather than crash.\n return emptyConfig();\n }\n}\n\n/** Persist auth.json with locked-down permissions (dir 0700, file 0600). */\nexport function writeConfig(config: AuthConfig): void {\n const dir = configDir();\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n const path = configPath();\n writeFileSync(path, `${JSON.stringify(config, null, 2)}\\n`, { mode: 0o600 });\n // writeFileSync only applies mode on create; enforce it on existing files too.\n chmodSync(path, 0o600);\n}\n\n/** Remove all stored credentials. Idempotent. */\nexport function clearConfig(): void {\n const path = configPath();\n if (existsSync(path)) rmSync(path);\n}\n\nexport function isLoggedIn(config: AuthConfig): boolean {\n return Boolean(config.activeOrgId && config.tokens[config.activeOrgId]);\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport { createServer } from \"node:http\";\nimport { AddressInfo } from \"node:net\";\nimport open from \"open\";\nimport {\n type AuthConfig,\n type OrgRef,\n type TokenEntry,\n type UserRef,\n readConfig,\n writeConfig,\n resolveApiUrl,\n} from \"./config\";\n\n/** Refresh a token this many ms before it actually expires. */\nconst EXPIRY_SKEW_MS = 60_000;\n\nfunction base64url(buf: Buffer): string {\n return buf.toString(\"base64url\");\n}\n\n/** PKCE pair: challenge = base64url(sha256(verifier)), matching the API's S256. */\nexport function generatePkce(): { verifier: string; challenge: string } {\n const verifier = base64url(randomBytes(32));\n const challenge = base64url(createHash(\"sha256\").update(verifier).digest());\n return { verifier, challenge };\n}\n\ninterface TokenResponse {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n token_type: string;\n}\n\ninterface WhoAmI {\n id: string;\n name: string;\n email: string;\n organizationId: string;\n}\n\n/** POST the OAuth token endpoint (form-encoded, per RFC 6749). */\nasync function postToken(apiUrl: string, params: Record<string, string>): Promise<TokenResponse> {\n const res = await fetch(`${apiUrl}/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams(params).toString(),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Token request failed (${res.status}): ${body}`);\n }\n return (await res.json()) as TokenResponse;\n}\n\n/** Register a fresh dynamic OAuth client bound to this run's loopback URI. */\nasync function registerClient(apiUrl: string, redirectUri: string): Promise<string> {\n const res = await fetch(`${apiUrl}/oauth/register`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ client_name: \"Sequel CLI\", redirect_uris: [redirectUri] }),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Client registration failed (${res.status}): ${body}`);\n }\n const data = (await res.json()) as { client_id: string };\n return data.client_id;\n}\n\nasync function fetchWhoAmI(apiUrl: string, accessToken: string): Promise<WhoAmI> {\n const res = await fetch(`${apiUrl}/users/me`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n if (!res.ok) throw new Error(`Failed to resolve identity (${res.status})`);\n return (await res.json()) as WhoAmI;\n}\n\nexport async function fetchOrganizations(apiUrl: string, accessToken: string): Promise<OrgRef[]> {\n const res = await fetch(`${apiUrl}/organizations`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n if (!res.ok) throw new Error(`Failed to list organizations (${res.status})`);\n const rows = (await res.json()) as Array<{\n role: string;\n organization: { id: string; name: string; slug: string };\n }>;\n return rows.map((r) => ({\n id: r.organization.id,\n name: r.organization.name,\n slug: r.organization.slug,\n role: r.role,\n }));\n}\n\n/**\n * Wait for the browser to hit the loopback redirect and hand back `?code&state`.\n * Resolves with the authorization code once `state` is verified.\n */\nfunction waitForCallback(\n expectedState: string,\n): { server: ReturnType<typeof createServer>; port: Promise<number>; code: Promise<string> } {\n let resolveCode!: (code: string) => void;\n let rejectCode!: (err: Error) => void;\n const code = new Promise<string>((resolve, reject) => {\n resolveCode = resolve;\n rejectCode = reject;\n });\n\n const server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname !== \"/callback\") {\n res.writeHead(404).end(\"Not found\");\n return;\n }\n const error = url.searchParams.get(\"error\");\n const returnedState = url.searchParams.get(\"state\");\n const returnedCode = url.searchParams.get(\"code\");\n\n const finish = (title: string, message: string) => {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(\n `<!doctype html><html><head><title>${title}</title></head><body style=\"font-family:system-ui;padding:3rem;text-align:center\"><h2>${title}</h2><p>${message}</p><p>You can close this tab and return to your terminal.</p></body></html>`,\n );\n };\n\n if (error) {\n finish(\"Sign-in failed\", `The authorization server returned: ${error}`);\n rejectCode(new Error(`Authorization failed: ${error}`));\n return;\n }\n if (!returnedState || returnedState !== expectedState) {\n finish(\"Sign-in failed\", \"State mismatch — possible CSRF. Please try again.\");\n rejectCode(new Error(\"State mismatch in OAuth callback\"));\n return;\n }\n if (!returnedCode) {\n finish(\"Sign-in failed\", \"No authorization code was returned.\");\n rejectCode(new Error(\"Missing authorization code\"));\n return;\n }\n finish(\"Signed in to Sequel\", \"Authentication complete.\");\n resolveCode(returnedCode);\n });\n\n const port = new Promise<number>((resolve, reject) => {\n server.on(\"error\", reject);\n server.listen(0, \"127.0.0.1\", () => resolve((server.address() as AddressInfo).port));\n });\n\n return { server, port, code };\n}\n\nexport interface LoginResult {\n user: UserRef;\n org: OrgRef | undefined;\n organizationId: string;\n}\n\n/**\n * Run the full OAuth 2.0 + PKCE loopback flow: register a client, open the\n * browser to the consent page (where the user picks an org), capture the code,\n * exchange it for an org-bound token, then cache that token keyed by its org.\n *\n * Shared by `login` and `switch` (for orgs without a cached token).\n */\nexport async function runLoginFlow(options?: { silent?: boolean }): Promise<LoginResult> {\n const config = readConfig();\n const apiUrl = resolveApiUrl(config);\n\n const { verifier, challenge } = generatePkce();\n const state = base64url(randomBytes(16));\n\n const { server, port: portPromise, code: codePromise } = waitForCallback(state);\n const port = await portPromise;\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n\n try {\n const clientId = await registerClient(apiUrl, redirectUri);\n\n const authorizeUrl = new URL(`${apiUrl}/oauth/authorize`);\n authorizeUrl.searchParams.set(\"client_id\", clientId);\n authorizeUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authorizeUrl.searchParams.set(\"response_type\", \"code\");\n authorizeUrl.searchParams.set(\"code_challenge\", challenge);\n authorizeUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n authorizeUrl.searchParams.set(\"state\", state);\n\n if (!options?.silent) {\n // open() can fail in headless envs — never block the flow on it.\n open(authorizeUrl.toString()).catch(() => {});\n }\n // Always surface the URL so the user can open it manually if needed.\n process.stderr.write(`\\nOpen this URL to continue:\\n${authorizeUrl.toString()}\\n\\n`);\n\n const code = await codePromise;\n\n const token = await postToken(apiUrl, {\n grant_type: \"authorization_code\",\n code,\n redirect_uri: redirectUri,\n client_id: clientId,\n code_verifier: verifier,\n });\n\n const me = await fetchWhoAmI(apiUrl, token.access_token);\n const orgs = await fetchOrganizations(apiUrl, token.access_token).catch(() => config.orgs ?? []);\n\n const next: AuthConfig = {\n ...config,\n version: 1,\n apiUrl,\n clientId,\n activeOrgId: me.organizationId,\n tokens: {\n ...config.tokens,\n [me.organizationId]: {\n accessToken: token.access_token,\n refreshToken: token.refresh_token,\n expiresAt: Date.now() + token.expires_in * 1000,\n },\n },\n user: { id: me.id, email: me.email, name: me.name },\n orgs,\n };\n writeConfig(next);\n\n return {\n user: next.user!,\n org: orgs.find((o) => o.id === me.organizationId),\n organizationId: me.organizationId,\n };\n } finally {\n server.close();\n }\n}\n\n/** True when there's a cached token for the active org (cheap, non-throwing). */\nexport function isLoggedIn(): boolean {\n const config = readConfig();\n const orgId = config.activeOrgId;\n return Boolean(orgId && config.tokens[orgId]);\n}\n\n/**\n * Return a valid access token for the active org, refreshing it in place when\n * expired. Throws a friendly error if there is no token or the refresh fails.\n */\nexport async function getValidAccessToken(): Promise<{ token: string; config: AuthConfig }> {\n const config = readConfig();\n const orgId = config.activeOrgId;\n if (!orgId || !config.tokens[orgId]) {\n throw new Error(\"Not logged in. Run `sequel login` first.\");\n }\n\n const entry: TokenEntry = config.tokens[orgId];\n if (entry.expiresAt - EXPIRY_SKEW_MS > Date.now()) {\n return { token: entry.accessToken, config };\n }\n\n // Access token expired — rotate via the refresh grant.\n const apiUrl = resolveApiUrl(config);\n try {\n const refreshed = await postToken(apiUrl, {\n grant_type: \"refresh_token\",\n refresh_token: entry.refreshToken,\n client_id: config.clientId ?? \"\",\n });\n config.tokens[orgId] = {\n accessToken: refreshed.access_token,\n refreshToken: refreshed.refresh_token,\n expiresAt: Date.now() + refreshed.expires_in * 1000,\n };\n writeConfig(config);\n return { token: refreshed.access_token, config };\n } catch {\n throw new Error(\n \"Your session for this organization has expired. Run `sequel login` (or `sequel switch`) to sign in again.\",\n );\n }\n}\n","import { getValidAccessToken } from \"./auth\";\nimport { resolveApiUrl } from \"./config\";\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n message: string,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\ninterface RequestOptions {\n method?: string;\n query?: Record<string, string | undefined>;\n body?: Record<string, unknown>;\n /**\n * How the active org id is attached to the request:\n * - \"query\" → ?organizationId=<org> (default; most GET/DELETE routes)\n * - \"organizationId\" → merged into the JSON body as organizationId\n * - \"organization_id\" → merged into the JSON body as organization_id (execute)\n * - \"none\" → not attached (e.g. /connectors, /oauth/*)\n */\n org?: \"query\" | \"organizationId\" | \"organization_id\" | \"none\";\n}\n\n/**\n * Authenticated request against the Sequel API using the active org's token.\n * Refreshes the token transparently and scopes the call to that org.\n */\nexport async function request<T = unknown>(path: string, options: RequestOptions = {}): Promise<T> {\n const { token, config } = await getValidAccessToken();\n const apiUrl = resolveApiUrl(config);\n const orgId = config.activeOrgId;\n const orgMode = options.org ?? \"query\";\n\n const url = new URL(`${apiUrl}${path}`);\n if (orgMode === \"query\" && orgId) url.searchParams.set(\"organizationId\", orgId);\n for (const [k, v] of Object.entries(options.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, v);\n }\n\n let bodyObj = options.body;\n if ((orgMode === \"organizationId\" || orgMode === \"organization_id\") && orgId) {\n bodyObj = { ...(bodyObj ?? {}), [orgMode]: orgId };\n }\n\n const headers: Record<string, string> = { Authorization: `Bearer ${token}` };\n let body: string | undefined;\n if (bodyObj !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(bodyObj);\n }\n\n const res = await fetch(url.toString(), { method: options.method ?? \"GET\", headers, body });\n\n if (!res.ok) {\n let message = `Request failed (${res.status})`;\n const text = await res.text().catch(() => \"\");\n try {\n const json = JSON.parse(text) as { error?: string };\n if (json.error) message = json.error;\n } catch {\n if (text) message = text;\n }\n throw new ApiError(res.status, message);\n }\n\n if (res.status === 204) return undefined as T;\n const text = await res.text();\n return (text ? JSON.parse(text) : undefined) as T;\n}\n\n/** The active organization id, or throws if not logged in. */\nexport async function activeOrgId(): Promise<string> {\n const { config } = await getValidAccessToken();\n if (!config.activeOrgId) throw new Error(\"No active organization. Run `sequel login`.\");\n return config.activeOrgId;\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport interface Connector {\n id: string;\n name: string;\n description: string;\n icon: string;\n appType: \"database\" | \"app\" | \"mcp\";\n live: boolean;\n authId: string;\n credentialsSchema?: Record<string, unknown>;\n userInputFields?: string[];\n canResolveName?: boolean;\n configuration?: { type: string } | null;\n}\n\nexport interface Connection {\n id: string;\n shortId: string;\n name: string;\n type: string;\n createdBy?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type LinkCreateResponse =\n | { status: \"success\"; connection: Connection }\n | { status: \"pending\"; link_token: string; redirect_url: string; expires_at: string };\n\nexport interface LinkStatus {\n status: \"pending\" | \"oauth_in_progress\" | \"awaiting_configuration\" | \"success\" | \"failed\" | \"completed\";\n connectionId?: string;\n connection_id?: string;\n reason?: string;\n}\n\nexport interface ExecuteResult {\n data: Array<Record<string, unknown>>;\n columns: string[];\n row_count: number;\n truncated: boolean;\n}\n\nexport interface SearchToolRef {\n tool_id: string;\n input_schema: Record<string, unknown>;\n output_schema: Record<string, unknown> | null;\n relevant_tables: string[];\n}\n\nexport interface SearchResult {\n connection_id: string;\n connection_name: string;\n app_id: string;\n use_case: string;\n instructions: string;\n tools: SearchToolRef[];\n}\n\n// ── Endpoint wrappers ───────────────────────────────────────────────────────────\n\nexport function listConnectors(): Promise<Connector[]> {\n return request<Connector[]>(\"/connectors\", { org: \"none\" });\n}\n\nexport function listConnections(): Promise<Connection[]> {\n return request<Connection[]>(\"/connections\");\n}\n\nexport function getConnection(id: string): Promise<Connection> {\n return request<Connection>(`/connections/${id}`);\n}\n\nexport function deleteConnection(id: string): Promise<Connection> {\n return request<Connection>(`/connections/${id}`, { method: \"DELETE\" });\n}\n\nexport function testConnection(id: string): Promise<{ success: boolean; message: string }> {\n return request(`/connections/${id}/test`, { method: \"POST\", org: \"organizationId\" });\n}\n\nexport function getConnectionConfig(\n id: string,\n): Promise<{ schemaFilters: string[] | null; instructions: string | null }> {\n return request(`/connections/${id}/config`);\n}\n\n/** Mint a connect link / create a connection for the given connector. */\nexport function createLink(appId: string, body: Record<string, unknown>): Promise<LinkCreateResponse> {\n // POST /link/:appId resolves the org from the token's session, which always\n // matches the active org in the multi-token model — no org param needed.\n return request<LinkCreateResponse>(`/link/${appId}`, { method: \"POST\", org: \"none\", body });\n}\n\n/**\n * Poll a connect link's status. Uses the authenticated route, which (unlike the\n * public one) reports terminal states — `completed`/`failed` — so the CLI can\n * tell when the browser flow has finished.\n */\nexport function getLinkStatus(token: string): Promise<LinkStatus> {\n return request<LinkStatus>(`/link/${token}/status`, { org: \"none\" });\n}\n\nexport function execute(\n connectionId: string,\n tool: string,\n params: Record<string, unknown>,\n): Promise<ExecuteResult> {\n return request<ExecuteResult>(\"/execute\", {\n method: \"POST\",\n org: \"organization_id\",\n body: { connection_id: connectionId, tool, params },\n });\n}\n\nexport function search(useCase: string, connectionIds?: string[]): Promise<{ results: SearchResult[] }> {\n return request<{ results: SearchResult[] }>(\"/search\", {\n method: \"POST\",\n org: \"organization_id\",\n body: {\n action_info: `CLI search: ${useCase}`,\n use_case: useCase,\n connection_ids: connectionIds,\n },\n });\n}\n\nexport async function createApiKey(name: string): Promise<{ key: string; keyPrefix: string }> {\n const orgId = await activeOrgId();\n return request(`/organizations/${orgId}/api-keys`, { method: \"POST\", org: \"none\", body: { name } });\n}\n\nexport interface FileDownloadInfo {\n url: string;\n filename: string;\n size: number;\n expires_in_seconds: number;\n}\n\n/** Get a signed URL to download a file produced in a session (by sequel_execute / workbench). */\nexport function getFileDownloadUrl(sessionId: string, path: string): Promise<FileDownloadInfo> {\n return request<FileDownloadInfo>(\"/files/download\", { query: { session_id: sessionId, path } });\n}\n","import pc from \"picocolors\";\n\nexport { pc };\n\n/** True when the user passed a global --json flag (set by index.ts). */\nlet jsonMode = false;\nexport function setJsonMode(on: boolean): void {\n jsonMode = on;\n}\nexport function isJsonMode(): boolean {\n return jsonMode;\n}\n\nexport function printJson(data: unknown): void {\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`);\n}\n\nfunction cell(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n\n/**\n * Render an array of records as an aligned text table. `columns` controls order\n * and which keys are shown; defaults to the union of keys in the first row.\n */\nexport function renderTable(rows: Array<Record<string, unknown>>, columns?: string[]): string {\n if (rows.length === 0) return pc.dim(\"(no rows)\");\n const cols = columns ?? Object.keys(rows[0]);\n const widths = cols.map((c) => Math.max(c.length, ...rows.map((r) => cell(r[c]).length)));\n\n const header = cols.map((c, i) => pc.bold(c.padEnd(widths[i]))).join(\" \");\n const sep = cols.map((_, i) => \"─\".repeat(widths[i])).join(\" \");\n const body = rows\n .map((r) => cols.map((c, i) => cell(r[c]).padEnd(widths[i])).join(\" \"))\n .join(\"\\n\");\n\n return `${header}\\n${pc.dim(sep)}\\n${body}`;\n}\n\nexport function printTable(rows: Array<Record<string, unknown>>, columns?: string[]): void {\n // Never emit human tables to stdout in JSON mode — keep stdout valid JSON for jq.\n if (jsonMode) return;\n process.stdout.write(`${renderTable(rows, columns)}\\n`);\n}\n\n// In JSON mode, human-facing lines go to stderr so stdout stays pure JSON.\nexport function success(message: string): void {\n (jsonMode ? process.stderr : process.stdout).write(`${pc.green(\"✓\")} ${message}\\n`);\n}\n\nexport function info(message: string): void {\n (jsonMode ? process.stderr : process.stdout).write(`${message}\\n`);\n}\n\nexport function fail(message: string): void {\n process.stderr.write(`${pc.red(\"✗\")} ${message}\\n`);\n}\n","import * as p from \"@clack/prompts\";\nimport { runLoginFlow } from \"../lib/auth\";\nimport { info, isJsonMode, pc, printJson, success } from \"../lib/output\";\n\nexport interface LoginOptions {\n /** Commander's `--no-browser` sets this to false: print the URL, don't open it. */\n browser?: boolean;\n}\n\nexport async function loginCommand(opts: LoginOptions = {}): Promise<void> {\n const json = isJsonMode();\n const openBrowser = opts.browser !== false;\n const opening = openBrowser ? \"Opening your browser to authorize…\" : \"Sign in with the URL below…\";\n if (json) {\n info(opening); // → stderr in JSON mode\n } else {\n p.intro(pc.cyan(\"Sign in to Sequel\"));\n p.log.info(opening);\n }\n\n const res = await runLoginFlow({ silent: !openBrowser });\n\n if (json) return printJson({ status: \"logged_in\", user: res.user, org: res.org ?? null });\n success(`Logged in as ${pc.bold(res.user.email)}${res.org ? ` · ${pc.bold(res.org.name)}` : \"\"}`);\n p.outro(\"You're all set. Try `sequel sources list` or `sequel connect`.\");\n}\n","import { clearConfig, isLoggedIn, readConfig } from \"../lib/config\";\nimport { info, isJsonMode, printJson, success } from \"../lib/output\";\n\nexport async function logoutCommand(): Promise<void> {\n const config = readConfig();\n if (!isLoggedIn(config)) {\n if (isJsonMode()) return printJson({ status: \"not_logged_in\" });\n info(\"You are not logged in.\");\n return;\n }\n clearConfig();\n if (isJsonMode()) return printJson({ status: \"logged_out\" });\n success(\"Logged out. Cached credentials removed from ~/.sequel/auth.json.\");\n}\n","import * as p from \"@clack/prompts\";\nimport { fetchOrganizations, getValidAccessToken, runLoginFlow } from \"../lib/auth\";\nimport { isLoggedIn, readConfig, resolveApiUrl, writeConfig } from \"../lib/config\";\nimport { isJsonMode, pc, success } from \"../lib/output\";\n\nexport async function switchCommand(): Promise<void> {\n if (isJsonMode()) {\n throw new Error(\n \"`sequel switch` is interactive (it prompts for an organization) — run it in a terminal, not piped/--json.\",\n );\n }\n const config = readConfig();\n if (!isLoggedIn(config)) {\n throw new Error(\"Not logged in. Run `sequel login` first.\");\n }\n\n // Refresh the membership list with the active org's token.\n let orgs = config.orgs ?? [];\n try {\n const { token } = await getValidAccessToken();\n orgs = await fetchOrganizations(resolveApiUrl(config), token);\n writeConfig({ ...readConfig(), orgs });\n } catch {\n // fall back to cached orgs\n }\n if (orgs.length === 0) throw new Error(\"No organizations available for this account.\");\n\n const selection = await p.select({\n message: \"Switch to organization\",\n options: orgs.map((o) => ({\n value: o.id,\n label: o.id === config.activeOrgId ? `${o.name} ${pc.dim(\"(current)\")}` : o.name,\n hint: config.tokens[o.id] ? o.role : \"sign-in required\",\n })),\n });\n if (p.isCancel(selection)) {\n p.cancel(\"Cancelled.\");\n return;\n }\n\n const orgId = selection as string;\n const org = orgs.find((o) => o.id === orgId);\n const fresh = readConfig();\n\n if (fresh.tokens[orgId]) {\n // Already authorized — instant, offline swap.\n writeConfig({ ...fresh, activeOrgId: orgId });\n success(`Switched to ${pc.bold(org?.name ?? orgId)}.`);\n return;\n }\n\n // No cached token for this org — sign in so the user can authorize it.\n p.log.info(`You haven't authorized ${pc.bold(org?.name ?? orgId)} yet — opening your browser…`);\n const res = await runLoginFlow();\n success(`Switched to ${pc.bold(res.org?.name ?? res.organizationId)}.`);\n}\n","import * as p from \"@clack/prompts\";\nimport open from \"open\";\nimport {\n type Connector,\n createLink,\n getLinkStatus,\n listConnectors,\n} from \"../lib/api\";\nimport { info, isJsonMode, pc, success } from \"../lib/output\";\n\nconst SECRET_RE = /pass|secret|token|key|connection|credential/i;\n\nfunction fieldsFor(connector: Connector): string[] {\n if (connector.userInputFields?.length) return connector.userInputFields;\n const props = (connector.credentialsSchema as { properties?: Record<string, unknown> } | undefined)?.properties;\n return props ? Object.keys(props) : [];\n}\n\nfunction isOAuth(connector: Connector): boolean {\n return Boolean(connector.configuration) || /oauth/i.test(connector.authId);\n}\n\n/** Poll a pending connect link until it completes or fails (or times out). */\nasync function pollLink(token: string): Promise<{ ok: boolean; reason?: string }> {\n const deadline = Date.now() + 5 * 60_000;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 2000));\n let status;\n try {\n status = await getLinkStatus(token);\n } catch {\n continue; // transient — keep polling\n }\n if (status.status === \"failed\") return { ok: false, reason: status.reason };\n if (status.status === \"success\" || status.status === \"completed\") return { ok: true };\n }\n return { ok: false, reason: \"Timed out waiting for the browser to finish.\" };\n}\n\nexport async function connectCommand(source?: string): Promise<void> {\n if (isJsonMode()) {\n throw new Error(\n \"`sequel connect` is interactive (it prompts for credentials/consent) — run it in a terminal, not piped/--json.\",\n );\n }\n const connectors = await listConnectors();\n\n let connector: Connector | undefined;\n if (source) {\n connector = connectors.find((c) => c.id === source);\n if (!connector) {\n throw new Error(\n `Unknown connector \"${source}\". Available: ${connectors.map((c) => c.id).join(\", \")}`,\n );\n }\n } else {\n const choice = await p.select({\n message: \"Which data source do you want to connect?\",\n options: connectors\n .slice()\n .sort((a, b) => a.appType.localeCompare(b.appType) || a.name.localeCompare(b.name))\n .map((c) => ({ value: c.id, label: c.name, hint: c.appType })),\n });\n if (p.isCancel(choice)) {\n p.cancel(\"Cancelled.\");\n return;\n }\n connector = connectors.find((c) => c.id === (choice as string))!;\n }\n\n p.intro(`Connect ${pc.bold(connector.name)}`);\n\n if (!isOAuth(connector)) {\n // Pre-auth connector: collect credential fields in the terminal.\n const fields = fieldsFor(connector);\n const credentials: Record<string, string> = {};\n for (const field of fields) {\n const secret = SECRET_RE.test(field);\n const value = await (secret ? p.password : p.text)({\n message: field,\n });\n if (p.isCancel(value)) {\n p.cancel(\"Cancelled.\");\n return;\n }\n credentials[field] = value as string;\n }\n const name = await p.text({ message: \"Name for this source (optional)\", placeholder: connector.name });\n if (p.isCancel(name)) {\n p.cancel(\"Cancelled.\");\n return;\n }\n\n const s = p.spinner();\n s.start(\"Validating credentials…\");\n const res = await createLink(connector.id, {\n credentials,\n ...(name ? { name } : {}),\n });\n if (res.status === \"success\") {\n s.stop(\"Connected.\");\n success(`Created source ${pc.bold(res.connection.name)} (${res.connection.shortId}).`);\n return;\n }\n // Fallback: server wants more input — finish in the browser.\n s.stop(\"Continue in your browser…\");\n open(res.redirect_url).catch(() => {});\n info(`Open: ${res.redirect_url}`);\n const result = await pollLink(res.link_token);\n if (result.ok) success(\"Connected.\");\n else throw new Error(result.reason ?? \"Connection failed.\");\n return;\n }\n\n // OAuth connector: mint a link and let the polished web flow handle consent\n // (and any pre-OAuth fields like a project id), then poll for completion.\n const res = await createLink(connector.id, {});\n if (res.status === \"success\") {\n success(`Created source ${pc.bold(res.connection.name)} (${res.connection.shortId}).`);\n return;\n }\n open(res.redirect_url).catch(() => {});\n info(`Complete authorization in your browser:\\n${res.redirect_url}`);\n const s = p.spinner();\n s.start(\"Waiting for you to finish in the browser…\");\n const result = await pollLink(res.link_token);\n if (result.ok) {\n s.stop(\"Connected.\");\n success(\"Source connected.\");\n } else {\n s.stop(\"Failed.\");\n throw new Error(result.reason ?? \"Connection failed.\");\n }\n}\n","import * as p from \"@clack/prompts\";\nimport {\n type Connection,\n deleteConnection,\n getConnection,\n getConnectionConfig,\n listConnections,\n testConnection,\n} from \"../lib/api\";\nimport { info, isJsonMode, pc, printJson, printTable, success } from \"../lib/output\";\n\n/** Resolve a user-supplied id (uuid or shortId) to the connection's real id. */\nasync function resolveConnection(idOrShort: string): Promise<Connection> {\n const all = await listConnections();\n const match = all.find((c) => c.id === idOrShort || c.shortId === idOrShort);\n if (!match) throw new Error(`No source found matching \"${idOrShort}\".`);\n return match;\n}\n\nasync function pickConnection(message: string): Promise<Connection | undefined> {\n const all = await listConnections();\n if (all.length === 0) {\n info(\"No sources connected yet. Run `sequel connect`.\");\n return undefined;\n }\n const choice = await p.select({\n message,\n options: all.map((c) => ({ value: c.shortId, label: `${c.name} (${c.shortId})`, hint: c.type })),\n });\n if (p.isCancel(choice)) return undefined;\n return all.find((c) => c.shortId === (choice as string));\n}\n\nfunction toRow(c: Connection): Record<string, unknown> {\n return { id: c.shortId, name: c.name, type: c.type, created: c.createdAt.slice(0, 10) };\n}\n\nexport async function sourcesList(): Promise<void> {\n const connections = await listConnections();\n if (isJsonMode()) return printJson(connections);\n if (connections.length === 0) return info(\"No sources connected yet. Run `sequel connect`.\");\n printTable(connections.map(toRow), [\"id\", \"name\", \"type\", \"created\"]);\n}\n\nexport async function sourcesActive(): Promise<void> {\n const connections = await listConnections();\n const rows = await Promise.all(\n connections.map(async (c) => {\n let status = \"unknown\";\n try {\n const t = await testConnection(c.id);\n status = t.success ? \"healthy\" : \"error\";\n } catch {\n status = \"error\";\n }\n return { ...toRow(c), status };\n }),\n );\n if (isJsonMode()) return printJson(rows);\n if (rows.length === 0) return info(\"No sources connected yet. Run `sequel connect`.\");\n printTable(rows, [\"id\", \"name\", \"type\", \"status\", \"created\"]);\n}\n\nexport async function sourcesInfo(idOrShort?: string): Promise<void> {\n const conn = idOrShort ? await resolveConnection(idOrShort) : await pickConnection(\"Source to inspect\");\n if (!conn) return;\n const full = await getConnection(conn.id);\n let config: { schemaFilters: string[] | null; instructions: string | null } | null = null;\n try {\n config = await getConnectionConfig(conn.id);\n } catch {\n /* config may be absent */\n }\n if (isJsonMode()) return printJson({ ...full, config });\n\n info(`${pc.bold(full.name)} ${pc.dim(full.shortId)}`);\n info(`type: ${full.type}`);\n info(`id: ${full.id}`);\n info(`created: ${full.createdAt}`);\n if (config?.schemaFilters?.length) info(`schemas: ${config.schemaFilters.join(\", \")}`);\n if (config?.instructions) info(`\\n${pc.dim(config.instructions)}`);\n}\n\nexport async function sourcesDelete(idOrShort?: string): Promise<void> {\n const conn = idOrShort ? await resolveConnection(idOrShort) : await pickConnection(\"Source to delete\");\n if (!conn) return;\n const confirmed = await p.confirm({ message: `Delete ${pc.bold(conn.name)} (${conn.shortId})? This cannot be undone.` });\n if (p.isCancel(confirmed) || !confirmed) {\n info(\"Cancelled.\");\n return;\n }\n await deleteConnection(conn.id);\n success(`Deleted ${conn.name} (${conn.shortId}).`);\n}\n","import { readConfig, resolveApiUrl } from \"../lib/config\";\nimport { info, isJsonMode, pc, printJson, printTable } from \"../lib/output\";\n\ntype PublicSkill = { id: string; slug: string; name: string; category: string; apps: string[] };\ntype PublicSkillDetail = PublicSkill & { description: string; instructions: string };\n\n// Skills are public, so these hit the unauthenticated marketplace endpoints and\n// work before `sequel login`.\nasync function publicGet<T>(path: string): Promise<T> {\n const res = await fetch(`${resolveApiUrl(readConfig())}${path}`, { headers: { Accept: \"application/json\" } });\n if (res.status === 404) throw new Error(`No skill found matching \"${path.split(\"/\").pop()}\". Run \\`sequel skills list\\`.`);\n if (!res.ok) throw new Error(`Request failed (${res.status})`);\n return (await res.json()) as T;\n}\n\nexport async function skillsList(): Promise<void> {\n const skills = await publicGet<PublicSkill[]>(\"/marketplace/skills\");\n const rows = skills.map((s) => ({ id: s.slug, name: s.name }));\n if (isJsonMode()) return printJson(rows);\n printTable(rows, [\"id\", \"name\"]);\n info(`${rows.length} skills. \\`sequel skills show <id>\\` prints one; \\`sequel install\\` gives your agent all of them.`);\n}\n\nexport async function skillsShow(slug: string): Promise<void> {\n const skill = await publicGet<PublicSkillDetail>(`/marketplace/skills/${encodeURIComponent(slug)}`);\n if (isJsonMode()) return printJson(skill);\n process.stdout.write(\n `${pc.bold(skill.name)} ${pc.dim(skill.slug)}\\n${skill.description}\\n` +\n (skill.apps.length ? `${pc.dim(\"apps:\")} ${skill.apps.join(\", \")}\\n` : \"\") +\n `\\n${skill.instructions}\\n`,\n );\n}\n","import { homedir, platform } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport YAML from \"yaml\";\n\n//#region src/install.ts\nconst SERVER_NAME = \"sequel\";\n/** Folder name of the Sequel skill inside an agent's skills directory. */\nconst SKILL_NAME = \"sequel\";\n/**\n* Write the Sequel SKILL.md into `<dir>/sequel/SKILL.md`, replacing any previous\n* copy. Skill files are plain markdown, so unlike the MCP configs there is\n* nothing to merge: the whole file is ours.\n*/\nfunction installSkill({ dir, markdown }) {\n\tconst path = join(dir, SKILL_NAME, \"SKILL.md\");\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, markdown.endsWith(\"\\n\") ? markdown : `${markdown}\\n`);\n\treturn {\n\t\tkind: \"file\",\n\t\tpath\n\t};\n}\nconst mcpUrl = (apiUrl) => `${apiUrl.replace(/\\/$/, \"\")}/mcp`;\nconst bearer = (apiKey) => `Bearer ${apiKey}`;\nfunction home(opts) {\n\treturn opts.home ?? homedir();\n}\nfunction cwd(opts) {\n\treturn opts.cwd ?? process.cwd();\n}\n/** OS-specific application-support dir for a vendor folder. */\nfunction appSupport(opts, vendor) {\n\tconst h = home(opts);\n\tswitch (platform()) {\n\t\tcase \"darwin\": return join(h, \"Library\", \"Application Support\", vendor);\n\t\tcase \"win32\": return join(process.env.APPDATA ?? join(h, \"AppData\", \"Roaming\"), vendor);\n\t\tdefault: return join(process.env.XDG_CONFIG_HOME ?? join(h, \".config\"), vendor);\n\t}\n}\n/** Read+merge+write a JSON config, preserving every other key already present. */\nfunction mergeJson(path, mutate) {\n\tlet cfg = {};\n\tif (existsSync(path)) try {\n\t\tcfg = JSON.parse(readFileSync(path, \"utf8\"));\n\t} catch {\n\t\tcfg = {};\n\t}\n\tmutate(cfg);\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, `${JSON.stringify(cfg, null, 2)}\\n`);\n}\nfunction mergeYaml(path, mutate) {\n\tlet cfg = {};\n\tif (existsSync(path)) try {\n\t\tcfg = YAML.parse(readFileSync(path, \"utf8\")) ?? {};\n\t} catch {\n\t\tcfg = {};\n\t}\n\tmutate(cfg);\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, YAML.stringify(cfg));\n}\nfunction setNested(cfg, key, value) {\n\tconst obj = cfg[key] ?? {};\n\tobj[SERVER_NAME] = value;\n\tcfg[key] = obj;\n}\nconst mcpClients = [\n\t{\n\t\tslug: \"claude\",\n\t\tname: \"Claude Desktop\",\n\t\tscopes: [\"global\"],\n\t\tdescribe: (o) => join(appSupport(o, \"Claude\"), \"claude_desktop_config.json\"),\n\t\tinstall(o) {\n\t\t\tconst path = join(appSupport(o, \"Claude\"), \"claude_desktop_config.json\");\n\t\t\tmergeJson(path, (cfg) => setNested(cfg, \"mcpServers\", {\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"claude-code\",\n\t\tname: \"Claude Code\",\n\t\tscopes: [\"global\", \"local\"],\n\t\tdescribe: (o) => `claude mcp add --scope ${o.scope === \"global\" ? \"user\" : \"local\"} --transport http ${SERVER_NAME} …`,\n\t\tskillsDir: (o) => o.scope === \"global\" ? join(home(o), \".claude\", \"skills\") : join(cwd(o), \".claude\", \"skills\"),\n\t\tinstall(o) {\n\t\t\treturn {\n\t\t\t\tkind: \"command\",\n\t\t\t\tcommand: \"claude\",\n\t\t\t\targs: [\n\t\t\t\t\t\"mcp\",\n\t\t\t\t\t\"add\",\n\t\t\t\t\t\"--scope\",\n\t\t\t\t\to.scope === \"global\" ? \"user\" : \"local\",\n\t\t\t\t\t\"--transport\",\n\t\t\t\t\t\"http\",\n\t\t\t\t\tSERVER_NAME,\n\t\t\t\t\tmcpUrl(o.apiUrl),\n\t\t\t\t\t\"--header\",\n\t\t\t\t\t`Authorization: ${bearer(o.apiKey)}`\n\t\t\t\t]\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"cursor\",\n\t\tname: \"Cursor\",\n\t\tscopes: [\"global\", \"local\"],\n\t\tdescribe: (o) => o.scope === \"global\" ? join(home(o), \".cursor\", \"mcp.json\") : join(cwd(o), \".cursor\", \"mcp.json\"),\n\t\tinstall(o) {\n\t\t\tconst path = o.scope === \"global\" ? join(home(o), \".cursor\", \"mcp.json\") : join(cwd(o), \".cursor\", \"mcp.json\");\n\t\t\tmergeJson(path, (cfg) => setNested(cfg, \"mcpServers\", {\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"vscode\",\n\t\tname: \"VS Code\",\n\t\tscopes: [\"global\", \"local\"],\n\t\tdescribe: (o) => o.scope === \"global\" ? join(appSupport(o, \"Code\"), \"User\", \"mcp.json\") : join(cwd(o), \".vscode\", \"mcp.json\"),\n\t\tinstall(o) {\n\t\t\tconst path = o.scope === \"global\" ? join(appSupport(o, \"Code\"), \"User\", \"mcp.json\") : join(cwd(o), \".vscode\", \"mcp.json\");\n\t\t\tmergeJson(path, (cfg) => setNested(cfg, \"servers\", {\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\ttype: \"http\",\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"windsurf\",\n\t\tname: \"Windsurf\",\n\t\tscopes: [\"global\"],\n\t\tdescribe: (o) => join(home(o), \".codeium\", \"windsurf\", \"mcp_config.json\"),\n\t\tinstall(o) {\n\t\t\tconst path = join(home(o), \".codeium\", \"windsurf\", \"mcp_config.json\");\n\t\t\tmergeJson(path, (cfg) => setNested(cfg, \"mcpServers\", {\n\t\t\t\tserverUrl: mcpUrl(o.apiUrl),\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"zed\",\n\t\tname: \"Zed\",\n\t\tscopes: [\"global\", \"local\"],\n\t\tdescribe: (o) => o.scope === \"global\" ? join(home(o), \".config\", \"zed\", \"settings.json\") : join(cwd(o), \".zed\", \"settings.json\"),\n\t\tinstall(o) {\n\t\t\tconst path = o.scope === \"global\" ? join(home(o), \".config\", \"zed\", \"settings.json\") : join(cwd(o), \".zed\", \"settings.json\");\n\t\t\tmergeJson(path, (cfg) => setNested(cfg, \"context_servers\", {\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\tsettings: { headers: { Authorization: bearer(o.apiKey) } }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"codex\",\n\t\tname: \"Codex\",\n\t\tscopes: [\"global\"],\n\t\tdescribe: (o) => join(home(o), \".codex\", \"config.yaml\"),\n\t\tinstall(o) {\n\t\t\tconst path = join(home(o), \".codex\", \"config.yaml\");\n\t\t\tmergeYaml(path, (cfg) => setNested(cfg, \"mcp_servers\", {\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"openclaw\",\n\t\tname: \"OpenClaw\",\n\t\tscopes: [\"global\"],\n\t\tdescribe: () => `openclaw mcp set ${SERVER_NAME} …`,\n\t\tinstall(o) {\n\t\t\tconst def = JSON.stringify({\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\ttransport: \"streamable-http\",\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tkind: \"command\",\n\t\t\t\tcommand: \"openclaw\",\n\t\t\t\targs: [\n\t\t\t\t\t\"mcp\",\n\t\t\t\t\t\"set\",\n\t\t\t\t\tSERVER_NAME,\n\t\t\t\t\tdef\n\t\t\t\t]\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"hermes\",\n\t\tname: \"Hermes\",\n\t\tscopes: [\"global\"],\n\t\tdescribe: (o) => join(home(o), \".hermes\", \"config.yaml\"),\n\t\tinstall(o) {\n\t\t\tconst path = join(home(o), \".hermes\", \"config.yaml\");\n\t\t\tmergeYaml(path, (cfg) => setNested(cfg, \"mcp_servers\", {\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t}\n];\nfunction getMcpClient(slug) {\n\treturn mcpClients.find((c) => c.slug === slug);\n}\n\n//#endregion\nexport { SKILL_NAME, getMcpClient, installSkill, mcpClients };\n//# sourceMappingURL=install.js.map","import { resolveSiteUrl } from \"./config\";\n\n/**\n * The canonical Sequel skill is published by the marketing site under the Agent\n * Skills discovery convention. The CLI downloads it at install time rather than\n * bundling a copy, so an installed skill is always the current one and there is\n * a single source of truth for its content.\n */\nexport function skillMarkdownUrl(): string {\n return `${resolveSiteUrl().replace(/\\/$/, \"\")}/.well-known/agent-skills/sequel/SKILL.md`;\n}\n\nexport async function fetchSkillMarkdown(): Promise<string> {\n const url = skillMarkdownUrl();\n const res = await fetch(url, { headers: { Accept: \"text/markdown, text/plain;q=0.9, */*;q=0.1\" } });\n if (!res.ok) throw new Error(`Could not download the Sequel skill (${res.status}) from ${url}`);\n const text = await res.text();\n // A SKILL.md starts with YAML frontmatter; anything else is an error page.\n if (!text.trimStart().startsWith(\"---\")) {\n throw new Error(`Unexpected response from ${url}: not a SKILL.md`);\n }\n return text;\n}\n","import { execFileSync } from \"node:child_process\";\nimport * as p from \"@clack/prompts\";\nimport { createApiKey } from \"../lib/api\";\nimport { isLoggedIn, runLoginFlow } from \"../lib/auth\";\nimport { readConfig, resolveApiUrl } from \"../lib/config\";\nimport { type Scope, getMcpClient, installSkill, mcpClients } from \"../lib/mcp-clients\";\nimport { info, isJsonMode, pc, success } from \"../lib/output\";\nimport { fetchSkillMarkdown } from \"../lib/skills\";\n\nexport interface InstallOptions {\n /** `--scope global|local`; skips the scope prompt. Defaults to the agent's first scope when non-interactive. */\n scope?: string;\n /** Commander's `--no-browser` sets this to false: print the sign-in URL instead of opening it. */\n browser?: boolean;\n}\n\nconst SCOPES: readonly Scope[] = [\"global\", \"local\"];\n\nexport async function installCommand(slugArg?: string, opts: InstallOptions = {}): Promise<void> {\n // Piped/--json (how coding agents run us): no prompts at all. Everything the\n // prompts would have asked must come from the argument and flags instead.\n const interactive = !isJsonMode();\n const slugList = mcpClients.map((c) => c.slug).join(\", \");\n\n if (interactive) p.intro(pc.cyan(\"Install the Sequel MCP server and skill\"));\n\n // Reject a bad slug before opening a browser for sign-in.\n if (slugArg && !getMcpClient(slugArg)) throw new Error(`Unknown agent \"${slugArg}\". Options: ${slugList}`);\n if (!slugArg && !interactive) {\n throw new Error(`Pass the agent slug when running non-interactively: \\`sequel install <agent>\\`. Options: ${slugList}`);\n }\n\n // Sign in first if needed, then continue with the install.\n if (!isLoggedIn()) {\n const msg = \"You need to sign in to Sequel first — opening your browser…\";\n if (interactive) p.log.info(msg);\n else info(msg);\n try {\n const result = await runLoginFlow({ silent: opts.browser === false });\n const signedIn = `Signed in as ${result.user.email}${result.org ? ` (${result.org.name})` : \"\"}.`;\n if (interactive) p.log.success(signedIn);\n else success(signedIn);\n } catch (err) {\n if (!interactive) throw err;\n p.cancel(err instanceof Error ? err.message : String(err));\n return;\n }\n }\n\n let slug = slugArg;\n if (!slug) {\n const choice = await p.select({\n message: \"Which coding agent do you want to install Sequel into?\",\n options: mcpClients.map((c) => ({ value: c.slug, label: c.name })),\n });\n if (p.isCancel(choice)) return p.cancel(\"Cancelled.\");\n slug = choice as string;\n }\n\n const client = getMcpClient(slug);\n if (!client) throw new Error(`Unknown agent \"${slug}\". Options: ${slugList}`);\n\n let scope: Scope = client.scopes[0];\n if (opts.scope !== undefined) {\n if (!SCOPES.includes(opts.scope as Scope)) {\n throw new Error(`Unknown scope \"${opts.scope}\". Options: ${SCOPES.join(\", \")}`);\n }\n if (!client.scopes.includes(opts.scope as Scope)) {\n throw new Error(`${client.name} only supports the ${client.scopes.join(\"/\")} scope.`);\n }\n scope = opts.scope as Scope;\n } else if (client.scopes.length > 1 && interactive) {\n const choice = await p.select({\n message: \"Install scope\",\n options: [\n { value: \"global\", label: \"Global\", hint: \"available everywhere on this machine\" },\n { value: \"local\", label: \"Local\", hint: \"this project only\" },\n ].filter((o) => client.scopes.includes(o.value as Scope)),\n });\n if (p.isCancel(choice)) return p.cancel(\"Cancelled.\");\n scope = choice as Scope;\n }\n\n const config = readConfig();\n const apiUrl = resolveApiUrl(config);\n\n // Clack spinners assume a TTY; when piped, log plain lines instead.\n const s = interactive ? p.spinner() : null;\n s?.start(\"Creating a Sequel API key for this agent…\");\n let key: string;\n try {\n ({ key } = await createApiKey(`Sequel CLI (${client.name})`));\n } catch (err) {\n s?.stop(\"Failed to create API key.\");\n throw err;\n }\n s ? s.stop(\"API key created.\") : info(\"API key created.\");\n\n const result = client.install({ apiUrl, apiKey: key, scope });\n\n if (result.kind === \"command\") {\n // e.g. Claude Code: run `claude mcp add …`.\n try {\n execFileSync(result.command, result.args, { stdio: \"inherit\" });\n } catch {\n throw new Error(\n `Failed to run \\`${result.command}\\`. Make sure it's installed, or run manually:\\n${result.command} ${result.args.join(\" \")}`,\n );\n }\n success(`Installed Sequel into ${client.name} (${scope}).`);\n } else {\n success(`Installed Sequel into ${client.name}.`);\n info(`Config written to ${pc.dim(result.path)}`);\n }\n\n // The skill teaches the agent that Sequel's playbooks exist and how to reach\n // them; the MCP server above is what runs them. Install both where we can.\n const skillsDir = client.skillsDir?.({ apiUrl, apiKey: key, scope }) ?? null;\n if (skillsDir) {\n const sk = interactive ? p.spinner() : null;\n sk?.start(\"Installing the Sequel skill…\");\n try {\n const markdown = await fetchSkillMarkdown();\n const written = installSkill({ dir: skillsDir, markdown });\n sk ? sk.stop(\"Sequel skill installed.\") : success(\"Sequel skill installed.\");\n info(`Skill written to ${pc.dim(written.path)}`);\n } catch (err) {\n // The MCP install already succeeded; a skill download failure should not\n // undo that or look like it did.\n sk?.stop(\"Could not install the Sequel skill.\");\n const warning = `${err instanceof Error ? err.message : String(err)}\\nSequel still works through MCP; rerun \\`sequel install ${client.slug}\\` later to add the skill.`;\n if (interactive) p.log.warn(warning);\n else info(`Could not install the Sequel skill. ${warning}`);\n }\n } else {\n info(\n `${client.name} has no skills directory the CLI can write to; the Sequel skill is skipped. Playbooks are still available through MCP.`,\n );\n }\n\n const done = `Restart ${client.name} and ask it to \"list my Sequel connections\" to verify.`;\n if (interactive) p.outro(done);\n else info(done);\n}\n","import { search } from \"../lib/api\";\nimport { info, isJsonMode, pc, printJson } from \"../lib/output\";\n\nexport async function searchCommand(useCase: string, opts: { connection?: string[] }): Promise<void> {\n const res = await search(useCase, opts.connection);\n if (isJsonMode()) return printJson(res);\n\n if (res.results.length === 0) {\n info(\"No matching tools found across your connected sources.\");\n return;\n }\n\n for (const r of res.results) {\n info(`\\n${pc.bold(r.connection_name)} ${pc.dim(`(${r.connection_id} · ${r.app_id})`)}`);\n if (r.instructions) info(pc.dim(r.instructions));\n for (const tool of r.tools) {\n info(` ${pc.cyan(tool.tool_id)}`);\n if (tool.relevant_tables?.length) info(` tables: ${tool.relevant_tables.join(\", \")}`);\n }\n info(pc.dim(` → sequel execute ${r.connection_id} ${r.tools[0]?.tool_id ?? \"<tool>\"} -d '{…}'`));\n }\n}\n","import { execute } from \"../lib/api\";\nimport { info, isJsonMode, pc, printJson, printTable } from \"../lib/output\";\n\nexport async function executeCommand(\n connectionId: string,\n tool: string,\n opts: { data?: string },\n): Promise<void> {\n let params: Record<string, unknown> = {};\n if (opts.data) {\n try {\n params = JSON.parse(opts.data) as Record<string, unknown>;\n } catch {\n throw new Error(\"Invalid JSON passed to -d/--data.\");\n }\n }\n\n const res = await execute(connectionId, tool, params);\n if (isJsonMode()) return printJson(res);\n\n if (res.data.length === 0) {\n info(pc.dim(\"(0 rows)\"));\n return;\n }\n printTable(res.data, res.columns.length ? res.columns : undefined);\n info(pc.dim(`\\n${res.row_count} row(s)${res.truncated ? \" (truncated)\" : \"\"}`));\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { getFileDownloadUrl } from \"../lib/api\";\nimport { info, isJsonMode, pc, printJson } from \"../lib/output\";\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport async function downloadCommand(\n sessionId: string,\n filePath: string,\n opts: { output?: string },\n): Promise<void> {\n const meta = await getFileDownloadUrl(sessionId, filePath);\n\n // JSON mode (explicit --json or piped): emit the metadata + signed URL for\n // scripting; don't write a file as a surprise side effect.\n if (isJsonMode()) return printJson(meta);\n\n const res = await fetch(meta.url);\n if (!res.ok) throw new Error(`Download failed (${res.status} ${res.statusText})`);\n const dest = opts.output ?? meta.filename;\n await writeFile(dest, Buffer.from(await res.arrayBuffer()));\n info(`${pc.green(\"✓\")} Downloaded ${pc.bold(meta.filename)} (${formatBytes(meta.size)}) → ${dest}`);\n}\n","import { execFileSync } from \"node:child_process\";\nimport * as p from \"@clack/prompts\";\nimport { isJsonMode, pc, printJson, success } from \"../lib/output\";\n\nconst PKG = \"@sequelsh/cli@latest\";\n\ntype Manager = { name: string; cmd: string; args: string[] };\n\n// Global-install command per package manager, in preference order.\nconst MANAGERS: Manager[] = [\n { name: \"npm\", cmd: \"npm\", args: [\"install\", \"-g\", PKG] },\n { name: \"pnpm\", cmd: \"pnpm\", args: [\"add\", \"-g\", PKG] },\n { name: \"bun\", cmd: \"bun\", args: [\"add\", \"-g\", PKG] },\n { name: \"yarn\", cmd: \"yarn\", args: [\"global\", \"add\", PKG] },\n];\n\nfunction has(cmd: string): boolean {\n try {\n execFileSync(process.platform === \"win32\" ? \"where\" : \"which\", [cmd], { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function upgradeCommand(): Promise<void> {\n const json = isJsonMode();\n if (!json) p.intro(pc.cyan(\"Upgrade the Sequel CLI\"));\n\n const manager = MANAGERS.find((m) => has(m.cmd));\n if (!manager) {\n const msg =\n \"No supported package manager found (npm, pnpm, bun, or yarn). Install Node.js from https://nodejs.org and try again.\";\n if (json) return printJson({ status: \"error\", error: msg });\n p.cancel(msg);\n return;\n }\n\n const s = json ? null : p.spinner();\n s?.start(`Updating ${PKG} with ${manager.name}…`);\n try {\n execFileSync(manager.cmd, manager.args, { stdio: \"pipe\" });\n } catch (err) {\n s?.stop(\"Upgrade failed.\");\n throw new Error(\n `Failed to run \\`${manager.cmd} ${manager.args.join(\" \")}\\`.\\n${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n s?.stop(\"Updated.\");\n\n if (json) return printJson({ status: \"upgraded\", package: PKG, manager: manager.name });\n success(\"Sequel CLI is now on the latest version.\");\n p.outro(\"Run `sequel --version` to confirm.\");\n}\n","import { Command } from \"commander\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { ApiError } from \"./lib/api\";\nimport { fail, setJsonMode } from \"./lib/output\";\nimport { loginCommand } from \"./commands/login\";\nimport { logoutCommand } from \"./commands/logout\";\nimport { switchCommand } from \"./commands/switch\";\nimport { connectCommand } from \"./commands/connect\";\nimport { sourcesActive, sourcesDelete, sourcesInfo, sourcesList } from \"./commands/sources\";\nimport { skillsList, skillsShow } from \"./commands/skills\";\nimport { installCommand } from \"./commands/install\";\nimport { searchCommand } from \"./commands/search\";\nimport { executeCommand } from \"./commands/execute\";\nimport { downloadCommand } from \"./commands/download\";\nimport { upgradeCommand } from \"./commands/upgrade\";\n\nconst program = new Command();\n\nprogram\n .name(\"sequel\")\n .description(\"Sequel CLI — connect data sources and run tools from your terminal\")\n // Inlined by tsdown at build time, so the reported version always matches\n // what the publish workflow bumped in package.json.\n .version(pkg.version)\n .option(\"--json\", \"output machine-readable JSON\")\n .enablePositionalOptions();\n\n/** Wrap a command action with shared --json handling and error reporting. */\nfunction action<A extends unknown[]>(fn: (...args: A) => Promise<void>) {\n return async (...args: A) => {\n // Auto-enable JSON when stdout is piped (e.g. `sequel sources | jq`), not just --json.\n if (program.opts().json || !process.stdout.isTTY) setJsonMode(true);\n try {\n await fn(...args);\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) {\n fail(\"Unauthorized. Run `sequel login` to sign in again.\");\n } else {\n fail(err instanceof Error ? err.message : String(err));\n }\n process.exitCode = 1;\n }\n };\n}\n\nprogram.command(\"upgrade\").description(\"Upgrade the Sequel CLI to the latest version\").action(action(upgradeCommand));\nprogram\n .command(\"login\")\n .description(\"Sign in to Sequel\")\n .option(\"--no-browser\", \"print the sign-in URL instead of opening a browser\")\n .action(action(loginCommand));\nprogram.command(\"logout\").description(\"Sign out and remove cached credentials\").action(action(logoutCommand));\nprogram.command(\"switch\").description(\"Switch the active organization\").action(action(switchCommand));\n\nprogram\n .command(\"connect\")\n .argument(\"[source]\", \"connector id (e.g. postgres); omit to choose interactively\")\n .description(\"Connect a new data source\")\n .action(action(connectCommand));\n\nconst sources = program.command(\"sources\").description(\"Manage connected data sources\");\nsources.command(\"list\", { isDefault: true }).description(\"List connected sources\").action(action(sourcesList));\nsources.command(\"active\").description(\"List sources with live health status\").action(action(sourcesActive));\nsources\n .command(\"info\")\n .argument(\"[id]\", \"source id or short id\")\n .description(\"Show details for a source\")\n .action(action(sourcesInfo));\nsources\n .command(\"delete\")\n .argument(\"[id]\", \"source id or short id\")\n .description(\"Delete a source\")\n .action(action(sourcesDelete));\n\nconst skills = program.command(\"skills\").description(\"Browse the playbooks your agent can follow\");\nskills.command(\"list\", { isDefault: true }).description(\"List every skill (id and name)\").action(action(skillsList));\nskills\n .command(\"show\")\n .argument(\"<id>\", \"skill id, e.g. seo\")\n .description(\"Print a skill's playbook\")\n .action(action((id: string) => skillsShow(id)));\n\nprogram\n .command(\"install\")\n .argument(\"[agent]\", \"coding agent slug (e.g. cursor, claude-code)\")\n .option(\"-s, --scope <scope>\", \"global or local; skips the prompt (defaults to global when piped)\")\n .option(\"--no-browser\", \"print the sign-in URL instead of opening a browser if sign-in is needed\")\n .description(\"Install the Sequel MCP server into a coding agent\")\n .action(action(installCommand));\n\nprogram\n .command(\"search\")\n .argument(\"<usecase>\", \"what you want to do, e.g. \\\"monthly revenue\\\"\")\n .option(\"-c, --connection <id...>\", \"limit to specific connection short ids\")\n .description(\"Find the right tools for a use case across your sources\")\n .action(action((usecase: string, opts: { connection?: string[] }) => searchCommand(usecase, opts)));\n\nprogram\n .command(\"execute\")\n .argument(\"<connection_id>\", \"connection short id\")\n .argument(\"<tool>\", \"tool id, e.g. postgres.query\")\n .option(\"-d, --data <json>\", \"tool input as a JSON string\")\n .description(\"Execute a tool against a connection\")\n .action(action((connectionId: string, tool: string, opts: { data?: string }) => executeCommand(connectionId, tool, opts)));\n\nprogram\n .command(\"download\")\n .argument(\"<session_id>\", \"session id (from `sequel search` or an agent session)\")\n .argument(\"<path>\", \"file path, e.g. /data/result.csv or result.csv\")\n .option(\"-o, --output <file>\", \"write to this path (default: the file's own name)\")\n .description(\"Download a file produced by a query or workbench run\")\n .action(action((sessionId: string, path: string, opts: { output?: string }) => downloadCommand(sessionId, path, opts)));\n\nprogram.parseAsync(process.argv).catch((err) => {\n fail(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["config?: AuthConfig | null","orgId: string","entry: TokenEntry","next: AuthConfig","config: AuthConfig","isLoggedIn","buf: Buffer","apiUrl: string","params: Record<string, string>","redirectUri: string","accessToken: string","expectedState: string","resolveCode!: (code: string) => void","rejectCode!: (err: Error) => void","title: string","message: string","options?: LoginFlowOptions","timer: NodeJS.Timeout | undefined","next: AuthConfig","entry: TokenEntry","status: number","message: string","path: string","options: RequestOptions","headers: Record<string, string>","body: string | undefined","text","id: string","appId: string","body: Record<string, unknown>","token: string","connectionId: string","tool: string","params: Record<string, unknown>","useCase: string","connectionIds?: string[]","name: string","sessionId: string","on: boolean","data: unknown","value: unknown","rows: Array<Record<string, unknown>>","columns?: string[]","message: string","pid: number","parsed: PendingLogin","record: PendingLogin","ms: number","opts: { browser: boolean }","timeoutMs: number","opts: LoginOptions","opts: { browser?: boolean }","connector: Connector","token: string","source?: string","connector: Connector | undefined","credentials: Record<string, string>","p","name","s","res","result","idOrShort: string","message: string","c: Connection","idOrShort?: string","config: { schemaFilters: string[] | null; instructions: string | null } | null","path: string","skills","slug: string","SERVER_NAME","SCOPES: readonly Scope[]","args: string[]","slugArg?: string","opts: InstallOptions","result","scope: Scope","key: string","keyPrefix: string","useCase: string","opts: { connection?: string[] }","connectionId: string","tool: string","opts: { data?: string }","params: Record<string, unknown>","n: number","sessionId: string","filePath: string","opts: { output?: string }","MANAGERS: Manager[]","cmd: string","pkg","fn: (...args: A) => Promise<void>","id: string","usecase: string","opts: { connection?: string[] }","connectionId: string","tool: string","opts: { data?: string }","sessionId: string","path: string","opts: { output?: string }"],"sources":["../package.json","../src/lib/config.ts","../src/lib/auth.ts","../src/lib/api.ts","../src/lib/output.ts","../src/lib/pending-login.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/switch.ts","../src/commands/connect.ts","../src/commands/sources.ts","../src/commands/skills.ts","../../mcp-clients/dist/install.js","../src/lib/skills.ts","../src/commands/install.ts","../src/commands/search.ts","../src/commands/execute.ts","../src/commands/download.ts","../src/commands/upgrade.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@sequelsh/cli\",\n \"version\": \"0.4.1\",\n \"description\": \"Sequel CLI — connect data sources and run tools from your terminal.\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"bin\": {\n \"sequel\": \"./dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n }\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/sequelsh/sequel.git\",\n \"directory\": \"packages/cli\"\n },\n \"homepage\": \"https://sequel.sh\",\n \"keywords\": [\n \"sequel\",\n \"cli\",\n \"mcp\",\n \"sql\",\n \"data\",\n \"ai\",\n \"agents\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"dev\": \"bun run src/index.ts\",\n \"cli\": \"bun run src/index.ts\",\n \"build\": \"tsdown\",\n \"build:binaries\": \"bun run scripts/build-binaries.ts\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^0.8.2\",\n \"commander\": \"^12.1.0\",\n \"open\": \"^10.1.0\",\n \"picocolors\": \"^1.1.1\",\n \"yaml\": \"^2.5.1\"\n },\n \"devDependencies\": {\n \"@sequel/mcp-clients\": \"workspace:*\",\n \"@sequel/typescript-config\": \"workspace:*\",\n \"@types/node\": \"^22.10.0\",\n \"tsdown\": \"^0.9.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^3.0.0\"\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdirSync, readFileSync, writeFileSync, rmSync, existsSync, chmodSync } from \"node:fs\";\n\n/** Default production API base. Override with SEQUEL_API_URL for local/dev. */\nexport const DEFAULT_API_URL = \"https://api.sequel.sh\";\n\n/** Default marketing site, which publishes the Sequel skill. Override with SEQUEL_SITE_URL. */\nexport const DEFAULT_SITE_URL = \"https://sequel.sh\";\n\nexport function resolveSiteUrl(): string {\n return process.env.SEQUEL_SITE_URL || DEFAULT_SITE_URL;\n}\n\n/** One OAuth token bundle, scoped to a single organization. */\nexport interface TokenEntry {\n accessToken: string;\n refreshToken: string;\n /** ms epoch when the access token expires. */\n expiresAt: number;\n /**\n * The dynamic client registration this token was issued to. Per-entry,\n * because each login registers a fresh client (the loopback port changes);\n * a single shared clientId meant logging into a second org made the first\n * org's refresh fail the server's client check and force a re-login.\n */\n clientId?: string;\n}\n\nexport interface OrgRef {\n id: string;\n name: string;\n slug: string;\n role: string;\n}\n\nexport interface UserRef {\n id: string;\n email: string;\n name: string;\n}\n\n/**\n * The on-disk shape of ~/.sequel/auth.json.\n *\n * Multi-token cache: one genuine org-bound OAuth token per organization, keyed\n * by org id. `activeOrgId` selects which token requests use right now. Switching\n * orgs is an offline swap when the target org already has a cached token.\n */\nexport interface AuthConfig {\n version: 1;\n apiUrl: string;\n /**\n * Last dynamic client registration. Kept only as a fallback for tokens\n * written before `TokenEntry.clientId` existed — new code reads the per-token\n * value.\n */\n clientId?: string;\n activeOrgId?: string;\n tokens: Record<string, TokenEntry>;\n user?: UserRef;\n /** Cached membership list for the `switch` UI. */\n orgs?: OrgRef[];\n}\n\n/** Directory holding the CLI's state. Overridable for tests. */\nexport function configDir(): string {\n return process.env.SEQUEL_CONFIG_DIR || join(homedir(), \".sequel\");\n}\n\nexport function configPath(): string {\n return join(configDir(), \"auth.json\");\n}\n\n/** The API base URL: explicit env wins, then a saved value, then the default. */\nexport function resolveApiUrl(config?: AuthConfig | null): string {\n return process.env.SEQUEL_API_URL || config?.apiUrl || DEFAULT_API_URL;\n}\n\nfunction emptyConfig(): AuthConfig {\n return { version: 1, apiUrl: resolveApiUrl(), tokens: {} };\n}\n\n/** Read auth.json, returning a fresh empty config if missing or corrupt. */\nexport function readConfig(): AuthConfig {\n const path = configPath();\n if (!existsSync(path)) return emptyConfig();\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf8\")) as AuthConfig;\n if (!parsed || typeof parsed !== \"object\" || !parsed.tokens) return emptyConfig();\n parsed.tokens ??= {};\n return parsed;\n } catch {\n // Corrupt file — start clean rather than crash.\n return emptyConfig();\n }\n}\n\n/**\n * Merge a token entry into auth.json against the file's *current* contents.\n *\n * A plain read-modify-write loses concurrent updates: two `sequel` processes\n * refreshing different orgs (or the same one) would each write back a snapshot\n * taken before the other's, silently dropping a freshly-rotated refresh token\n * and stranding that org at the next call. Re-reading immediately before the\n * write keeps every other org's entry intact.\n */\nexport function saveTokenEntry(orgId: string, entry: TokenEntry): AuthConfig {\n const current = readConfig();\n const next: AuthConfig = {\n ...current,\n tokens: { ...current.tokens, [orgId]: entry },\n };\n writeConfig(next);\n return next;\n}\n\n/** Persist auth.json with locked-down permissions (dir 0700, file 0600). */\nexport function writeConfig(config: AuthConfig): void {\n const dir = configDir();\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n const path = configPath();\n writeFileSync(path, `${JSON.stringify(config, null, 2)}\\n`, { mode: 0o600 });\n // writeFileSync only applies mode on create; enforce it on existing files too.\n chmodSync(path, 0o600);\n}\n\n/** Remove all stored credentials. Idempotent. */\nexport function clearConfig(): void {\n const path = configPath();\n if (existsSync(path)) rmSync(path);\n}\n\nexport function isLoggedIn(config: AuthConfig): boolean {\n return Boolean(config.activeOrgId && config.tokens[config.activeOrgId]);\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport { createServer } from \"node:http\";\nimport { AddressInfo } from \"node:net\";\nimport open from \"open\";\nimport {\n type AuthConfig,\n type OrgRef,\n type TokenEntry,\n type UserRef,\n readConfig,\n writeConfig,\n saveTokenEntry,\n resolveApiUrl,\n} from \"./config\";\n\n/** Refresh a token this many ms before it actually expires. */\nconst EXPIRY_SKEW_MS = 60_000;\n\nfunction base64url(buf: Buffer): string {\n return buf.toString(\"base64url\");\n}\n\n/** PKCE pair: challenge = base64url(sha256(verifier)), matching the API's S256. */\nexport function generatePkce(): { verifier: string; challenge: string } {\n const verifier = base64url(randomBytes(32));\n const challenge = base64url(createHash(\"sha256\").update(verifier).digest());\n return { verifier, challenge };\n}\n\ninterface TokenResponse {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n token_type: string;\n}\n\ninterface WhoAmI {\n id: string;\n name: string;\n email: string;\n organizationId: string;\n}\n\n/** POST the OAuth token endpoint (form-encoded, per RFC 6749). */\nasync function postToken(apiUrl: string, params: Record<string, string>): Promise<TokenResponse> {\n const res = await fetch(`${apiUrl}/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams(params).toString(),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Token request failed (${res.status}): ${body}`);\n }\n return (await res.json()) as TokenResponse;\n}\n\n/** Register a fresh dynamic OAuth client bound to this run's loopback URI. */\nasync function registerClient(apiUrl: string, redirectUri: string): Promise<string> {\n const res = await fetch(`${apiUrl}/oauth/register`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ client_name: \"Sequel CLI\", redirect_uris: [redirectUri] }),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Client registration failed (${res.status}): ${body}`);\n }\n const data = (await res.json()) as { client_id: string };\n return data.client_id;\n}\n\nasync function fetchWhoAmI(apiUrl: string, accessToken: string): Promise<WhoAmI> {\n const res = await fetch(`${apiUrl}/users/me`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n if (!res.ok) throw new Error(`Failed to resolve identity (${res.status})`);\n return (await res.json()) as WhoAmI;\n}\n\nexport async function fetchOrganizations(apiUrl: string, accessToken: string): Promise<OrgRef[]> {\n const res = await fetch(`${apiUrl}/organizations`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n if (!res.ok) throw new Error(`Failed to list organizations (${res.status})`);\n const rows = (await res.json()) as Array<{\n role: string;\n organization: { id: string; name: string; slug: string };\n }>;\n return rows.map((r) => ({\n id: r.organization.id,\n name: r.organization.name,\n slug: r.organization.slug,\n role: r.role,\n }));\n}\n\n/**\n * Wait for the browser to hit the loopback redirect and hand back `?code&state`.\n * Resolves with the authorization code once `state` is verified.\n */\nfunction waitForCallback(\n expectedState: string,\n): { server: ReturnType<typeof createServer>; port: Promise<number>; code: Promise<string> } {\n let resolveCode!: (code: string) => void;\n let rejectCode!: (err: Error) => void;\n const code = new Promise<string>((resolve, reject) => {\n resolveCode = resolve;\n rejectCode = reject;\n });\n\n const server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname !== \"/callback\") {\n res.writeHead(404).end(\"Not found\");\n return;\n }\n const error = url.searchParams.get(\"error\");\n const returnedState = url.searchParams.get(\"state\");\n const returnedCode = url.searchParams.get(\"code\");\n\n const finish = (title: string, message: string) => {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(\n `<!doctype html><html><head><title>${title}</title></head><body style=\"font-family:system-ui;padding:3rem;text-align:center\"><h2>${title}</h2><p>${message}</p><p>You can close this tab and return to your terminal.</p></body></html>`,\n );\n };\n\n if (error) {\n finish(\"Sign-in failed\", `The authorization server returned: ${error}`);\n rejectCode(new Error(`Authorization failed: ${error}`));\n return;\n }\n if (!returnedState || returnedState !== expectedState) {\n finish(\"Sign-in failed\", \"State mismatch — possible CSRF. Please try again.\");\n rejectCode(new Error(\"State mismatch in OAuth callback\"));\n return;\n }\n if (!returnedCode) {\n finish(\"Sign-in failed\", \"No authorization code was returned.\");\n rejectCode(new Error(\"Missing authorization code\"));\n return;\n }\n finish(\"Signed in to Sequel\", \"Authentication complete.\");\n resolveCode(returnedCode);\n });\n\n const port = new Promise<number>((resolve, reject) => {\n server.on(\"error\", reject);\n server.listen(0, \"127.0.0.1\", () => resolve((server.address() as AddressInfo).port));\n });\n\n return { server, port, code };\n}\n\nexport interface LoginResult {\n user: UserRef;\n org: OrgRef | undefined;\n organizationId: string;\n}\n\n/**\n * Run the full OAuth 2.0 + PKCE loopback flow: register a client, open the\n * browser to the consent page (where the user picks an org), capture the code,\n * exchange it for an org-bound token, then cache that token keyed by its org.\n *\n * Shared by `login` and `switch` (for orgs without a cached token).\n */\nexport interface LoginFlowOptions {\n /** Don't try to open a browser; just print the URL. */\n silent?: boolean;\n /** Called with the authorize URL as soon as it's known (before the wait). */\n onUrl?: (url: string) => void;\n /** Give up waiting for the browser callback after this long. */\n timeoutMs?: number;\n}\n\nexport async function runLoginFlow(options?: LoginFlowOptions): Promise<LoginResult> {\n const config = readConfig();\n const apiUrl = resolveApiUrl(config);\n\n const { verifier, challenge } = generatePkce();\n const state = base64url(randomBytes(16));\n\n const { server, port: portPromise, code: codePromise } = waitForCallback(state);\n const port = await portPromise;\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n\n try {\n const clientId = await registerClient(apiUrl, redirectUri);\n\n const authorizeUrl = new URL(`${apiUrl}/oauth/authorize`);\n authorizeUrl.searchParams.set(\"client_id\", clientId);\n authorizeUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authorizeUrl.searchParams.set(\"response_type\", \"code\");\n authorizeUrl.searchParams.set(\"code_challenge\", challenge);\n authorizeUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n authorizeUrl.searchParams.set(\"state\", state);\n\n if (!options?.silent) {\n // open() can fail in headless envs — never block the flow on it.\n open(authorizeUrl.toString()).catch(() => {});\n }\n // Always surface the URL so the user can open it manually if needed.\n process.stderr.write(`\\nOpen this URL to continue:\\n${authorizeUrl.toString()}\\n\\n`);\n options?.onUrl?.(authorizeUrl.toString());\n\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<never>((_, reject) => {\n if (options?.timeoutMs) {\n timer = setTimeout(\n () => reject(new Error(\"Timed out waiting for the browser sign-in to complete.\")),\n options.timeoutMs,\n );\n }\n });\n const code = await Promise.race([codePromise, timeout]).finally(() => clearTimeout(timer));\n\n const token = await postToken(apiUrl, {\n grant_type: \"authorization_code\",\n code,\n redirect_uri: redirectUri,\n client_id: clientId,\n code_verifier: verifier,\n });\n\n const me = await fetchWhoAmI(apiUrl, token.access_token);\n const orgs = await fetchOrganizations(apiUrl, token.access_token).catch(() => config.orgs ?? []);\n\n const next: AuthConfig = {\n ...config,\n version: 1,\n apiUrl,\n clientId,\n activeOrgId: me.organizationId,\n tokens: {\n ...config.tokens,\n [me.organizationId]: {\n accessToken: token.access_token,\n refreshToken: token.refresh_token,\n expiresAt: Date.now() + token.expires_in * 1000,\n clientId,\n },\n },\n user: { id: me.id, email: me.email, name: me.name },\n orgs,\n };\n writeConfig(next);\n\n return {\n user: next.user!,\n org: orgs.find((o) => o.id === me.organizationId),\n organizationId: me.organizationId,\n };\n } finally {\n server.close();\n }\n}\n\n/** True when there's a cached token for the active org (cheap, non-throwing). */\nexport function isLoggedIn(): boolean {\n const config = readConfig();\n const orgId = config.activeOrgId;\n return Boolean(orgId && config.tokens[orgId]);\n}\n\n/**\n * Return a valid access token for the active org, refreshing it in place when\n * expired. Throws a friendly error if there is no token or the refresh fails.\n */\nexport async function getValidAccessToken(): Promise<{ token: string; config: AuthConfig }> {\n const config = readConfig();\n const orgId = config.activeOrgId;\n if (!orgId || !config.tokens[orgId]) {\n throw new Error(\"Not logged in. Run `sequel login` first.\");\n }\n\n const entry: TokenEntry = config.tokens[orgId];\n if (entry.expiresAt - EXPIRY_SKEW_MS > Date.now()) {\n return { token: entry.accessToken, config };\n }\n\n // Access token expired — rotate via the refresh grant. Tokens carry the\n // client they were issued to; `config.clientId` is only a fallback for\n // entries written before that field existed.\n const apiUrl = resolveApiUrl(config);\n const clientId = entry.clientId ?? config.clientId ?? \"\";\n try {\n const refreshed = await postToken(apiUrl, {\n grant_type: \"refresh_token\",\n refresh_token: entry.refreshToken,\n client_id: clientId,\n });\n const next = saveTokenEntry(orgId, {\n accessToken: refreshed.access_token,\n refreshToken: refreshed.refresh_token,\n expiresAt: Date.now() + refreshed.expires_in * 1000,\n clientId,\n });\n return { token: refreshed.access_token, config: next };\n } catch {\n // Another `sequel` process may have rotated the same token a moment ago and\n // already written the successor. Re-read before giving up — otherwise a\n // concurrent invocation sends the user through a needless re-login.\n const fresh = readConfig().tokens[orgId];\n if (fresh && fresh.refreshToken !== entry.refreshToken && fresh.expiresAt - EXPIRY_SKEW_MS > Date.now()) {\n return { token: fresh.accessToken, config: readConfig() };\n }\n throw new Error(\n \"Your session for this organization has expired. Run `sequel login` (or `sequel switch`) to sign in again.\",\n );\n }\n}\n","import { getValidAccessToken } from \"./auth\";\nimport { resolveApiUrl } from \"./config\";\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n message: string,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\ninterface RequestOptions {\n method?: string;\n query?: Record<string, string | undefined>;\n body?: Record<string, unknown>;\n /**\n * How the active org id is attached to the request:\n * - \"query\" → ?organizationId=<org> (default; most GET/DELETE routes)\n * - \"organizationId\" → merged into the JSON body as organizationId\n * - \"organization_id\" → merged into the JSON body as organization_id (execute)\n * - \"none\" → not attached (e.g. /connectors, /oauth/*)\n */\n org?: \"query\" | \"organizationId\" | \"organization_id\" | \"none\";\n}\n\n/**\n * Authenticated request against the Sequel API using the active org's token.\n * Refreshes the token transparently and scopes the call to that org.\n */\nexport async function request<T = unknown>(path: string, options: RequestOptions = {}): Promise<T> {\n const { token, config } = await getValidAccessToken();\n const apiUrl = resolveApiUrl(config);\n const orgId = config.activeOrgId;\n const orgMode = options.org ?? \"query\";\n\n const url = new URL(`${apiUrl}${path}`);\n if (orgMode === \"query\" && orgId) url.searchParams.set(\"organizationId\", orgId);\n for (const [k, v] of Object.entries(options.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, v);\n }\n\n let bodyObj = options.body;\n if ((orgMode === \"organizationId\" || orgMode === \"organization_id\") && orgId) {\n bodyObj = { ...(bodyObj ?? {}), [orgMode]: orgId };\n }\n\n const headers: Record<string, string> = { Authorization: `Bearer ${token}` };\n let body: string | undefined;\n if (bodyObj !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(bodyObj);\n }\n\n const res = await fetch(url.toString(), { method: options.method ?? \"GET\", headers, body });\n\n if (!res.ok) {\n let message = `Request failed (${res.status})`;\n const text = await res.text().catch(() => \"\");\n try {\n const json = JSON.parse(text) as { error?: string };\n if (json.error) message = json.error;\n } catch {\n if (text) message = text;\n }\n throw new ApiError(res.status, message);\n }\n\n if (res.status === 204) return undefined as T;\n const text = await res.text();\n return (text ? JSON.parse(text) : undefined) as T;\n}\n\n/** The active organization id, or throws if not logged in. */\nexport async function activeOrgId(): Promise<string> {\n const { config } = await getValidAccessToken();\n if (!config.activeOrgId) throw new Error(\"No active organization. Run `sequel login`.\");\n return config.activeOrgId;\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport interface Connector {\n id: string;\n name: string;\n description: string;\n icon: string;\n appType: \"database\" | \"app\" | \"mcp\";\n live: boolean;\n authId: string;\n credentialsSchema?: Record<string, unknown>;\n userInputFields?: string[];\n canResolveName?: boolean;\n configuration?: { type: string } | null;\n}\n\nexport interface Connection {\n id: string;\n shortId: string;\n name: string;\n type: string;\n createdBy?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type LinkCreateResponse =\n | { status: \"success\"; connection: Connection }\n | { status: \"pending\"; link_token: string; redirect_url: string; expires_at: string };\n\nexport interface LinkStatus {\n status: \"pending\" | \"oauth_in_progress\" | \"awaiting_configuration\" | \"success\" | \"failed\" | \"completed\";\n connectionId?: string;\n connection_id?: string;\n reason?: string;\n}\n\nexport interface ExecuteResult {\n data: Array<Record<string, unknown>>;\n columns: string[];\n row_count: number;\n truncated: boolean;\n}\n\nexport interface SearchToolRef {\n tool_id: string;\n input_schema: Record<string, unknown>;\n output_schema: Record<string, unknown> | null;\n relevant_tables: string[];\n}\n\nexport interface SearchResult {\n connection_id: string;\n connection_name: string;\n app_id: string;\n use_case: string;\n instructions: string;\n tools: SearchToolRef[];\n}\n\n// ── Endpoint wrappers ───────────────────────────────────────────────────────────\n\nexport function listConnectors(): Promise<Connector[]> {\n return request<Connector[]>(\"/connectors\", { org: \"none\" });\n}\n\nexport function listConnections(): Promise<Connection[]> {\n return request<Connection[]>(\"/connections\");\n}\n\nexport function getConnection(id: string): Promise<Connection> {\n return request<Connection>(`/connections/${id}`);\n}\n\nexport function deleteConnection(id: string): Promise<Connection> {\n return request<Connection>(`/connections/${id}`, { method: \"DELETE\" });\n}\n\nexport function testConnection(id: string): Promise<{ success: boolean; message: string }> {\n return request(`/connections/${id}/test`, { method: \"POST\", org: \"organizationId\" });\n}\n\nexport function getConnectionConfig(\n id: string,\n): Promise<{ schemaFilters: string[] | null; instructions: string | null }> {\n return request(`/connections/${id}/config`);\n}\n\n/** Mint a connect link / create a connection for the given connector. */\nexport function createLink(appId: string, body: Record<string, unknown>): Promise<LinkCreateResponse> {\n // POST /link/:appId resolves the org from the token's session, which always\n // matches the active org in the multi-token model — no org param needed.\n return request<LinkCreateResponse>(`/link/${appId}`, { method: \"POST\", org: \"none\", body });\n}\n\n/**\n * Poll a connect link's status. Uses the authenticated route, which (unlike the\n * public one) reports terminal states — `completed`/`failed` — so the CLI can\n * tell when the browser flow has finished.\n */\nexport function getLinkStatus(token: string): Promise<LinkStatus> {\n return request<LinkStatus>(`/link/${token}/status`, { org: \"none\" });\n}\n\nexport function execute(\n connectionId: string,\n tool: string,\n params: Record<string, unknown>,\n): Promise<ExecuteResult> {\n return request<ExecuteResult>(\"/execute\", {\n method: \"POST\",\n org: \"organization_id\",\n body: { connection_id: connectionId, tool, params },\n });\n}\n\nexport function search(useCase: string, connectionIds?: string[]): Promise<{ results: SearchResult[] }> {\n return request<{ results: SearchResult[] }>(\"/search\", {\n method: \"POST\",\n org: \"organization_id\",\n body: {\n action_info: `CLI search: ${useCase}`,\n use_case: useCase,\n connection_ids: connectionIds,\n },\n });\n}\n\nexport async function createApiKey(name: string): Promise<{ key: string; keyPrefix: string }> {\n const orgId = await activeOrgId();\n return request(`/organizations/${orgId}/api-keys`, { method: \"POST\", org: \"none\", body: { name } });\n}\n\nexport interface FileDownloadInfo {\n url: string;\n filename: string;\n size: number;\n expires_in_seconds: number;\n}\n\n/** Get a signed URL to download a file produced in a session (by sequel_execute / workbench). */\nexport function getFileDownloadUrl(sessionId: string, path: string): Promise<FileDownloadInfo> {\n return request<FileDownloadInfo>(\"/files/download\", { query: { session_id: sessionId, path } });\n}\n","import pc from \"picocolors\";\n\nexport { pc };\n\n/** True when the user passed a global --json flag (set by index.ts). */\nlet jsonMode = false;\nexport function setJsonMode(on: boolean): void {\n jsonMode = on;\n}\nexport function isJsonMode(): boolean {\n return jsonMode;\n}\n\nexport function printJson(data: unknown): void {\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`);\n}\n\nfunction cell(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n\n/**\n * Render an array of records as an aligned text table. `columns` controls order\n * and which keys are shown; defaults to the union of keys in the first row.\n */\nexport function renderTable(rows: Array<Record<string, unknown>>, columns?: string[]): string {\n if (rows.length === 0) return pc.dim(\"(no rows)\");\n const cols = columns ?? Object.keys(rows[0]);\n const widths = cols.map((c) => Math.max(c.length, ...rows.map((r) => cell(r[c]).length)));\n\n const header = cols.map((c, i) => pc.bold(c.padEnd(widths[i]))).join(\" \");\n const sep = cols.map((_, i) => \"─\".repeat(widths[i])).join(\" \");\n const body = rows\n .map((r) => cols.map((c, i) => cell(r[c]).padEnd(widths[i])).join(\" \"))\n .join(\"\\n\");\n\n return `${header}\\n${pc.dim(sep)}\\n${body}`;\n}\n\nexport function printTable(rows: Array<Record<string, unknown>>, columns?: string[]): void {\n // Never emit human tables to stdout in JSON mode — keep stdout valid JSON for jq.\n if (jsonMode) return;\n process.stdout.write(`${renderTable(rows, columns)}\\n`);\n}\n\n// In JSON mode, human-facing lines go to stderr so stdout stays pure JSON.\nexport function success(message: string): void {\n (jsonMode ? process.stderr : process.stdout).write(`${pc.green(\"✓\")} ${message}\\n`);\n}\n\nexport function info(message: string): void {\n (jsonMode ? process.stderr : process.stdout).write(`${message}\\n`);\n}\n\nexport function fail(message: string): void {\n process.stderr.write(`${pc.red(\"✗\")} ${message}\\n`);\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync, rmSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isLoggedIn } from \"./auth\";\nimport { configDir } from \"./config\";\n\n/**\n * A sign-in that is waiting for the browser in a detached background process.\n *\n * Coding agents run the CLI with stdout piped and block until it exits, so a\n * `sequel login` that waits for the OAuth callback in the foreground never gets\n * its URL in front of the user. Instead the piped form spawns `login-worker`\n * detached, which owns the loopback server, records the URL here as soon as it\n * is known, and clears the record when the sign-in finishes. The foreground\n * process prints the URL and exits; later commands find the record and wait.\n */\nexport interface PendingLogin {\n url: string;\n pid: number;\n startedAt: number;\n expiresAt: number;\n status: \"pending\" | \"failed\";\n error?: string;\n}\n\n/** How long the background worker waits for the browser before giving up. */\nexport const LOGIN_TIMEOUT_MS = 10 * 60 * 1000;\n\n/** How long the foreground `login` waits for the worker to report its URL. */\nconst URL_WAIT_MS = 20_000;\n\nexport function pendingLoginPath(): string {\n return join(configDir(), \"pending-login.json\");\n}\n\nfunction isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\n/** The current record, or null if there is none, it expired, or its worker died. */\nexport function readPendingLogin(): PendingLogin | null {\n const path = pendingLoginPath();\n if (!existsSync(path)) return null;\n let parsed: PendingLogin;\n try {\n parsed = JSON.parse(readFileSync(path, \"utf8\")) as PendingLogin;\n } catch {\n rmSync(path, { force: true });\n return null;\n }\n // A failed record is kept (so `--status` can say why) until the next login.\n if (parsed.status === \"pending\" && (Date.now() > parsed.expiresAt || !isAlive(parsed.pid))) {\n rmSync(path, { force: true });\n return null;\n }\n return parsed;\n}\n\nexport function writePendingLogin(record: PendingLogin): void {\n mkdirSync(configDir(), { recursive: true, mode: 0o700 });\n writeFileSync(pendingLoginPath(), `${JSON.stringify(record, null, 2)}\\n`, { mode: 0o600 });\n}\n\nexport function clearPendingLogin(): void {\n rmSync(pendingLoginPath(), { force: true });\n}\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\n/**\n * Spawn the detached worker and return its record once the URL is known.\n * Reuses a still-pending sign-in rather than starting a second one.\n */\nexport async function startDetachedLogin(opts: { browser: boolean }): Promise<PendingLogin> {\n const existing = readPendingLogin();\n if (existing?.status === \"pending\") return existing;\n clearPendingLogin();\n\n // process.argv[1] is dist/index.js under node and src/index.ts under bun; the\n // matching execPath runs either.\n const args = [process.argv[1], \"login-worker\", ...(opts.browser ? [] : [\"--no-browser\"])];\n const child = spawn(process.execPath, args, { detached: true, stdio: \"ignore\" });\n child.unref();\n\n const deadline = Date.now() + URL_WAIT_MS;\n while (Date.now() < deadline) {\n const record = readPendingLogin();\n if (record && record.pid === child.pid) {\n if (record.status === \"failed\") throw new Error(record.error ?? \"Sign-in failed to start.\");\n return record;\n }\n await sleep(200);\n }\n throw new Error(\"Timed out waiting for the sign-in URL. Run `sequel login` again.\");\n}\n\n/**\n * Block until the pending sign-in finishes (or `timeoutMs` passes). Resolves\n * true when a token is now cached. Returns immediately if nothing is pending.\n */\nexport async function waitForLogin(timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const record = readPendingLogin();\n if (!record) return isLoggedIn();\n if (record.status === \"failed\") return false;\n await sleep(1000);\n }\n return false;\n}\n","import * as p from \"@clack/prompts\";\nimport { isLoggedIn, runLoginFlow } from \"../lib/auth\";\nimport { readConfig } from \"../lib/config\";\nimport { info, isJsonMode, pc, printJson, success } from \"../lib/output\";\nimport {\n LOGIN_TIMEOUT_MS,\n clearPendingLogin,\n readPendingLogin,\n startDetachedLogin,\n waitForLogin,\n writePendingLogin,\n} from \"../lib/pending-login\";\n\nexport interface LoginOptions {\n /** Commander's `--no-browser` sets this to false: print the URL, don't open it. */\n browser?: boolean;\n /** Return the sign-in URL immediately and finish in the background. Implied when piped. */\n detach?: boolean;\n /** Report whether a sign-in is cached, pending, or absent, without starting one. */\n status?: boolean;\n /** Block until a pending background sign-in finishes. */\n wait?: boolean;\n}\n\n/** Instruction that rides along with a pending URL so an agent knows what to do. */\nconst PENDING_MESSAGE =\n \"Show this URL to the user and ask them to open it in their browser to sign in. Once they have, run `sequel login --status` to confirm.\";\n\nfunction printStatus(): void {\n const json = isJsonMode();\n const pending = readPendingLogin();\n if (pending?.status === \"pending\") {\n if (json) return printJson({ status: \"pending\", url: pending.url, expiresAt: pending.expiresAt, message: PENDING_MESSAGE });\n info(`Sign-in pending. Open this URL to finish:\\n${pending.url}`);\n return;\n }\n if (pending?.status === \"failed\") {\n if (json) return printJson({ status: \"failed\", error: pending.error ?? \"Sign-in failed.\", message: \"Run `sequel login` to try again.\" });\n info(`${pc.red(\"✗\")} Last sign-in failed: ${pending.error ?? \"unknown error\"}. Run \\`sequel login\\` to try again.`);\n return;\n }\n if (isLoggedIn()) {\n const config = readConfig();\n const org = config.orgs?.find((o) => o.id === config.activeOrgId) ?? null;\n if (json) return printJson({ status: \"logged_in\", user: config.user ?? null, org });\n success(`Logged in as ${pc.bold(config.user?.email ?? \"unknown\")}${org ? ` · ${pc.bold(org.name)}` : \"\"}`);\n return;\n }\n if (json) return printJson({ status: \"logged_out\", message: \"Run `sequel login` to sign in.\" });\n info(\"Not logged in. Run `sequel login` to sign in.\");\n}\n\nexport async function loginCommand(opts: LoginOptions = {}): Promise<void> {\n const json = isJsonMode();\n const openBrowser = opts.browser !== false;\n\n if (opts.status) return printStatus();\n\n if (opts.wait) {\n const pending = readPendingLogin();\n if (pending?.status === \"pending\") {\n info(`Waiting for the sign-in at ${pending.url} to finish…`);\n await waitForLogin(pending.expiresAt - Date.now());\n }\n return printStatus();\n }\n\n // Piped (a coding agent, `| cat`): hand back the URL right away and let a\n // detached worker wait for the browser, otherwise the caller blocks until the\n // user has signed in and never sees the URL.\n if (opts.detach || json) {\n const pending = await startDetachedLogin({ browser: openBrowser });\n if (json) {\n return printJson({ status: \"pending\", url: pending.url, expiresAt: pending.expiresAt, message: PENDING_MESSAGE });\n }\n info(`Open this URL to sign in:\\n${pending.url}\\n\\nSign-in continues in the background; run \\`sequel login --status\\` to check.`);\n return;\n }\n\n p.intro(pc.cyan(\"Sign in to Sequel\"));\n p.log.info(openBrowser ? \"Opening your browser to authorize…\" : \"Sign in with the URL below…\");\n\n const res = await runLoginFlow({ silent: !openBrowser });\n\n success(`Logged in as ${pc.bold(res.user.email)}${res.org ? ` · ${pc.bold(res.org.name)}` : \"\"}`);\n p.outro(\"You're all set. Try `sequel sources list` or `sequel connect`.\");\n}\n\n/**\n * Hidden: the detached process behind a piped `sequel login`. Owns the loopback\n * server, records the URL for the foreground process, and clears the record\n * (or marks it failed) when the browser flow ends.\n */\nexport async function loginWorkerCommand(opts: { browser?: boolean } = {}): Promise<void> {\n const startedAt = Date.now();\n const base = { pid: process.pid, startedAt, expiresAt: startedAt + LOGIN_TIMEOUT_MS };\n let url = \"\";\n try {\n await runLoginFlow({\n silent: opts.browser === false,\n timeoutMs: LOGIN_TIMEOUT_MS,\n onUrl: (u) => {\n url = u;\n writePendingLogin({ ...base, url, status: \"pending\" });\n },\n });\n clearPendingLogin();\n } catch (err) {\n writePendingLogin({ ...base, url, status: \"failed\", error: err instanceof Error ? err.message : String(err) });\n process.exitCode = 1;\n }\n}\n","import { clearConfig, isLoggedIn, readConfig } from \"../lib/config\";\nimport { info, isJsonMode, printJson, success } from \"../lib/output\";\n\nexport async function logoutCommand(): Promise<void> {\n const config = readConfig();\n if (!isLoggedIn(config)) {\n if (isJsonMode()) return printJson({ status: \"not_logged_in\" });\n info(\"You are not logged in.\");\n return;\n }\n clearConfig();\n if (isJsonMode()) return printJson({ status: \"logged_out\" });\n success(\"Logged out. Cached credentials removed from ~/.sequel/auth.json.\");\n}\n","import * as p from \"@clack/prompts\";\nimport { fetchOrganizations, getValidAccessToken, runLoginFlow } from \"../lib/auth\";\nimport { isLoggedIn, readConfig, resolveApiUrl, writeConfig } from \"../lib/config\";\nimport { isJsonMode, pc, success } from \"../lib/output\";\n\nexport async function switchCommand(): Promise<void> {\n if (isJsonMode()) {\n throw new Error(\n \"`sequel switch` is interactive (it prompts for an organization) — run it in a terminal, not piped/--json.\",\n );\n }\n const config = readConfig();\n if (!isLoggedIn(config)) {\n throw new Error(\"Not logged in. Run `sequel login` first.\");\n }\n\n // Refresh the membership list with the active org's token.\n let orgs = config.orgs ?? [];\n try {\n const { token } = await getValidAccessToken();\n orgs = await fetchOrganizations(resolveApiUrl(config), token);\n writeConfig({ ...readConfig(), orgs });\n } catch {\n // fall back to cached orgs\n }\n if (orgs.length === 0) throw new Error(\"No organizations available for this account.\");\n\n const selection = await p.select({\n message: \"Switch to organization\",\n options: orgs.map((o) => ({\n value: o.id,\n label: o.id === config.activeOrgId ? `${o.name} ${pc.dim(\"(current)\")}` : o.name,\n hint: config.tokens[o.id] ? o.role : \"sign-in required\",\n })),\n });\n if (p.isCancel(selection)) {\n p.cancel(\"Cancelled.\");\n return;\n }\n\n const orgId = selection as string;\n const org = orgs.find((o) => o.id === orgId);\n const fresh = readConfig();\n\n if (fresh.tokens[orgId]) {\n // Already authorized — instant, offline swap.\n writeConfig({ ...fresh, activeOrgId: orgId });\n success(`Switched to ${pc.bold(org?.name ?? orgId)}.`);\n return;\n }\n\n // No cached token for this org — sign in so the user can authorize it.\n p.log.info(`You haven't authorized ${pc.bold(org?.name ?? orgId)} yet — opening your browser…`);\n const res = await runLoginFlow();\n success(`Switched to ${pc.bold(res.org?.name ?? res.organizationId)}.`);\n}\n","import * as p from \"@clack/prompts\";\nimport open from \"open\";\nimport {\n type Connector,\n createLink,\n getLinkStatus,\n listConnectors,\n} from \"../lib/api\";\nimport { info, isJsonMode, pc, success } from \"../lib/output\";\n\nconst SECRET_RE = /pass|secret|token|key|connection|credential/i;\n\nfunction fieldsFor(connector: Connector): string[] {\n if (connector.userInputFields?.length) return connector.userInputFields;\n const props = (connector.credentialsSchema as { properties?: Record<string, unknown> } | undefined)?.properties;\n return props ? Object.keys(props) : [];\n}\n\nfunction isOAuth(connector: Connector): boolean {\n return Boolean(connector.configuration) || /oauth/i.test(connector.authId);\n}\n\n/** Poll a pending connect link until it completes or fails (or times out). */\nasync function pollLink(token: string): Promise<{ ok: boolean; reason?: string }> {\n const deadline = Date.now() + 5 * 60_000;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 2000));\n let status;\n try {\n status = await getLinkStatus(token);\n } catch {\n continue; // transient — keep polling\n }\n if (status.status === \"failed\") return { ok: false, reason: status.reason };\n if (status.status === \"success\" || status.status === \"completed\") return { ok: true };\n }\n return { ok: false, reason: \"Timed out waiting for the browser to finish.\" };\n}\n\nexport async function connectCommand(source?: string): Promise<void> {\n if (isJsonMode()) {\n throw new Error(\n \"`sequel connect` is interactive (it prompts for credentials/consent) — run it in a terminal, not piped/--json.\",\n );\n }\n const connectors = await listConnectors();\n\n let connector: Connector | undefined;\n if (source) {\n connector = connectors.find((c) => c.id === source);\n if (!connector) {\n throw new Error(\n `Unknown connector \"${source}\". Available: ${connectors.map((c) => c.id).join(\", \")}`,\n );\n }\n } else {\n const choice = await p.select({\n message: \"Which data source do you want to connect?\",\n options: connectors\n .slice()\n .sort((a, b) => a.appType.localeCompare(b.appType) || a.name.localeCompare(b.name))\n .map((c) => ({ value: c.id, label: c.name, hint: c.appType })),\n });\n if (p.isCancel(choice)) {\n p.cancel(\"Cancelled.\");\n return;\n }\n connector = connectors.find((c) => c.id === (choice as string))!;\n }\n\n p.intro(`Connect ${pc.bold(connector.name)}`);\n\n if (!isOAuth(connector)) {\n // Pre-auth connector: collect credential fields in the terminal.\n const fields = fieldsFor(connector);\n const credentials: Record<string, string> = {};\n for (const field of fields) {\n const secret = SECRET_RE.test(field);\n const value = await (secret ? p.password : p.text)({\n message: field,\n });\n if (p.isCancel(value)) {\n p.cancel(\"Cancelled.\");\n return;\n }\n credentials[field] = value as string;\n }\n const name = await p.text({ message: \"Name for this source (optional)\", placeholder: connector.name });\n if (p.isCancel(name)) {\n p.cancel(\"Cancelled.\");\n return;\n }\n\n const s = p.spinner();\n s.start(\"Validating credentials…\");\n const res = await createLink(connector.id, {\n credentials,\n ...(name ? { name } : {}),\n });\n if (res.status === \"success\") {\n s.stop(\"Connected.\");\n success(`Created source ${pc.bold(res.connection.name)} (${res.connection.shortId}).`);\n return;\n }\n // Fallback: server wants more input — finish in the browser.\n s.stop(\"Continue in your browser…\");\n open(res.redirect_url).catch(() => {});\n info(`Open: ${res.redirect_url}`);\n const result = await pollLink(res.link_token);\n if (result.ok) success(\"Connected.\");\n else throw new Error(result.reason ?? \"Connection failed.\");\n return;\n }\n\n // OAuth connector: mint a link and let the polished web flow handle consent\n // (and any pre-OAuth fields like a project id), then poll for completion.\n const res = await createLink(connector.id, {});\n if (res.status === \"success\") {\n success(`Created source ${pc.bold(res.connection.name)} (${res.connection.shortId}).`);\n return;\n }\n open(res.redirect_url).catch(() => {});\n info(`Complete authorization in your browser:\\n${res.redirect_url}`);\n const s = p.spinner();\n s.start(\"Waiting for you to finish in the browser…\");\n const result = await pollLink(res.link_token);\n if (result.ok) {\n s.stop(\"Connected.\");\n success(\"Source connected.\");\n } else {\n s.stop(\"Failed.\");\n throw new Error(result.reason ?? \"Connection failed.\");\n }\n}\n","import * as p from \"@clack/prompts\";\nimport {\n type Connection,\n deleteConnection,\n getConnection,\n getConnectionConfig,\n listConnections,\n testConnection,\n} from \"../lib/api\";\nimport { info, isJsonMode, pc, printJson, printTable, success } from \"../lib/output\";\n\n/** Resolve a user-supplied id (uuid or shortId) to the connection's real id. */\nasync function resolveConnection(idOrShort: string): Promise<Connection> {\n const all = await listConnections();\n const match = all.find((c) => c.id === idOrShort || c.shortId === idOrShort);\n if (!match) throw new Error(`No source found matching \"${idOrShort}\".`);\n return match;\n}\n\nasync function pickConnection(message: string): Promise<Connection | undefined> {\n const all = await listConnections();\n if (all.length === 0) {\n info(\"No sources connected yet. Run `sequel connect`.\");\n return undefined;\n }\n const choice = await p.select({\n message,\n options: all.map((c) => ({ value: c.shortId, label: `${c.name} (${c.shortId})`, hint: c.type })),\n });\n if (p.isCancel(choice)) return undefined;\n return all.find((c) => c.shortId === (choice as string));\n}\n\nfunction toRow(c: Connection): Record<string, unknown> {\n return { id: c.shortId, name: c.name, type: c.type, created: c.createdAt.slice(0, 10) };\n}\n\nexport async function sourcesList(): Promise<void> {\n const connections = await listConnections();\n if (isJsonMode()) return printJson(connections);\n if (connections.length === 0) return info(\"No sources connected yet. Run `sequel connect`.\");\n printTable(connections.map(toRow), [\"id\", \"name\", \"type\", \"created\"]);\n}\n\nexport async function sourcesActive(): Promise<void> {\n const connections = await listConnections();\n const rows = await Promise.all(\n connections.map(async (c) => {\n let status = \"unknown\";\n try {\n const t = await testConnection(c.id);\n status = t.success ? \"healthy\" : \"error\";\n } catch {\n status = \"error\";\n }\n return { ...toRow(c), status };\n }),\n );\n if (isJsonMode()) return printJson(rows);\n if (rows.length === 0) return info(\"No sources connected yet. Run `sequel connect`.\");\n printTable(rows, [\"id\", \"name\", \"type\", \"status\", \"created\"]);\n}\n\nexport async function sourcesInfo(idOrShort?: string): Promise<void> {\n const conn = idOrShort ? await resolveConnection(idOrShort) : await pickConnection(\"Source to inspect\");\n if (!conn) return;\n const full = await getConnection(conn.id);\n let config: { schemaFilters: string[] | null; instructions: string | null } | null = null;\n try {\n config = await getConnectionConfig(conn.id);\n } catch {\n /* config may be absent */\n }\n if (isJsonMode()) return printJson({ ...full, config });\n\n info(`${pc.bold(full.name)} ${pc.dim(full.shortId)}`);\n info(`type: ${full.type}`);\n info(`id: ${full.id}`);\n info(`created: ${full.createdAt}`);\n if (config?.schemaFilters?.length) info(`schemas: ${config.schemaFilters.join(\", \")}`);\n if (config?.instructions) info(`\\n${pc.dim(config.instructions)}`);\n}\n\nexport async function sourcesDelete(idOrShort?: string): Promise<void> {\n const conn = idOrShort ? await resolveConnection(idOrShort) : await pickConnection(\"Source to delete\");\n if (!conn) return;\n const confirmed = await p.confirm({ message: `Delete ${pc.bold(conn.name)} (${conn.shortId})? This cannot be undone.` });\n if (p.isCancel(confirmed) || !confirmed) {\n info(\"Cancelled.\");\n return;\n }\n await deleteConnection(conn.id);\n success(`Deleted ${conn.name} (${conn.shortId}).`);\n}\n","import { readConfig, resolveApiUrl } from \"../lib/config\";\nimport { info, isJsonMode, pc, printJson, printTable } from \"../lib/output\";\n\ntype PublicSkill = { id: string; slug: string; name: string; category: string; apps: string[] };\ntype PublicSkillDetail = PublicSkill & { description: string; instructions: string };\n\n// Skills are public, so these hit the unauthenticated marketplace endpoints and\n// work before `sequel login`.\nasync function publicGet<T>(path: string): Promise<T> {\n const res = await fetch(`${resolveApiUrl(readConfig())}${path}`, { headers: { Accept: \"application/json\" } });\n if (res.status === 404) throw new Error(`No skill found matching \"${path.split(\"/\").pop()}\". Run \\`sequel skills list\\`.`);\n if (!res.ok) throw new Error(`Request failed (${res.status})`);\n return (await res.json()) as T;\n}\n\nexport async function skillsList(): Promise<void> {\n const skills = await publicGet<PublicSkill[]>(\"/marketplace/skills\");\n const rows = skills.map((s) => ({ id: s.slug, name: s.name }));\n if (isJsonMode()) return printJson(rows);\n printTable(rows, [\"id\", \"name\"]);\n info(`${rows.length} skills. \\`sequel skills show <id>\\` prints one; \\`sequel install\\` gives your agent all of them.`);\n}\n\nexport async function skillsShow(slug: string): Promise<void> {\n const skill = await publicGet<PublicSkillDetail>(`/marketplace/skills/${encodeURIComponent(slug)}`);\n if (isJsonMode()) return printJson(skill);\n process.stdout.write(\n `${pc.bold(skill.name)} ${pc.dim(skill.slug)}\\n${skill.description}\\n` +\n (skill.apps.length ? `${pc.dim(\"apps:\")} ${skill.apps.join(\", \")}\\n` : \"\") +\n `\\n${skill.instructions}\\n`,\n );\n}\n","import { homedir, platform } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport YAML from \"yaml\";\n\n//#region src/install.ts\nconst SERVER_NAME = \"sequel\";\n/** Folder name of the Sequel skill inside an agent's skills directory. */\nconst SKILL_NAME = \"sequel\";\n/**\n* Write the Sequel SKILL.md into `<dir>/sequel/SKILL.md`, replacing any previous\n* copy. Skill files are plain markdown, so unlike the MCP configs there is\n* nothing to merge: the whole file is ours.\n*/\nfunction installSkill({ dir, markdown }) {\n\tconst path = join(dir, SKILL_NAME, \"SKILL.md\");\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, markdown.endsWith(\"\\n\") ? markdown : `${markdown}\\n`);\n\treturn {\n\t\tkind: \"file\",\n\t\tpath\n\t};\n}\nconst mcpUrl = (apiUrl) => `${apiUrl.replace(/\\/$/, \"\")}/mcp`;\nconst bearer = (apiKey) => `Bearer ${apiKey}`;\nfunction home(opts) {\n\treturn opts.home ?? homedir();\n}\nfunction cwd(opts) {\n\treturn opts.cwd ?? process.cwd();\n}\n/** OS-specific application-support dir for a vendor folder. */\nfunction appSupport(opts, vendor) {\n\tconst h = home(opts);\n\tswitch (platform()) {\n\t\tcase \"darwin\": return join(h, \"Library\", \"Application Support\", vendor);\n\t\tcase \"win32\": return join(process.env.APPDATA ?? join(h, \"AppData\", \"Roaming\"), vendor);\n\t\tdefault: return join(process.env.XDG_CONFIG_HOME ?? join(h, \".config\"), vendor);\n\t}\n}\n/** Read+merge+write a JSON config, preserving every other key already present. */\nfunction mergeJson(path, mutate) {\n\tlet cfg = {};\n\tif (existsSync(path)) try {\n\t\tcfg = JSON.parse(readFileSync(path, \"utf8\"));\n\t} catch {\n\t\tcfg = {};\n\t}\n\tmutate(cfg);\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, `${JSON.stringify(cfg, null, 2)}\\n`);\n}\nfunction mergeYaml(path, mutate) {\n\tlet cfg = {};\n\tif (existsSync(path)) try {\n\t\tcfg = YAML.parse(readFileSync(path, \"utf8\")) ?? {};\n\t} catch {\n\t\tcfg = {};\n\t}\n\tmutate(cfg);\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, YAML.stringify(cfg));\n}\nfunction setNested(cfg, key, value) {\n\tconst obj = cfg[key] ?? {};\n\tobj[SERVER_NAME] = value;\n\tcfg[key] = obj;\n}\nconst mcpClients = [\n\t{\n\t\tslug: \"claude\",\n\t\tname: \"Claude Desktop\",\n\t\tscopes: [\"global\"],\n\t\tdescribe: (o) => join(appSupport(o, \"Claude\"), \"claude_desktop_config.json\"),\n\t\tinstall(o) {\n\t\t\tconst path = join(appSupport(o, \"Claude\"), \"claude_desktop_config.json\");\n\t\t\tmergeJson(path, (cfg) => setNested(cfg, \"mcpServers\", {\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"claude-code\",\n\t\tname: \"Claude Code\",\n\t\tscopes: [\"global\", \"local\"],\n\t\tdescribe: (o) => `claude mcp add --scope ${o.scope === \"global\" ? \"user\" : \"local\"} --transport http ${SERVER_NAME} …`,\n\t\tskillsDir: (o) => o.scope === \"global\" ? join(home(o), \".claude\", \"skills\") : join(cwd(o), \".claude\", \"skills\"),\n\t\tinstall(o) {\n\t\t\treturn {\n\t\t\t\tkind: \"command\",\n\t\t\t\tcommand: \"claude\",\n\t\t\t\targs: [\n\t\t\t\t\t\"mcp\",\n\t\t\t\t\t\"add\",\n\t\t\t\t\t\"--scope\",\n\t\t\t\t\to.scope === \"global\" ? \"user\" : \"local\",\n\t\t\t\t\t\"--transport\",\n\t\t\t\t\t\"http\",\n\t\t\t\t\tSERVER_NAME,\n\t\t\t\t\tmcpUrl(o.apiUrl),\n\t\t\t\t\t\"--header\",\n\t\t\t\t\t`Authorization: ${bearer(o.apiKey)}`\n\t\t\t\t]\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"cursor\",\n\t\tname: \"Cursor\",\n\t\tscopes: [\"global\", \"local\"],\n\t\tdescribe: (o) => o.scope === \"global\" ? join(home(o), \".cursor\", \"mcp.json\") : join(cwd(o), \".cursor\", \"mcp.json\"),\n\t\tinstall(o) {\n\t\t\tconst path = o.scope === \"global\" ? join(home(o), \".cursor\", \"mcp.json\") : join(cwd(o), \".cursor\", \"mcp.json\");\n\t\t\tmergeJson(path, (cfg) => setNested(cfg, \"mcpServers\", {\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"vscode\",\n\t\tname: \"VS Code\",\n\t\tscopes: [\"global\", \"local\"],\n\t\tdescribe: (o) => o.scope === \"global\" ? join(appSupport(o, \"Code\"), \"User\", \"mcp.json\") : join(cwd(o), \".vscode\", \"mcp.json\"),\n\t\tinstall(o) {\n\t\t\tconst path = o.scope === \"global\" ? join(appSupport(o, \"Code\"), \"User\", \"mcp.json\") : join(cwd(o), \".vscode\", \"mcp.json\");\n\t\t\tmergeJson(path, (cfg) => setNested(cfg, \"servers\", {\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\ttype: \"http\",\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"windsurf\",\n\t\tname: \"Windsurf\",\n\t\tscopes: [\"global\"],\n\t\tdescribe: (o) => join(home(o), \".codeium\", \"windsurf\", \"mcp_config.json\"),\n\t\tinstall(o) {\n\t\t\tconst path = join(home(o), \".codeium\", \"windsurf\", \"mcp_config.json\");\n\t\t\tmergeJson(path, (cfg) => setNested(cfg, \"mcpServers\", {\n\t\t\t\tserverUrl: mcpUrl(o.apiUrl),\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"zed\",\n\t\tname: \"Zed\",\n\t\tscopes: [\"global\", \"local\"],\n\t\tdescribe: (o) => o.scope === \"global\" ? join(home(o), \".config\", \"zed\", \"settings.json\") : join(cwd(o), \".zed\", \"settings.json\"),\n\t\tinstall(o) {\n\t\t\tconst path = o.scope === \"global\" ? join(home(o), \".config\", \"zed\", \"settings.json\") : join(cwd(o), \".zed\", \"settings.json\");\n\t\t\tmergeJson(path, (cfg) => setNested(cfg, \"context_servers\", {\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\tsettings: { headers: { Authorization: bearer(o.apiKey) } }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"codex\",\n\t\tname: \"Codex\",\n\t\tscopes: [\"global\"],\n\t\tdescribe: (o) => join(home(o), \".codex\", \"config.yaml\"),\n\t\tinstall(o) {\n\t\t\tconst path = join(home(o), \".codex\", \"config.yaml\");\n\t\t\tmergeYaml(path, (cfg) => setNested(cfg, \"mcp_servers\", {\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"openclaw\",\n\t\tname: \"OpenClaw\",\n\t\tscopes: [\"global\"],\n\t\tdescribe: () => `openclaw mcp set ${SERVER_NAME} …`,\n\t\tinstall(o) {\n\t\t\tconst def = JSON.stringify({\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\ttransport: \"streamable-http\",\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tkind: \"command\",\n\t\t\t\tcommand: \"openclaw\",\n\t\t\t\targs: [\n\t\t\t\t\t\"mcp\",\n\t\t\t\t\t\"set\",\n\t\t\t\t\tSERVER_NAME,\n\t\t\t\t\tdef\n\t\t\t\t]\n\t\t\t};\n\t\t}\n\t},\n\t{\n\t\tslug: \"hermes\",\n\t\tname: \"Hermes\",\n\t\tscopes: [\"global\"],\n\t\tdescribe: (o) => join(home(o), \".hermes\", \"config.yaml\"),\n\t\tinstall(o) {\n\t\t\tconst path = join(home(o), \".hermes\", \"config.yaml\");\n\t\t\tmergeYaml(path, (cfg) => setNested(cfg, \"mcp_servers\", {\n\t\t\t\turl: mcpUrl(o.apiUrl),\n\t\t\t\theaders: { Authorization: bearer(o.apiKey) }\n\t\t\t}));\n\t\t\treturn {\n\t\t\t\tkind: \"file\",\n\t\t\t\tpath\n\t\t\t};\n\t\t}\n\t}\n];\nfunction getMcpClient(slug) {\n\treturn mcpClients.find((c) => c.slug === slug);\n}\n\n//#endregion\nexport { SKILL_NAME, getMcpClient, installSkill, mcpClients };\n//# sourceMappingURL=install.js.map","import { resolveSiteUrl } from \"./config\";\n\n/**\n * The canonical Sequel skill is published by the marketing site under the Agent\n * Skills discovery convention. The CLI downloads it at install time rather than\n * bundling a copy, so an installed skill is always the current one and there is\n * a single source of truth for its content.\n */\nexport function skillMarkdownUrl(): string {\n return `${resolveSiteUrl().replace(/\\/$/, \"\")}/.well-known/agent-skills/sequel/SKILL.md`;\n}\n\nexport async function fetchSkillMarkdown(): Promise<string> {\n const url = skillMarkdownUrl();\n const res = await fetch(url, { headers: { Accept: \"text/markdown, text/plain;q=0.9, */*;q=0.1\" } });\n if (!res.ok) throw new Error(`Could not download the Sequel skill (${res.status}) from ${url}`);\n const text = await res.text();\n // A SKILL.md starts with YAML frontmatter; anything else is an error page.\n if (!text.trimStart().startsWith(\"---\")) {\n throw new Error(`Unexpected response from ${url}: not a SKILL.md`);\n }\n return text;\n}\n","import { execFileSync } from \"node:child_process\";\nimport * as p from \"@clack/prompts\";\nimport { createApiKey } from \"../lib/api\";\nimport { isLoggedIn, runLoginFlow } from \"../lib/auth\";\nimport { readConfig, resolveApiUrl } from \"../lib/config\";\nimport { type Scope, getMcpClient, installSkill, mcpClients } from \"../lib/mcp-clients\";\nimport { info, isJsonMode, pc, success } from \"../lib/output\";\nimport { readPendingLogin, waitForLogin } from \"../lib/pending-login\";\nimport { fetchSkillMarkdown } from \"../lib/skills\";\n\nexport interface InstallOptions {\n /** `--scope global|local`; skips the scope prompt. Defaults to the agent's first scope when non-interactive. */\n scope?: string;\n /** Commander's `--no-browser` sets this to false: if a sign-in is needed, print its URL instead of opening it. */\n browser?: boolean;\n}\n\nconst SCOPES: readonly Scope[] = [\"global\", \"local\"];\n\n/** MCP server name the CLI installs under; used in recovery hints. */\nconst SERVER_NAME = \"sequel\";\n\n/**\n * Mask credential-bearing argv entries so a failure can show a runnable-looking\n * command without leaking the bearer token into logs or an agent's transcript.\n */\nfunction redactArgs(args: string[]): string[] {\n return args.map((arg) => (/^Authorization:/i.test(arg) ? \"Authorization: Bearer sql_your_api_key\" : arg));\n}\n\nexport async function installCommand(slugArg?: string, opts: InstallOptions = {}): Promise<void> {\n // Piped/--json (how coding agents run us): no prompts at all. Everything the\n // prompts would have asked must come from the argument and flags instead.\n const interactive = !isJsonMode();\n const slugList = mcpClients.map((c) => c.slug).join(\", \");\n\n if (interactive) p.intro(pc.cyan(\"Install the Sequel MCP server and skill\"));\n\n // Reject a bad slug before opening a browser for sign-in.\n if (slugArg && !getMcpClient(slugArg)) throw new Error(`Unknown agent \"${slugArg}\". Options: ${slugList}`);\n if (!slugArg && !interactive) {\n throw new Error(`Pass the agent slug when running non-interactively: \\`sequel install <agent>\\`. Options: ${slugList}`);\n }\n\n // Sign in first if needed, then continue with the install.\n if (!isLoggedIn()) {\n if (!interactive) {\n // Never block a piped caller on a URL it can't see: finish a sign-in that\n // `sequel login` already started, otherwise tell it to start one.\n const pending = readPendingLogin();\n if (pending?.status !== \"pending\") {\n throw new Error(\n \"Not signed in. Run `sequel login` first: it prints a sign-in URL for the user to open. Once they have signed in, rerun this command.\",\n );\n }\n info(`Waiting for the sign-in at ${pending.url} to finish…`);\n if (!(await waitForLogin(pending.expiresAt - Date.now()))) {\n throw new Error(\"The sign-in did not complete. Run `sequel login` to get a fresh URL, then rerun this command.\");\n }\n } else {\n p.log.info(\"You need to sign in to Sequel first — opening your browser…\");\n try {\n const result = await runLoginFlow({ silent: opts.browser === false });\n p.log.success(`Signed in as ${result.user.email}${result.org ? ` (${result.org.name})` : \"\"}.`);\n } catch (err) {\n p.cancel(err instanceof Error ? err.message : String(err));\n return;\n }\n }\n }\n\n let slug = slugArg;\n if (!slug) {\n const choice = await p.select({\n message: \"Which coding agent do you want to install Sequel into?\",\n options: mcpClients.map((c) => ({ value: c.slug, label: c.name })),\n });\n if (p.isCancel(choice)) return p.cancel(\"Cancelled.\");\n slug = choice as string;\n }\n\n const client = getMcpClient(slug);\n if (!client) throw new Error(`Unknown agent \"${slug}\". Options: ${slugList}`);\n\n let scope: Scope = client.scopes[0];\n if (opts.scope !== undefined) {\n if (!SCOPES.includes(opts.scope as Scope)) {\n throw new Error(`Unknown scope \"${opts.scope}\". Options: ${SCOPES.join(\", \")}`);\n }\n if (!client.scopes.includes(opts.scope as Scope)) {\n throw new Error(`${client.name} only supports the ${client.scopes.join(\"/\")} scope.`);\n }\n scope = opts.scope as Scope;\n } else if (client.scopes.length > 1 && interactive) {\n const choice = await p.select({\n message: \"Install scope\",\n options: [\n { value: \"global\", label: \"Global\", hint: \"available everywhere on this machine\" },\n { value: \"local\", label: \"Local\", hint: \"this project only\" },\n ].filter((o) => client.scopes.includes(o.value as Scope)),\n });\n if (p.isCancel(choice)) return p.cancel(\"Cancelled.\");\n scope = choice as Scope;\n }\n\n const config = readConfig();\n const apiUrl = resolveApiUrl(config);\n\n // Clack spinners assume a TTY; when piped, log plain lines instead.\n const s = interactive ? p.spinner() : null;\n s?.start(\"Creating a Sequel API key for this agent…\");\n let key: string;\n let keyPrefix: string;\n try {\n ({ key, keyPrefix } = await createApiKey(`Sequel CLI (${client.name})`));\n } catch (err) {\n s?.stop(\"Failed to create API key.\");\n throw err;\n }\n s ? s.stop(\"API key created.\") : info(\"API key created.\");\n\n const result = client.install({ apiUrl, apiKey: key, scope });\n\n if (result.kind === \"command\") {\n // e.g. Claude Code: run `claude mcp add …`.\n try {\n execFileSync(result.command, result.args, { stdio: \"inherit\" });\n } catch {\n // The args carry `Authorization: Bearer sql_…`. Never echo them: this\n // message surfaces in terminals, CI logs and coding-agent transcripts.\n throw new Error(\n [\n `Failed to run \\`${result.command}\\`. Make sure it's installed, then run:`,\n ` ${result.command} ${redactArgs(result.args).join(\" \")}`,\n \"\",\n `A Sequel API key (${keyPrefix}…) was created before this step and is now unused.`,\n \"Revoke it under Settings → API Keys, or rerun this command once the problem is fixed.\",\n `If the MCP server is already configured, remove it first (e.g. \\`claude mcp remove ${SERVER_NAME}\\`) and rerun.`,\n ].join(\"\\n\"),\n );\n }\n success(`Installed Sequel into ${client.name} (${scope}).`);\n } else {\n success(`Installed Sequel into ${client.name}.`);\n info(`Config written to ${pc.dim(result.path)}`);\n }\n\n // The skill teaches the agent that Sequel's playbooks exist and how to reach\n // them; the MCP server above is what runs them. Install both where we can.\n const skillsDir = client.skillsDir?.({ apiUrl, apiKey: key, scope }) ?? null;\n if (skillsDir) {\n const sk = interactive ? p.spinner() : null;\n sk?.start(\"Installing the Sequel skill…\");\n try {\n const markdown = await fetchSkillMarkdown();\n const written = installSkill({ dir: skillsDir, markdown });\n sk ? sk.stop(\"Sequel skill installed.\") : success(\"Sequel skill installed.\");\n info(`Skill written to ${pc.dim(written.path)}`);\n } catch (err) {\n // The MCP install already succeeded; a skill download failure should not\n // undo that or look like it did.\n sk?.stop(\"Could not install the Sequel skill.\");\n const warning = `${err instanceof Error ? err.message : String(err)}\\nSequel still works through MCP; rerun \\`sequel install ${client.slug}\\` later to add the skill.`;\n if (interactive) p.log.warn(warning);\n else info(`Could not install the Sequel skill. ${warning}`);\n }\n } else {\n info(\n `${client.name} has no skills directory the CLI can write to; the Sequel skill is skipped. Playbooks are still available through MCP.`,\n );\n }\n\n const done = `Restart ${client.name} and ask it to \"list my Sequel connections\" to verify.`;\n if (interactive) p.outro(done);\n else info(done);\n}\n","import { search } from \"../lib/api\";\nimport { info, isJsonMode, pc, printJson } from \"../lib/output\";\n\nexport async function searchCommand(useCase: string, opts: { connection?: string[] }): Promise<void> {\n const res = await search(useCase, opts.connection);\n if (isJsonMode()) return printJson(res);\n\n if (res.results.length === 0) {\n info(\"No matching tools found across your connected sources.\");\n return;\n }\n\n for (const r of res.results) {\n info(`\\n${pc.bold(r.connection_name)} ${pc.dim(`(${r.connection_id} · ${r.app_id})`)}`);\n if (r.instructions) info(pc.dim(r.instructions));\n for (const tool of r.tools) {\n info(` ${pc.cyan(tool.tool_id)}`);\n if (tool.relevant_tables?.length) info(` tables: ${tool.relevant_tables.join(\", \")}`);\n }\n info(pc.dim(` → sequel execute ${r.connection_id} ${r.tools[0]?.tool_id ?? \"<tool>\"} -d '{…}'`));\n }\n}\n","import { execute } from \"../lib/api\";\nimport { info, isJsonMode, pc, printJson, printTable } from \"../lib/output\";\n\nexport async function executeCommand(\n connectionId: string,\n tool: string,\n opts: { data?: string },\n): Promise<void> {\n let params: Record<string, unknown> = {};\n if (opts.data) {\n try {\n params = JSON.parse(opts.data) as Record<string, unknown>;\n } catch {\n throw new Error(\"Invalid JSON passed to -d/--data.\");\n }\n }\n\n const res = await execute(connectionId, tool, params);\n if (isJsonMode()) return printJson(res);\n\n if (res.data.length === 0) {\n info(pc.dim(\"(0 rows)\"));\n return;\n }\n printTable(res.data, res.columns.length ? res.columns : undefined);\n info(pc.dim(`\\n${res.row_count} row(s)${res.truncated ? \" (truncated)\" : \"\"}`));\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { getFileDownloadUrl } from \"../lib/api\";\nimport { info, isJsonMode, pc, printJson } from \"../lib/output\";\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport async function downloadCommand(\n sessionId: string,\n filePath: string,\n opts: { output?: string },\n): Promise<void> {\n const meta = await getFileDownloadUrl(sessionId, filePath);\n\n // JSON mode (explicit --json or piped): emit the metadata + signed URL for\n // scripting; don't write a file as a surprise side effect.\n if (isJsonMode()) return printJson(meta);\n\n const res = await fetch(meta.url);\n if (!res.ok) throw new Error(`Download failed (${res.status} ${res.statusText})`);\n const dest = opts.output ?? meta.filename;\n await writeFile(dest, Buffer.from(await res.arrayBuffer()));\n info(`${pc.green(\"✓\")} Downloaded ${pc.bold(meta.filename)} (${formatBytes(meta.size)}) → ${dest}`);\n}\n","import { execFileSync } from \"node:child_process\";\nimport * as p from \"@clack/prompts\";\nimport { isJsonMode, pc, printJson, success } from \"../lib/output\";\n\nconst PKG = \"@sequelsh/cli@latest\";\n\ntype Manager = { name: string; cmd: string; args: string[] };\n\n// Global-install command per package manager, in preference order.\nconst MANAGERS: Manager[] = [\n { name: \"npm\", cmd: \"npm\", args: [\"install\", \"-g\", PKG] },\n { name: \"pnpm\", cmd: \"pnpm\", args: [\"add\", \"-g\", PKG] },\n { name: \"bun\", cmd: \"bun\", args: [\"add\", \"-g\", PKG] },\n { name: \"yarn\", cmd: \"yarn\", args: [\"global\", \"add\", PKG] },\n];\n\nfunction has(cmd: string): boolean {\n try {\n execFileSync(process.platform === \"win32\" ? \"where\" : \"which\", [cmd], { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function upgradeCommand(): Promise<void> {\n const json = isJsonMode();\n if (!json) p.intro(pc.cyan(\"Upgrade the Sequel CLI\"));\n\n const manager = MANAGERS.find((m) => has(m.cmd));\n if (!manager) {\n const msg =\n \"No supported package manager found (npm, pnpm, bun, or yarn). Install Node.js from https://nodejs.org and try again.\";\n if (json) return printJson({ status: \"error\", error: msg });\n p.cancel(msg);\n return;\n }\n\n const s = json ? null : p.spinner();\n s?.start(`Updating ${PKG} with ${manager.name}…`);\n try {\n execFileSync(manager.cmd, manager.args, { stdio: \"pipe\" });\n } catch (err) {\n s?.stop(\"Upgrade failed.\");\n throw new Error(\n `Failed to run \\`${manager.cmd} ${manager.args.join(\" \")}\\`.\\n${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n s?.stop(\"Updated.\");\n\n if (json) return printJson({ status: \"upgraded\", package: PKG, manager: manager.name });\n success(\"Sequel CLI is now on the latest version.\");\n p.outro(\"Run `sequel --version` to confirm.\");\n}\n","import { Command } from \"commander\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { ApiError } from \"./lib/api\";\nimport { fail, setJsonMode } from \"./lib/output\";\nimport { loginCommand, loginWorkerCommand } from \"./commands/login\";\nimport { logoutCommand } from \"./commands/logout\";\nimport { switchCommand } from \"./commands/switch\";\nimport { connectCommand } from \"./commands/connect\";\nimport { sourcesActive, sourcesDelete, sourcesInfo, sourcesList } from \"./commands/sources\";\nimport { skillsList, skillsShow } from \"./commands/skills\";\nimport { installCommand } from \"./commands/install\";\nimport { searchCommand } from \"./commands/search\";\nimport { executeCommand } from \"./commands/execute\";\nimport { downloadCommand } from \"./commands/download\";\nimport { upgradeCommand } from \"./commands/upgrade\";\n\nconst program = new Command();\n\nprogram\n .name(\"sequel\")\n .description(\"Sequel CLI — connect data sources and run tools from your terminal\")\n // Inlined by tsdown at build time, so the reported version always matches\n // what the publish workflow bumped in package.json.\n .version(pkg.version)\n .option(\"--json\", \"output machine-readable JSON\")\n .enablePositionalOptions();\n\n/** Wrap a command action with shared --json handling and error reporting. */\nfunction action<A extends unknown[]>(fn: (...args: A) => Promise<void>) {\n return async (...args: A) => {\n // Auto-enable JSON when stdout is piped (e.g. `sequel sources | jq`), not just --json.\n if (program.opts().json || !process.stdout.isTTY) setJsonMode(true);\n try {\n await fn(...args);\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) {\n fail(\"Unauthorized. Run `sequel login` to sign in again.\");\n } else {\n fail(err instanceof Error ? err.message : String(err));\n }\n process.exitCode = 1;\n }\n };\n}\n\nprogram.command(\"upgrade\").description(\"Upgrade the Sequel CLI to the latest version\").action(action(upgradeCommand));\nprogram\n .command(\"login\")\n .description(\"Sign in to Sequel\")\n .option(\"--no-browser\", \"print the sign-in URL instead of opening a browser\")\n .option(\"--detach\", \"print the sign-in URL and return; finish signing in in the background (default when piped)\")\n .option(\"--status\", \"report whether you are signed in, or a sign-in is pending, without starting one\")\n .option(\"--wait\", \"block until a pending background sign-in finishes\")\n .action(action(loginCommand));\nprogram\n .command(\"login-worker\", { hidden: true })\n .option(\"--no-browser\")\n .action(action(loginWorkerCommand));\nprogram.command(\"logout\").description(\"Sign out and remove cached credentials\").action(action(logoutCommand));\nprogram.command(\"switch\").description(\"Switch the active organization\").action(action(switchCommand));\n\nprogram\n .command(\"connect\")\n .argument(\"[source]\", \"connector id (e.g. postgres); omit to choose interactively\")\n .description(\"Connect a new data source\")\n .action(action(connectCommand));\n\nconst sources = program.command(\"sources\").description(\"Manage connected data sources\");\nsources.command(\"list\", { isDefault: true }).description(\"List connected sources\").action(action(sourcesList));\nsources.command(\"active\").description(\"List sources with live health status\").action(action(sourcesActive));\nsources\n .command(\"info\")\n .argument(\"[id]\", \"source id or short id\")\n .description(\"Show details for a source\")\n .action(action(sourcesInfo));\nsources\n .command(\"delete\")\n .argument(\"[id]\", \"source id or short id\")\n .description(\"Delete a source\")\n .action(action(sourcesDelete));\n\nconst skills = program.command(\"skills\").description(\"Browse the playbooks your agent can follow\");\nskills.command(\"list\", { isDefault: true }).description(\"List every skill (id and name)\").action(action(skillsList));\nskills\n .command(\"show\")\n .argument(\"<id>\", \"skill id, e.g. seo\")\n .description(\"Print a skill's playbook\")\n .action(action((id: string) => skillsShow(id)));\n\nprogram\n .command(\"install\")\n .argument(\"[agent]\", \"coding agent slug (e.g. cursor, claude-code)\")\n .option(\"-s, --scope <scope>\", \"global or local; skips the prompt (defaults to global when piped)\")\n .option(\"--no-browser\", \"print the sign-in URL instead of opening a browser if sign-in is needed\")\n .description(\"Install the Sequel MCP server into a coding agent\")\n .action(action(installCommand));\n\nprogram\n .command(\"search\")\n .argument(\"<usecase>\", \"what you want to do, e.g. \\\"monthly revenue\\\"\")\n .option(\"-c, --connection <id...>\", \"limit to specific connection short ids\")\n .description(\"Find the right tools for a use case across your sources\")\n .action(action((usecase: string, opts: { connection?: string[] }) => searchCommand(usecase, opts)));\n\nprogram\n .command(\"execute\")\n .argument(\"<connection_id>\", \"connection short id\")\n .argument(\"<tool>\", \"tool id, e.g. postgres.query\")\n .option(\"-d, --data <json>\", \"tool input as a JSON string\")\n .description(\"Execute a tool against a connection\")\n .action(action((connectionId: string, tool: string, opts: { data?: string }) => executeCommand(connectionId, tool, opts)));\n\nprogram\n .command(\"download\")\n .argument(\"<session_id>\", \"session id (from `sequel search` or an agent session)\")\n .argument(\"<path>\", \"file path, e.g. /data/result.csv or result.csv\")\n .option(\"-o, --output <file>\", \"write to this path (default: the file's own name)\")\n .description(\"Download a file produced by a query or workbench run\")\n .action(action((sessionId: string, path: string, opts: { output?: string }) => downloadCommand(sessionId, path, opts)));\n\nprogram.parseAsync(process.argv).catch((err) => {\n fail(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sequelsh/cli",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "description": "Sequel CLI — connect data sources and run tools from your terminal.",
5
5
  "license": "MIT",
6
6
  "type": "module",