mepcli 1.3.2 → 2.0.0-beta.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 (291) hide show
  1. package/README.md +11 -2
  2. package/dist/{ansi.js → src/ansi.js} +17 -9
  3. package/dist/src/ansi.js.map +1 -0
  4. package/dist/{base.js → src/base.js} +82 -70
  5. package/dist/src/base.js.map +1 -0
  6. package/dist/{core.js → src/core.js} +266 -320
  7. package/dist/src/core.js.map +1 -0
  8. package/dist/src/data/countries.js +569 -0
  9. package/dist/src/data/countries.js.map +1 -0
  10. package/dist/src/data/licenses.js +480 -0
  11. package/dist/src/data/licenses.js.map +1 -0
  12. package/dist/{highlight.js → src/highlight.js} +77 -69
  13. package/dist/src/highlight.js.map +1 -0
  14. package/dist/src/index.js +66 -0
  15. package/dist/src/index.js.map +1 -0
  16. package/dist/{input.js → src/input.js} +47 -41
  17. package/dist/src/input.js.map +1 -0
  18. package/dist/src/pipeline.js +273 -0
  19. package/dist/src/pipeline.js.map +1 -0
  20. package/dist/{prompts → src/prompts}/autocomplete.js +58 -57
  21. package/dist/src/prompts/autocomplete.js.map +1 -0
  22. package/dist/{prompts → src/prompts}/box.js +86 -53
  23. package/dist/src/prompts/box.js.map +1 -0
  24. package/dist/{prompts → src/prompts}/breadcrumb-search.js +110 -98
  25. package/dist/src/prompts/breadcrumb-search.js.map +1 -0
  26. package/dist/{prompts → src/prompts}/breadcrumb.js +126 -121
  27. package/dist/src/prompts/breadcrumb.js.map +1 -0
  28. package/dist/{prompts → src/prompts}/byte.js +69 -52
  29. package/dist/src/prompts/byte.js.map +1 -0
  30. package/dist/{prompts → src/prompts}/calculator.js +79 -56
  31. package/dist/src/prompts/calculator.js.map +1 -0
  32. package/dist/{prompts → src/prompts}/calendar.js +167 -127
  33. package/dist/src/prompts/calendar.js.map +1 -0
  34. package/dist/{prompts → src/prompts}/checkbox.js +53 -49
  35. package/dist/src/prompts/checkbox.js.map +1 -0
  36. package/dist/{prompts → src/prompts}/code.js +88 -76
  37. package/dist/src/prompts/code.js.map +1 -0
  38. package/dist/{prompts → src/prompts}/color.js +68 -50
  39. package/dist/src/prompts/color.js.map +1 -0
  40. package/dist/{prompts → src/prompts}/confirm.js +22 -15
  41. package/dist/src/prompts/confirm.js.map +1 -0
  42. package/dist/{prompts → src/prompts}/connection-string.js +59 -36
  43. package/dist/src/prompts/connection-string.js.map +1 -0
  44. package/dist/{prompts → src/prompts}/cron.js +90 -59
  45. package/dist/src/prompts/cron.js.map +1 -0
  46. package/dist/src/prompts/curl-utils.js +71 -0
  47. package/dist/src/prompts/curl-utils.js.map +1 -0
  48. package/dist/{prompts → src/prompts}/curl.js +153 -132
  49. package/dist/src/prompts/curl.js.map +1 -0
  50. package/dist/{prompts → src/prompts}/data-inspector.js +96 -91
  51. package/dist/src/prompts/data-inspector.js.map +1 -0
  52. package/dist/{prompts → src/prompts}/date.js +64 -57
  53. package/dist/src/prompts/date.js.map +1 -0
  54. package/dist/{prompts → src/prompts}/dependency.js +84 -80
  55. package/dist/src/prompts/dependency.js.map +1 -0
  56. package/dist/{prompts → src/prompts}/dial.js +49 -35
  57. package/dist/src/prompts/dial.js.map +1 -0
  58. package/dist/src/prompts/diff.js +118 -0
  59. package/dist/src/prompts/diff.js.map +1 -0
  60. package/dist/{prompts → src/prompts}/draw.js +83 -80
  61. package/dist/src/prompts/draw.js.map +1 -0
  62. package/dist/src/prompts/editor.js +234 -0
  63. package/dist/src/prompts/editor.js.map +1 -0
  64. package/dist/{prompts → src/prompts}/emoji.js +80 -82
  65. package/dist/src/prompts/emoji.js.map +1 -0
  66. package/dist/{prompts → src/prompts}/exec.js +60 -46
  67. package/dist/src/prompts/exec.js.map +1 -0
  68. package/dist/src/prompts/file.js +217 -0
  69. package/dist/src/prompts/file.js.map +1 -0
  70. package/dist/{prompts → src/prompts}/form.js +63 -54
  71. package/dist/src/prompts/form.js.map +1 -0
  72. package/dist/{prompts → src/prompts}/fuzzy-multi-column.js +65 -53
  73. package/dist/src/prompts/fuzzy-multi-column.js.map +1 -0
  74. package/dist/{prompts → src/prompts}/fuzzy.js +66 -55
  75. package/dist/src/prompts/fuzzy.js.map +1 -0
  76. package/dist/src/prompts/gauge.js +137 -0
  77. package/dist/src/prompts/gauge.js.map +1 -0
  78. package/dist/{prompts → src/prompts}/grid.js +70 -57
  79. package/dist/src/prompts/grid.js.map +1 -0
  80. package/dist/{prompts → src/prompts}/heatmap.js +70 -64
  81. package/dist/src/prompts/heatmap.js.map +1 -0
  82. package/dist/{prompts → src/prompts}/ip.js +56 -36
  83. package/dist/src/prompts/ip.js.map +1 -0
  84. package/dist/{prompts → src/prompts}/kanban.js +63 -58
  85. package/dist/src/prompts/kanban.js.map +1 -0
  86. package/dist/src/prompts/keypress.js +54 -0
  87. package/dist/src/prompts/keypress.js.map +1 -0
  88. package/dist/src/prompts/license.js +144 -0
  89. package/dist/src/prompts/license.js.map +1 -0
  90. package/dist/{prompts → src/prompts}/list.js +46 -31
  91. package/dist/src/prompts/list.js.map +1 -0
  92. package/dist/{prompts → src/prompts}/map.js +93 -77
  93. package/dist/src/prompts/map.js.map +1 -0
  94. package/dist/{prompts → src/prompts}/match.js +91 -95
  95. package/dist/src/prompts/match.js.map +1 -0
  96. package/dist/{prompts → src/prompts}/miller.js +74 -67
  97. package/dist/src/prompts/miller.js.map +1 -0
  98. package/dist/{prompts → src/prompts}/multi-column-select.js +54 -44
  99. package/dist/src/prompts/multi-column-select.js.map +1 -0
  100. package/dist/{prompts → src/prompts}/multi-range.js +70 -52
  101. package/dist/src/prompts/multi-range.js.map +1 -0
  102. package/dist/{prompts → src/prompts}/multi-select.js +67 -58
  103. package/dist/src/prompts/multi-select.js.map +1 -0
  104. package/dist/{prompts → src/prompts}/number.js +51 -39
  105. package/dist/src/prompts/number.js.map +1 -0
  106. package/dist/{prompts → src/prompts}/otp.js +43 -27
  107. package/dist/src/prompts/otp.js.map +1 -0
  108. package/dist/{prompts → src/prompts}/pattern.js +74 -71
  109. package/dist/src/prompts/pattern.js.map +1 -0
  110. package/dist/{prompts → src/prompts}/phone.js +107 -118
  111. package/dist/src/prompts/phone.js.map +1 -0
  112. package/dist/src/prompts/quiz-select.js +114 -0
  113. package/dist/src/prompts/quiz-select.js.map +1 -0
  114. package/dist/src/prompts/quiz-text.js +98 -0
  115. package/dist/src/prompts/quiz-text.js.map +1 -0
  116. package/dist/{prompts → src/prompts}/range.js +85 -61
  117. package/dist/src/prompts/range.js.map +1 -0
  118. package/dist/{prompts → src/prompts}/rating.js +29 -24
  119. package/dist/src/prompts/rating.js.map +1 -0
  120. package/dist/{prompts → src/prompts}/regex.js +50 -36
  121. package/dist/src/prompts/regex.js.map +1 -0
  122. package/dist/{prompts → src/prompts}/region.js +62 -56
  123. package/dist/src/prompts/region.js.map +1 -0
  124. package/dist/{prompts → src/prompts}/schedule.js +82 -75
  125. package/dist/src/prompts/schedule.js.map +1 -0
  126. package/dist/{prompts → src/prompts}/scroll.js +61 -58
  127. package/dist/src/prompts/scroll.js.map +1 -0
  128. package/dist/src/prompts/seat.js +164 -0
  129. package/dist/src/prompts/seat.js.map +1 -0
  130. package/dist/{prompts → src/prompts}/select-range.js +58 -46
  131. package/dist/src/prompts/select-range.js.map +1 -0
  132. package/dist/{prompts → src/prompts}/select.js +65 -66
  133. package/dist/src/prompts/select.js.map +1 -0
  134. package/dist/{prompts → src/prompts}/semver.js +24 -13
  135. package/dist/src/prompts/semver.js.map +1 -0
  136. package/dist/src/prompts/shortcut.js +133 -0
  137. package/dist/src/prompts/shortcut.js.map +1 -0
  138. package/dist/{prompts → src/prompts}/slider.js +28 -23
  139. package/dist/src/prompts/slider.js.map +1 -0
  140. package/dist/src/prompts/slot.js +117 -0
  141. package/dist/src/prompts/slot.js.map +1 -0
  142. package/dist/{prompts → src/prompts}/snippet.js +82 -61
  143. package/dist/src/prompts/snippet.js.map +1 -0
  144. package/dist/{prompts → src/prompts}/sort-grid.js +64 -59
  145. package/dist/src/prompts/sort-grid.js.map +1 -0
  146. package/dist/{prompts → src/prompts}/sort.js +59 -49
  147. package/dist/src/prompts/sort.js.map +1 -0
  148. package/dist/src/prompts/spam.js +80 -0
  149. package/dist/src/prompts/spam.js.map +1 -0
  150. package/dist/{prompts → src/prompts}/spreadsheet.js +71 -70
  151. package/dist/src/prompts/spreadsheet.js.map +1 -0
  152. package/dist/{prompts → src/prompts}/table.js +52 -38
  153. package/dist/src/prompts/table.js.map +1 -0
  154. package/dist/{prompts → src/prompts}/text.js +74 -70
  155. package/dist/src/prompts/text.js.map +1 -0
  156. package/dist/{prompts → src/prompts}/time.js +105 -96
  157. package/dist/src/prompts/time.js.map +1 -0
  158. package/dist/src/prompts/toggle.js +53 -0
  159. package/dist/src/prompts/toggle.js.map +1 -0
  160. package/dist/{prompts → src/prompts}/transfer.js +71 -67
  161. package/dist/src/prompts/transfer.js.map +1 -0
  162. package/dist/{prompts → src/prompts}/tree-select.js +83 -86
  163. package/dist/src/prompts/tree-select.js.map +1 -0
  164. package/dist/{prompts → src/prompts}/tree.js +69 -67
  165. package/dist/src/prompts/tree.js.map +1 -0
  166. package/dist/src/prompts/wait.js +79 -0
  167. package/dist/src/prompts/wait.js.map +1 -0
  168. package/dist/src/spinner.js +105 -0
  169. package/dist/src/spinner.js.map +1 -0
  170. package/dist/{symbols.js → src/symbols.js} +32 -7
  171. package/dist/src/symbols.js.map +1 -0
  172. package/dist/{tasks.js → src/tasks.js} +104 -79
  173. package/dist/src/tasks.js.map +1 -0
  174. package/dist/src/theme.js +29 -0
  175. package/dist/src/theme.js.map +1 -0
  176. package/dist/src/types.js +8 -0
  177. package/dist/src/types.js.map +1 -0
  178. package/dist/{utils.js → src/utils.js} +196 -152
  179. package/dist/src/utils.js.map +1 -0
  180. package/package.json +16 -13
  181. package/dist/ansi.d.ts +0 -36
  182. package/dist/base.d.ts +0 -60
  183. package/dist/core.d.ts +0 -1072
  184. package/dist/data/countries.d.ts +0 -2
  185. package/dist/data/countries.js +0 -105
  186. package/dist/data/licenses.d.ts +0 -2
  187. package/dist/data/licenses.js +0 -109
  188. package/dist/highlight.d.ts +0 -7
  189. package/dist/index.d.ts +0 -48
  190. package/dist/index.js +0 -64
  191. package/dist/input.d.ts +0 -14
  192. package/dist/pipeline.d.ts +0 -39
  193. package/dist/pipeline.js +0 -54
  194. package/dist/prompts/autocomplete.d.ts +0 -22
  195. package/dist/prompts/box.d.ts +0 -21
  196. package/dist/prompts/breadcrumb-search.d.ts +0 -14
  197. package/dist/prompts/breadcrumb.d.ts +0 -32
  198. package/dist/prompts/byte.d.ts +0 -13
  199. package/dist/prompts/calculator.d.ts +0 -17
  200. package/dist/prompts/calendar.d.ts +0 -33
  201. package/dist/prompts/checkbox.d.ts +0 -13
  202. package/dist/prompts/code.d.ts +0 -19
  203. package/dist/prompts/color.d.ts +0 -14
  204. package/dist/prompts/confirm.d.ts +0 -8
  205. package/dist/prompts/connection-string.d.ts +0 -18
  206. package/dist/prompts/cron.d.ts +0 -13
  207. package/dist/prompts/curl-utils.d.ts +0 -25
  208. package/dist/prompts/curl-utils.js +0 -41
  209. package/dist/prompts/curl.d.ts +0 -41
  210. package/dist/prompts/data-inspector.d.ts +0 -22
  211. package/dist/prompts/date.d.ts +0 -12
  212. package/dist/prompts/dependency.d.ts +0 -16
  213. package/dist/prompts/dial.d.ts +0 -10
  214. package/dist/prompts/diff.d.ts +0 -10
  215. package/dist/prompts/diff.js +0 -101
  216. package/dist/prompts/draw.d.ts +0 -20
  217. package/dist/prompts/editor.d.ts +0 -14
  218. package/dist/prompts/editor.js +0 -203
  219. package/dist/prompts/emoji.d.ts +0 -18
  220. package/dist/prompts/exec.d.ts +0 -17
  221. package/dist/prompts/file.d.ts +0 -21
  222. package/dist/prompts/file.js +0 -210
  223. package/dist/prompts/form.d.ts +0 -18
  224. package/dist/prompts/fuzzy-multi-column.d.ts +0 -12
  225. package/dist/prompts/fuzzy.d.ts +0 -12
  226. package/dist/prompts/gauge.d.ts +0 -21
  227. package/dist/prompts/gauge.js +0 -130
  228. package/dist/prompts/grid.d.ts +0 -14
  229. package/dist/prompts/heatmap.d.ts +0 -13
  230. package/dist/prompts/ip.d.ts +0 -11
  231. package/dist/prompts/kanban.d.ts +0 -17
  232. package/dist/prompts/keypress.d.ts +0 -7
  233. package/dist/prompts/keypress.js +0 -55
  234. package/dist/prompts/license.d.ts +0 -9
  235. package/dist/prompts/license.js +0 -105
  236. package/dist/prompts/list.d.ts +0 -9
  237. package/dist/prompts/map.d.ts +0 -17
  238. package/dist/prompts/match.d.ts +0 -19
  239. package/dist/prompts/miller.d.ts +0 -15
  240. package/dist/prompts/multi-column-select.d.ts +0 -10
  241. package/dist/prompts/multi-range.d.ts +0 -9
  242. package/dist/prompts/multi-select.d.ts +0 -15
  243. package/dist/prompts/number.d.ts +0 -11
  244. package/dist/prompts/otp.d.ts +0 -10
  245. package/dist/prompts/pattern.d.ts +0 -22
  246. package/dist/prompts/phone.d.ts +0 -41
  247. package/dist/prompts/quiz-select.d.ts +0 -10
  248. package/dist/prompts/quiz-select.js +0 -104
  249. package/dist/prompts/quiz-text.d.ts +0 -11
  250. package/dist/prompts/quiz-text.js +0 -82
  251. package/dist/prompts/range.d.ts +0 -9
  252. package/dist/prompts/rating.d.ts +0 -8
  253. package/dist/prompts/regex.d.ts +0 -13
  254. package/dist/prompts/region.d.ts +0 -11
  255. package/dist/prompts/schedule.d.ts +0 -20
  256. package/dist/prompts/scroll.d.ts +0 -13
  257. package/dist/prompts/seat.d.ts +0 -17
  258. package/dist/prompts/seat.js +0 -165
  259. package/dist/prompts/select-range.d.ts +0 -8
  260. package/dist/prompts/select.d.ts +0 -15
  261. package/dist/prompts/semver.d.ts +0 -6
  262. package/dist/prompts/shortcut.d.ts +0 -9
  263. package/dist/prompts/shortcut.js +0 -135
  264. package/dist/prompts/slider.d.ts +0 -8
  265. package/dist/prompts/slot.d.ts +0 -16
  266. package/dist/prompts/slot.js +0 -107
  267. package/dist/prompts/snippet.d.ts +0 -19
  268. package/dist/prompts/sort-grid.d.ts +0 -16
  269. package/dist/prompts/sort.d.ts +0 -14
  270. package/dist/prompts/spam.d.ts +0 -17
  271. package/dist/prompts/spam.js +0 -62
  272. package/dist/prompts/spreadsheet.d.ts +0 -21
  273. package/dist/prompts/table.d.ts +0 -14
  274. package/dist/prompts/text.d.ts +0 -17
  275. package/dist/prompts/time.d.ts +0 -12
  276. package/dist/prompts/toggle.d.ts +0 -8
  277. package/dist/prompts/toggle.js +0 -47
  278. package/dist/prompts/transfer.d.ts +0 -18
  279. package/dist/prompts/tree-select.d.ts +0 -31
  280. package/dist/prompts/tree.d.ts +0 -20
  281. package/dist/prompts/wait.d.ts +0 -18
  282. package/dist/prompts/wait.js +0 -62
  283. package/dist/spinner.d.ts +0 -33
  284. package/dist/spinner.js +0 -89
  285. package/dist/symbols.d.ts +0 -33
  286. package/dist/tasks.d.ts +0 -57
  287. package/dist/theme.d.ts +0 -2
  288. package/dist/theme.js +0 -20
  289. package/dist/types.d.ts +0 -503
  290. package/dist/types.js +0 -5
  291. package/dist/utils.d.ts +0 -81
@@ -1,62 +1,48 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EmojiPrompt = void 0;
4
- const ansi_1 = require("../ansi");
5
- const base_1 = require("../base");
6
- const theme_1 = require("../theme");
7
- const utils_1 = require("../utils");
8
- class EmojiPrompt extends base_1.Prompt {
9
- constructor(options) {
10
- super(options);
11
- this.search = '';
12
- this.cursor = 0; // Index in the filtered list
13
- this.filtered = [];
14
- this.sortedEmojis = [];
15
- this.cols = 0;
16
- this.scrollTop = 0;
17
- this.pageSize = 8; // Number of rows to display
18
- // Sort emojis by recent
19
- this.sortedEmojis = [...options.emojis];
20
- if (options.recent && options.recent.length > 0) {
21
- const recentSet = new Set(options.recent);
22
- this.sortedEmojis.sort((a, b) => {
23
- const aRecent = recentSet.has(a.name);
24
- const bRecent = recentSet.has(b.name);
25
- if (aRecent && !bRecent)
26
- return -1;
27
- if (!aRecent && bRecent)
28
- return 1;
29
- return 0;
30
- });
31
- }
32
- this.checkWindowsAttention();
33
- // Initial filter
34
- this.filtered = this.sortedEmojis;
35
- // Calculate layout
36
- this.calculateLayout();
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "EmojiPrompt", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return EmojiPrompt;
37
9
  }
10
+ });
11
+ const _ansi = require("../ansi");
12
+ const _base = require("../base");
13
+ const _theme = require("../theme");
14
+ const _utils = require("../utils");
15
+ function _define_property(obj, key, value) {
16
+ if (key in obj) {
17
+ Object.defineProperty(obj, key, {
18
+ value: value,
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true
22
+ });
23
+ } else {
24
+ obj[key] = value;
25
+ }
26
+ return obj;
27
+ }
28
+ let EmojiPrompt = class EmojiPrompt extends _base.Prompt {
38
29
  calculateLayout() {
39
30
  if (this.options.cols) {
40
31
  this.cols = this.options.cols;
41
- }
42
- else {
32
+ } else {
43
33
  // Auto-detect based on terminal width
44
34
  // Assume each emoji cell takes ~4 chars (2 char emoji + 2 padding)
45
35
  const termWidth = process.stdout.columns || 80;
46
36
  this.cols = Math.floor((termWidth - 4) / 4); // -4 for margin
47
- if (this.cols < 1)
48
- this.cols = 1;
37
+ if (this.cols < 1) this.cols = 1;
49
38
  }
50
39
  }
51
40
  updateFilter() {
52
41
  if (!this.search) {
53
42
  this.filtered = this.sortedEmojis;
54
- }
55
- else {
43
+ } else {
56
44
  const lowerSearch = this.search.toLowerCase();
57
- this.filtered = this.sortedEmojis.filter(e => e.name.toLowerCase().includes(lowerSearch) ||
58
- (e.description && e.description.toLowerCase().includes(lowerSearch)) ||
59
- e.char === this.search // Allow searching by exact char
45
+ this.filtered = this.sortedEmojis.filter((e)=>e.name.toLowerCase().includes(lowerSearch) || e.description && e.description.toLowerCase().includes(lowerSearch) || e.char === this.search // Allow searching by exact char
60
46
  );
61
47
  }
62
48
  this.cursor = 0;
@@ -64,37 +50,35 @@ class EmojiPrompt extends base_1.Prompt {
64
50
  }
65
51
  render(_firstRender) {
66
52
  // Prepare header (Search bar)
67
- const icon = `${theme_1.theme.success}?`;
68
- const title = `${ansi_1.ANSI.BOLD}${theme_1.theme.title}${this.options.message}${ansi_1.ANSI.RESET}`;
69
- const searchDisplay = this.search ? `${theme_1.theme.main}${this.search}${ansi_1.ANSI.RESET}` : `${theme_1.theme.muted}Type to search...${ansi_1.ANSI.RESET}`;
53
+ const icon = `${_theme.theme.success}?`;
54
+ const title = `${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}`;
55
+ const searchDisplay = this.search ? `${_theme.theme.main}${this.search}${_ansi.ANSI.RESET}` : `${_theme.theme.muted}Type to search...${_ansi.ANSI.RESET}`;
70
56
  let output = `${icon} ${title} ${searchDisplay}\n`;
71
57
  // Render Grid
72
58
  if (this.filtered.length === 0) {
73
- output += `\n${theme_1.theme.error}No results found.${ansi_1.ANSI.RESET}\n`;
74
- }
75
- else {
59
+ output += `\n${_theme.theme.error}No results found.${_ansi.ANSI.RESET}\n`;
60
+ } else {
76
61
  const totalRows = Math.ceil(this.filtered.length / this.cols);
77
62
  const startRow = this.scrollTop;
78
63
  const endRow = Math.min(totalRows, startRow + this.pageSize);
79
- for (let r = startRow; r < endRow; r++) {
64
+ for(let r = startRow; r < endRow; r++){
80
65
  let rowStr = ' '; // Left margin
81
- for (let c = 0; c < this.cols; c++) {
66
+ for(let c = 0; c < this.cols; c++){
82
67
  const idx = r * this.cols + c;
83
- if (idx >= this.filtered.length)
84
- break;
68
+ if (idx >= this.filtered.length) break;
85
69
  const item = this.filtered[idx];
86
70
  const isSelected = idx === this.cursor;
87
71
  // Render Emoji
88
72
  // Align center in 4 chars
89
73
  // Emoji width is typically 2.
90
74
  const emoji = item.char;
91
- const width = (0, utils_1.stringWidth)(emoji);
75
+ const width = (0, _utils.stringWidth)(emoji);
92
76
  const padding = 4 - width;
93
77
  const leftPad = Math.floor(padding / 2);
94
78
  const rightPad = padding - leftPad;
95
79
  let cell = `${' '.repeat(leftPad)}${emoji}${' '.repeat(rightPad)}`;
96
80
  if (isSelected) {
97
- cell = `${ansi_1.ANSI.REVERSE}${cell}${ansi_1.ANSI.RESET}`;
81
+ cell = `${_ansi.ANSI.REVERSE}${cell}${_ansi.ANSI.RESET}`;
98
82
  }
99
83
  rowStr += cell;
100
84
  }
@@ -103,12 +87,11 @@ class EmojiPrompt extends base_1.Prompt {
103
87
  // Footer (Preview of selected)
104
88
  if (this.filtered.length > 0) {
105
89
  const selectedItem = this.filtered[this.cursor];
106
- output += `\n${ansi_1.ANSI.BOLD}${selectedItem.char} ${selectedItem.name}${ansi_1.ANSI.RESET}`;
90
+ output += `\n${_ansi.ANSI.BOLD}${selectedItem.char} ${selectedItem.name}${_ansi.ANSI.RESET}`;
107
91
  if (selectedItem.description) {
108
- output += ` - ${theme_1.theme.muted}${selectedItem.description}${ansi_1.ANSI.RESET}`;
92
+ output += ` - ${_theme.theme.muted}${selectedItem.description}${_ansi.ANSI.RESET}`;
109
93
  }
110
- }
111
- else {
94
+ } else {
112
95
  output += '\n'; // Spacer
113
96
  }
114
97
  }
@@ -119,8 +102,7 @@ class EmojiPrompt extends base_1.Prompt {
119
102
  handleInput(char) {
120
103
  // Navigation
121
104
  if (this.isUp(char)) {
122
- if (this.filtered.length === 0)
123
- return;
105
+ if (this.filtered.length === 0) return;
124
106
  const newCursor = this.cursor - this.cols;
125
107
  if (newCursor >= 0) {
126
108
  this.cursor = newCursor;
@@ -130,8 +112,7 @@ class EmojiPrompt extends base_1.Prompt {
130
112
  return;
131
113
  }
132
114
  if (this.isDown(char)) {
133
- if (this.filtered.length === 0)
134
- return;
115
+ if (this.filtered.length === 0) return;
135
116
  const newCursor = this.cursor + this.cols;
136
117
  if (newCursor < this.filtered.length) {
137
118
  this.cursor = newCursor;
@@ -141,12 +122,10 @@ class EmojiPrompt extends base_1.Prompt {
141
122
  return;
142
123
  }
143
124
  if (this.isLeft(char)) {
144
- if (this.filtered.length === 0)
145
- return;
125
+ if (this.filtered.length === 0) return;
146
126
  if (this.cursor > 0) {
147
127
  this.cursor--;
148
- }
149
- else {
128
+ } else {
150
129
  // Wrap to end?
151
130
  this.cursor = this.filtered.length - 1;
152
131
  }
@@ -155,12 +134,10 @@ class EmojiPrompt extends base_1.Prompt {
155
134
  return;
156
135
  }
157
136
  if (this.isRight(char)) {
158
- if (this.filtered.length === 0)
159
- return;
137
+ if (this.filtered.length === 0) return;
160
138
  if (this.cursor < this.filtered.length - 1) {
161
139
  this.cursor++;
162
- }
163
- else {
140
+ } else {
164
141
  // Wrap to start?
165
142
  this.cursor = 0;
166
143
  }
@@ -197,17 +174,14 @@ class EmojiPrompt extends base_1.Prompt {
197
174
  // Left / Previous
198
175
  if (this.cursor > 0) {
199
176
  this.cursor--;
200
- }
201
- else {
177
+ } else {
202
178
  this.cursor = this.filtered.length - 1;
203
179
  }
204
- }
205
- else {
180
+ } else {
206
181
  // Right / Next
207
182
  if (this.cursor < this.filtered.length - 1) {
208
183
  this.cursor++;
209
- }
210
- else {
184
+ } else {
211
185
  this.cursor = 0;
212
186
  }
213
187
  }
@@ -219,10 +193,34 @@ class EmojiPrompt extends base_1.Prompt {
219
193
  const cursorRow = Math.floor(this.cursor / this.cols);
220
194
  if (cursorRow < this.scrollTop) {
221
195
  this.scrollTop = cursorRow;
222
- }
223
- else if (cursorRow >= this.scrollTop + this.pageSize) {
196
+ } else if (cursorRow >= this.scrollTop + this.pageSize) {
224
197
  this.scrollTop = cursorRow - this.pageSize + 1;
225
198
  }
226
199
  }
227
- }
228
- exports.EmojiPrompt = EmojiPrompt;
200
+ constructor(options){
201
+ super(options), _define_property(this, "search", ''), _define_property(this, "cursor", 0) // Index in the filtered list
202
+ , _define_property(this, "filtered", []), _define_property(this, "sortedEmojis", []), _define_property(this, "cols", 0), _define_property(this, "scrollTop", 0), _define_property(this, "pageSize", 8) // Number of rows to display
203
+ ;
204
+ // Sort emojis by recent
205
+ this.sortedEmojis = [
206
+ ...options.emojis
207
+ ];
208
+ if (options.recent && options.recent.length > 0) {
209
+ const recentSet = new Set(options.recent);
210
+ this.sortedEmojis.sort((a, b)=>{
211
+ const aRecent = recentSet.has(a.name);
212
+ const bRecent = recentSet.has(b.name);
213
+ if (aRecent && !bRecent) return -1;
214
+ if (!aRecent && bRecent) return 1;
215
+ return 0;
216
+ });
217
+ }
218
+ this.checkWindowsAttention();
219
+ // Initial filter
220
+ this.filtered = this.sortedEmojis;
221
+ // Calculate layout
222
+ this.calculateLayout();
223
+ }
224
+ };
225
+
226
+ //# sourceMappingURL=emoji.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/emoji.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { EmojiOptions, EmojiItem, MouseEvent } from '../types';\nimport { stringWidth } from '../utils';\n\nexport class EmojiPrompt extends Prompt<string, EmojiOptions> {\n private search: string = '';\n private cursor: number = 0; // Index in the filtered list\n private filtered: EmojiItem[] = [];\n private sortedEmojis: EmojiItem[] = [];\n private cols: number = 0;\n private scrollTop: number = 0;\n private pageSize: number = 8; // Number of rows to display\n\n constructor(options: EmojiOptions) {\n super(options);\n\n // Sort emojis by recent\n this.sortedEmojis = [...options.emojis];\n if (options.recent && options.recent.length > 0) {\n const recentSet = new Set(options.recent);\n this.sortedEmojis.sort((a, b) => {\n const aRecent = recentSet.has(a.name);\n const bRecent = recentSet.has(b.name);\n if (aRecent && !bRecent) return -1;\n if (!aRecent && bRecent) return 1;\n return 0;\n });\n }\n\n this.checkWindowsAttention();\n\n // Initial filter\n this.filtered = this.sortedEmojis;\n\n // Calculate layout\n this.calculateLayout();\n }\n\n private calculateLayout() {\n if (this.options.cols) {\n this.cols = this.options.cols;\n } else {\n // Auto-detect based on terminal width\n // Assume each emoji cell takes ~4 chars (2 char emoji + 2 padding)\n const termWidth = process.stdout.columns || 80;\n this.cols = Math.floor((termWidth - 4) / 4); // -4 for margin\n if (this.cols < 1) this.cols = 1;\n }\n }\n\n private updateFilter() {\n if (!this.search) {\n this.filtered = this.sortedEmojis;\n } else {\n const lowerSearch = this.search.toLowerCase();\n this.filtered = this.sortedEmojis.filter(e =>\n e.name.toLowerCase().includes(lowerSearch) ||\n (e.description && e.description.toLowerCase().includes(lowerSearch)) ||\n e.char === this.search // Allow searching by exact char\n );\n }\n this.cursor = 0;\n this.scrollTop = 0;\n }\n\n protected render(_firstRender: boolean): void {\n // Prepare header (Search bar)\n const icon = `${theme.success}?`;\n const title = `${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}`;\n const searchDisplay = this.search ? `${theme.main}${this.search}${ANSI.RESET}` : `${theme.muted}Type to search...${ANSI.RESET}`;\n\n let output = `${icon} ${title} ${searchDisplay}\\n`;\n\n // Render Grid\n if (this.filtered.length === 0) {\n output += `\\n${theme.error}No results found.${ANSI.RESET}\\n`;\n } else {\n const totalRows = Math.ceil(this.filtered.length / this.cols);\n const startRow = this.scrollTop;\n const endRow = Math.min(totalRows, startRow + this.pageSize);\n\n for (let r = startRow; r < endRow; r++) {\n let rowStr = ' '; // Left margin\n for (let c = 0; c < this.cols; c++) {\n const idx = r * this.cols + c;\n if (idx >= this.filtered.length) break;\n\n const item = this.filtered[idx];\n const isSelected = idx === this.cursor;\n\n // Render Emoji\n // Align center in 4 chars\n // Emoji width is typically 2.\n const emoji = item.char;\n const width = stringWidth(emoji);\n const padding = 4 - width;\n const leftPad = Math.floor(padding / 2);\n const rightPad = padding - leftPad;\n\n let cell = `${' '.repeat(leftPad)}${emoji}${' '.repeat(rightPad)}`;\n\n if (isSelected) {\n cell = `${ANSI.REVERSE}${cell}${ANSI.RESET}`;\n }\n\n rowStr += cell;\n }\n output += rowStr + '\\n';\n }\n\n // Footer (Preview of selected)\n if (this.filtered.length > 0) {\n const selectedItem = this.filtered[this.cursor];\n output += `\\n${ANSI.BOLD}${selectedItem.char} ${selectedItem.name}${ANSI.RESET}`;\n if (selectedItem.description) {\n output += ` - ${theme.muted}${selectedItem.description}${ANSI.RESET}`;\n }\n } else {\n output += '\\n'; // Spacer\n }\n }\n\n // Navigation hints\n // output += `\\n${theme.muted}Arrows to navigate, Enter to select${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string): void {\n // Navigation\n if (this.isUp(char)) {\n if (this.filtered.length === 0) return;\n const newCursor = this.cursor - this.cols;\n if (newCursor >= 0) {\n this.cursor = newCursor;\n }\n this.adjustScroll();\n this.render(false);\n return;\n }\n\n if (this.isDown(char)) {\n if (this.filtered.length === 0) return;\n const newCursor = this.cursor + this.cols;\n if (newCursor < this.filtered.length) {\n this.cursor = newCursor;\n }\n this.adjustScroll();\n this.render(false);\n return;\n }\n\n if (this.isLeft(char)) {\n if (this.filtered.length === 0) return;\n if (this.cursor > 0) {\n this.cursor--;\n } else {\n // Wrap to end?\n this.cursor = this.filtered.length - 1;\n }\n this.adjustScroll();\n this.render(false);\n return;\n }\n\n if (this.isRight(char)) {\n if (this.filtered.length === 0) return;\n if (this.cursor < this.filtered.length - 1) {\n this.cursor++;\n } else {\n // Wrap to start?\n this.cursor = 0;\n }\n this.adjustScroll();\n this.render(false);\n return;\n }\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n if (this.filtered.length > 0) {\n this.submit(this.filtered[this.cursor].char);\n }\n return;\n }\n\n // Backspace\n if (char === '\\u0008' || char === '\\x7f') {\n if (this.search.length > 0) {\n this.search = this.search.slice(0, -1);\n this.updateFilter();\n this.render(false);\n }\n return;\n }\n\n // Typing\n if (!/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.search += char;\n this.updateFilter();\n this.render(false);\n }\n }\n\n protected handleMouse(event: MouseEvent): void {\n if (event.action === 'scroll' && this.filtered.length > 0) {\n if (event.scroll === 'up') {\n // Left / Previous\n if (this.cursor > 0) {\n this.cursor--;\n } else {\n this.cursor = this.filtered.length - 1;\n }\n } else {\n // Right / Next\n if (this.cursor < this.filtered.length - 1) {\n this.cursor++;\n } else {\n this.cursor = 0;\n }\n }\n this.adjustScroll();\n this.render(false);\n }\n }\n\n private adjustScroll() {\n const cursorRow = Math.floor(this.cursor / this.cols);\n\n if (cursorRow < this.scrollTop) {\n this.scrollTop = cursorRow;\n } else if (cursorRow >= this.scrollTop + this.pageSize) {\n this.scrollTop = cursorRow - this.pageSize + 1;\n }\n }\n}\n"],"names":["EmojiPrompt","Prompt","calculateLayout","options","cols","termWidth","process","stdout","columns","Math","floor","updateFilter","search","filtered","sortedEmojis","lowerSearch","toLowerCase","filter","e","name","includes","description","char","cursor","scrollTop","render","_firstRender","icon","theme","success","title","ANSI","BOLD","message","RESET","searchDisplay","main","muted","output","length","error","totalRows","ceil","startRow","endRow","min","pageSize","r","rowStr","c","idx","item","isSelected","emoji","width","stringWidth","padding","leftPad","rightPad","cell","repeat","REVERSE","selectedItem","renderFrame","handleInput","isUp","newCursor","adjustScroll","isDown","isLeft","isRight","submit","slice","test","startsWith","handleMouse","event","action","scroll","cursorRow","emojis","recent","recentSet","Set","sort","a","b","aRecent","has","bRecent","checkWindowsAttention"],"mappings":"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"}
@@ -1,31 +1,47 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ExecPrompt = void 0;
4
- const child_process_1 = require("child_process");
5
- const base_1 = require("../base");
6
- const theme_1 = require("../theme");
7
- const symbols_1 = require("../symbols");
8
- const ansi_1 = require("../ansi");
9
- class ExecPrompt extends base_1.Prompt {
10
- constructor(options) {
11
- super(options);
12
- this.status = 'running';
13
- this.stdoutBuffer = '';
14
- this.stderrBuffer = '';
15
- this.lastLogLine = '';
16
- // Experimental warning removed
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "ExecPrompt", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return ExecPrompt;
17
9
  }
10
+ });
11
+ const _child_process = require("child_process");
12
+ const _base = require("../base");
13
+ const _theme = require("../theme");
14
+ const _symbols = require("../symbols");
15
+ const _ansi = require("../ansi");
16
+ function _define_property(obj, key, value) {
17
+ if (key in obj) {
18
+ Object.defineProperty(obj, key, {
19
+ value: value,
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true
23
+ });
24
+ } else {
25
+ obj[key] = value;
26
+ }
27
+ return obj;
28
+ }
29
+ let ExecPrompt = class ExecPrompt extends _base.Prompt {
18
30
  run() {
19
- this.child = (0, child_process_1.spawn)(this.options.command, [], {
31
+ this.child = (0, _child_process.spawn)(this.options.command, [], {
20
32
  cwd: this.options.cwd || process.cwd(),
21
33
  shell: true,
22
34
  // Use 'ignore' for stdin so parent keeps control (and raw mode).
23
35
  // Use 'pipe' for stdout/stderr to capture output.
24
- stdio: ['ignore', 'pipe', 'pipe']
36
+ stdio: [
37
+ 'ignore',
38
+ 'pipe',
39
+ 'pipe'
40
+ ]
25
41
  });
26
42
  // Capture stdout
27
43
  if (this.child.stdout) {
28
- this.child.stdout.on('data', (data) => {
44
+ this.child.stdout.on('data', (data)=>{
29
45
  const chunk = data.toString();
30
46
  this.stdoutBuffer += chunk;
31
47
  this.updateLastLogLine(chunk);
@@ -33,31 +49,28 @@ class ExecPrompt extends base_1.Prompt {
33
49
  }
34
50
  // Capture stderr
35
51
  if (this.child.stderr) {
36
- this.child.stderr.on('data', (data) => {
52
+ this.child.stderr.on('data', (data)=>{
37
53
  const chunk = data.toString();
38
54
  this.stderrBuffer += chunk;
39
55
  this.updateLastLogLine(chunk);
40
56
  });
41
57
  }
42
58
  if (this.options.timeout && this.options.timeout > 0) {
43
- this.timer = setTimeout(() => {
44
- if (this.status !== 'running')
45
- return;
59
+ this.timer = setTimeout(()=>{
60
+ if (this.status !== 'running') return;
46
61
  this.status = 'error';
47
62
  this.render(false);
48
63
  this.killChild();
49
64
  this.cancel(new Error(`Timeout after ${this.options.timeout}ms`));
50
65
  }, this.options.timeout);
51
66
  }
52
- this.child.on('exit', (code) => {
53
- if (this.status !== 'running')
54
- return;
67
+ this.child.on('exit', (code)=>{
68
+ if (this.status !== 'running') return;
55
69
  if (code === 0) {
56
70
  this.status = 'done';
57
71
  this.render(false);
58
72
  this.submit();
59
- }
60
- else {
73
+ } else {
61
74
  this.status = 'error';
62
75
  this.render(false);
63
76
  const errorMessage = this.stderrBuffer.trim() || `Command failed with exit code ${code}`;
@@ -71,9 +84,8 @@ class ExecPrompt extends base_1.Prompt {
71
84
  this.cancel(err);
72
85
  }
73
86
  });
74
- this.child.on('error', (err) => {
75
- if (this.status !== 'running')
76
- return;
87
+ this.child.on('error', (err)=>{
88
+ if (this.status !== 'running') return;
77
89
  this.status = 'error';
78
90
  this.render(false);
79
91
  this.cancel(err);
@@ -84,7 +96,7 @@ class ExecPrompt extends base_1.Prompt {
84
96
  // We only want the last non-empty line
85
97
  const lines = chunk.split('\n');
86
98
  // Iterate backwards
87
- for (let i = lines.length - 1; i >= 0; i--) {
99
+ for(let i = lines.length - 1; i >= 0; i--){
88
100
  const line = lines[i].trim();
89
101
  if (line) {
90
102
  this.lastLogLine = line;
@@ -100,21 +112,18 @@ class ExecPrompt extends base_1.Prompt {
100
112
  }
101
113
  cleanup() {
102
114
  this.status = 'done';
103
- if (this.timer)
104
- clearTimeout(this.timer);
115
+ if (this.timer) clearTimeout(this.timer);
105
116
  this.killChild();
106
117
  super.cleanup();
107
118
  }
108
119
  render(_firstRender) {
109
120
  let symbol = '';
110
121
  if (this.status === 'running') {
111
- symbol = theme_1.theme.muted + '...' + ansi_1.ANSI.RESET;
112
- }
113
- else if (this.status === 'done') {
114
- symbol = theme_1.theme.success + symbols_1.symbols.tick + ansi_1.ANSI.RESET;
115
- }
116
- else if (this.status === 'error') {
117
- symbol = theme_1.theme.error + symbols_1.symbols.cross + ansi_1.ANSI.RESET;
122
+ symbol = _theme.theme.muted + '...' + _ansi.ANSI.RESET;
123
+ } else if (this.status === 'done') {
124
+ symbol = _theme.theme.success + _symbols.symbols.tick + _ansi.ANSI.RESET;
125
+ } else if (this.status === 'error') {
126
+ symbol = _theme.theme.error + _symbols.symbols.cross + _ansi.ANSI.RESET;
118
127
  }
119
128
  let details = '';
120
129
  if (this.status === 'running' && this.lastLogLine) {
@@ -124,14 +133,19 @@ class ExecPrompt extends base_1.Prompt {
124
133
  if (line.length > maxLen) {
125
134
  line = line.substring(0, maxLen - 3) + '...';
126
135
  }
127
- details = ` ${theme_1.theme.muted}${line}${ansi_1.ANSI.RESET}`;
136
+ details = ` ${_theme.theme.muted}${line}${_ansi.ANSI.RESET}`;
128
137
  }
129
- const output = `${theme_1.theme.title}${this.options.message}${ansi_1.ANSI.RESET} ${symbol}${details}`;
138
+ const output = `${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${symbol}${details}`;
130
139
  this.renderFrame(output);
131
140
  }
132
141
  handleInput(_char, _key) {
133
- // Prompt base class handles Ctrl+C (SIGINT) in _onKeyHandler
134
- // which calls cleanup() -> killChild().
142
+ // Prompt base class handles Ctrl+C (SIGINT) in _onKeyHandler
143
+ // which calls cleanup() -> killChild().
135
144
  }
136
- }
137
- exports.ExecPrompt = ExecPrompt;
145
+ constructor(options){
146
+ super(options), _define_property(this, "child", void 0), _define_property(this, "status", 'running'), _define_property(this, "timer", void 0), _define_property(this, "stdoutBuffer", ''), _define_property(this, "stderrBuffer", ''), _define_property(this, "lastLogLine", '');
147
+ // Experimental warning removed
148
+ }
149
+ };
150
+
151
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/exec.ts"],"sourcesContent":["import { spawn, ChildProcess } from 'child_process';\nimport { Prompt } from '../base';\nimport { ExecOptions } from '../types';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { ANSI } from '../ansi';\n\nexport class ExecPrompt extends Prompt<void, ExecOptions> {\n private child?: ChildProcess;\n private status: 'running' | 'done' | 'error' = 'running';\n private timer?: NodeJS.Timeout;\n private stdoutBuffer: string = '';\n private stderrBuffer: string = '';\n private lastLogLine: string = '';\n\n constructor(options: ExecOptions) {\n super(options);\n // Experimental warning removed\n }\n\n public run(): Promise<void> {\n this.child = spawn(this.options.command, [], {\n cwd: this.options.cwd || process.cwd(),\n shell: true,\n // Use 'ignore' for stdin so parent keeps control (and raw mode).\n // Use 'pipe' for stdout/stderr to capture output.\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n // Capture stdout\n if (this.child.stdout) {\n this.child.stdout.on('data', (data: Buffer) => {\n const chunk = data.toString();\n this.stdoutBuffer += chunk;\n this.updateLastLogLine(chunk);\n });\n }\n\n // Capture stderr\n if (this.child.stderr) {\n this.child.stderr.on('data', (data: Buffer) => {\n const chunk = data.toString();\n this.stderrBuffer += chunk;\n this.updateLastLogLine(chunk);\n });\n }\n\n if (this.options.timeout && this.options.timeout > 0) {\n this.timer = setTimeout(() => {\n if (this.status !== 'running') return;\n this.status = 'error';\n this.render(false);\n this.killChild();\n this.cancel(new Error(`Timeout after ${this.options.timeout}ms`));\n }, this.options.timeout);\n }\n\n this.child.on('exit', (code) => {\n if (this.status !== 'running') return;\n \n if (code === 0) {\n this.status = 'done';\n this.render(false);\n this.submit();\n } else {\n this.status = 'error';\n this.render(false);\n \n const errorMessage = this.stderrBuffer.trim() || `Command failed with exit code ${code}`;\n const err = new Error(errorMessage);\n // Attach details\n Object.assign(err, {\n code,\n stdout: this.stdoutBuffer,\n stderr: this.stderrBuffer\n });\n \n this.cancel(err);\n }\n });\n\n this.child.on('error', (err) => {\n if (this.status !== 'running') return;\n this.status = 'error';\n this.render(false);\n this.cancel(err);\n });\n\n return super.run();\n }\n\n private updateLastLogLine(chunk: string) {\n // We only want the last non-empty line\n const lines = chunk.split('\\n');\n // Iterate backwards\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i].trim();\n if (line) {\n this.lastLogLine = line;\n this.render(false);\n break;\n }\n }\n }\n\n private killChild() {\n if (this.child && !this.child.killed) {\n this.child.kill();\n }\n }\n\n protected cleanup() {\n this.status = 'done';\n if (this.timer) clearTimeout(this.timer);\n this.killChild();\n super.cleanup();\n }\n\n protected render(_firstRender: boolean) {\n let symbol = '';\n\n if (this.status === 'running') {\n symbol = theme.muted + '...' + ANSI.RESET;\n } else if (this.status === 'done') {\n symbol = theme.success + symbols.tick + ANSI.RESET;\n } else if (this.status === 'error') {\n symbol = theme.error + symbols.cross + ANSI.RESET;\n }\n\n let details = '';\n if (this.status === 'running' && this.lastLogLine) {\n // Truncate for display\n const maxLen = 50;\n let line = this.stripAnsi(this.lastLogLine);\n if (line.length > maxLen) {\n line = line.substring(0, maxLen - 3) + '...';\n }\n details = ` ${theme.muted}${line}${ANSI.RESET}`;\n }\n\n const output = `${theme.title}${this.options.message}${ANSI.RESET} ${symbol}${details}`;\n this.renderFrame(output);\n }\n\n protected handleInput(_char: string, _key: Buffer) {\n // Prompt base class handles Ctrl+C (SIGINT) in _onKeyHandler\n // which calls cleanup() -> killChild().\n }\n}\n"],"names":["ExecPrompt","Prompt","run","child","spawn","options","command","cwd","process","shell","stdio","stdout","on","data","chunk","toString","stdoutBuffer","updateLastLogLine","stderr","stderrBuffer","timeout","timer","setTimeout","status","render","killChild","cancel","Error","code","submit","errorMessage","trim","err","Object","assign","lines","split","i","length","line","lastLogLine","killed","kill","cleanup","clearTimeout","_firstRender","symbol","theme","muted","ANSI","RESET","success","symbols","tick","error","cross","details","maxLen","stripAnsi","substring","output","title","message","renderFrame","handleInput","_char","_key"],"mappings":"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"}