brew-tui 0.8.1 → 0.9.0

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 (34) hide show
  1. package/build/{brewbar-installer-DCF37YM3.js → brewbar-installer-LCENEWJB.js} +2 -2
  2. package/build/{brewfile-manager-6LXONGSA.js → brewfile-manager-G7Q4IOG3.js} +4 -4
  3. package/build/{chunk-VLREAA5F.js → chunk-BRXZG7ZL.js} +2 -2
  4. package/build/{chunk-QZZZAAWG.js → chunk-IGDHDXUH.js} +11 -1
  5. package/build/chunk-IGDHDXUH.js.map +1 -0
  6. package/build/{chunk-FIPCCYL6.js → chunk-J6HCX7RG.js} +2 -2
  7. package/build/{chunk-OHMNJ3EA.js → chunk-MHHIHUCY.js} +15 -9
  8. package/build/chunk-MHHIHUCY.js.map +1 -0
  9. package/build/{chunk-3VDIKVS3.js → chunk-QX5DEW3S.js} +3 -3
  10. package/build/{chunk-JYHINZVV.js → chunk-VQJBFXZN.js} +2 -2
  11. package/build/{chunk-3OIVIQWW.js → chunk-VXTPR2FD.js} +4 -4
  12. package/build/compliance-checker-IXZHIMQG.js +12 -0
  13. package/build/{history-logger-FJ3HZSFU.js → history-logger-SB5UG5BQ.js} +3 -3
  14. package/build/index.js +297 -251
  15. package/build/index.js.map +1 -1
  16. package/build/{snapshot-JDRSBMG6.js → snapshot-ZOJETCED.js} +3 -3
  17. package/build/{sync-engine-CIL6C44Z.js → sync-engine-IKKIWF2Y.js} +5 -5
  18. package/build/{version-check-LEJWNDQK.js → version-check-GUAV5TWD.js} +2 -2
  19. package/package.json +1 -1
  20. package/build/chunk-OHMNJ3EA.js.map +0 -1
  21. package/build/chunk-QZZZAAWG.js.map +0 -1
  22. package/build/compliance-checker-MAREAFDH.js +0 -12
  23. /package/build/{brewbar-installer-DCF37YM3.js.map → brewbar-installer-LCENEWJB.js.map} +0 -0
  24. /package/build/{brewfile-manager-6LXONGSA.js.map → brewfile-manager-G7Q4IOG3.js.map} +0 -0
  25. /package/build/{chunk-VLREAA5F.js.map → chunk-BRXZG7ZL.js.map} +0 -0
  26. /package/build/{chunk-FIPCCYL6.js.map → chunk-J6HCX7RG.js.map} +0 -0
  27. /package/build/{chunk-3VDIKVS3.js.map → chunk-QX5DEW3S.js.map} +0 -0
  28. /package/build/{chunk-JYHINZVV.js.map → chunk-VQJBFXZN.js.map} +0 -0
  29. /package/build/{chunk-3OIVIQWW.js.map → chunk-VXTPR2FD.js.map} +0 -0
  30. /package/build/{compliance-checker-MAREAFDH.js.map → compliance-checker-IXZHIMQG.js.map} +0 -0
  31. /package/build/{history-logger-FJ3HZSFU.js.map → history-logger-SB5UG5BQ.js.map} +0 -0
  32. /package/build/{snapshot-JDRSBMG6.js.map → snapshot-ZOJETCED.js.map} +0 -0
  33. /package/build/{sync-engine-CIL6C44Z.js.map → sync-engine-IKKIWF2Y.js.map} +0 -0
  34. /package/build/{version-check-LEJWNDQK.js.map → version-check-GUAV5TWD.js.map} +0 -0
package/build/index.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  loadBrewfile,
6
6
  reconcile,
7
7
  saveBrewfile
8
- } from "./chunk-3VDIKVS3.js";
8
+ } from "./chunk-QX5DEW3S.js";
9
9
  import {
10
10
  activate,
11
11
  applyConflictResolutions,
@@ -19,17 +19,17 @@ import {
19
19
  readSyncEnvelope,
20
20
  revalidate,
21
21
  sync
22
- } from "./chunk-3OIVIQWW.js";
22
+ } from "./chunk-VXTPR2FD.js";
23
23
  import {
24
24
  checkCompliance
25
- } from "./chunk-FIPCCYL6.js";
25
+ } from "./chunk-J6HCX7RG.js";
26
26
  import {
27
27
  captureSnapshot,
28
28
  execBrew,
29
29
  loadSnapshots,
30
30
  saveSnapshot,
31
31
  streamBrew
32
- } from "./chunk-VLREAA5F.js";
32
+ } from "./chunk-BRXZG7ZL.js";
33
33
  import {
34
34
  exportReport,
35
35
  loadPolicy
@@ -39,14 +39,15 @@ import {
39
39
  clearHistory,
40
40
  detectAction,
41
41
  loadHistory
42
- } from "./chunk-JYHINZVV.js";
42
+ } from "./chunk-VQJBFXZN.js";
43
43
  import {
44
44
  DATA_DIR,
45
45
  ONBOARDING_FLAG_PATH,
46
46
  PROFILES_DIR,
47
47
  ensureDataDirs,
48
- getMachineId
49
- } from "./chunk-QZZZAAWG.js";
48
+ getMachineId,
49
+ writeLastAction
50
+ } from "./chunk-IGDHDXUH.js";
50
51
  import {
51
52
  fetchWithRetry,
52
53
  fetchWithTimeout,
@@ -54,7 +55,7 @@ import {
54
55
  t,
55
56
  tp,
56
57
  useLocaleStore
57
- } from "./chunk-OHMNJ3EA.js";
58
+ } from "./chunk-MHHIHUCY.js";
58
59
  import {
59
60
  logger
60
61
  } from "./chunk-KDHEUNRI.js";
@@ -76,12 +77,11 @@ import { Box, Text as Text2, useStdout } from "ink";
76
77
 
77
78
  // src/stores/navigation-store.ts
78
79
  import { create } from "zustand";
79
- var VIEWS = [
80
+ var MENU_VIEWS = [
80
81
  "dashboard",
81
82
  "installed",
82
83
  "outdated",
83
84
  "package-info",
84
- "search",
85
85
  "services",
86
86
  "doctor",
87
87
  "profiles",
@@ -99,6 +99,8 @@ var useNavigationStore = create((set, get) => ({
99
99
  selectedPackage: null,
100
100
  selectedPackageType: null,
101
101
  viewHistory: [],
102
+ menuMode: false,
103
+ menuCursor: 0,
102
104
  navigate: (view) => {
103
105
  const { currentView, viewHistory } = get();
104
106
  if (view === currentView) return;
@@ -108,7 +110,11 @@ var useNavigationStore = create((set, get) => ({
108
110
  });
109
111
  },
110
112
  goBack: () => {
111
- const { viewHistory } = get();
113
+ const { viewHistory, menuMode } = get();
114
+ if (menuMode) {
115
+ set({ menuMode: false });
116
+ return;
117
+ }
112
118
  if (viewHistory.length === 0) return;
113
119
  const prev = viewHistory[viewHistory.length - 1];
114
120
  set({
@@ -116,16 +122,37 @@ var useNavigationStore = create((set, get) => ({
116
122
  viewHistory: viewHistory.slice(0, -1)
117
123
  });
118
124
  },
119
- selectPackage: (name, type = null) => set({ selectedPackage: name, selectedPackageType: type })
125
+ selectPackage: (name, type = null) => set({ selectedPackage: name, selectedPackageType: type }),
126
+ enterMenuMode: () => {
127
+ const { currentView } = get();
128
+ const idx = MENU_VIEWS.indexOf(currentView);
129
+ set({ menuMode: true, menuCursor: idx >= 0 ? idx : 0 });
130
+ },
131
+ exitMenuMode: () => set({ menuMode: false }),
132
+ moveMenuCursor: (delta) => {
133
+ const { menuCursor } = get();
134
+ const next = menuCursor + delta;
135
+ if (next < 0 || next >= MENU_VIEWS.length) return;
136
+ set({ menuCursor: next });
137
+ },
138
+ selectMenuItem: () => {
139
+ const { menuCursor, currentView, viewHistory } = get();
140
+ const target = MENU_VIEWS[menuCursor];
141
+ if (!target) {
142
+ set({ menuMode: false });
143
+ return;
144
+ }
145
+ if (target === currentView) {
146
+ set({ menuMode: false });
147
+ return;
148
+ }
149
+ set({
150
+ currentView: target,
151
+ viewHistory: [...viewHistory.slice(-19), currentView],
152
+ menuMode: false
153
+ });
154
+ }
120
155
  }));
121
- function getNextView(current) {
122
- const idx = VIEWS.indexOf(current);
123
- return VIEWS[(idx + 1) % VIEWS.length];
124
- }
125
- function getPrevView(current) {
126
- const idx = VIEWS.indexOf(current);
127
- return VIEWS[(idx - 1 + VIEWS.length) % VIEWS.length];
128
- }
129
156
 
130
157
  // src/lib/license/feature-gate.ts
131
158
  var PRO_VIEWS = /* @__PURE__ */ new Set([
@@ -313,98 +340,49 @@ var VIEW_LABEL_KEYS = {
313
340
  compliance: "view_compliance",
314
341
  account: "view_account"
315
342
  };
316
- var VIEW_KEYS = {
317
- dashboard: "1",
318
- installed: "2",
319
- search: "",
320
- outdated: "3",
321
- "package-info": "",
322
- services: "4",
323
- doctor: "5",
324
- profiles: "6",
325
- "smart-cleanup": "7",
326
- history: "8",
327
- "security-audit": "9",
328
- rollback: "",
329
- brewfile: "",
330
- sync: "",
331
- compliance: "",
332
- account: "0"
333
- };
334
- var TAB_VIEWS = [
335
- "dashboard",
336
- "installed",
337
- "outdated",
338
- "package-info",
339
- "services",
340
- "doctor",
341
- "profiles",
342
- "smart-cleanup",
343
- "history",
344
- "rollback",
345
- "brewfile",
346
- "sync",
347
- "security-audit",
348
- "compliance",
349
- "account"
350
- ];
351
- function MenuItem({ view, currentView }) {
352
- const key = VIEW_KEYS[view];
343
+ function MenuItem({ view, currentView, cursorView, menuMode }) {
353
344
  const viewLabel = t(VIEW_LABEL_KEYS[view]);
354
345
  const isPro = isProView(view) || isTeamView(view);
355
- const isActive = view === currentView;
346
+ const isCurrent = view === currentView;
347
+ const isCursor = menuMode && view === cursorView;
356
348
  const isAccount = view === "account";
357
- const indicator = key || (view === "package-info" ? "\u21B2" : " ");
349
+ const indicatorColor = isCursor ? COLORS.brand : COLORS.success;
350
+ const labelColor = isCursor ? COLORS.brand : isCurrent ? COLORS.success : isAccount ? COLORS.gold : COLORS.textSecondary;
351
+ const showArrow = menuMode ? isCursor : isCurrent;
358
352
  return /* @__PURE__ */ jsxs(Box, { children: [
359
- isActive ? /* @__PURE__ */ jsxs(Text2, { color: COLORS.success, bold: true, children: [
353
+ showArrow ? /* @__PURE__ */ jsxs(Text2, { color: indicatorColor, bold: true, children: [
360
354
  "\u25B6",
361
355
  " "
362
356
  ] }) : /* @__PURE__ */ jsx2(Text2, { children: " " }),
363
- /* @__PURE__ */ jsx2(Text2, { bold: true, color: key ? COLORS.white : COLORS.textSecondary, children: indicator }),
364
- /* @__PURE__ */ jsxs(Text2, { bold: isActive, underline: isActive, color: isActive ? COLORS.success : isAccount ? COLORS.gold : COLORS.textSecondary, children: [
365
- " ",
366
- viewLabel
367
- ] }),
357
+ /* @__PURE__ */ jsx2(Text2, { bold: showArrow, underline: !menuMode && isCurrent, color: labelColor, children: viewLabel }),
368
358
  isPro && /* @__PURE__ */ jsxs(Text2, { color: COLORS.brand, bold: true, children: [
369
359
  " ",
370
360
  t("pro_badge")
371
361
  ] })
372
362
  ] });
373
363
  }
374
- var COL1_VIEWS = TAB_VIEWS.slice(0, 6);
375
- var COL2_VIEWS = TAB_VIEWS.slice(6);
364
+ var COL1_VIEWS = MENU_VIEWS.slice(0, 6);
365
+ var COL2_VIEWS = MENU_VIEWS.slice(6);
376
366
  function Header() {
377
367
  const currentView = useNavigationStore((s) => s.currentView);
368
+ const menuMode = useNavigationStore((s) => s.menuMode);
369
+ const menuCursor = useNavigationStore((s) => s.menuCursor);
378
370
  useLocaleStore((s) => s.locale);
379
371
  const { stdout } = useStdout();
380
372
  const cols = stdout?.columns ?? 80;
381
373
  const isNarrow = cols < 95;
374
+ const cursorView = menuMode ? MENU_VIEWS[menuCursor] ?? null : null;
382
375
  const logoBlock = /* @__PURE__ */ jsx2(Box, { flexDirection: "column", flexShrink: 0, children: LOGO_BREW.map((brew, i) => /* @__PURE__ */ jsxs(Box, { children: [
383
376
  /* @__PURE__ */ jsx2(GradientText, { colors: GRADIENTS.gold, children: brew }),
384
377
  /* @__PURE__ */ jsx2(GradientText, { colors: GRADIENTS.darkGold, children: LOGO_TUI[i] })
385
378
  ] }, `logo-${i}`)) });
386
- const menuBlock = /* @__PURE__ */ jsxs(Box, { borderStyle: "round", borderColor: COLORS.lavender, paddingX: SPACING.xs, flexDirection: "column", alignSelf: isNarrow ? "flex-start" : "center", children: [
379
+ const menuBorderColor = menuMode ? COLORS.brand : COLORS.lavender;
380
+ const menuBlock = /* @__PURE__ */ jsxs(Box, { borderStyle: "round", borderColor: menuBorderColor, paddingX: SPACING.xs, flexDirection: "column", alignSelf: isNarrow ? "flex-start" : "center", children: [
387
381
  /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
388
- /* @__PURE__ */ jsx2(Box, { flexDirection: "column", children: COL1_VIEWS.map((view) => /* @__PURE__ */ jsx2(MenuItem, { view, currentView }, view)) }),
389
- /* @__PURE__ */ jsx2(Box, { flexDirection: "column", marginLeft: SPACING.sm, children: COL2_VIEWS.map((view) => /* @__PURE__ */ jsx2(MenuItem, { view, currentView }, view)) })
382
+ /* @__PURE__ */ jsx2(Box, { flexDirection: "column", children: COL1_VIEWS.map((view) => /* @__PURE__ */ jsx2(MenuItem, { view, currentView, cursorView, menuMode }, view)) }),
383
+ /* @__PURE__ */ jsx2(Box, { flexDirection: "column", marginLeft: SPACING.sm, children: COL2_VIEWS.map((view) => /* @__PURE__ */ jsx2(MenuItem, { view, currentView, cursorView, menuMode }, view)) })
390
384
  ] }),
391
- /* @__PURE__ */ jsxs(Box, { borderStyle: "single", borderTop: true, borderBottom: false, borderLeft: false, borderRight: false, borderColor: COLORS.lavender, marginTop: SPACING.none, children: [
392
- /* @__PURE__ */ jsx2(Text2, { bold: true, color: COLORS.white, children: "S" }),
393
- /* @__PURE__ */ jsxs(Text2, { color: COLORS.textSecondary, children: [
394
- " ",
395
- t("hint_search")
396
- ] }),
397
- /* @__PURE__ */ jsxs(Text2, { color: COLORS.lavender, children: [
398
- " ",
399
- "\u2503",
400
- " "
401
- ] }),
402
- /* @__PURE__ */ jsx2(Text2, { bold: true, color: COLORS.white, children: "L" }),
403
- /* @__PURE__ */ jsxs(Text2, { color: COLORS.textSecondary, children: [
404
- " ",
405
- t("hint_lang")
406
- ] })
407
- ] })
385
+ /* @__PURE__ */ jsx2(Box, { borderStyle: "single", borderTop: true, borderBottom: false, borderLeft: false, borderRight: false, borderColor: menuBorderColor, marginTop: SPACING.none, children: menuMode ? /* @__PURE__ */ jsx2(Text2, { color: COLORS.brand, children: t("hint_menuMode") }) : /* @__PURE__ */ jsx2(Text2, { color: COLORS.textSecondary, children: t("hint_menuOpen") }) })
408
386
  ] });
409
387
  if (isNarrow) {
410
388
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: SPACING.xs, children: [
@@ -423,25 +401,27 @@ import React2 from "react";
423
401
  import { Box as Box2, Text as Text3 } from "ink";
424
402
  import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
425
403
  var VIEW_HINT_DEFS = {
426
- dashboard: [["1-9,0", "hint_navigate"], ["r", "hint_refresh"], ["S", "hint_search"], ["tab", "hint_next"], ["q", "hint_quit"]],
427
- installed: [["/", "hint_filter"], ["enter", "hint_info"], ["u", "hint_uninstall"], ["f", "hint_switchTab"], ["S", "hint_search"], ["q", "hint_quit"]],
428
- search: [["hint_typeToSearch"], ["enter", "hint_details"], ["i", "hint_install"], ["esc", "hint_back"], ["q", "hint_quit"]],
429
- outdated: [["enter", "hint_upgrade"], ["A", "hint_upgradeAll"], ["p", "hint_pin"], ["r", "hint_refresh"], ["S", "hint_search"], ["q", "hint_quit"]],
430
- "package-info": [["i", "hint_install"], ["u", "hint_uninstall"], ["U", "hint_upgrade"], ["esc", "hint_back"], ["q", "hint_quit"]],
431
- services: [["s", "hint_start"], ["x", "hint_stop"], ["R", "hint_restart"], ["r", "hint_refresh"], ["S", "hint_search"], ["q", "hint_quit"]],
432
- doctor: [["r", "hint_refresh"], ["S", "hint_search"], ["tab", "hint_next"], ["q", "hint_quit"]],
433
- profiles: [["n", "hint_new"], ["enter", "hint_details"], ["e", "hint_edit"], ["i", "hint_import"], ["d", "hint_delete"], ["q", "hint_quit"]],
434
- "smart-cleanup": [["enter", "hint_toggle"], ["a", "hint_all"], ["c", "hint_clean"], ["F", "hint_force"], ["r", "hint_refresh"], ["S", "hint_search"], ["q", "hint_quit"]],
435
- history: [["/", "hint_search"], ["enter", "hint_replay"], ["f", "hint_filter"], ["c", "hint_clear"], ["q", "hint_quit"]],
436
- "security-audit": [["r", "hint_scan"], ["enter", "hint_details"], ["u", "hint_upgrade"], ["S", "hint_search"], ["q", "hint_quit"]],
437
- rollback: [["j/k", "hint_navigate"], ["enter", "hint_select"], ["r", "hint_rollback_confirm"], ["esc", "hint_back"], ["q", "hint_quit"]],
438
- brewfile: [["j/k", "hint_navigate"], ["a", "hint_add"], ["d", "hint_delete"], ["r", "hint_reconcile"], ["e", "hint_export"], ["q", "hint_quit"]],
439
- sync: [["s", "hint_sync"], ["r", "hint_refresh"], ["c", "hint_conflict"], ["l", "hint_useLocal"], ["esc", "hint_back"], ["q", "hint_quit"]],
440
- compliance: [["r", "hint_scan"], ["i", "hint_import"], ["e", "hint_export"], ["c", "hint_clean"], ["q", "hint_quit"]],
441
- account: [["p", "hint_promo"], ["d", "hint_deactivate"], ["S", "hint_search"], ["q", "hint_quit"]]
404
+ dashboard: [["1", "hint_refresh"]],
405
+ installed: [["/", "hint_filter"], ["enter", "hint_info"], ["1", "hint_uninstall"], ["2", "hint_switchTab"]],
406
+ search: [["enter", "hint_details"], ["1", "hint_install"]],
407
+ outdated: [["enter", "hint_upgrade"], ["1", "hint_upgradeAll"], ["2", "hint_pin"], ["3", "hint_refresh"]],
408
+ "package-info": [["1", "hint_install"], ["2", "hint_uninstall"], ["3", "hint_upgrade"]],
409
+ services: [["1", "hint_start"], ["2", "hint_stop"], ["3", "hint_restart"], ["4", "hint_refresh"]],
410
+ doctor: [["1", "hint_refresh"]],
411
+ profiles: [["enter", "hint_details"], ["1", "hint_new"], ["2", "hint_edit"], ["3", "hint_import"], ["4", "hint_delete"]],
412
+ "smart-cleanup": [["enter", "hint_toggle"], ["1", "hint_all"], ["2", "hint_clean"], ["3", "hint_force"], ["4", "hint_refresh"]],
413
+ history: [["/", "hint_search"], ["enter", "hint_replay"], ["1", "hint_filter"], ["2", "hint_clear"]],
414
+ "security-audit": [["enter", "hint_details"], ["1", "hint_scan"], ["2", "hint_upgrade"]],
415
+ rollback: [["j/k", "hint_navigate"], ["enter", "hint_select"], ["1", "hint_rollback_confirm"]],
416
+ brewfile: [["1", "hint_new"], ["2", "hint_refresh"], ["3", "hint_reconcile"]],
417
+ sync: [["1", "hint_sync"], ["2", "hint_refresh"], ["3", "hint_conflict"], ["4", "hint_useLocal"]],
418
+ compliance: [["1", "hint_scan"], ["2", "hint_import"], ["3", "hint_export"], ["4", "hint_clean"]],
419
+ account: [["1", "hint_promo"], ["2", "hint_deactivate"]]
442
420
  };
421
+ function hasNumberedActions(defs) {
422
+ return defs.some(([key]) => /^\d+$/.test(key));
423
+ }
443
424
  function HintItem({ def }) {
444
- if (def.length === 1) return /* @__PURE__ */ jsx3(Text3, { color: COLORS.gold, dimColor: true, children: t(def[0]) });
445
425
  return /* @__PURE__ */ jsxs2(Fragment2, { children: [
446
426
  /* @__PURE__ */ jsx3(Text3, { color: COLORS.text, bold: true, children: def[0] }),
447
427
  /* @__PURE__ */ jsx3(Text3, { color: COLORS.textSecondary, children: ":" }),
@@ -450,32 +430,50 @@ function HintItem({ def }) {
450
430
  }
451
431
  function Footer() {
452
432
  const currentView = useNavigationStore((s) => s.currentView);
433
+ const menuMode = useNavigationStore((s) => s.menuMode);
453
434
  const locale = useLocaleStore((s) => s.locale);
454
435
  const defs = VIEW_HINT_DEFS[currentView] ?? [];
455
- return /* @__PURE__ */ jsxs2(Box2, { borderStyle: "single", borderTop: true, borderBottom: false, borderLeft: false, borderRight: false, borderColor: COLORS.gold, paddingX: SPACING.xs, flexWrap: "wrap", children: [
456
- defs.map((def, i) => {
457
- const key = def.length === 1 ? def[0] : `${def[0]}:${def[1]}`;
458
- return /* @__PURE__ */ jsxs2(React2.Fragment, { children: [
436
+ const showChoose = hasNumberedActions(defs) && !menuMode;
437
+ return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", children: [
438
+ showChoose && /* @__PURE__ */ jsx3(Box2, { paddingX: SPACING.xs, children: /* @__PURE__ */ jsx3(Text3, { color: COLORS.text, children: t("hint_chooseNumber") }) }),
439
+ /* @__PURE__ */ jsxs2(Box2, { borderStyle: "single", borderTop: true, borderBottom: false, borderLeft: false, borderRight: false, borderColor: COLORS.gold, paddingX: SPACING.xs, flexWrap: "wrap", children: [
440
+ !menuMode && defs.map((def, i) => /* @__PURE__ */ jsxs2(React2.Fragment, { children: [
459
441
  i > 0 && /* @__PURE__ */ jsxs2(Text3, { color: COLORS.border, children: [
460
442
  " ",
461
443
  "\u2502",
462
444
  " "
463
445
  ] }),
464
446
  /* @__PURE__ */ jsx3(HintItem, { def })
465
- ] }, key);
466
- }),
467
- /* @__PURE__ */ jsxs2(Text3, { color: COLORS.lavender, children: [
468
- " ",
469
- "\u2503",
470
- " "
471
- ] }),
472
- /* @__PURE__ */ jsx3(Text3, { color: COLORS.text, bold: true, children: "L" }),
473
- /* @__PURE__ */ jsx3(Text3, { color: COLORS.textSecondary, children: ":" }),
474
- /* @__PURE__ */ jsxs2(Text3, { color: COLORS.gold, dimColor: true, children: [
475
- t("hint_lang"),
476
- "(",
477
- locale,
478
- ")"
447
+ ] }, `${def[0]}:${def[1]}`)),
448
+ !menuMode && defs.length > 0 && /* @__PURE__ */ jsxs2(Text3, { color: COLORS.border, children: [
449
+ " ",
450
+ "\u2502",
451
+ " "
452
+ ] }),
453
+ /* @__PURE__ */ jsx3(Text3, { color: COLORS.text, bold: true, children: "esc" }),
454
+ /* @__PURE__ */ jsx3(Text3, { color: COLORS.textSecondary, children: ":" }),
455
+ /* @__PURE__ */ jsx3(Text3, { color: COLORS.gold, dimColor: true, children: t("hint_back") }),
456
+ /* @__PURE__ */ jsxs2(Text3, { color: COLORS.border, children: [
457
+ " ",
458
+ "\u2502",
459
+ " "
460
+ ] }),
461
+ /* @__PURE__ */ jsx3(Text3, { color: COLORS.text, bold: true, children: "q" }),
462
+ /* @__PURE__ */ jsx3(Text3, { color: COLORS.textSecondary, children: ":" }),
463
+ /* @__PURE__ */ jsx3(Text3, { color: COLORS.gold, dimColor: true, children: t("hint_quit") }),
464
+ /* @__PURE__ */ jsxs2(Text3, { color: COLORS.lavender, children: [
465
+ " ",
466
+ "\u2503",
467
+ " "
468
+ ] }),
469
+ /* @__PURE__ */ jsx3(Text3, { color: COLORS.text, bold: true, children: "L" }),
470
+ /* @__PURE__ */ jsx3(Text3, { color: COLORS.textSecondary, children: ":" }),
471
+ /* @__PURE__ */ jsxs2(Text3, { color: COLORS.gold, dimColor: true, children: [
472
+ t("hint_lang"),
473
+ "(",
474
+ locale,
475
+ ")"
476
+ ] })
479
477
  ] })
480
478
  ] });
481
479
  }
@@ -629,27 +627,42 @@ var useModalStore = create3((set) => ({
629
627
  }));
630
628
 
631
629
  // src/hooks/use-keyboard.ts
632
- var VIEW_KEYS2 = {
633
- "1": "dashboard",
634
- "2": "installed",
635
- "3": "outdated",
636
- "4": "services",
637
- "5": "doctor",
638
- "6": "profiles",
639
- "7": "smart-cleanup",
640
- "8": "history",
641
- "9": "security-audit",
642
- "0": "account"
643
- };
644
630
  function useGlobalKeyboard(opts) {
645
631
  const navigate = useNavigationStore((s) => s.navigate);
646
- const currentView = useNavigationStore((s) => s.currentView);
647
632
  const goBack = useNavigationStore((s) => s.goBack);
633
+ const menuMode = useNavigationStore((s) => s.menuMode);
634
+ const enterMenuMode = useNavigationStore((s) => s.enterMenuMode);
635
+ const exitMenuMode = useNavigationStore((s) => s.exitMenuMode);
636
+ const moveMenuCursor = useNavigationStore((s) => s.moveMenuCursor);
637
+ const selectMenuItem = useNavigationStore((s) => s.selectMenuItem);
648
638
  const { locale, setLocale } = useLocaleStore();
649
639
  const modalOpen = useModalStore((s) => s.isOpen);
650
640
  useInput((input, key) => {
651
641
  if (opts?.disabled) return;
652
642
  if (modalOpen) return;
643
+ if (menuMode) {
644
+ if (input === "q" || key.ctrl && input === "c") {
645
+ opts?.onQuit?.();
646
+ return;
647
+ }
648
+ if (key.escape || input === "m") {
649
+ exitMenuMode();
650
+ return;
651
+ }
652
+ if (key.upArrow) {
653
+ moveMenuCursor(-1);
654
+ return;
655
+ }
656
+ if (key.downArrow) {
657
+ moveMenuCursor(1);
658
+ return;
659
+ }
660
+ if (key.return) {
661
+ selectMenuItem();
662
+ return;
663
+ }
664
+ return;
665
+ }
653
666
  if (input === "q" || key.ctrl && input === "c") {
654
667
  opts?.onQuit?.();
655
668
  return;
@@ -658,12 +671,8 @@ function useGlobalKeyboard(opts) {
658
671
  goBack();
659
672
  return;
660
673
  }
661
- if (key.tab && key.shift) {
662
- navigate(getPrevView(currentView));
663
- return;
664
- }
665
- if (key.tab) {
666
- navigate(getNextView(currentView));
674
+ if (input === "m") {
675
+ enterMenuMode();
667
676
  return;
668
677
  }
669
678
  if (input === "S") {
@@ -674,9 +683,6 @@ function useGlobalKeyboard(opts) {
674
683
  setLocale(locale === "en" ? "es" : "en");
675
684
  return;
676
685
  }
677
- if (input in VIEW_KEYS2) {
678
- navigate(VIEW_KEYS2[input]);
679
- }
680
686
  }, { isActive: !opts?.disabled });
681
687
  }
682
688
 
@@ -705,14 +711,24 @@ async function markOnboardingComplete() {
705
711
 
706
712
  // src/views/welcome.tsx
707
713
  import { useEffect } from "react";
708
- import { Box as Box4, Text as Text4, useInput as useInput2 } from "ink";
714
+ import { Box as Box4, Text as Text4 } from "ink";
715
+
716
+ // src/hooks/use-view-input.ts
717
+ import { useInput as useInput2 } from "ink";
718
+ function useViewInput(handler, opts) {
719
+ const menuMode = useNavigationStore((s) => s.menuMode);
720
+ const baseActive = opts?.isActive ?? true;
721
+ useInput2(handler, { ...opts, isActive: baseActive && !menuMode });
722
+ }
723
+
724
+ // src/views/welcome.tsx
709
725
  import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
710
726
  function WelcomeView({ onContinue }) {
711
727
  useEffect(() => {
712
728
  return () => {
713
729
  };
714
730
  }, []);
715
- useInput2((input, key) => {
731
+ useViewInput((input, key) => {
716
732
  if (key.return || input === " " || key.escape) {
717
733
  void markOnboardingComplete().finally(onContinue);
718
734
  }
@@ -724,30 +740,30 @@ function WelcomeView({ onContinue }) {
724
740
  /* @__PURE__ */ jsx5(Text4, { color: COLORS.muted, children: t("welcome_keysHeader") }),
725
741
  /* @__PURE__ */ jsxs4(Box4, { flexDirection: "column", paddingLeft: SPACING.sm, marginTop: SPACING.xs, children: [
726
742
  /* @__PURE__ */ jsxs4(Text4, { children: [
727
- /* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "1-9 0" }),
728
- " ",
729
- t("welcome_keyJumpView")
730
- ] }),
731
- /* @__PURE__ */ jsxs4(Text4, { children: [
732
- /* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "Tab" }),
733
- " ",
734
- t("welcome_keyCycleView")
743
+ /* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "m" }),
744
+ " ",
745
+ t("welcome_keyMenu")
735
746
  ] }),
736
747
  /* @__PURE__ */ jsxs4(Text4, { children: [
737
- /* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "j k" }),
748
+ /* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "\u2191 \u2193" }),
738
749
  " ",
739
750
  t("welcome_keyMove")
740
751
  ] }),
741
752
  /* @__PURE__ */ jsxs4(Text4, { children: [
742
- /* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "/" }),
743
- " ",
744
- t("welcome_keySearch")
753
+ /* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "1-9" }),
754
+ " ",
755
+ t("welcome_keyAction")
745
756
  ] }),
746
757
  /* @__PURE__ */ jsxs4(Text4, { children: [
747
758
  /* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "Enter" }),
748
759
  " ",
749
760
  t("welcome_keySelect")
750
761
  ] }),
762
+ /* @__PURE__ */ jsxs4(Text4, { children: [
763
+ /* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "S" }),
764
+ " ",
765
+ t("welcome_keySearch")
766
+ ] }),
751
767
  /* @__PURE__ */ jsxs4(Text4, { children: [
752
768
  /* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "Esc" }),
753
769
  " ",
@@ -838,7 +854,7 @@ function UpgradePrompt({ viewId }) {
838
854
 
839
855
  // src/views/dashboard.tsx
840
856
  import { useEffect as useEffect2, useMemo as useMemo2 } from "react";
841
- import { Box as Box9, Text as Text11, useInput as useInput3, useStdout as useStdout3 } from "ink";
857
+ import { Box as Box9, Text as Text11, useStdout as useStdout3 } from "ink";
842
858
 
843
859
  // src/stores/brew-store.ts
844
860
  import { create as create4 } from "zustand";
@@ -1988,8 +2004,8 @@ function DashboardView() {
1988
2004
  useEffect2(() => {
1989
2005
  fetchAll();
1990
2006
  }, []);
1991
- useInput3((input) => {
1992
- if (input === "r" || input === "R") {
2007
+ useViewInput((input) => {
2008
+ if (input === "r" || input === "R" || input === "1") {
1993
2009
  void fetchAll();
1994
2010
  }
1995
2011
  });
@@ -2096,7 +2112,7 @@ function DashboardView() {
2096
2112
 
2097
2113
  // src/views/installed.tsx
2098
2114
  import { useState as useState3, useMemo as useMemo3, useEffect as useEffect6 } from "react";
2099
- import { Box as Box15, Text as Text17, useInput as useInput5, useStdout as useStdout4 } from "ink";
2115
+ import { Box as Box15, Text as Text17, useStdout as useStdout4 } from "ink";
2100
2116
 
2101
2117
  // src/hooks/use-debounce.ts
2102
2118
  import { useState, useEffect as useEffect3 } from "react";
@@ -2117,7 +2133,7 @@ async function logToHistory(args, success, error) {
2117
2133
  if (!detected) return;
2118
2134
  try {
2119
2135
  const isPro = useLicenseStore.getState().isPro();
2120
- const { appendEntry: appendEntry2 } = await import("./history-logger-FJ3HZSFU.js");
2136
+ const { appendEntry: appendEntry2 } = await import("./history-logger-SB5UG5BQ.js");
2121
2137
  await appendEntry2(isPro, detected.action, detected.packageName, success, error);
2122
2138
  } catch {
2123
2139
  }
@@ -2169,7 +2185,7 @@ function useBrewStream() {
2169
2185
  }
2170
2186
  const MUTATING_COMMANDS = /* @__PURE__ */ new Set(["install", "uninstall", "upgrade", "pin", "unpin", "tap", "untap"]);
2171
2187
  if (!cancelRef.current && MUTATING_COMMANDS.has(args[0] ?? "")) {
2172
- void import("./snapshot-JDRSBMG6.js").then(({ captureSnapshot: captureSnapshot2, saveSnapshot: saveSnapshot2 }) => {
2188
+ void import("./snapshot-ZOJETCED.js").then(({ captureSnapshot: captureSnapshot2, saveSnapshot: saveSnapshot2 }) => {
2173
2189
  captureSnapshot2().then((s) => saveSnapshot2(s)).catch((err) => logger.warn("snapshot: capture/save failed", { error: String(err) }));
2174
2190
  });
2175
2191
  }
@@ -2210,7 +2226,7 @@ function SearchInput({ defaultValue, onChange, placeholder, isActive = true }) {
2210
2226
 
2211
2227
  // src/components/common/confirm-dialog.tsx
2212
2228
  import { useEffect as useEffect5 } from "react";
2213
- import { Box as Box11, Text as Text13, useInput as useInput4 } from "ink";
2229
+ import { Box as Box11, Text as Text13, useInput as useInput3 } from "ink";
2214
2230
  import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
2215
2231
  function ConfirmDialog({ message, onConfirm, onCancel }) {
2216
2232
  const locale = useLocaleStore((s) => s.locale);
@@ -2221,7 +2237,7 @@ function ConfirmDialog({ message, onConfirm, onCancel }) {
2221
2237
  closeModal();
2222
2238
  };
2223
2239
  }, []);
2224
- useInput4((input, key) => {
2240
+ useInput3((input, key) => {
2225
2241
  if (input === "y" || input === "Y") onConfirm();
2226
2242
  else if (locale === "es" && (input === "s" || input === "S")) onConfirm();
2227
2243
  else if (input === "n" || input === "N") onCancel();
@@ -2327,7 +2343,7 @@ function InstalledView() {
2327
2343
  (p) => p.name.toLowerCase().includes(lower) || p.desc.toLowerCase().includes(lower)
2328
2344
  );
2329
2345
  }, [formulae, casks, tab, debouncedFilter]);
2330
- useInput5((input, key) => {
2346
+ useViewInput((input, key) => {
2331
2347
  if (confirmUninstall) return;
2332
2348
  if (stream.isRunning) {
2333
2349
  if (key.escape) stream.cancel();
@@ -2351,7 +2367,7 @@ function InstalledView() {
2351
2367
  setIsSearching(true);
2352
2368
  return;
2353
2369
  }
2354
- if (input === "u" && allItems[cursor]) {
2370
+ if ((input === "u" || input === "1") && allItems[cursor]) {
2355
2371
  setConfirmUninstall(allItems[cursor].name);
2356
2372
  return;
2357
2373
  }
@@ -2366,7 +2382,7 @@ function InstalledView() {
2366
2382
  } else if (key.return && allItems[cursor]) {
2367
2383
  selectPackage(allItems[cursor].name, tab === "formulae" ? "formula" : "cask");
2368
2384
  navigate("package-info");
2369
- } else if (input === "f") {
2385
+ } else if (input === "f" || input === "2") {
2370
2386
  setTab((t2) => t2 === "formulae" ? "casks" : "formulae");
2371
2387
  setCursor(0);
2372
2388
  }
@@ -2487,7 +2503,7 @@ function InstalledView() {
2487
2503
 
2488
2504
  // src/views/search.tsx
2489
2505
  import { useState as useState4, useCallback as useCallback2, useEffect as useEffect7, useRef as useRef2 } from "react";
2490
- import { Box as Box16, Text as Text18, useInput as useInput6 } from "ink";
2506
+ import { Box as Box16, Text as Text18 } from "ink";
2491
2507
  import { TextInput as TextInput2 } from "@inkjs/ui";
2492
2508
  import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
2493
2509
  function SearchView() {
@@ -2541,7 +2557,7 @@ function SearchView() {
2541
2557
  const visibleFormulae = results ? results.formulae.slice(0, MAX_VISIBLE) : [];
2542
2558
  const visibleCasks = results ? results.casks.slice(0, MAX_VISIBLE) : [];
2543
2559
  const allVisible = [...visibleFormulae, ...visibleCasks];
2544
- useInput6((input, key) => {
2560
+ useViewInput((input, key) => {
2545
2561
  if (stream.isRunning) {
2546
2562
  if (key.escape) stream.cancel();
2547
2563
  return;
@@ -2562,7 +2578,7 @@ function SearchView() {
2562
2578
  navigate("package-info");
2563
2579
  return;
2564
2580
  }
2565
- if (input === "i" && allVisible[cursor]) {
2581
+ if ((input === "i" || input === "1") && allVisible[cursor]) {
2566
2582
  setConfirmInstall(allVisible[cursor]);
2567
2583
  return;
2568
2584
  }
@@ -2673,7 +2689,7 @@ function SearchView() {
2673
2689
 
2674
2690
  // src/views/outdated.tsx
2675
2691
  import { useEffect as useEffect8, useMemo as useMemo4, useRef as useRef3, useState as useState5 } from "react";
2676
- import { Box as Box17, Text as Text19, useInput as useInput7, useStdout as useStdout5 } from "ink";
2692
+ import { Box as Box17, Text as Text19, useStdout as useStdout5 } from "ink";
2677
2693
  import { jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
2678
2694
  function ImpactPanel({ impact }) {
2679
2695
  const riskColor = impact.risk === "high" ? COLORS.error : impact.risk === "medium" ? COLORS.warning : COLORS.success;
@@ -2702,6 +2718,7 @@ function OutdatedView() {
2702
2718
  const [cursor, setCursor] = useState5(0);
2703
2719
  const [confirmAction, setConfirmAction] = useState5(null);
2704
2720
  const hasRefreshed = useRef3(false);
2721
+ const pendingUpgradeRef = useRef3(null);
2705
2722
  const [impact, setImpact] = useState5(null);
2706
2723
  const [impactLoading, setImpactLoading] = useState5(false);
2707
2724
  useEffect8(() => {
@@ -2710,7 +2727,20 @@ function OutdatedView() {
2710
2727
  useEffect8(() => {
2711
2728
  if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current) {
2712
2729
  hasRefreshed.current = true;
2713
- void fetchOutdated();
2730
+ void fetchOutdated().then(() => {
2731
+ const pkgs = pendingUpgradeRef.current;
2732
+ if (!pkgs) return;
2733
+ pendingUpgradeRef.current = null;
2734
+ const state = useBrewStore.getState().outdated;
2735
+ const remaining = state.formulae.length + state.casks.length;
2736
+ void writeLastAction({
2737
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
2738
+ action: "upgrade",
2739
+ packages: pkgs,
2740
+ remainingOutdated: remaining,
2741
+ source: "brew-tui"
2742
+ }).catch((err) => logger.warn("Failed to write last-action.json", err));
2743
+ });
2714
2744
  }
2715
2745
  }, [stream.isRunning, stream.error]);
2716
2746
  const allOutdated = useMemo4(
@@ -2745,7 +2775,7 @@ function OutdatedView() {
2745
2775
  cancelled = true;
2746
2776
  };
2747
2777
  }, [debouncedCursor, stream.isRunning]);
2748
- useInput7((input, key) => {
2778
+ useViewInput((input, key) => {
2749
2779
  if (stream.isRunning) {
2750
2780
  if (key.escape) stream.cancel();
2751
2781
  return;
@@ -2755,7 +2785,7 @@ function OutdatedView() {
2755
2785
  stream.clear();
2756
2786
  return;
2757
2787
  }
2758
- if (input === "r") {
2788
+ if (input === "r" || input === "3") {
2759
2789
  stream.clear();
2760
2790
  void fetchOutdated();
2761
2791
  }
@@ -2768,13 +2798,13 @@ function OutdatedView() {
2768
2798
  setCursor((c) => Math.max(c - 1, 0));
2769
2799
  } else if (key.return && allOutdated[cursor]) {
2770
2800
  setConfirmAction({ type: "single", name: allOutdated[cursor].name });
2771
- } else if (input === "A" && allOutdated.length > 0) {
2801
+ } else if ((input === "A" || input === "1") && allOutdated.length > 0) {
2772
2802
  setConfirmAction({ type: "all" });
2773
- } else if (input === "p" && allOutdated[cursor]) {
2803
+ } else if ((input === "p" || input === "2") && allOutdated[cursor]) {
2774
2804
  const pkg = allOutdated[cursor];
2775
2805
  void (pkg.pinned ? unpinPackage(pkg.name) : pinPackage(pkg.name)).then(() => void fetchOutdated());
2776
2806
  return;
2777
- } else if (input === "r") {
2807
+ } else if (input === "r" || input === "3") {
2778
2808
  void fetchOutdated();
2779
2809
  }
2780
2810
  });
@@ -2826,8 +2856,10 @@ ${t("outdated_upgradeAllList", { list: allOutdated.map((p) => p.name).join(", ")
2826
2856
  onConfirm: () => {
2827
2857
  hasRefreshed.current = false;
2828
2858
  if (confirmAction.type === "all") {
2859
+ pendingUpgradeRef.current = allOutdated.map((p) => p.name);
2829
2860
  void stream.run(["upgrade"]);
2830
2861
  } else if (confirmAction.name) {
2862
+ pendingUpgradeRef.current = [confirmAction.name];
2831
2863
  void stream.run(["upgrade", confirmAction.name]);
2832
2864
  }
2833
2865
  setConfirmAction(null);
@@ -2868,7 +2900,7 @@ ${t("outdated_upgradeAllList", { list: allOutdated.map((p) => p.name).join(", ")
2868
2900
 
2869
2901
  // src/views/package-info.tsx
2870
2902
  import { useEffect as useEffect9, useRef as useRef4, useState as useState6 } from "react";
2871
- import { Box as Box18, Text as Text20, useInput as useInput8 } from "ink";
2903
+ import { Box as Box18, Text as Text20 } from "ink";
2872
2904
  import { Fragment as Fragment4, jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
2873
2905
  var ACTION_PROGRESS_KEYS = {
2874
2906
  install: "pkgInfo_installing",
@@ -2932,9 +2964,23 @@ function PackageInfoView() {
2932
2964
  }
2933
2965
  }).catch(() => {
2934
2966
  });
2967
+ const action = activeActionRef.current;
2968
+ if (action === "upgrade" || action === "install" || action === "uninstall") {
2969
+ void useBrewStore.getState().fetchOutdated().then(() => {
2970
+ const out = useBrewStore.getState().outdated;
2971
+ const remaining = out.formulae.length + out.casks.length;
2972
+ void writeLastAction({
2973
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
2974
+ action,
2975
+ packages: [packageName],
2976
+ remainingOutdated: remaining,
2977
+ source: "brew-tui"
2978
+ }).catch((err) => logger.warn("Failed to write last-action.json", err));
2979
+ });
2980
+ }
2935
2981
  }
2936
2982
  }, [stream.isRunning, stream.error]);
2937
- useInput8((input, key) => {
2983
+ useViewInput((input, key) => {
2938
2984
  if (stream.isRunning) {
2939
2985
  if (key.escape) stream.cancel();
2940
2986
  return;
@@ -2942,11 +2988,11 @@ function PackageInfoView() {
2942
2988
  if (confirmAction) return;
2943
2989
  if (!formula) return;
2944
2990
  const isInstalled2 = formula.installed.length > 0;
2945
- if (input === "i" && !isInstalled2) {
2991
+ if ((input === "i" || input === "1") && !isInstalled2) {
2946
2992
  setConfirmAction("install");
2947
- } else if (input === "u" && isInstalled2) {
2993
+ } else if ((input === "u" || input === "2") && isInstalled2) {
2948
2994
  setConfirmAction("uninstall");
2949
- } else if (input === "U" && isInstalled2 && formula.outdated) {
2995
+ } else if ((input === "U" || input === "3") && isInstalled2 && formula.outdated) {
2950
2996
  setConfirmAction("upgrade");
2951
2997
  }
2952
2998
  });
@@ -3066,7 +3112,7 @@ function PackageInfoView() {
3066
3112
 
3067
3113
  // src/views/services.tsx
3068
3114
  import { useEffect as useEffect10, useState as useState7 } from "react";
3069
- import { Box as Box19, Text as Text21, useInput as useInput9, useStdout as useStdout6 } from "ink";
3115
+ import { Box as Box19, Text as Text21, useStdout as useStdout6 } from "ink";
3070
3116
  import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
3071
3117
  var STATUS_VARIANTS = {
3072
3118
  started: "success",
@@ -3094,7 +3140,7 @@ function ServicesView() {
3094
3140
  useEffect10(() => {
3095
3141
  fetchServices();
3096
3142
  }, []);
3097
- useInput9((input, key) => {
3143
+ useViewInput((input, key) => {
3098
3144
  if (actionInProgress) return;
3099
3145
  if (confirmAction) return;
3100
3146
  if (lastError) {
@@ -3104,7 +3150,7 @@ function ServicesView() {
3104
3150
  setCursor((c) => Math.min(c + 1, Math.max(0, services.length - 1)));
3105
3151
  } else if (input === "k" || key.upArrow) {
3106
3152
  setCursor((c) => Math.max(c - 1, 0));
3107
- } else if (input === "r") {
3153
+ } else if (input === "r" || input === "4") {
3108
3154
  void fetchServices();
3109
3155
  }
3110
3156
  const svc = services[cursor];
@@ -3119,9 +3165,9 @@ function ServicesView() {
3119
3165
  if (storeError) setLastError(humaniseServiceError(storeError));
3120
3166
  });
3121
3167
  };
3122
- if (input === "s") doAction("start");
3123
- else if (input === "x") setConfirmAction({ type: "stop", name: svc.name });
3124
- else if (input === "R") setConfirmAction({ type: "restart", name: svc.name });
3168
+ if (input === "s" || input === "1") doAction("start");
3169
+ else if (input === "x" || input === "2") setConfirmAction({ type: "stop", name: svc.name });
3170
+ else if (input === "R" || input === "3") setConfirmAction({ type: "restart", name: svc.name });
3125
3171
  });
3126
3172
  if (loading.services) return /* @__PURE__ */ jsx21(Loading, { message: t("loading_services") });
3127
3173
  if (errors.services) return /* @__PURE__ */ jsx21(ErrorMessage, { message: errors.services });
@@ -3194,7 +3240,7 @@ function ServicesView() {
3194
3240
 
3195
3241
  // src/views/doctor.tsx
3196
3242
  import { useEffect as useEffect11, useRef as useRef5 } from "react";
3197
- import { Box as Box20, Text as Text22, useInput as useInput10 } from "ink";
3243
+ import { Box as Box20, Text as Text22 } from "ink";
3198
3244
  import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
3199
3245
  function DoctorView() {
3200
3246
  const { doctorWarnings, doctorClean, loading, errors, fetchDoctor } = useBrewStore();
@@ -3208,8 +3254,8 @@ function DoctorView() {
3208
3254
  useEffect11(() => {
3209
3255
  fetchDoctor();
3210
3256
  }, []);
3211
- useInput10((input) => {
3212
- if (input === "r") void fetchDoctor();
3257
+ useViewInput((input) => {
3258
+ if (input === "r" || input === "1") void fetchDoctor();
3213
3259
  });
3214
3260
  if (loading.doctor) return /* @__PURE__ */ jsx22(Loading, { message: t("loading_doctor") });
3215
3261
  if (errors.doctor) return /* @__PURE__ */ jsx22(ErrorMessage, { message: errors.doctor });
@@ -3229,7 +3275,7 @@ function DoctorView() {
3229
3275
 
3230
3276
  // src/views/profiles.tsx
3231
3277
  import { useEffect as useEffect12, useRef as useRef6, useState as useState8 } from "react";
3232
- import { Box as Box25, useInput as useInput11 } from "ink";
3278
+ import { Box as Box25 } from "ink";
3233
3279
 
3234
3280
  // src/stores/profile-store.ts
3235
3281
  import { create as create9 } from "zustand";
@@ -3618,13 +3664,13 @@ function ProfilesView() {
3618
3664
  }
3619
3665
  return void 0;
3620
3666
  }, [mode]);
3621
- useInput11((input, key) => {
3667
+ useViewInput((input, key) => {
3622
3668
  if (mode !== "list" || confirmDelete) return;
3623
- if (input === "n") {
3669
+ if (input === "n" || input === "1") {
3624
3670
  setMode("create-name");
3625
3671
  return;
3626
3672
  }
3627
- if (input === "d" && profileNames[cursor]) {
3673
+ if ((input === "d" || input === "4") && profileNames[cursor]) {
3628
3674
  setConfirmDelete(true);
3629
3675
  return;
3630
3676
  }
@@ -3633,25 +3679,25 @@ function ProfilesView() {
3633
3679
  setMode("detail");
3634
3680
  return;
3635
3681
  }
3636
- if (input === "i" && profileNames[cursor]) {
3682
+ if ((input === "i" || input === "3") && profileNames[cursor]) {
3637
3683
  void prepareImport(profileNames[cursor]);
3638
3684
  return;
3639
3685
  }
3640
3686
  if (input === "j" || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, profileNames.length - 1)));
3641
3687
  else if (input === "k" || key.upArrow) setCursor((c) => Math.max(c - 1, 0));
3642
3688
  });
3643
- useInput11((input, key) => {
3689
+ useViewInput((input, key) => {
3644
3690
  if (key.escape || input === "q") {
3645
3691
  setMode("list");
3646
3692
  return;
3647
3693
  }
3648
- if (input === "e" && selectedProfile) {
3694
+ if ((input === "e" || input === "2") && selectedProfile) {
3649
3695
  setEditName(selectedProfile.name);
3650
3696
  setEditDesc(selectedProfile.description);
3651
3697
  setMode("edit-name");
3652
3698
  }
3653
3699
  }, { isActive: mode === "detail" });
3654
- useInput11(() => {
3700
+ useViewInput(() => {
3655
3701
  setMode("list");
3656
3702
  }, { isActive: mode === "importing" && !importRunning });
3657
3703
  const prepareImport = async (name) => {
@@ -3786,7 +3832,7 @@ function ProfilesView() {
3786
3832
 
3787
3833
  // src/views/smart-cleanup.tsx
3788
3834
  import { useEffect as useEffect13, useRef as useRef7, useState as useState9 } from "react";
3789
- import { Box as Box26, Text as Text27, useInput as useInput12 } from "ink";
3835
+ import { Box as Box26, Text as Text27 } from "ink";
3790
3836
 
3791
3837
  // src/stores/cleanup-store.ts
3792
3838
  import { create as create10 } from "zustand";
@@ -3926,17 +3972,17 @@ function SmartCleanupView() {
3926
3972
  }, [stream.isRunning, stream.error]);
3927
3973
  const candidates = summary?.candidates ?? [];
3928
3974
  const isDependencyError = stream.error != null && stream.lines.some((l) => l.includes("Refusing to uninstall") || l.includes("required by"));
3929
- useInput12((input, key) => {
3975
+ useViewInput((input, key) => {
3930
3976
  if (stream.isRunning) {
3931
3977
  if (key.escape) stream.cancel();
3932
3978
  return;
3933
3979
  }
3934
3980
  if (confirmClean || confirmForce) return;
3935
- if (input === "F" && isDependencyError && failedNames.length > 0) {
3981
+ if ((input === "F" || input === "3") && isDependencyError && failedNames.length > 0) {
3936
3982
  setConfirmForce(true);
3937
3983
  return;
3938
3984
  }
3939
- if (input === "r") {
3985
+ if (input === "r" || input === "4") {
3940
3986
  stream.clear();
3941
3987
  setFailedNames([]);
3942
3988
  void analyze();
@@ -3946,11 +3992,11 @@ function SmartCleanupView() {
3946
3992
  toggleSelect(candidates[cursor].name);
3947
3993
  return;
3948
3994
  }
3949
- if (input === "a") {
3995
+ if (input === "a" || input === "1") {
3950
3996
  selectAll();
3951
3997
  return;
3952
3998
  }
3953
- if (input === "c" && selected.size > 0) {
3999
+ if ((input === "c" || input === "2") && selected.size > 0) {
3954
4000
  setConfirmClean(true);
3955
4001
  return;
3956
4002
  }
@@ -4042,7 +4088,7 @@ function SmartCleanupView() {
4042
4088
 
4043
4089
  // src/views/history.tsx
4044
4090
  import { useEffect as useEffect14, useState as useState10, useMemo as useMemo5 } from "react";
4045
- import { Box as Box27, Text as Text28, useInput as useInput13, useStdout as useStdout7 } from "ink";
4091
+ import { Box as Box27, Text as Text28, useStdout as useStdout7 } from "ink";
4046
4092
 
4047
4093
  // src/stores/history-store.ts
4048
4094
  import { create as create11 } from "zustand";
@@ -4128,7 +4174,7 @@ function HistoryView() {
4128
4174
  }
4129
4175
  return result;
4130
4176
  }, [entries, filter, debouncedQuery]);
4131
- useInput13((input, key) => {
4177
+ useViewInput((input, key) => {
4132
4178
  if (confirmClear || confirmReplay || stream.isRunning) return;
4133
4179
  if (isSearching) {
4134
4180
  if (key.escape) {
@@ -4141,13 +4187,13 @@ function HistoryView() {
4141
4187
  setIsSearching(true);
4142
4188
  return;
4143
4189
  }
4144
- if (input === "f") {
4190
+ if (input === "f" || input === "1") {
4145
4191
  const idx = FILTERS.indexOf(filter);
4146
4192
  setFilter(FILTERS[(idx + 1) % FILTERS.length]);
4147
4193
  setCursor(0);
4148
4194
  return;
4149
4195
  }
4150
- if (input === "c" && entries.length > 0) {
4196
+ if ((input === "c" || input === "2") && entries.length > 0) {
4151
4197
  setConfirmClear(true);
4152
4198
  return;
4153
4199
  }
@@ -4242,7 +4288,7 @@ function HistoryView() {
4242
4288
 
4243
4289
  // src/views/security-audit.tsx
4244
4290
  import { useEffect as useEffect15, useState as useState11 } from "react";
4245
- import { Box as Box28, Text as Text29, useInput as useInput14 } from "ink";
4291
+ import { Box as Box28, Text as Text29 } from "ink";
4246
4292
  import { jsx as jsx30, jsxs as jsxs29 } from "react/jsx-runtime";
4247
4293
  var SEVERITY_COLORS = {
4248
4294
  CRITICAL: COLORS.error,
@@ -4272,9 +4318,9 @@ function SecurityAuditView() {
4272
4318
  scan();
4273
4319
  }, []);
4274
4320
  const results = summary?.results ?? [];
4275
- useInput14((input, key) => {
4321
+ useViewInput((input, key) => {
4276
4322
  if (confirmUpgrade || stream.isRunning) return;
4277
- if (input === "r") {
4323
+ if (input === "r" || input === "1") {
4278
4324
  void scan(true);
4279
4325
  return;
4280
4326
  }
@@ -4282,7 +4328,7 @@ function SecurityAuditView() {
4282
4328
  navigate("rollback");
4283
4329
  return;
4284
4330
  }
4285
- if (input === "u" && results[cursor]) {
4331
+ if ((input === "u" || input === "2") && results[cursor]) {
4286
4332
  setConfirmUpgrade(results[cursor].packageName);
4287
4333
  return;
4288
4334
  }
@@ -4374,7 +4420,7 @@ function SecurityAuditView() {
4374
4420
 
4375
4421
  // src/views/account.tsx
4376
4422
  import { useState as useState12 } from "react";
4377
- import { Box as Box29, Text as Text30, useInput as useInput15 } from "ink";
4423
+ import { Box as Box29, Text as Text30 } from "ink";
4378
4424
  import { TextInput as TextInput5 } from "@inkjs/ui";
4379
4425
 
4380
4426
  // src/lib/license/promo.ts
@@ -4462,7 +4508,7 @@ function AccountView() {
4462
4508
  const [promoLoading, setPromoLoading] = useState12(false);
4463
4509
  const [promoResult, setPromoResult] = useState12(null);
4464
4510
  const [revalidating, setRevalidating] = useState12(false);
4465
- useInput15((input, key) => {
4511
+ useViewInput((input, key) => {
4466
4512
  if (confirmDeactivate || deactivating || promoMode || revalidating) {
4467
4513
  if (key.escape && promoMode) {
4468
4514
  setPromoMode(false);
@@ -4470,10 +4516,10 @@ function AccountView() {
4470
4516
  }
4471
4517
  return;
4472
4518
  }
4473
- if (input === "d" && status === "pro") {
4519
+ if ((input === "d" || input === "2") && status === "pro") {
4474
4520
  setConfirmDeactivate(true);
4475
4521
  }
4476
- if (input === "p") {
4522
+ if (input === "p" || input === "1") {
4477
4523
  setPromoMode(true);
4478
4524
  setPromoResult(null);
4479
4525
  }
@@ -4607,14 +4653,14 @@ function AccountView() {
4607
4653
  status === "pro" || status === "team" || status === "expired" ? `v ${t("hint_revalidate")} ` : "",
4608
4654
  revalidating ? t("account_revalidating") : "",
4609
4655
  " ",
4610
- t("app_version", { version: "0.8.1" })
4656
+ t("app_version", { version: "0.9.0" })
4611
4657
  ] }) })
4612
4658
  ] });
4613
4659
  }
4614
4660
 
4615
4661
  // src/views/rollback.tsx
4616
4662
  import { useCallback as useCallback3, useEffect as useEffect16, useRef as useRef8, useState as useState13 } from "react";
4617
- import { Box as Box30, Text as Text31, useInput as useInput16 } from "ink";
4663
+ import { Box as Box30, Text as Text31 } from "ink";
4618
4664
 
4619
4665
  // src/stores/rollback-store.ts
4620
4666
  import { create as create12 } from "zustand";
@@ -4944,7 +4990,7 @@ function RollbackView() {
4944
4990
  }
4945
4991
  }
4946
4992
  }, [isPro]);
4947
- useInput16((input, key) => {
4993
+ useViewInput((input, key) => {
4948
4994
  if (phase === "executing") return;
4949
4995
  if (phase === "result") {
4950
4996
  if (key.escape || input === "r") {
@@ -4973,7 +5019,7 @@ function RollbackView() {
4973
5019
  } else if (key.return && snapshots[cursor]) {
4974
5020
  void selectSnapshot(snapshots[cursor], isPro());
4975
5021
  setPhase("plan");
4976
- } else if (input === "r") {
5022
+ } else if (input === "r" || input === "1") {
4977
5023
  void fetchSnapshots(isPro());
4978
5024
  }
4979
5025
  });
@@ -5038,7 +5084,7 @@ function RollbackView() {
5038
5084
 
5039
5085
  // src/views/brewfile.tsx
5040
5086
  import { useCallback as useCallback4, useEffect as useEffect17, useRef as useRef9, useState as useState14 } from "react";
5041
- import { Box as Box31, Text as Text32, useInput as useInput17 } from "ink";
5087
+ import { Box as Box31, Text as Text32 } from "ink";
5042
5088
  import { TextInput as TextInput6 } from "@inkjs/ui";
5043
5089
  import { jsx as jsx33, jsxs as jsxs32 } from "react/jsx-runtime";
5044
5090
  function DriftScore({ score }) {
@@ -5128,7 +5174,7 @@ function BrewfileView() {
5128
5174
  }
5129
5175
  }
5130
5176
  }, [schema, isPro]);
5131
- useInput17((input, key) => {
5177
+ useViewInput((input, key) => {
5132
5178
  if (phase === "reconciling") return;
5133
5179
  if (phase === "confirming-reconcile") return;
5134
5180
  if (phase === "result") {
@@ -5139,15 +5185,15 @@ function BrewfileView() {
5139
5185
  return;
5140
5186
  }
5141
5187
  if (phase === "creating") return;
5142
- if (input === "n") {
5188
+ if (input === "n" || input === "1") {
5143
5189
  setPhase("creating");
5144
5190
  return;
5145
5191
  }
5146
- if (input === "r") {
5192
+ if (input === "r" || input === "2") {
5147
5193
  void load();
5148
5194
  return;
5149
5195
  }
5150
- if (input === "c") {
5196
+ if (input === "c" || input === "3") {
5151
5197
  const needsReconcile = drift && (drift.missingPackages.length > 0 || drift.wrongVersions.length > 0);
5152
5198
  if (needsReconcile) {
5153
5199
  setPhase("confirming-reconcile");
@@ -5267,7 +5313,7 @@ function BrewfileView() {
5267
5313
 
5268
5314
  // src/views/sync.tsx
5269
5315
  import { useCallback as useCallback5, useEffect as useEffect18, useState as useState15 } from "react";
5270
- import { Box as Box32, Text as Text33, useInput as useInput18 } from "ink";
5316
+ import { Box as Box32, Text as Text33 } from "ink";
5271
5317
  import { Fragment as Fragment6, jsx as jsx34, jsxs as jsxs33 } from "react/jsx-runtime";
5272
5318
  function OverviewSection({
5273
5319
  config,
@@ -5412,7 +5458,7 @@ function SyncView() {
5412
5458
  await resolveConflicts(resolutions);
5413
5459
  setPhase("result");
5414
5460
  }, [conflictEntries, resolveConflicts]);
5415
- useInput18((input, key) => {
5461
+ useViewInput((input, key) => {
5416
5462
  if (phase === "syncing") return;
5417
5463
  if (phase === "confirming-sync" || phase === "confirming-apply") return;
5418
5464
  if (phase === "result") {
@@ -5454,20 +5500,20 @@ function SyncView() {
5454
5500
  return;
5455
5501
  }
5456
5502
  }
5457
- if (input === "s") {
5503
+ if (input === "s" || input === "1") {
5458
5504
  setPhase("confirming-sync");
5459
5505
  return;
5460
5506
  }
5461
- if (input === "c" && conflicts.length > 0) {
5507
+ if ((input === "c" || input === "3") && conflicts.length > 0) {
5462
5508
  setCursor(0);
5463
5509
  setPhase("conflicts");
5464
5510
  return;
5465
5511
  }
5466
- if (input === "c" && lastResult?.success) {
5512
+ if ((input === "c" || input === "3") && lastResult?.success) {
5467
5513
  navigate("compliance");
5468
5514
  return;
5469
5515
  }
5470
- if (input === "r") {
5516
+ if (input === "r" || input === "2") {
5471
5517
  void initialize(isPro());
5472
5518
  return;
5473
5519
  }
@@ -5547,7 +5593,7 @@ function SyncView() {
5547
5593
 
5548
5594
  // src/views/compliance.tsx
5549
5595
  import { useCallback as useCallback6, useEffect as useEffect19, useRef as useRef10, useState as useState16 } from "react";
5550
- import { Box as Box33, Text as Text34, useInput as useInput19 } from "ink";
5596
+ import { Box as Box33, Text as Text34 } from "ink";
5551
5597
  import { TextInput as TextInput7 } from "@inkjs/ui";
5552
5598
 
5553
5599
  // src/lib/compliance/compliance-remediator.ts
@@ -5735,7 +5781,7 @@ function ComplianceView() {
5735
5781
  }
5736
5782
  }
5737
5783
  }, [report, isPro, runCheck]);
5738
- useInput19((input, key) => {
5784
+ useViewInput((input, key) => {
5739
5785
  if (phase === "remediating" || phase === "importing") return;
5740
5786
  if (phase === "confirming-remediate") return;
5741
5787
  if (phase === "result") {
@@ -5745,19 +5791,19 @@ function ComplianceView() {
5745
5791
  }
5746
5792
  return;
5747
5793
  }
5748
- if (input === "i") {
5794
+ if (input === "i" || input === "2") {
5749
5795
  setPhase("importing");
5750
5796
  return;
5751
5797
  }
5752
- if (input === "r" && policy) {
5798
+ if ((input === "r" || input === "1") && policy) {
5753
5799
  handleRecheck();
5754
5800
  return;
5755
5801
  }
5756
- if (input === "e" && report) {
5802
+ if ((input === "e" || input === "3") && report) {
5757
5803
  void handleExport();
5758
5804
  return;
5759
5805
  }
5760
- if (input === "c" && report) {
5806
+ if ((input === "c" || input === "4") && report) {
5761
5807
  const actionable = report.violations.filter(
5762
5808
  (v) => v.type === "missing" || v.type === "wrong-version"
5763
5809
  );
@@ -6015,7 +6061,7 @@ async function reportError(err, context = {}) {
6015
6061
  const config = await resolveConfig();
6016
6062
  if (!config.enabled || !config.endpoint) return;
6017
6063
  const machineId = await getMachineId();
6018
- const version = true ? "0.8.1" : "unknown";
6064
+ const version = true ? "0.9.0" : "unknown";
6019
6065
  await postReport(buildReport("error", err, context, machineId, version), config);
6020
6066
  }
6021
6067
  async function installCrashReporter() {
@@ -6024,7 +6070,7 @@ async function installCrashReporter() {
6024
6070
  if (!config.enabled || !config.endpoint) return;
6025
6071
  _installed = true;
6026
6072
  const machineId = await getMachineId();
6027
- const version = true ? "0.8.1" : "unknown";
6073
+ const version = true ? "0.9.0" : "unknown";
6028
6074
  process.on("uncaughtException", (err) => {
6029
6075
  void postReport(buildReport("fatal", err, { kind: "uncaughtException" }, machineId, version), config);
6030
6076
  });
@@ -6039,7 +6085,7 @@ import { jsx as jsx37 } from "react/jsx-runtime";
6039
6085
  var [, , command, arg] = process.argv;
6040
6086
  async function runCli() {
6041
6087
  if (command === "--version" || command === "-v" || command === "version") {
6042
- process.stdout.write("0.8.1\n");
6088
+ process.stdout.write("0.9.0\n");
6043
6089
  return;
6044
6090
  }
6045
6091
  await ensureDataDirs();
@@ -6134,7 +6180,7 @@ async function runCli() {
6134
6180
  }
6135
6181
  if (isPro) {
6136
6182
  try {
6137
- const { loadSnapshots: loadSnapshots2 } = await import("./snapshot-JDRSBMG6.js");
6183
+ const { loadSnapshots: loadSnapshots2 } = await import("./snapshot-ZOJETCED.js");
6138
6184
  const snapshots = await loadSnapshots2();
6139
6185
  if (snapshots.length > 0) {
6140
6186
  const latest = snapshots[0];
@@ -6146,7 +6192,7 @@ Snapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt)
6146
6192
  } catch {
6147
6193
  }
6148
6194
  try {
6149
- const { loadBrewfile: loadBrewfile2, computeDrift: computeDrift2 } = await import("./brewfile-manager-6LXONGSA.js");
6195
+ const { loadBrewfile: loadBrewfile2, computeDrift: computeDrift2 } = await import("./brewfile-manager-G7Q4IOG3.js");
6150
6196
  const schema = await loadBrewfile2();
6151
6197
  if (schema) {
6152
6198
  const drift = await computeDrift2(schema);
@@ -6155,7 +6201,7 @@ Snapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt)
6155
6201
  } catch {
6156
6202
  }
6157
6203
  try {
6158
- const { loadSyncConfig: loadSyncConfig2 } = await import("./sync-engine-CIL6C44Z.js");
6204
+ const { loadSyncConfig: loadSyncConfig2 } = await import("./sync-engine-IKKIWF2Y.js");
6159
6205
  const syncConfig = await loadSyncConfig2();
6160
6206
  if (syncConfig?.lastSync) {
6161
6207
  console.log(`Sync: last sync ${formatDate(syncConfig.lastSync)}`);
@@ -6164,7 +6210,7 @@ Snapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt)
6164
6210
  }
6165
6211
  try {
6166
6212
  const { loadPolicy: loadPolicy2 } = await import("./policy-io-EECGRKNA.js");
6167
- const { checkCompliance: checkCompliance2 } = await import("./compliance-checker-MAREAFDH.js");
6213
+ const { checkCompliance: checkCompliance2 } = await import("./compliance-checker-IXZHIMQG.js");
6168
6214
  const policy = await loadPolicy2(`${process.env["HOME"] ?? "~"}/.brew-tui/policy.yaml`).catch(() => null);
6169
6215
  if (policy) {
6170
6216
  const report = await checkCompliance2(policy, true);
@@ -6178,7 +6224,7 @@ Snapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt)
6178
6224
  if (command === "install-brewbar") {
6179
6225
  await useLicenseStore.getState().initialize();
6180
6226
  const isPro = useLicenseStore.getState().isPro();
6181
- const { installBrewBar } = await import("./brewbar-installer-DCF37YM3.js");
6227
+ const { installBrewBar } = await import("./brewbar-installer-LCENEWJB.js");
6182
6228
  try {
6183
6229
  await installBrewBar(isPro, arg === "--force");
6184
6230
  console.log(t("cli_brewbarInstalled"));
@@ -6189,7 +6235,7 @@ Snapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt)
6189
6235
  return;
6190
6236
  }
6191
6237
  if (command === "uninstall-brewbar") {
6192
- const { uninstallBrewBar } = await import("./brewbar-installer-DCF37YM3.js");
6238
+ const { uninstallBrewBar } = await import("./brewbar-installer-LCENEWJB.js");
6193
6239
  try {
6194
6240
  await uninstallBrewBar();
6195
6241
  console.log(t("cli_brewbarUninstalled"));
@@ -6220,8 +6266,8 @@ async function ensureBrewBarRunning() {
6220
6266
  if (process.platform !== "darwin") return;
6221
6267
  await useLicenseStore.getState().initialize();
6222
6268
  if (!useLicenseStore.getState().isPro()) return;
6223
- const { isBrewBarInstalled, installBrewBar, launchBrewBar } = await import("./brewbar-installer-DCF37YM3.js");
6224
- const { checkBrewBarVersion } = await import("./version-check-LEJWNDQK.js");
6269
+ const { isBrewBarInstalled, installBrewBar, launchBrewBar } = await import("./brewbar-installer-LCENEWJB.js");
6270
+ const { checkBrewBarVersion } = await import("./version-check-GUAV5TWD.js");
6225
6271
  try {
6226
6272
  if (!await isBrewBarInstalled()) {
6227
6273
  console.log(t("cli_brewbarInstalling"));