mover-os 4.4.1 → 4.4.2

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/install.js +36 -5
  2. package/package.json +1 -1
package/install.js CHANGED
@@ -343,7 +343,16 @@ function textInput({ label = "", initial = "", mask = null, placeholder = "" })
343
343
  value = value.slice(0, pos) + value.slice(pos + 1);
344
344
  }
345
345
  }
346
- else if (data.startsWith("\x1b")) { /* ignore escape sequences */ }
346
+ else if (data === "\x1b") {
347
+ // Escape — cancel input
348
+ stdin.removeListener("data", handler);
349
+ stdin.setRawMode(false);
350
+ stdin.pause();
351
+ ln();
352
+ resolve(null);
353
+ return;
354
+ }
355
+ else if (data.startsWith("\x1b")) { /* ignore other escape sequences */ }
347
356
  else {
348
357
  for (const ch of data) {
349
358
  if (ch.charCodeAt(0) >= 32) {
@@ -3024,6 +3033,7 @@ async function cmdCapture(opts) {
3024
3033
  if (!type) return;
3025
3034
  }
3026
3035
  content = await textInput({ label: `Enter ${type}:` });
3036
+ if (content === null) return;
3027
3037
  }
3028
3038
  if (!type) type = "task";
3029
3039
 
@@ -3536,7 +3546,9 @@ async function cmdPrayer(opts) {
3536
3546
  if (choice === "fetch") {
3537
3547
  barLn();
3538
3548
  const city = await textInput({ label: "City", placeholder: "London" });
3549
+ if (city === null) return;
3539
3550
  const country = await textInput({ label: "Country", placeholder: "United Kingdom" });
3551
+ if (country === null) return;
3540
3552
  barLn();
3541
3553
 
3542
3554
  if (city && country) {
@@ -3562,7 +3574,7 @@ async function cmdPrayer(opts) {
3562
3574
  barLn(dim(" Format examples:"));
3563
3575
  barLn(dim(" 2026-03-08 05:20 13:00 16:15 18:01 19:45"));
3564
3576
  barLn(dim(" March 8: Fajr 05:20, Dhuhr 13:00, Asr 16:15, Maghrib 18:01, Isha 19:45"));
3565
- barLn(dim(" Type 'done' on a new line when finished."));
3577
+ barLn(dim(" Type 'done' or press Enter on empty line to finish. 'back' to cancel."));
3566
3578
  barLn();
3567
3579
 
3568
3580
  const lines = [];
@@ -3570,7 +3582,14 @@ async function cmdPrayer(opts) {
3570
3582
  await new Promise((resolve) => {
3571
3583
  const ask = () => {
3572
3584
  rl.question(`${BAR_COLOR}\u2502${S.reset} `, (line) => {
3573
- if (line.trim().toLowerCase() === "done" || line.trim() === "") {
3585
+ const t = line.trim().toLowerCase();
3586
+ if (t === "done" || t === "") {
3587
+ rl.close();
3588
+ resolve();
3589
+ return;
3590
+ }
3591
+ if (t === "back" || t === "cancel") {
3592
+ lines.length = 0; // clear
3574
3593
  rl.close();
3575
3594
  resolve();
3576
3595
  return;
@@ -4410,6 +4429,7 @@ async function main() {
4410
4429
  mask: "\u25AA",
4411
4430
  placeholder: "MOVER-XXXX-XXXX",
4412
4431
  });
4432
+ if (key === null) return;
4413
4433
 
4414
4434
  const sp = spinner("Validating...");
4415
4435
  const valid = await validateKey(key);
@@ -4503,6 +4523,7 @@ async function main() {
4503
4523
  label: "Where is your Obsidian vault?",
4504
4524
  initial: path.join(os.homedir(), "Mover-OS"),
4505
4525
  });
4526
+ if (vaultPath === null) return;
4506
4527
  } else {
4507
4528
  vaultPath = selected;
4508
4529
  }
@@ -4511,6 +4532,7 @@ async function main() {
4511
4532
  label: "Where is your Obsidian vault?",
4512
4533
  initial: path.join(os.homedir(), "Mover-OS"),
4513
4534
  });
4535
+ if (vaultPath === null) return;
4514
4536
  }
4515
4537
  } else {
4516
4538
  barLn(dim(`Vault: ${vaultPath}`));
@@ -4958,7 +4980,7 @@ async function main() {
4958
4980
  barLn(dim(" 2026-03-08 05:20 13:00 16:15 18:01 19:45"));
4959
4981
  barLn(dim(" March 8: Fajr 05:20, Dhuhr 13:00, Asr 16:15, Maghrib 18:01, Isha 19:45"));
4960
4982
  barLn(dim(" Or paste a whole table — the system will parse it."));
4961
- barLn(dim(" When done, type 'done' on a new line and press Enter."));
4983
+ barLn(dim(" Type 'done' or press Enter on empty line to finish. 'back' to cancel."));
4962
4984
  barLn();
4963
4985
 
4964
4986
  const lines = [];
@@ -4966,7 +4988,14 @@ async function main() {
4966
4988
  await new Promise((resolve) => {
4967
4989
  const ask = () => {
4968
4990
  rl.question(`${BAR_COLOR}\u2502${S.reset} `, (line) => {
4969
- if (line.trim().toLowerCase() === "done" || line.trim() === "") {
4991
+ const t = line.trim().toLowerCase();
4992
+ if (t === "done" || t === "") {
4993
+ rl.close();
4994
+ resolve();
4995
+ return;
4996
+ }
4997
+ if (t === "back" || t === "cancel") {
4998
+ lines.length = 0;
4970
4999
  rl.close();
4971
5000
  resolve();
4972
5001
  return;
@@ -4991,7 +5020,9 @@ async function main() {
4991
5020
  } else if (method === "fetch") {
4992
5021
  barLn();
4993
5022
  const city = await textInput({ label: "City (e.g. London, Watford, Istanbul)", placeholder: "London" });
5023
+ if (city === null) break;
4994
5024
  const country = await textInput({ label: "Country", placeholder: "United Kingdom" });
5025
+ if (country === null) break;
4995
5026
  barLn();
4996
5027
 
4997
5028
  if (city && country) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mover-os",
3
- "version": "4.4.1",
3
+ "version": "4.4.2",
4
4
  "description": "The self-improving OS for AI agents. Turns Obsidian into an execution engine.",
5
5
  "bin": {
6
6
  "moveros": "install.js"