@sundaeswap/sprinkles 0.7.0 → 0.8.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.
Files changed (95) hide show
  1. package/README.md +178 -181
  2. package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js +4 -4
  3. package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js.map +1 -1
  4. package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js +25 -3
  5. package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js.map +1 -1
  6. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +15 -1
  7. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
  8. package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js +7 -9
  9. package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -1
  10. package/dist/cjs/Sprinkle/__tests__/native-script.test.js +390 -0
  11. package/dist/cjs/Sprinkle/__tests__/native-script.test.js.map +1 -0
  12. package/dist/cjs/Sprinkle/__tests__/utility-actions.test.js +367 -0
  13. package/dist/cjs/Sprinkle/__tests__/utility-actions.test.js.map +1 -0
  14. package/dist/cjs/Sprinkle/actions/builtin/addressbook-actions.js +164 -0
  15. package/dist/cjs/Sprinkle/actions/builtin/addressbook-actions.js.map +1 -0
  16. package/dist/cjs/Sprinkle/actions/builtin/index.js +60 -3
  17. package/dist/cjs/Sprinkle/actions/builtin/index.js.map +1 -1
  18. package/dist/cjs/Sprinkle/actions/builtin/native-script.js +139 -0
  19. package/dist/cjs/Sprinkle/actions/builtin/native-script.js.map +1 -0
  20. package/dist/cjs/Sprinkle/actions/builtin/utility-actions.js +218 -0
  21. package/dist/cjs/Sprinkle/actions/builtin/utility-actions.js.map +1 -0
  22. package/dist/cjs/Sprinkle/actions/cli-adapter.js +20 -2
  23. package/dist/cjs/Sprinkle/actions/cli-adapter.js.map +1 -1
  24. package/dist/cjs/Sprinkle/actions/index.js +12 -0
  25. package/dist/cjs/Sprinkle/actions/index.js.map +1 -1
  26. package/dist/cjs/Sprinkle/actions/mcp-adapter.js +146 -4
  27. package/dist/cjs/Sprinkle/actions/mcp-adapter.js.map +1 -1
  28. package/dist/cjs/Sprinkle/index.js +282 -6
  29. package/dist/cjs/Sprinkle/index.js.map +1 -1
  30. package/dist/cjs/Sprinkle/schemas.js +17 -1
  31. package/dist/cjs/Sprinkle/schemas.js.map +1 -1
  32. package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js +4 -4
  33. package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js.map +1 -1
  34. package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js +25 -3
  35. package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js.map +1 -1
  36. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +15 -1
  37. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
  38. package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js +7 -9
  39. package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -1
  40. package/dist/esm/Sprinkle/__tests__/native-script.test.js +388 -0
  41. package/dist/esm/Sprinkle/__tests__/native-script.test.js.map +1 -0
  42. package/dist/esm/Sprinkle/__tests__/utility-actions.test.js +365 -0
  43. package/dist/esm/Sprinkle/__tests__/utility-actions.test.js.map +1 -0
  44. package/dist/esm/Sprinkle/actions/builtin/addressbook-actions.js +159 -0
  45. package/dist/esm/Sprinkle/actions/builtin/addressbook-actions.js.map +1 -0
  46. package/dist/esm/Sprinkle/actions/builtin/index.js +8 -3
  47. package/dist/esm/Sprinkle/actions/builtin/index.js.map +1 -1
  48. package/dist/esm/Sprinkle/actions/builtin/native-script.js +133 -0
  49. package/dist/esm/Sprinkle/actions/builtin/native-script.js.map +1 -0
  50. package/dist/esm/Sprinkle/actions/builtin/utility-actions.js +213 -0
  51. package/dist/esm/Sprinkle/actions/builtin/utility-actions.js.map +1 -0
  52. package/dist/esm/Sprinkle/actions/cli-adapter.js +20 -2
  53. package/dist/esm/Sprinkle/actions/cli-adapter.js.map +1 -1
  54. package/dist/esm/Sprinkle/actions/index.js +1 -1
  55. package/dist/esm/Sprinkle/actions/index.js.map +1 -1
  56. package/dist/esm/Sprinkle/actions/mcp-adapter.js +145 -5
  57. package/dist/esm/Sprinkle/actions/mcp-adapter.js.map +1 -1
  58. package/dist/esm/Sprinkle/index.js +260 -9
  59. package/dist/esm/Sprinkle/index.js.map +1 -1
  60. package/dist/esm/Sprinkle/schemas.js +16 -0
  61. package/dist/esm/Sprinkle/schemas.js.map +1 -1
  62. package/dist/types/Sprinkle/actions/builtin/addressbook-actions.d.ts +50 -0
  63. package/dist/types/Sprinkle/actions/builtin/addressbook-actions.d.ts.map +1 -0
  64. package/dist/types/Sprinkle/actions/builtin/index.d.ts +6 -2
  65. package/dist/types/Sprinkle/actions/builtin/index.d.ts.map +1 -1
  66. package/dist/types/Sprinkle/actions/builtin/native-script.d.ts +27 -0
  67. package/dist/types/Sprinkle/actions/builtin/native-script.d.ts.map +1 -0
  68. package/dist/types/Sprinkle/actions/builtin/utility-actions.d.ts +48 -0
  69. package/dist/types/Sprinkle/actions/builtin/utility-actions.d.ts.map +1 -0
  70. package/dist/types/Sprinkle/actions/cli-adapter.d.ts.map +1 -1
  71. package/dist/types/Sprinkle/actions/index.d.ts +2 -1
  72. package/dist/types/Sprinkle/actions/index.d.ts.map +1 -1
  73. package/dist/types/Sprinkle/actions/mcp-adapter.d.ts +24 -0
  74. package/dist/types/Sprinkle/actions/mcp-adapter.d.ts.map +1 -1
  75. package/dist/types/Sprinkle/index.d.ts +5 -2
  76. package/dist/types/Sprinkle/index.d.ts.map +1 -1
  77. package/dist/types/Sprinkle/schemas.d.ts +72 -0
  78. package/dist/types/Sprinkle/schemas.d.ts.map +1 -1
  79. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  80. package/package.json +1 -1
  81. package/src/Sprinkle/__tests__/builtin-actions.test.ts +4 -4
  82. package/src/Sprinkle/__tests__/cli-adapter.test.ts +24 -3
  83. package/src/Sprinkle/__tests__/fill-in-struct.test.ts +23 -1
  84. package/src/Sprinkle/__tests__/mcp-adapter.test.ts +7 -5
  85. package/src/Sprinkle/__tests__/native-script.test.ts +341 -0
  86. package/src/Sprinkle/__tests__/utility-actions.test.ts +348 -0
  87. package/src/Sprinkle/actions/builtin/addressbook-actions.ts +168 -0
  88. package/src/Sprinkle/actions/builtin/index.ts +41 -2
  89. package/src/Sprinkle/actions/builtin/native-script.ts +165 -0
  90. package/src/Sprinkle/actions/builtin/utility-actions.ts +285 -0
  91. package/src/Sprinkle/actions/cli-adapter.ts +18 -2
  92. package/src/Sprinkle/actions/index.ts +2 -1
  93. package/src/Sprinkle/actions/mcp-adapter.ts +179 -4
  94. package/src/Sprinkle/index.ts +264 -3
  95. package/src/Sprinkle/schemas.ts +20 -0
@@ -9,6 +9,8 @@ var _exportNames = {
9
9
  NetworkSchema: true,
10
10
  MultisigScriptModule: true,
11
11
  MultisigScript: true,
12
+ NativeScriptInputSchema: true,
13
+ NativeScriptsParam: true,
12
14
  ProviderSettingsSchema: true,
13
15
  WalletSettingsSchema: true,
14
16
  isOptional: true,
@@ -52,7 +54,9 @@ var _exportNames = {
52
54
  createMcpServer: true,
53
55
  runMcp: true,
54
56
  getBuiltinActions: true,
55
- promptAndExecute: true
57
+ promptAndExecute: true,
58
+ toNativeScript: true,
59
+ completeWithScripts: true
56
60
  };
57
61
  Object.defineProperty(exports, "ActionError", {
58
62
  enumerable: true,
@@ -96,6 +100,18 @@ Object.defineProperty(exports, "MultisigScriptModule", {
96
100
  return _schemas.MultisigScriptModule;
97
101
  }
98
102
  });
103
+ Object.defineProperty(exports, "NativeScriptInputSchema", {
104
+ enumerable: true,
105
+ get: function () {
106
+ return _schemas.NativeScriptInputSchema;
107
+ }
108
+ });
109
+ Object.defineProperty(exports, "NativeScriptsParam", {
110
+ enumerable: true,
111
+ get: function () {
112
+ return _schemas.NativeScriptsParam;
113
+ }
114
+ });
99
115
  Object.defineProperty(exports, "NetworkSchema", {
100
116
  enumerable: true,
101
117
  get: function () {
@@ -139,6 +155,12 @@ Object.defineProperty(exports, "coerceValue", {
139
155
  return _index2.coerceValue;
140
156
  }
141
157
  });
158
+ Object.defineProperty(exports, "completeWithScripts", {
159
+ enumerable: true,
160
+ get: function () {
161
+ return _index2.completeWithScripts;
162
+ }
163
+ });
142
164
  Object.defineProperty(exports, "createMcpServer", {
143
165
  enumerable: true,
144
166
  get: function () {
@@ -331,6 +353,12 @@ Object.defineProperty(exports, "runMcp", {
331
353
  return _index2.runMcp;
332
354
  }
333
355
  });
356
+ Object.defineProperty(exports, "toNativeScript", {
357
+ enumerable: true,
358
+ get: function () {
359
+ return _index2.toNativeScript;
360
+ }
361
+ });
334
362
  Object.defineProperty(exports, "typeboxToJsonSchema", {
335
363
  enumerable: true,
336
364
  get: function () {
@@ -371,6 +399,7 @@ var _txDialog = require("./tx-dialog.js");
371
399
  var _index = require("./menus/index.js");
372
400
  var _formatting = require("./utils/formatting.js");
373
401
  var _index2 = require("./actions/index.js");
402
+ var _utilityActions = require("./actions/builtin/utility-actions.js");
374
403
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
375
404
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
376
405
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
@@ -390,6 +419,7 @@ class Sprinkle {
390
419
  _defineProperty(this, "settings", {});
391
420
  _defineProperty(this, "type", void 0);
392
421
  _defineProperty(this, "defaults", {});
422
+ _defineProperty(this, "addressbook", {});
393
423
  _defineProperty(this, "options", void 0);
394
424
  _defineProperty(this, "profileId", "");
395
425
  _defineProperty(this, "profileMeta", {
@@ -472,6 +502,7 @@ class Sprinkle {
472
502
  this.profileMeta = parsed.meta;
473
503
  this.settings = await this.decryptSettings(parsed.settings);
474
504
  this.defaults = parsed.defaults ?? {};
505
+ this.addressbook = parsed.addressbook ?? {};
475
506
  // Update active profile pointer
476
507
  fs.writeFileSync(Sprinkle.activeProfilePath(this.storagePath), id, "utf-8");
477
508
  }
@@ -491,7 +522,8 @@ class Sprinkle {
491
522
  const jsonContent = JSON.stringify({
492
523
  meta: this.profileMeta,
493
524
  settings: settingsToSave,
494
- defaults: this.defaults
525
+ defaults: this.defaults,
526
+ addressbook: this.addressbook
495
527
  }, _encryption.bigIntReplacer, 2);
496
528
  fs.writeFileSync(filePath, jsonContent, "utf-8");
497
529
  }
@@ -568,7 +600,8 @@ class Sprinkle {
568
600
  updatedAt: now
569
601
  },
570
602
  settings: parsed.settings,
571
- defaults: parsed.defaults ?? {}
603
+ defaults: parsed.defaults ?? {},
604
+ addressbook: parsed.addressbook ?? {}
572
605
  };
573
606
  fs.mkdirSync(profilesDir, {
574
607
  recursive: true
@@ -643,7 +676,8 @@ class Sprinkle {
643
676
  updatedAt: now
644
677
  },
645
678
  settings: settingsToSave,
646
- defaults: this.defaults
679
+ defaults: this.defaults,
680
+ addressbook: this.addressbook
647
681
  }, _encryption.bigIntReplacer, 2);
648
682
  fs.writeFileSync(path.join(profilesDir, `${id}.json`), jsonContent, "utf-8");
649
683
  console.log(`Profile "${name}" created as a copy.`);
@@ -737,6 +771,10 @@ class Sprinkle {
737
771
  value: -1
738
772
  });
739
773
  } else {
774
+ choices.push({
775
+ name: "Utilities",
776
+ value: -6
777
+ });
740
778
  choices.push({
741
779
  name: "Settings & Profiles",
742
780
  value: -5
@@ -760,6 +798,58 @@ class Sprinkle {
760
798
  return;
761
799
  }
762
800
  const selection = selectionResult;
801
+ if (selection === -6) {
802
+ const utilitiesMenu = {
803
+ title: "Utilities",
804
+ items: [{
805
+ title: "Mint Token",
806
+ action: async () => {
807
+ const result = await (0, _index2.promptAndExecute)(this, _utilityActions.mintToken);
808
+ if (!result.success) {
809
+ if (result.error.code === "USER_CANCELLED") return;
810
+ console.error(`\nError (${result.error.code}): ${result.error.message}\n`);
811
+ return;
812
+ }
813
+ const data = result.data;
814
+ console.log(`\nPolicy: ${data.policyId}\nToken: ${data.tokenName}\nAmount: ${data.amount}\n`);
815
+ const blaze = await Sprinkle.GetBlaze(this.settings.network, this.settings.provider, this.settings.wallet);
816
+ const tx = _sdk.Core.Transaction.fromCbor(_sdk.Core.TxCBOR(data.txCbor));
817
+ await this.TxDialog(blaze, tx);
818
+ }
819
+ }, {
820
+ title: "Simple Send",
821
+ action: async () => {
822
+ const result = await (0, _index2.promptAndExecute)(this, _utilityActions.simpleSend);
823
+ if (!result.success) {
824
+ if (result.error.code === "USER_CANCELLED") return;
825
+ console.error(`\nError (${result.error.code}): ${result.error.message}\n`);
826
+ return;
827
+ }
828
+ const data = result.data;
829
+ const blaze = await Sprinkle.GetBlaze(this.settings.network, this.settings.provider, this.settings.wallet);
830
+ const tx = _sdk.Core.Transaction.fromCbor(_sdk.Core.TxCBOR(data.txCbor));
831
+ await this.TxDialog(blaze, tx);
832
+ }
833
+ }, {
834
+ title: "Register Stake Script",
835
+ action: async () => {
836
+ const result = await (0, _index2.promptAndExecute)(this, _utilityActions.registerStakeScript);
837
+ if (!result.success) {
838
+ if (result.error.code === "USER_CANCELLED") return;
839
+ console.error(`\nError (${result.error.code}): ${result.error.message}\n`);
840
+ return;
841
+ }
842
+ const data = result.data;
843
+ const blaze = await Sprinkle.GetBlaze(this.settings.network, this.settings.provider, this.settings.wallet);
844
+ const tx = _sdk.Core.Transaction.fromCbor(_sdk.Core.TxCBOR(data.txCbor));
845
+ await this.TxDialog(blaze, tx);
846
+ }
847
+ }]
848
+ };
849
+ await this._showMenu(utilitiesMenu, false, [...path, "Utilities"], true);
850
+ await this._showMenu(menu, main, path, true);
851
+ return;
852
+ }
763
853
  if (selection === -5) {
764
854
  const settingsMenu = {
765
855
  title: "Settings & Profiles",
@@ -826,6 +916,113 @@ class Sprinkle {
826
916
  action: async () => {
827
917
  await this.deleteProfile();
828
918
  }
919
+ }, {
920
+ title: "Addressbook",
921
+ items: [{
922
+ title: "View entries",
923
+ action: async () => {
924
+ const entries = Object.entries(this.addressbook);
925
+ if (entries.length === 0) {
926
+ console.log("Addressbook is empty.");
927
+ } else {
928
+ for (const [name, ms] of entries) {
929
+ const json = JSON.stringify(ms, _encryption.bigIntReplacer, 2);
930
+ let hashStr = "unknown";
931
+ try {
932
+ hashStr = (0, _index2.toNativeScript)(ms).hash();
933
+ } catch {/* skip */}
934
+ console.log(_yoctocolorsCjs.default.bold(name) + " " + _yoctocolorsCjs.default.dim(hashStr));
935
+ console.log(json);
936
+ console.log();
937
+ }
938
+ }
939
+ await (0, _prompts.selectWithClear)({
940
+ message: "Press Enter to continue...",
941
+ choices: [{
942
+ name: "Continue",
943
+ value: "continue"
944
+ }]
945
+ });
946
+ }
947
+ }, {
948
+ title: "Add entry",
949
+ action: async () => {
950
+ const name = await (0, _prompts.inputCancellable)({
951
+ message: "Entry name:",
952
+ validate: v => v.trim().length > 0 ? true : "Name cannot be empty"
953
+ });
954
+ if (name === null) return;
955
+ if (this.addressbook[name]) {
956
+ const overwrite = await (0, _prompts.confirmCancellable)({
957
+ message: `Entry "${name}" already exists. Overwrite?`,
958
+ default: false
959
+ });
960
+ if (!overwrite) return;
961
+ }
962
+ try {
963
+ const script = await this.FillInStruct(_schemas.MultisigScript);
964
+ this.addressbook[name] = script;
965
+ this.saveSettings();
966
+ console.log(`Added "${name}" to addressbook.`);
967
+ } catch (e) {
968
+ if (e instanceof _types.UserCancelledError) return;
969
+ throw e;
970
+ }
971
+ }
972
+ }, {
973
+ title: "Edit entry",
974
+ action: async () => {
975
+ const entries = Object.keys(this.addressbook);
976
+ if (entries.length === 0) {
977
+ console.log("Addressbook is empty.");
978
+ return;
979
+ }
980
+ const selected = await (0, _prompts.selectCancellable)({
981
+ message: "Select entry to edit:",
982
+ choices: entries.map(n => ({
983
+ name: n,
984
+ value: n
985
+ }))
986
+ });
987
+ if (selected === null) return;
988
+ const editName = selected;
989
+ try {
990
+ const updated = await this.EditStruct(_schemas.MultisigScript, this.addressbook[editName]);
991
+ this.addressbook[editName] = updated;
992
+ this.saveSettings();
993
+ console.log(`Updated "${editName}".`);
994
+ } catch (e) {
995
+ if (e instanceof _types.UserCancelledError) return;
996
+ throw e;
997
+ }
998
+ }
999
+ }, {
1000
+ title: "Delete entry",
1001
+ action: async () => {
1002
+ const entries = Object.keys(this.addressbook);
1003
+ if (entries.length === 0) {
1004
+ console.log("Addressbook is empty.");
1005
+ return;
1006
+ }
1007
+ const delSelected = await (0, _prompts.selectCancellable)({
1008
+ message: "Select entry to delete:",
1009
+ choices: entries.map(n => ({
1010
+ name: n,
1011
+ value: n
1012
+ }))
1013
+ });
1014
+ if (delSelected === null) return;
1015
+ const delName = delSelected;
1016
+ const confirmed = await (0, _prompts.confirmCancellable)({
1017
+ message: `Delete "${delName}"?`,
1018
+ default: false
1019
+ });
1020
+ if (!confirmed) return;
1021
+ delete this.addressbook[delName];
1022
+ this.saveSettings();
1023
+ console.log(`Deleted "${delName}".`);
1024
+ }
1025
+ }]
829
1026
  }]
830
1027
  };
831
1028
  await this._showMenu(settingsMenu, false, [...path, "Settings & Profiles"], true);
@@ -964,7 +1161,8 @@ class Sprinkle {
964
1161
  const profileData = {
965
1162
  meta,
966
1163
  settings: initialSettings ?? {},
967
- defaults: {}
1164
+ defaults: {},
1165
+ addressbook: {}
968
1166
  };
969
1167
  fs.writeFileSync(path.join(profilesDir, `${id}.json`), JSON.stringify(profileData, _encryption.bigIntReplacer, 2), "utf-8");
970
1168
  return {
@@ -1309,7 +1507,67 @@ class Sprinkle {
1309
1507
  if (!resolvedType) {
1310
1508
  throw new Error(`Could not resolve type ${type["$ref"]} at ${path.join(".")}`);
1311
1509
  }
1312
- return this._fillInStruct(resolvedType, path, defs, def);
1510
+
1511
+ // Addressbook integration for MultisigScript fields
1512
+ if (type["$ref"] === "MultisigScript" && Object.keys(this.addressbook).length > 0) {
1513
+ const sourceChoice = await (0, _prompts.selectWithClear)({
1514
+ message: "Select source for native script:",
1515
+ choices: [{
1516
+ name: "Enter manually",
1517
+ value: "manual"
1518
+ }, {
1519
+ name: "Select from addressbook",
1520
+ value: "addressbook"
1521
+ }]
1522
+ });
1523
+ if (sourceChoice === null) throw new _types.UserCancelledError();
1524
+ if (sourceChoice === "addressbook") {
1525
+ const entries = Object.entries(this.addressbook);
1526
+ const abChoices = entries.map(([name, ms]) => {
1527
+ let hashStr = "";
1528
+ try {
1529
+ hashStr = " " + _yoctocolorsCjs.default.dim((0, _index2.toNativeScript)(ms).hash());
1530
+ } catch {/* skip */}
1531
+ return {
1532
+ name: name + hashStr,
1533
+ value: name
1534
+ };
1535
+ });
1536
+ const selected = await (0, _prompts.selectWithClear)({
1537
+ message: "Select addressbook entry:",
1538
+ choices: abChoices
1539
+ });
1540
+ if (selected === null) throw new _types.UserCancelledError();
1541
+ return this.addressbook[selected];
1542
+ }
1543
+ }
1544
+ const result = await this._fillInStruct(resolvedType, path, defs, def);
1545
+
1546
+ // Offer to save manually entered MultisigScript to addressbook
1547
+ if (type["$ref"] === "MultisigScript" && result !== undefined) {
1548
+ const shouldSave = await (0, _prompts.selectWithClear)({
1549
+ message: "Save this script to the addressbook?",
1550
+ choices: [{
1551
+ name: "No",
1552
+ value: false
1553
+ }, {
1554
+ name: "Yes",
1555
+ value: true
1556
+ }]
1557
+ });
1558
+ if (shouldSave) {
1559
+ const entryName = await (0, _prompts.inputCancellable)({
1560
+ message: "Addressbook entry name:",
1561
+ validate: v => v.trim().length > 0 ? true : "Name cannot be empty"
1562
+ });
1563
+ if (entryName !== null) {
1564
+ this.addressbook[entryName] = result;
1565
+ this.saveSettings();
1566
+ console.log(`Saved "${entryName}" to addressbook.`);
1567
+ }
1568
+ }
1569
+ }
1570
+ return result;
1313
1571
  }
1314
1572
  if ((0, _typeGuards.isOptional)(type)) {
1315
1573
  const pathDisplay = (0, _formatting.formatPath)(path) || "value";
@@ -1454,6 +1712,24 @@ class Sprinkle {
1454
1712
  }
1455
1713
  return BigInt(answer);
1456
1714
  }
1715
+ if ((0, _typeGuards.isBoolean)(type)) {
1716
+ const pathDisplay = (0, _formatting.formatPath)(path) || "value";
1717
+ const answer = await (0, _prompts.selectWithClear)({
1718
+ message: Sprinkle.ExtractMessage(type, `${pathDisplay}?`),
1719
+ choices: [{
1720
+ name: "Yes",
1721
+ value: true
1722
+ }, {
1723
+ name: "No",
1724
+ value: false
1725
+ }],
1726
+ default: def !== undefined ? def : (0, _typeGuards.hasDefault)(type) ? (0, _typeGuards.getDefault)(type) : undefined
1727
+ });
1728
+ if (answer === null) {
1729
+ throw new _types.UserCancelledError();
1730
+ }
1731
+ return answer;
1732
+ }
1457
1733
  if ((0, _typeGuards.isLiteral)(type)) {
1458
1734
  return type.const;
1459
1735
  }