@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.
- package/dist/index.js +51 -24
- 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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
9761
|
-
|
|
9762
|
-
|
|
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
|
|
9945
|
-
if (
|
|
9971
|
+
async function getKeytar2() {
|
|
9972
|
+
if (_keytar2 !== "pending") return _keytar2;
|
|
9946
9973
|
try {
|
|
9947
|
-
|
|
9948
|
-
return
|
|
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
|
-
|
|
9978
|
+
_keytar2 = null;
|
|
9952
9979
|
return null;
|
|
9953
9980
|
}
|
|
9954
9981
|
}
|
|
9955
9982
|
async function secureStoreDelete() {
|
|
9956
|
-
const kt = await
|
|
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,
|
|
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
|
-
|
|
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.
|
|
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-
|
|
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
|
|
15275
|
-
if (
|
|
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
|
|
15425
|
+
const keytar = await import("keytar");
|
|
15399
15426
|
const KEYCHAIN_SERVICE3 = "msapling-cli";
|
|
15400
15427
|
const KEYCHAIN_ACCOUNT3 = "auth_token";
|
|
15401
|
-
const token = await
|
|
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.
|
|
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.
|
|
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",
|