@mtreeai/msapling-cli 2.3.6-beta.40 → 2.3.6-beta.42

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.
Files changed (2) hide show
  1. package/dist/index.js +51 -24
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -8685,11 +8685,22 @@ import { join as join17 } from "path";
8685
8685
  import { chmodSync, existsSync as existsSync13, renameSync as renameSync2, unlinkSync } from "fs";
8686
8686
  import { writeFile as writeFile6, readFile as readFile13 } from "fs/promises";
8687
8687
  import { createHash as createHash4 } from "crypto";
8688
- import * as keytar from "keytar";
8688
+ async function getKeytar() {
8689
+ if (_keytar !== "pending") return _keytar;
8690
+ try {
8691
+ const mod = await import("keytar");
8692
+ _keytar = mod && typeof mod.setPassword === "function" ? mod : mod?.default ?? mod;
8693
+ } catch {
8694
+ _keytar = null;
8695
+ }
8696
+ return _keytar;
8697
+ }
8689
8698
  async function saveToken(baseDir, token) {
8690
8699
  const filePath = join17(baseDir, "vault", "token");
8691
8700
  try {
8692
- await keytar.setPassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT, token);
8701
+ const kt = await getKeytar();
8702
+ if (!kt) throw new Error("keytar not loadable");
8703
+ await kt.setPassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT, token);
8693
8704
  try {
8694
8705
  if (existsSync13(filePath)) unlinkSync(filePath);
8695
8706
  } catch {
@@ -8705,7 +8716,9 @@ async function saveToken(baseDir, token) {
8705
8716
  async function loadToken(baseDir) {
8706
8717
  const filePath = join17(baseDir, "vault", "token");
8707
8718
  try {
8708
- const keychainToken = await keytar.getPassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
8719
+ const kt = await getKeytar();
8720
+ if (!kt) throw new Error("keytar not loadable");
8721
+ const keychainToken = await kt.getPassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
8709
8722
  if (keychainToken) return keychainToken;
8710
8723
  } catch (e) {
8711
8724
  console.debug(`Keychain unavailable (${e instanceof Error ? e.message : String(e)}), falling back to file storage`);
@@ -8719,7 +8732,8 @@ async function loadToken(baseDir) {
8719
8732
  async function clearToken(baseDir) {
8720
8733
  const filePath = join17(baseDir, "vault", "token");
8721
8734
  try {
8722
- await keytar.deletePassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
8735
+ const kt = await getKeytar();
8736
+ if (kt) await kt.deletePassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
8723
8737
  } catch (e) {
8724
8738
  console.debug(`Keychain unavailable for deletion (${e instanceof Error ? e.message : String(e)})`);
8725
8739
  }
@@ -8753,11 +8767,12 @@ async function readVaultRef(baseDir, label) {
8753
8767
  if (!existsSync13(objectPath)) return null;
8754
8768
  return readFile13(objectPath, "utf8");
8755
8769
  }
8756
- var KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT;
8770
+ var _keytar, KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT;
8757
8771
  var init_vault = __esm({
8758
8772
  "../core/src/Storage/vault.ts"() {
8759
8773
  "use strict";
8760
8774
  init_esm_shims();
8775
+ _keytar = "pending";
8761
8776
  KEYCHAIN_SERVICE = "msapling-cli";
8762
8777
  KEYCHAIN_ACCOUNT = "auth_token";
8763
8778
  }
@@ -9757,10 +9772,22 @@ async function loginWithEmailPassword(email, context, preSuppliedPassword) {
9757
9772
  context.addMessage("system", `Logging in as ${email}...`);
9758
9773
  let password = preSuppliedPassword || process.env.MSAPLING_PASSWORD || "";
9759
9774
  if (!password) {
9760
- context.addMessage(
9761
- "system",
9762
- "NOTE: the interactive password prompt is known to leak keystrokes into the REPL input. Safer alternatives: /login <email> <password> OR set MSAPLING_PASSWORD env var OR use /login <token>."
9763
- );
9775
+ const inkAlreadyListening = process.stdin.listenerCount("data") > 0;
9776
+ if (inkAlreadyListening) {
9777
+ context.addMessage(
9778
+ "error",
9779
+ "Cannot prompt for password inside the REPL \u2014 Ink owns stdin and would corrupt the input."
9780
+ );
9781
+ context.addMessage(
9782
+ "system",
9783
+ "Use one of these instead:"
9784
+ );
9785
+ context.addMessage("system", ` /login ${email} <your-password>`);
9786
+ context.addMessage("system", ` or set the env var before launching: $env:MSAPLING_PASSWORD="..."`);
9787
+ context.addMessage("system", " or paste an API token: /login <token> (get one at msapling.com \u2192 Settings \u2192 API Keys)");
9788
+ context.addMessage("system", " or use a different login mode: /login github | /login guest");
9789
+ return;
9790
+ }
9764
9791
  try {
9765
9792
  password = await promptPassword("Password: ");
9766
9793
  if (!password) {
@@ -9941,19 +9968,19 @@ var init_login = __esm({
9941
9968
  });
9942
9969
 
9943
9970
  // src/state/secureStore.ts
9944
- async function getKeytar() {
9945
- if (_keytar !== "pending") return _keytar;
9971
+ async function getKeytar2() {
9972
+ if (_keytar2 !== "pending") return _keytar2;
9946
9973
  try {
9947
- _keytar = await import("keytar");
9948
- return _keytar;
9974
+ _keytar2 = await import("keytar");
9975
+ return _keytar2;
9949
9976
  } catch (e) {
9950
9977
  console.warn(`[secureStore] keytar unavailable, falling back to file token: ${e instanceof Error ? e.message : String(e)}`);
9951
- _keytar = null;
9978
+ _keytar2 = null;
9952
9979
  return null;
9953
9980
  }
9954
9981
  }
9955
9982
  async function secureStoreDelete() {
9956
- const kt = await getKeytar();
9983
+ const kt = await getKeytar2();
9957
9984
  if (!kt) return;
9958
9985
  try {
9959
9986
  await kt.deletePassword(KEYCHAIN_SERVICE2, KEYCHAIN_ACCOUNT2);
@@ -9961,14 +9988,14 @@ async function secureStoreDelete() {
9961
9988
  console.warn(`[secureStore] deletePassword failed: ${e instanceof Error ? e.message : String(e)}`);
9962
9989
  }
9963
9990
  }
9964
- var KEYCHAIN_SERVICE2, KEYCHAIN_ACCOUNT2, _keytar;
9991
+ var KEYCHAIN_SERVICE2, KEYCHAIN_ACCOUNT2, _keytar2;
9965
9992
  var init_secureStore = __esm({
9966
9993
  "src/state/secureStore.ts"() {
9967
9994
  "use strict";
9968
9995
  init_esm_shims();
9969
9996
  KEYCHAIN_SERVICE2 = "msapling-cli";
9970
9997
  KEYCHAIN_ACCOUNT2 = "auth-cookie";
9971
- _keytar = "pending";
9998
+ _keytar2 = "pending";
9972
9999
  }
9973
10000
  });
9974
10001
 
@@ -12380,7 +12407,7 @@ var init_version = __esm({
12380
12407
  description: "Show version information for CLI and core packages",
12381
12408
  category: "debug",
12382
12409
  handler: async (_args, context) => {
12383
- const cliVersion = true ? "2.3.6-beta.40" : "(dev)";
12410
+ const cliVersion = true ? "2.3.6-beta.42" : "(dev)";
12384
12411
  const coreVersion = true ? "2.3.2" : "(dev)";
12385
12412
  const runtime = process.version;
12386
12413
  context.addMessage("system", "MSapling Version Info");
@@ -12389,7 +12416,7 @@ var init_version = __esm({
12389
12416
  context.addMessage("system", row2("Core (@msapling/core)", coreVersion));
12390
12417
  context.addMessage("system", row2("Runtime (Node/Bun)", runtime));
12391
12418
  try {
12392
- const ts = "2026-06-02T15:27:42.676Z";
12419
+ const ts = "2026-06-02T16:20:01.508Z";
12393
12420
  if (ts && ts !== "__BUILD_TIMESTAMP__") {
12394
12421
  context.addMessage("system", row2("Build Timestamp", ts));
12395
12422
  }
@@ -15271,8 +15298,8 @@ async function checkConfigDir() {
15271
15298
  }
15272
15299
  async function checkKeytar() {
15273
15300
  try {
15274
- const keytar2 = await import("keytar");
15275
- if (keytar2 && typeof keytar2.getPassword === "function") {
15301
+ const keytar = await import("keytar");
15302
+ if (keytar && typeof keytar.getPassword === "function") {
15276
15303
  return {
15277
15304
  name: "Keytar native binary",
15278
15305
  status: "PASS",
@@ -15395,10 +15422,10 @@ async function checkNetworkReach() {
15395
15422
  }
15396
15423
  async function checkTokenValidity() {
15397
15424
  try {
15398
- const keytar2 = await import("keytar");
15425
+ const keytar = await import("keytar");
15399
15426
  const KEYCHAIN_SERVICE3 = "msapling-cli";
15400
15427
  const KEYCHAIN_ACCOUNT3 = "auth_token";
15401
- const token = await keytar2.getPassword(KEYCHAIN_SERVICE3, KEYCHAIN_ACCOUNT3);
15428
+ const token = await keytar.getPassword(KEYCHAIN_SERVICE3, KEYCHAIN_ACCOUNT3);
15402
15429
  if (!token) {
15403
15430
  return {
15404
15431
  name: "Token validity",
@@ -17905,7 +17932,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
17905
17932
  var Header = () => /* @__PURE__ */ jsxs(Box, { borderStyle: "single", borderColor: "cyan", paddingX: 1, marginBottom: 1, children: [
17906
17933
  /* @__PURE__ */ jsxs(Text, { bold: true, color: "cyan", children: [
17907
17934
  "\u25CF MSapling CLI v",
17908
- "2.3.6-beta.40"
17935
+ "2.3.6-beta.42"
17909
17936
  ] }),
17910
17937
  /* @__PURE__ */ jsx(Box, { marginLeft: 2, children: /* @__PURE__ */ jsx(Text, { color: "gray", children: "Platinum Tier Architecture" }) })
17911
17938
  ] });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mtreeai/msapling-cli",
3
- "version": "2.3.6-beta.40",
3
+ "version": "2.3.6-beta.42",
4
4
  "description": "MSapling CLI — React/Ink terminal client for the MSapling backend (chat, projects, MDrive, agent tools). Proprietary; redistribution prohibited.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "MSapling Team",