opencode-sesh 2.1.8 → 2.3.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.
package/dist/tui.js CHANGED
@@ -299,7 +299,11 @@ function truncate(text, width) {
299
299
  // so cap it a bit lower to guarantee separation.
300
300
  const SIDEBAR_TITLE_WIDTH = 27;
301
301
  const SIDEBAR_GROUP_WIDTH = 30;
302
- const HOME_TITLE_WIDTH = 30;
302
+ const HOME_TITLE_MIN = 20;
303
+ const HOME_DIR_MIN = 8;
304
+ const HOME_HINT_MIN_WIDTH = 32;
305
+ const HOME_DIR_MAX = 22;
306
+ const HOME_AGE_WIDTH = 4;
303
307
 
304
308
  // The sidebar lists every session (newest first, pins ahead) and fills
305
309
  // whatever vertical space it gets: overflow scrolls inside the stretched
@@ -2409,12 +2413,11 @@ const HOME_SESSION_LIMIT = 6;
2409
2413
  // https://github.com/anomalyco/opencode/blob/45898d0f8569225eb1ddb4ee13f8581b34dff311/packages/tui/src/component/prompt/index.tsx#L1676
2410
2414
  // https://github.com/anomalyco/opencode/blob/45898d0f8569225eb1ddb4ee13f8581b34dff311/packages/tui/src/component/logo.tsx
2411
2415
  // https://github.com/anomalyco/opencode/blob/45898d0f8569225eb1ddb4ee13f8581b34dff311/packages/tui/src/feature-plugins/home/footer.tsx
2412
- // The native home needs room for its logo, composer chrome and status footer.
2413
- // Reserve the editor's *maximum* height (one third of the terminal, at least
2414
- // six lines), so typing/wrapping a prompt cannot push it into our footer.
2415
- // Chrome: logo (4) + gap (1) + composer (6) + status (3). Below 44 columns,
2416
- // the logo stacks to seven lines but the three-line status footer disappears.
2417
- const HOME_CHROME_ROWS = 14;
2416
+ // The list floats just under the composer instead of taking layout space, so
2417
+ // it budgets from its measured position: whatever lies between it and the
2418
+ // native status footer (three lines, hidden below 44 columns or 14 rows, plus
2419
+ // one line of slack for other footer plugins).
2420
+ const HOME_FOOTER_ROWS = 3;
2418
2421
  function HomeSessions(props) {
2419
2422
  const theme = () => props.api.theme.current;
2420
2423
  const home = process.env.HOME ?? "";
@@ -2629,12 +2632,42 @@ function HomeSessions(props) {
2629
2632
  const list = q ? entries().filter(entry => entry.title.toLowerCase().includes(q) || entry.dir.toLowerCase().includes(q)) : entries();
2630
2633
  return pinnedFirst(list, props.pins());
2631
2634
  });
2635
+ // Unmeasured (before the first frame) reads as no room.
2636
+ const [top, setTop] = createSignal(dimensions().height);
2637
+ const [listWidth, setListWidth] = createSignal(Math.min(75, dimensions().width));
2638
+ let anchor;
2639
+ // Fixed columns: marker, title (flexes), directory (last segment), age.
2640
+ const columns = () => {
2641
+ const width = Math.max(1, listWidth());
2642
+ const age = HOME_AGE_WIDTH;
2643
+ const wanted = Math.max(0, ...visible().map(entry => rowDir(entry).length));
2644
+ const room = Math.min(HOME_DIR_MAX, wanted, width - 1 - age - 3 - HOME_TITLE_MIN);
2645
+ // A starved title is worse than no directory: drop the column instead.
2646
+ const dir = room >= HOME_DIR_MIN || room >= wanted ? Math.max(0, room) : 0;
2647
+ // The armed-delete prompt may not push the age out of a narrow list.
2648
+ const pending = pendingDelete() ? Math.max(0, Math.min(Math.max(dir, 14), width - 1 - age - 3 - 1)) : dir;
2649
+ return {
2650
+ age,
2651
+ dir: pending,
2652
+ title: Math.max(1, width - 1 - age - pending - (pending > 0 ? 3 : 2))
2653
+ };
2654
+ };
2655
+ const rowDir = entry => `${props.pins().directories.includes(entry.dir) ? "★ " : ""}${home && entry.dir === home ? "~" : shortDir(entry.dir, home)}`;
2656
+ // Running state comes from the host's live session store: no polling here.
2657
+ const isRunning = id => {
2658
+ try {
2659
+ return sidebarMarker(false, props.api.state.session.status(id)) === "running";
2660
+ } catch {
2661
+ return false;
2662
+ }
2663
+ };
2632
2664
  const layout = createMemo(() => {
2633
2665
  const rows = dimensions().height;
2634
- const budget = Math.max(0, rows - Math.max(6, Math.floor(rows / 3)) - HOME_CHROME_ROWS);
2666
+ const footer = dimensions().width >= 44 && rows >= 14 ? HOME_FOOTER_ROWS : 0;
2667
+ const budget = Math.max(0, rows - footer - 1 - top());
2635
2668
  // Drop decorative padding/spacing before sessions. Keep the full list in
2636
2669
  // the picker when even a heading and one session cannot fit.
2637
- const padding = budget >= HOME_SESSION_LIMIT + 2 ? 1 : 0;
2670
+ const padding = budget >= 4 ? 1 : 0;
2638
2671
  const limit = Math.min(HOME_SESSION_LIMIT, Math.max(0, budget - padding - 1));
2639
2672
  const count = Math.max(1, Math.min(filtered().length, limit));
2640
2673
  return {
@@ -2655,47 +2688,50 @@ function HomeSessions(props) {
2655
2688
  var _el$49 = _$createElement("box"),
2656
2689
  _el$50 = _$createElement("box");
2657
2690
  _$insertNode(_el$49, _el$50);
2658
- _$setProp(_el$49, "width", "100%");
2659
- _$setProp(_el$49, "flexShrink", 0);
2691
+ _$use(box => {
2692
+ anchor = box;
2693
+ }, _el$49);
2694
+ _$setProp(_el$49, "renderAfter", () => {
2695
+ const y = anchor?.y;
2696
+ if (y !== undefined && y !== top()) queueMicrotask(() => setTop(y));
2697
+ const width = anchor?.width;
2698
+ if (width && width !== listWidth()) queueMicrotask(() => setListWidth(width));
2699
+ });
2700
+ _$setProp(_el$49, "position", "absolute");
2701
+ _$setProp(_el$49, "top", 1);
2702
+ _$setProp(_el$49, "left", 0);
2703
+ _$setProp(_el$49, "right", 0);
2660
2704
  _$setProp(_el$49, "overflow", "hidden");
2661
- _$setProp(_el$49, "alignItems", "center");
2662
2705
  _$setProp(_el$50, "flexDirection", "column");
2663
2706
  _$setProp(_el$50, "width", "100%");
2664
- _$setProp(_el$50, "maxWidth", 72);
2665
- _$setProp(_el$50, "paddingLeft", 1);
2666
- _$setProp(_el$50, "paddingRight", 1);
2667
2707
  _$insert(_el$50, _$createComponent(Show, {
2668
2708
  get when() {
2669
2709
  return entries().length > 0;
2670
2710
  },
2671
2711
  get fallback() {
2672
2712
  return (() => {
2673
- var _el$64 = _$createElement("box"),
2674
- _el$65 = _$createElement("text"),
2675
- _el$66 = _$createTextNode(`Recent sessions `);
2676
- _$insertNode(_el$64, _el$65);
2677
- _$setProp(_el$64, "height", 1);
2678
- _$setProp(_el$64, "flexShrink", 0);
2679
- _$insertNode(_el$65, _el$66);
2680
- _$setProp(_el$65, "wrapMode", "none");
2681
- _$setProp(_el$65, "overflow", "hidden");
2682
- _$insert(_el$65, () => loadFailed() ? "· list unavailable, will retry" : "· none yet, option+o to browse", null);
2683
- _$effect(_$p => _$setProp(_el$65, "style", {
2713
+ var _el$62 = _$createElement("box"),
2714
+ _el$63 = _$createElement("text"),
2715
+ _el$64 = _$createTextNode(`Recent sessions `);
2716
+ _$insertNode(_el$62, _el$63);
2717
+ _$setProp(_el$62, "height", 1);
2718
+ _$setProp(_el$62, "flexShrink", 0);
2719
+ _$insertNode(_el$63, _el$64);
2720
+ _$setProp(_el$63, "wrapMode", "none");
2721
+ _$setProp(_el$63, "overflow", "hidden");
2722
+ _$insert(_el$63, () => loadFailed() ? "· list unavailable, will retry" : "· none yet, option+o to browse", null);
2723
+ _$effect(_$p => _$setProp(_el$63, "style", {
2684
2724
  fg: theme().textMuted
2685
2725
  }, _$p));
2686
- return _el$64;
2726
+ return _el$62;
2687
2727
  })();
2688
2728
  },
2689
2729
  get children() {
2690
2730
  return [(() => {
2691
2731
  var _el$51 = _$createElement("box"),
2692
2732
  _el$52 = _$createElement("box"),
2693
- _el$53 = _$createElement("text"),
2694
- _el$57 = _$createElement("box"),
2695
- _el$58 = _$createElement("box"),
2696
- _el$59 = _$createElement("text");
2733
+ _el$53 = _$createElement("text");
2697
2734
  _$insertNode(_el$51, _el$52);
2698
- _$insertNode(_el$51, _el$57);
2699
2735
  _$setProp(_el$51, "height", 1);
2700
2736
  _$setProp(_el$51, "flexShrink", 0);
2701
2737
  _$setProp(_el$51, "flexDirection", "row");
@@ -2708,71 +2744,80 @@ function HomeSessions(props) {
2708
2744
  _$setProp(_el$52, "flexShrink", 0);
2709
2745
  _$insertNode(_el$53, _$createTextNode(`Recent sessions`));
2710
2746
  _$setProp(_el$53, "wrapMode", "none");
2711
- _$insert(_el$52, _$createComponent(Show, {
2747
+ _$insert(_el$51, _$createComponent(Show, {
2712
2748
  get when() {
2713
- return dimensions().width >= 68;
2749
+ return listWidth() >= HOME_HINT_MIN_WIDTH || query() || searching();
2714
2750
  },
2715
2751
  get children() {
2716
- var _el$55 = _$createElement("text");
2717
- _$insertNode(_el$55, _$createTextNode(`· option+o for all`));
2718
- _$effect(_$p => _$setProp(_el$55, "style", {
2719
- fg: theme().textMuted
2720
- }, _$p));
2752
+ var _el$55 = _$createElement("box"),
2753
+ _el$56 = _$createElement("box"),
2754
+ _el$57 = _$createElement("text");
2755
+ _$insertNode(_el$55, _el$56);
2756
+ _$setProp(_el$55, "flexDirection", "row");
2757
+ _$setProp(_el$55, "flexShrink", 1);
2758
+ _$setProp(_el$55, "minWidth", 0);
2759
+ _$setProp(_el$55, "gap", 1);
2760
+ _$setProp(_el$55, "paddingLeft", 1);
2761
+ _$setProp(_el$55, "onMouseDown", event => {
2762
+ event.stopPropagation();
2763
+ setSearching(true);
2764
+ });
2765
+ _$insertNode(_el$56, _el$57);
2766
+ _$setProp(_el$56, "flexShrink", 1);
2767
+ _$setProp(_el$56, "minWidth", 0);
2768
+ _$setProp(_el$57, "flexGrow", 1);
2769
+ _$setProp(_el$57, "flexShrink", 1);
2770
+ _$setProp(_el$57, "overflow", "hidden");
2771
+ _$setProp(_el$57, "wrapMode", "none");
2772
+ _$insert(_el$57, () => query() || (searching() ? "" : "option+o all"), null);
2773
+ _$insert(_el$57, () => searching() ? "▏" : "", null);
2774
+ _$insert(_el$55, _$createComponent(Show, {
2775
+ get when() {
2776
+ return query();
2777
+ },
2778
+ get children() {
2779
+ var _el$58 = _$createElement("text");
2780
+ _$insertNode(_el$58, _$createTextNode(`✕`));
2781
+ _$setProp(_el$58, "flexShrink", 0);
2782
+ _$setProp(_el$58, "onMouseDown", () => setQuery(""));
2783
+ _$effect(_$p => _$setProp(_el$58, "style", {
2784
+ fg: theme().textMuted
2785
+ }, _$p));
2786
+ return _el$58;
2787
+ }
2788
+ }), null);
2789
+ _$effect(_p$ => {
2790
+ var _v$29 = searching() ? theme().backgroundElement : RGBA.fromInts(0, 0, 0, 0),
2791
+ _v$30 = query() || searching() ? 24 : 12,
2792
+ _v$31 = query() ? undefined : TextAttributes.DIM,
2793
+ _v$32 = {
2794
+ fg: query() ? theme().text : theme().textMuted
2795
+ };
2796
+ _v$29 !== _p$.e && (_p$.e = _$setProp(_el$55, "backgroundColor", _v$29, _p$.e));
2797
+ _v$30 !== _p$.t && (_p$.t = _$setProp(_el$56, "width", _v$30, _p$.t));
2798
+ _v$31 !== _p$.a && (_p$.a = _$setProp(_el$57, "attributes", _v$31, _p$.a));
2799
+ _v$32 !== _p$.o && (_p$.o = _$setProp(_el$57, "style", _v$32, _p$.o));
2800
+ return _p$;
2801
+ }, {
2802
+ e: undefined,
2803
+ t: undefined,
2804
+ a: undefined,
2805
+ o: undefined
2806
+ });
2721
2807
  return _el$55;
2722
2808
  }
2723
2809
  }), null);
2724
- _$insertNode(_el$57, _el$58);
2725
- _$setProp(_el$57, "flexDirection", "row");
2726
- _$setProp(_el$57, "flexShrink", 1);
2727
- _$setProp(_el$57, "minWidth", 0);
2728
- _$setProp(_el$57, "gap", 1);
2729
- _$setProp(_el$57, "paddingLeft", 1);
2730
- _$setProp(_el$57, "paddingRight", 1);
2731
- _$setProp(_el$57, "onMouseDown", event => {
2732
- event.stopPropagation();
2733
- setSearching(true);
2734
- });
2735
- _$insertNode(_el$58, _el$59);
2736
- _$setProp(_el$58, "width", 24);
2737
- _$setProp(_el$58, "flexShrink", 1);
2738
- _$setProp(_el$58, "minWidth", 0);
2739
- _$setProp(_el$59, "flexGrow", 1);
2740
- _$setProp(_el$59, "flexShrink", 1);
2741
- _$setProp(_el$59, "overflow", "hidden");
2742
- _$setProp(_el$59, "wrapMode", "none");
2743
- _$insert(_el$59, () => query() || (searching() ? "" : "search…"), null);
2744
- _$insert(_el$59, () => searching() ? "▏" : "", null);
2745
- _$insert(_el$57, _$createComponent(Show, {
2746
- get when() {
2747
- return query();
2748
- },
2749
- get children() {
2750
- var _el$60 = _$createElement("text");
2751
- _$insertNode(_el$60, _$createTextNode(`✕`));
2752
- _$setProp(_el$60, "flexShrink", 0);
2753
- _$setProp(_el$60, "onMouseDown", () => setQuery(""));
2754
- _$effect(_$p => _$setProp(_el$60, "style", {
2755
- fg: theme().textMuted
2756
- }, _$p));
2757
- return _el$60;
2758
- }
2759
- }), null);
2760
2810
  _$effect(_p$ => {
2761
- var _v$29 = {
2811
+ var _v$33 = TextAttributes.DIM,
2812
+ _v$34 = {
2762
2813
  fg: theme().textMuted
2763
- },
2764
- _v$30 = searching() ? theme().backgroundElement : RGBA.fromInts(0, 0, 0, 0),
2765
- _v$31 = {
2766
- fg: query() ? theme().text : theme().textMuted
2767
2814
  };
2768
- _v$29 !== _p$.e && (_p$.e = _$setProp(_el$53, "style", _v$29, _p$.e));
2769
- _v$30 !== _p$.t && (_p$.t = _$setProp(_el$57, "backgroundColor", _v$30, _p$.t));
2770
- _v$31 !== _p$.a && (_p$.a = _$setProp(_el$59, "style", _v$31, _p$.a));
2815
+ _v$33 !== _p$.e && (_p$.e = _$setProp(_el$53, "attributes", _v$33, _p$.e));
2816
+ _v$34 !== _p$.t && (_p$.t = _$setProp(_el$53, "style", _v$34, _p$.t));
2771
2817
  return _p$;
2772
2818
  }, {
2773
2819
  e: undefined,
2774
- t: undefined,
2775
- a: undefined
2820
+ t: undefined
2776
2821
  });
2777
2822
  return _el$51;
2778
2823
  })(), _$createComponent(For, {
@@ -2780,26 +2825,31 @@ function HomeSessions(props) {
2780
2825
  return visible();
2781
2826
  },
2782
2827
  children: entry => (() => {
2783
- var _el$67 = _$createElement("box"),
2784
- _el$68 = _$createElement("text"),
2785
- _el$70 = _$createElement("text");
2786
- _$insertNode(_el$67, _el$68);
2787
- _$insertNode(_el$67, _el$70);
2788
- _$setProp(_el$67, "height", 1);
2789
- _$setProp(_el$67, "flexShrink", 0);
2790
- _$setProp(_el$67, "overflow", "hidden");
2791
- _$setProp(_el$67, "flexDirection", "row");
2792
- _$setProp(_el$67, "gap", 1);
2793
- _$setProp(_el$67, "onMouseOver", () => setHovered(entry.id));
2794
- _$setProp(_el$67, "onMouseOut", () => setHovered(undefined));
2795
- _$setProp(_el$67, "onMouseDown", event => event.button === RIGHT_BUTTON ? openInCmuxWorkspace(props.api, entry) : props.api.route.navigate("session", {
2828
+ var _el$65 = _$createElement("box"),
2829
+ _el$66 = _$createElement("text"),
2830
+ _el$67 = _$createElement("box"),
2831
+ _el$69 = _$createElement("text");
2832
+ _$insertNode(_el$65, _el$66);
2833
+ _$insertNode(_el$65, _el$67);
2834
+ _$insertNode(_el$65, _el$69);
2835
+ _$setProp(_el$65, "height", 1);
2836
+ _$setProp(_el$65, "flexShrink", 0);
2837
+ _$setProp(_el$65, "overflow", "hidden");
2838
+ _$setProp(_el$65, "flexDirection", "row");
2839
+ _$setProp(_el$65, "gap", 1);
2840
+ _$setProp(_el$65, "onMouseOver", () => setHovered(entry.id));
2841
+ _$setProp(_el$65, "onMouseOut", () => setHovered(undefined));
2842
+ _$setProp(_el$65, "onMouseDown", event => event.button === RIGHT_BUTTON ? openInCmuxWorkspace(props.api, entry) : props.api.route.navigate("session", {
2796
2843
  sessionID: entry.id
2797
2844
  }));
2798
- _$insertNode(_el$68, _$createTextNode(`○`));
2799
- _$setProp(_el$68, "flexShrink", 0);
2845
+ _$setProp(_el$66, "width", 1);
2846
+ _$setProp(_el$66, "flexShrink", 0);
2847
+ _$insert(_el$66, () => isRunning(entry.id) ? "●" : "○");
2848
+ _$setProp(_el$67, "flexShrink", 0);
2849
+ _$setProp(_el$67, "overflow", "hidden");
2800
2850
  _$insert(_el$67, _$createComponent(Highlighted, {
2801
2851
  get text() {
2802
- return `${props.pins().sessions.includes(entry.id) ? "★ " : ""}${truncate(entry.title, HOME_TITLE_WIDTH - (props.pins().sessions.includes(entry.id) ? 2 : 0))}`;
2852
+ return truncate(`${props.pins().sessions.includes(entry.id) ? "★ " : ""}${entry.title}`, columns().title);
2803
2853
  },
2804
2854
  get query() {
2805
2855
  return query();
@@ -2810,64 +2860,94 @@ function HomeSessions(props) {
2810
2860
  get matchColor() {
2811
2861
  return theme().warning;
2812
2862
  }
2813
- }), _el$70);
2814
- _$setProp(_el$70, "flexShrink", 1);
2815
- _$setProp(_el$70, "wrapMode", "none");
2816
- _$setProp(_el$70, "overflow", "hidden");
2817
- _$insert(_el$70, (() => {
2818
- var _c$5 = _$memo(() => pendingDelete() === entry.id);
2819
- return () => _c$5() ? "option+d again" : `${props.pins().directories.includes(entry.dir) ? "★ " : ""}${prettyDir(entry.dir, home)} · ${ago(entry.updated)}`;
2820
- })());
2863
+ }));
2864
+ _$insert(_el$65, _$createComponent(Show, {
2865
+ get when() {
2866
+ return columns().dir > 0;
2867
+ },
2868
+ get children() {
2869
+ var _el$68 = _$createElement("text");
2870
+ _$setProp(_el$68, "flexShrink", 0);
2871
+ _$setProp(_el$68, "wrapMode", "none");
2872
+ _$setProp(_el$68, "overflow", "hidden");
2873
+ _$insert(_el$68, () => truncate(pendingDelete() === entry.id ? "option+d again" : rowDir(entry), columns().dir));
2874
+ _$effect(_p$ => {
2875
+ var _v$39 = columns().dir,
2876
+ _v$40 = pendingDelete() === entry.id ? undefined : TextAttributes.DIM,
2877
+ _v$41 = {
2878
+ fg: pendingDelete() === entry.id ? theme().error : theme().textMuted
2879
+ };
2880
+ _v$39 !== _p$.e && (_p$.e = _$setProp(_el$68, "width", _v$39, _p$.e));
2881
+ _v$40 !== _p$.t && (_p$.t = _$setProp(_el$68, "attributes", _v$40, _p$.t));
2882
+ _v$41 !== _p$.a && (_p$.a = _$setProp(_el$68, "style", _v$41, _p$.a));
2883
+ return _p$;
2884
+ }, {
2885
+ e: undefined,
2886
+ t: undefined,
2887
+ a: undefined
2888
+ });
2889
+ return _el$68;
2890
+ }
2891
+ }), _el$69);
2892
+ _$setProp(_el$69, "flexShrink", 0);
2893
+ _$setProp(_el$69, "wrapMode", "none");
2894
+ _$insert(_el$69, () => ago(entry.updated).padStart(columns().age));
2821
2895
  _$effect(_p$ => {
2822
- var _v$36 = entry.id === hovered() ? theme().backgroundElement : RGBA.fromInts(0, 0, 0, 0),
2823
- _v$37 = {
2824
- fg: theme().textMuted
2896
+ var _v$42 = entry.id === hovered() ? theme().backgroundElement : RGBA.fromInts(0, 0, 0, 0),
2897
+ _v$43 = {
2898
+ fg: isRunning(entry.id) ? theme().success : theme().textMuted
2825
2899
  },
2826
- _v$38 = Math.max(0, Math.floor((Math.min(72, dimensions().width) - 4) / 2)),
2827
- _v$39 = {
2828
- fg: pendingDelete() === entry.id ? theme().error : theme().textMuted
2900
+ _v$44 = columns().title,
2901
+ _v$45 = columns().age,
2902
+ _v$46 = TextAttributes.DIM,
2903
+ _v$47 = {
2904
+ fg: theme().textMuted
2829
2905
  };
2830
- _v$36 !== _p$.e && (_p$.e = _$setProp(_el$67, "backgroundColor", _v$36, _p$.e));
2831
- _v$37 !== _p$.t && (_p$.t = _$setProp(_el$68, "style", _v$37, _p$.t));
2832
- _v$38 !== _p$.a && (_p$.a = _$setProp(_el$70, "maxWidth", _v$38, _p$.a));
2833
- _v$39 !== _p$.o && (_p$.o = _$setProp(_el$70, "style", _v$39, _p$.o));
2906
+ _v$42 !== _p$.e && (_p$.e = _$setProp(_el$65, "backgroundColor", _v$42, _p$.e));
2907
+ _v$43 !== _p$.t && (_p$.t = _$setProp(_el$66, "style", _v$43, _p$.t));
2908
+ _v$44 !== _p$.a && (_p$.a = _$setProp(_el$67, "width", _v$44, _p$.a));
2909
+ _v$45 !== _p$.o && (_p$.o = _$setProp(_el$69, "width", _v$45, _p$.o));
2910
+ _v$46 !== _p$.i && (_p$.i = _$setProp(_el$69, "attributes", _v$46, _p$.i));
2911
+ _v$47 !== _p$.n && (_p$.n = _$setProp(_el$69, "style", _v$47, _p$.n));
2834
2912
  return _p$;
2835
2913
  }, {
2836
2914
  e: undefined,
2837
2915
  t: undefined,
2838
2916
  a: undefined,
2839
- o: undefined
2917
+ o: undefined,
2918
+ i: undefined,
2919
+ n: undefined
2840
2920
  });
2841
- return _el$67;
2921
+ return _el$65;
2842
2922
  })()
2843
2923
  }), _$createComponent(Show, {
2844
2924
  get when() {
2845
2925
  return visible().length === 0;
2846
2926
  },
2847
2927
  get children() {
2848
- var _el$62 = _$createElement("text");
2849
- _$insertNode(_el$62, _$createTextNode(`No title or directory matches · option+o to search transcripts`));
2850
- _$setProp(_el$62, "height", 1);
2851
- _$setProp(_el$62, "flexShrink", 0);
2852
- _$setProp(_el$62, "wrapMode", "none");
2853
- _$setProp(_el$62, "overflow", "hidden");
2854
- _$effect(_$p => _$setProp(_el$62, "style", {
2928
+ var _el$60 = _$createElement("text");
2929
+ _$insertNode(_el$60, _$createTextNode(`No title or directory matches · option+o to search transcripts`));
2930
+ _$setProp(_el$60, "height", 1);
2931
+ _$setProp(_el$60, "flexShrink", 0);
2932
+ _$setProp(_el$60, "wrapMode", "none");
2933
+ _$setProp(_el$60, "overflow", "hidden");
2934
+ _$effect(_$p => _$setProp(_el$60, "style", {
2855
2935
  fg: theme().textMuted
2856
2936
  }, _$p));
2857
- return _el$62;
2937
+ return _el$60;
2858
2938
  }
2859
2939
  })];
2860
2940
  }
2861
2941
  }));
2862
2942
  _$effect(_p$ => {
2863
- var _v$32 = layout().limit > 0,
2864
- _v$33 = layout().budget,
2865
- _v$34 = layout().padding,
2866
- _v$35 = layout().gap;
2867
- _v$32 !== _p$.e && (_p$.e = _$setProp(_el$49, "visible", _v$32, _p$.e));
2868
- _v$33 !== _p$.t && (_p$.t = _$setProp(_el$49, "maxHeight", _v$33, _p$.t));
2869
- _v$34 !== _p$.a && (_p$.a = _$setProp(_el$50, "paddingTop", _v$34, _p$.a));
2870
- _v$35 !== _p$.o && (_p$.o = _$setProp(_el$50, "gap", _v$35, _p$.o));
2943
+ var _v$35 = layout().budget,
2944
+ _v$36 = layout().limit > 0 && props.api.route.current.name === "home",
2945
+ _v$37 = layout().padding,
2946
+ _v$38 = layout().gap;
2947
+ _v$35 !== _p$.e && (_p$.e = _$setProp(_el$49, "maxHeight", _v$35, _p$.e));
2948
+ _v$36 !== _p$.t && (_p$.t = _$setProp(_el$50, "visible", _v$36, _p$.t));
2949
+ _v$37 !== _p$.a && (_p$.a = _$setProp(_el$50, "paddingTop", _v$37, _p$.a));
2950
+ _v$38 !== _p$.o && (_p$.o = _$setProp(_el$50, "gap", _v$38, _p$.o));
2871
2951
  return _p$;
2872
2952
  }, {
2873
2953
  e: undefined,
@@ -2878,6 +2958,31 @@ function HomeSessions(props) {
2878
2958
  return _el$49;
2879
2959
  })();
2880
2960
  }
2961
+
2962
+ // prompt.footer also mounts in session composers: only home subscribes to polling.
2963
+ function HomeBottom(props) {
2964
+ return _$createComponent(Show, {
2965
+ get when() {
2966
+ return props.api.route.current.name === "home";
2967
+ },
2968
+ get children() {
2969
+ return _$createComponent(HomeSessions, {
2970
+ get api() {
2971
+ return props.api;
2972
+ },
2973
+ get pins() {
2974
+ return props.pins;
2975
+ },
2976
+ get onTogglePin() {
2977
+ return props.onTogglePin;
2978
+ },
2979
+ get poll() {
2980
+ return props.poll;
2981
+ }
2982
+ });
2983
+ }
2984
+ });
2985
+ }
2881
2986
  const tui = async api => {
2882
2987
  const [pins, setPins] = createSignal(emptyPins());
2883
2988
  // Keep exploratory context while the plugin remains loaded; a full OpenCode
@@ -2922,7 +3027,7 @@ const tui = async api => {
2922
3027
  });
2923
3028
  },
2924
3029
  home_bottom() {
2925
- return _$createComponent(HomeSessions, {
3030
+ return _$createComponent(HomeBottom, {
2926
3031
  api: api,
2927
3032
  pins: pins,
2928
3033
  onTogglePin: onTogglePin,
@@ -3431,64 +3536,64 @@ const tui = async api => {
3431
3536
  if (previewTimer) clearTimeout(previewTimer);
3432
3537
  };
3433
3538
  api.ui.dialog.replace(() => (() => {
3434
- var _el$71 = _$createElement("box"),
3539
+ var _el$70 = _$createElement("box"),
3540
+ _el$71 = _$createElement("box"),
3435
3541
  _el$72 = _$createElement("box"),
3436
- _el$73 = _$createElement("box"),
3437
- _el$74 = _$createElement("text"),
3438
- _el$75 = _$createTextNode(`Sessions `),
3439
- _el$76 = _$createElement("span"),
3440
- _el$77 = _$createTextNode(`(`),
3441
- _el$78 = _$createTextNode(`)`),
3442
- _el$79 = _$createElement("text"),
3443
- _el$81 = _$createElement("box"),
3444
- _el$82 = _$createElement("input"),
3445
- _el$85 = _$createElement("box"),
3542
+ _el$73 = _$createElement("text"),
3543
+ _el$74 = _$createTextNode(`Sessions `),
3544
+ _el$75 = _$createElement("span"),
3545
+ _el$76 = _$createTextNode(`(`),
3546
+ _el$77 = _$createTextNode(`)`),
3547
+ _el$78 = _$createElement("text"),
3548
+ _el$80 = _$createElement("box"),
3549
+ _el$81 = _$createElement("input"),
3550
+ _el$84 = _$createElement("box"),
3551
+ _el$85 = _$createElement("text"),
3446
3552
  _el$86 = _$createElement("text"),
3447
3553
  _el$87 = _$createElement("text"),
3448
- _el$88 = _$createElement("text"),
3449
- _el$89 = _$createElement("box"),
3450
- _el$92 = _$createElement("box"),
3451
- _el$93 = _$createElement("text");
3554
+ _el$88 = _$createElement("box"),
3555
+ _el$91 = _$createElement("box"),
3556
+ _el$92 = _$createElement("text");
3557
+ _$insertNode(_el$70, _el$71);
3558
+ _$insertNode(_el$70, _el$88);
3559
+ _$insertNode(_el$70, _el$91);
3560
+ _$setProp(_el$70, "flexDirection", "column");
3561
+ _$setProp(_el$70, "paddingTop", 1);
3562
+ _$setProp(_el$70, "paddingBottom", 1);
3563
+ _$setProp(_el$70, "gap", 1);
3452
3564
  _$insertNode(_el$71, _el$72);
3453
- _$insertNode(_el$71, _el$89);
3454
- _$insertNode(_el$71, _el$92);
3455
- _$setProp(_el$71, "flexDirection", "column");
3456
- _$setProp(_el$71, "paddingTop", 1);
3457
- _$setProp(_el$71, "paddingBottom", 1);
3458
- _$setProp(_el$71, "gap", 1);
3565
+ _$insertNode(_el$71, _el$80);
3566
+ _$insertNode(_el$71, _el$84);
3567
+ _$setProp(_el$71, "paddingLeft", 4);
3568
+ _$setProp(_el$71, "paddingRight", 4);
3459
3569
  _$insertNode(_el$72, _el$73);
3460
- _$insertNode(_el$72, _el$81);
3461
- _$insertNode(_el$72, _el$85);
3462
- _$setProp(_el$72, "paddingLeft", 4);
3463
- _$setProp(_el$72, "paddingRight", 4);
3570
+ _$insertNode(_el$72, _el$78);
3571
+ _$setProp(_el$72, "flexDirection", "row");
3572
+ _$setProp(_el$72, "justifyContent", "space-between");
3464
3573
  _$insertNode(_el$73, _el$74);
3465
- _$insertNode(_el$73, _el$79);
3466
- _$setProp(_el$73, "flexDirection", "row");
3467
- _$setProp(_el$73, "justifyContent", "space-between");
3468
- _$insertNode(_el$74, _el$75);
3469
- _$insertNode(_el$74, _el$76);
3470
- _$insertNode(_el$76, _el$77);
3471
- _$insertNode(_el$76, _el$78);
3472
- _$insert(_el$76, () => selectableEntries().length, _el$78);
3473
- _$insertNode(_el$79, _$createTextNode(`esc`));
3474
- _$setProp(_el$79, "onMouseUp", close);
3475
- _$insertNode(_el$81, _el$82);
3476
- _$setProp(_el$81, "paddingTop", 1);
3477
- _$setProp(_el$82, "focused", true);
3478
- _$setProp(_el$82, "placeholder", "Search title, directory, transcript…");
3479
- _$setProp(_el$82, "cursorStyle", {
3574
+ _$insertNode(_el$73, _el$75);
3575
+ _$insertNode(_el$75, _el$76);
3576
+ _$insertNode(_el$75, _el$77);
3577
+ _$insert(_el$75, () => selectableEntries().length, _el$77);
3578
+ _$insertNode(_el$78, _$createTextNode(`esc`));
3579
+ _$setProp(_el$78, "onMouseUp", close);
3580
+ _$insertNode(_el$80, _el$81);
3581
+ _$setProp(_el$80, "paddingTop", 1);
3582
+ _$setProp(_el$81, "focused", true);
3583
+ _$setProp(_el$81, "placeholder", "Search title, directory, transcript…");
3584
+ _$setProp(_el$81, "cursorStyle", {
3480
3585
  style: "line",
3481
3586
  blinking: false
3482
3587
  });
3483
- _$setProp(_el$82, "onInput", value => {
3588
+ _$setProp(_el$81, "onInput", value => {
3484
3589
  if (pendingDelete()) return;
3485
3590
  setQuery(value);
3486
3591
  });
3487
- _$setProp(_el$82, "onSubmit", () => {
3592
+ _$setProp(_el$81, "onSubmit", () => {
3488
3593
  if (confirmArmed()) return;
3489
3594
  choose();
3490
3595
  });
3491
- _$setProp(_el$82, "onKeyDown", event => {
3596
+ _$setProp(_el$81, "onKeyDown", event => {
3492
3597
  if (event.name === "escape") {
3493
3598
  event.preventDefault();
3494
3599
  handleEscape();
@@ -3520,92 +3625,92 @@ const tui = async api => {
3520
3625
  }
3521
3626
  }
3522
3627
  });
3523
- _$insert(_el$72, _$createComponent(Show, {
3628
+ _$insert(_el$71, _$createComponent(Show, {
3524
3629
  get when() {
3525
3630
  return coverageLabel();
3526
3631
  },
3527
3632
  get children() {
3528
- var _el$83 = _$createElement("box"),
3529
- _el$84 = _$createElement("text");
3530
- _$insertNode(_el$83, _el$84);
3531
- _$setProp(_el$83, "paddingTop", 1);
3532
- _$insert(_el$84, coverageLabel);
3533
- _$effect(_$p => _$setProp(_el$84, "style", {
3633
+ var _el$82 = _$createElement("box"),
3634
+ _el$83 = _$createElement("text");
3635
+ _$insertNode(_el$82, _el$83);
3636
+ _$setProp(_el$82, "paddingTop", 1);
3637
+ _$insert(_el$83, coverageLabel);
3638
+ _$effect(_$p => _$setProp(_el$83, "style", {
3534
3639
  fg: api.theme.current.textMuted
3535
3640
  }, _$p));
3536
- return _el$83;
3641
+ return _el$82;
3537
3642
  }
3538
- }), _el$85);
3539
- _$insertNode(_el$85, _el$86);
3540
- _$insertNode(_el$85, _el$87);
3541
- _$insertNode(_el$85, _el$88);
3542
- _$setProp(_el$85, "flexDirection", "row");
3543
- _$setProp(_el$85, "gap", 2);
3544
- _$setProp(_el$85, "paddingTop", 1);
3545
- _$setProp(_el$86, "onMouseDown", () => {
3643
+ }), _el$84);
3644
+ _$insertNode(_el$84, _el$85);
3645
+ _$insertNode(_el$84, _el$86);
3646
+ _$insertNode(_el$84, _el$87);
3647
+ _$setProp(_el$84, "flexDirection", "row");
3648
+ _$setProp(_el$84, "gap", 2);
3649
+ _$setProp(_el$84, "paddingTop", 1);
3650
+ _$setProp(_el$85, "onMouseDown", () => {
3546
3651
  const group = currentProject();
3547
3652
  if (group) setScope(scope() === group ? undefined : group);else api.ui.toast({
3548
3653
  message: "No current project to filter",
3549
3654
  variant: "info"
3550
3655
  });
3551
3656
  });
3552
- _$insert(_el$86, (() => {
3553
- var _c$6 = _$memo(() => !!scope());
3554
- return () => _c$6() ? `Project: ${truncate(scope(), 22)}` : "Project: all";
3657
+ _$insert(_el$85, (() => {
3658
+ var _c$5 = _$memo(() => !!scope());
3659
+ return () => _c$5() ? `Project: ${truncate(scope(), 22)}` : "Project: all";
3555
3660
  })());
3556
- _$setProp(_el$87, "onMouseDown", () => setWaitingOnly(value => !value));
3557
- _$insert(_el$87, () => waitingOnly() ? "● Needs input" : "○ Needs input");
3558
- _$setProp(_el$88, "onMouseDown", () => setPinnedOnly(value => !value));
3559
- _$insert(_el$88, () => pinnedOnly() ? "★ Pinned" : "☆ Pinned");
3560
- _$setProp(_el$89, "flexDirection", "column");
3561
- _$setProp(_el$89, "flexGrow", 1);
3562
- _$setProp(_el$89, "overflow", "hidden");
3563
- _$setProp(_el$89, "onMouseScroll", event => {
3661
+ _$setProp(_el$86, "onMouseDown", () => setWaitingOnly(value => !value));
3662
+ _$insert(_el$86, () => waitingOnly() ? "● Needs input" : "○ Needs input");
3663
+ _$setProp(_el$87, "onMouseDown", () => setPinnedOnly(value => !value));
3664
+ _$insert(_el$87, () => pinnedOnly() ? "★ Pinned" : "☆ Pinned");
3665
+ _$setProp(_el$88, "flexDirection", "column");
3666
+ _$setProp(_el$88, "flexGrow", 1);
3667
+ _$setProp(_el$88, "overflow", "hidden");
3668
+ _$setProp(_el$88, "onMouseScroll", event => {
3564
3669
  scrollPicker(event.scroll);
3565
3670
  });
3566
- _$insert(_el$89, _$createComponent(For, {
3671
+ _$insert(_el$88, _$createComponent(For, {
3567
3672
  get each() {
3568
3673
  return visiblePickerRows();
3569
3674
  },
3570
3675
  children: row => {
3571
3676
  if (row.kind === "group") return (() => {
3572
- var _el$106 = _$createElement("box"),
3677
+ var _el$105 = _$createElement("box"),
3678
+ _el$106 = _$createElement("text"),
3573
3679
  _el$107 = _$createElement("text"),
3574
- _el$108 = _$createElement("text"),
3575
- _el$109 = _$createTextNode(` (`),
3576
- _el$110 = _$createTextNode(`)`);
3577
- _$insertNode(_el$106, _el$107);
3578
- _$insertNode(_el$106, _el$108);
3579
- _$setProp(_el$106, "flexDirection", "row");
3580
- _$setProp(_el$106, "paddingLeft", 4);
3581
- _$setProp(_el$106, "paddingRight", 4);
3582
- _$setProp(_el$106, "onMouseDown", () => setCollapsed(state => ({
3680
+ _el$108 = _$createTextNode(` (`),
3681
+ _el$109 = _$createTextNode(`)`);
3682
+ _$insertNode(_el$105, _el$106);
3683
+ _$insertNode(_el$105, _el$107);
3684
+ _$setProp(_el$105, "flexDirection", "row");
3685
+ _$setProp(_el$105, "paddingLeft", 4);
3686
+ _$setProp(_el$105, "paddingRight", 4);
3687
+ _$setProp(_el$105, "onMouseDown", () => setCollapsed(state => ({
3583
3688
  ...state,
3584
3689
  [row.dir]: !state[row.dir]
3585
3690
  })));
3586
- _$setProp(_el$107, "flexGrow", 1);
3587
- _$setProp(_el$107, "flexShrink", 1);
3588
- _$setProp(_el$107, "wrapMode", "none");
3589
- _$insert(_el$107, () => collapsed()[row.dir] && !query().trim() ? "▸ " : "▾ ", null);
3590
- _$insert(_el$107, () => row.pinned ? "★ " : "", null);
3591
- _$insert(_el$107, () => row.label, null);
3592
- _$insertNode(_el$108, _el$109);
3593
- _$insertNode(_el$108, _el$110);
3594
- _$setProp(_el$108, "flexShrink", 0);
3595
- _$insert(_el$108, () => row.count, _el$110);
3691
+ _$setProp(_el$106, "flexGrow", 1);
3692
+ _$setProp(_el$106, "flexShrink", 1);
3693
+ _$setProp(_el$106, "wrapMode", "none");
3694
+ _$insert(_el$106, () => collapsed()[row.dir] && !query().trim() ? "▸ " : "▾ ", null);
3695
+ _$insert(_el$106, () => row.pinned ? "★ " : "", null);
3696
+ _$insert(_el$106, () => row.label, null);
3697
+ _$insertNode(_el$107, _el$108);
3698
+ _$insertNode(_el$107, _el$109);
3699
+ _$setProp(_el$107, "flexShrink", 0);
3700
+ _$insert(_el$107, () => row.count, _el$109);
3596
3701
  _$effect(_p$ => {
3597
- var _v$60 = row.continued ? 0 : 1,
3598
- _v$61 = {
3702
+ var _v$68 = row.continued ? 0 : 1,
3703
+ _v$69 = {
3599
3704
  fg: api.theme.current.accent
3600
3705
  },
3601
- _v$62 = TextAttributes.BOLD,
3602
- _v$63 = {
3706
+ _v$70 = TextAttributes.BOLD,
3707
+ _v$71 = {
3603
3708
  fg: api.theme.current.textMuted
3604
3709
  };
3605
- _v$60 !== _p$.e && (_p$.e = _$setProp(_el$106, "paddingTop", _v$60, _p$.e));
3606
- _v$61 !== _p$.t && (_p$.t = _$setProp(_el$107, "style", _v$61, _p$.t));
3607
- _v$62 !== _p$.a && (_p$.a = _$setProp(_el$107, "attributes", _v$62, _p$.a));
3608
- _v$63 !== _p$.o && (_p$.o = _$setProp(_el$108, "style", _v$63, _p$.o));
3710
+ _v$68 !== _p$.e && (_p$.e = _$setProp(_el$105, "paddingTop", _v$68, _p$.e));
3711
+ _v$69 !== _p$.t && (_p$.t = _$setProp(_el$106, "style", _v$69, _p$.t));
3712
+ _v$70 !== _p$.a && (_p$.a = _$setProp(_el$106, "attributes", _v$70, _p$.a));
3713
+ _v$71 !== _p$.o && (_p$.o = _$setProp(_el$107, "style", _v$71, _p$.o));
3609
3714
  return _p$;
3610
3715
  }, {
3611
3716
  e: undefined,
@@ -3613,46 +3718,46 @@ const tui = async api => {
3613
3718
  a: undefined,
3614
3719
  o: undefined
3615
3720
  });
3616
- return _el$106;
3721
+ return _el$105;
3617
3722
  })();
3618
3723
  const excerpt = createMemo(() => transcriptMatchExcerpt(searchIndex().get(row.entry.id), row.entry, query()));
3619
3724
  return (() => {
3620
- var _el$111 = _$createElement("box"),
3621
- _el$112 = _$createElement("box"),
3622
- _el$113 = _$createElement("text"),
3623
- _el$116 = _$createElement("text");
3624
- _$insertNode(_el$111, _el$112);
3625
- _$setProp(_el$111, "flexDirection", "column");
3626
- _$setProp(_el$111, "paddingLeft", 6);
3627
- _$setProp(_el$111, "paddingRight", 4);
3628
- _$setProp(_el$111, "onMouseMove", () => {
3725
+ var _el$110 = _$createElement("box"),
3726
+ _el$111 = _$createElement("box"),
3727
+ _el$112 = _$createElement("text"),
3728
+ _el$115 = _$createElement("text");
3729
+ _$insertNode(_el$110, _el$111);
3730
+ _$setProp(_el$110, "flexDirection", "column");
3731
+ _$setProp(_el$110, "paddingLeft", 6);
3732
+ _$setProp(_el$110, "paddingRight", 4);
3733
+ _$setProp(_el$110, "onMouseMove", () => {
3629
3734
  // Repainting under a stationary pointer must not select
3630
3735
  // another row while the wheel is moving the viewport.
3631
3736
  const index = selectableEntries().findIndex(entry => entry.id === row.entry.id);
3632
3737
  if (index >= 0) setCursor(index);
3633
3738
  });
3634
- _$setProp(_el$111, "onMouseDown", event => event.button === RIGHT_BUTTON ? (cleanup(), api.ui.dialog.clear(), openInCmuxWorkspace(api, row.entry)) : choose(row.entry));
3635
- _$insertNode(_el$112, _el$113);
3636
- _$insertNode(_el$112, _el$116);
3637
- _$setProp(_el$112, "flexDirection", "row");
3638
- _$setProp(_el$112, "gap", 1);
3639
- _$setProp(_el$113, "flexShrink", 0);
3640
- _$insert(_el$113, () => row.last ? "└" : "├");
3641
- _$insert(_el$112, _$createComponent(Show, {
3739
+ _$setProp(_el$110, "onMouseDown", event => event.button === RIGHT_BUTTON ? (cleanup(), api.ui.dialog.clear(), openInCmuxWorkspace(api, row.entry)) : choose(row.entry));
3740
+ _$insertNode(_el$111, _el$112);
3741
+ _$insertNode(_el$111, _el$115);
3742
+ _$setProp(_el$111, "flexDirection", "row");
3743
+ _$setProp(_el$111, "gap", 1);
3744
+ _$setProp(_el$112, "flexShrink", 0);
3745
+ _$insert(_el$112, () => row.last ? "└" : "├");
3746
+ _$insert(_el$111, _$createComponent(Show, {
3642
3747
  get when() {
3643
3748
  return row.entry.id === currentSessionID();
3644
3749
  },
3645
3750
  get children() {
3646
- var _el$114 = _$createElement("text");
3647
- _$insertNode(_el$114, _$createTextNode(`●`));
3648
- _$setProp(_el$114, "flexShrink", 0);
3649
- _$effect(_$p => _$setProp(_el$114, "style", {
3751
+ var _el$113 = _$createElement("text");
3752
+ _$insertNode(_el$113, _$createTextNode(`●`));
3753
+ _$setProp(_el$113, "flexShrink", 0);
3754
+ _$effect(_$p => _$setProp(_el$113, "style", {
3650
3755
  fg: row.entry.id === selectableEntries()[cursor()]?.id ? api.theme.current.text : api.theme.current.primary
3651
3756
  }, _$p));
3652
- return _el$114;
3757
+ return _el$113;
3653
3758
  }
3654
- }), _el$116);
3655
- _$insert(_el$112, _$createComponent(Highlighted, {
3759
+ }), _el$115);
3760
+ _$insert(_el$111, _$createComponent(Highlighted, {
3656
3761
  get text() {
3657
3762
  return `${pins().sessions.includes(row.entry.id) ? "★ " : ""}${truncate(row.entry.title, pins().sessions.includes(row.entry.id) ? 59 : 61)}`;
3658
3763
  },
@@ -3668,26 +3773,26 @@ const tui = async api => {
3668
3773
  get matchColor() {
3669
3774
  return _$memo(() => row.entry.id === selectableEntries()[cursor()]?.id)() ? api.theme.current.text : api.theme.current.warning;
3670
3775
  }
3671
- }), _el$116);
3672
- _$setProp(_el$116, "flexShrink", 0);
3673
- _$insert(_el$116, (() => {
3674
- var _c$0 = _$memo(() => pendingDelete()?.id === row.entry.id);
3675
- return () => _c$0() ? "press y to delete" : `${ago(row.entry.updated)}${query().trim() && !`${row.entry.title} ${row.entry.dir}`.toLowerCase().includes(query().trim().toLowerCase()) ? " · transcript match" : ""}`;
3776
+ }), _el$115);
3777
+ _$setProp(_el$115, "flexShrink", 0);
3778
+ _$insert(_el$115, (() => {
3779
+ var _c$9 = _$memo(() => pendingDelete()?.id === row.entry.id);
3780
+ return () => _c$9() ? "press y to delete" : `${ago(row.entry.updated)}${query().trim() && !`${row.entry.title} ${row.entry.dir}`.toLowerCase().includes(query().trim().toLowerCase()) ? " · transcript match" : ""}`;
3676
3781
  })());
3677
- _$insert(_el$111, _$createComponent(Show, {
3782
+ _$insert(_el$110, _$createComponent(Show, {
3678
3783
  get when() {
3679
3784
  return excerpt();
3680
3785
  },
3681
3786
  children: match => (() => {
3682
- var _el$117 = _$createElement("box"),
3683
- _el$118 = _$createElement("text");
3684
- _$insertNode(_el$117, _el$118);
3685
- _$setProp(_el$117, "flexDirection", "row");
3686
- _$setProp(_el$117, "gap", 1);
3687
- _$setProp(_el$117, "paddingLeft", 2);
3688
- _$insertNode(_el$118, _$createTextNode(`↳`));
3689
- _$setProp(_el$118, "flexShrink", 0);
3690
- _$insert(_el$117, _$createComponent(Highlighted, {
3787
+ var _el$116 = _$createElement("box"),
3788
+ _el$117 = _$createElement("text");
3789
+ _$insertNode(_el$116, _el$117);
3790
+ _$setProp(_el$116, "flexDirection", "row");
3791
+ _$setProp(_el$116, "gap", 1);
3792
+ _$setProp(_el$116, "paddingLeft", 2);
3793
+ _$insertNode(_el$117, _$createTextNode(`↳`));
3794
+ _$setProp(_el$117, "flexShrink", 0);
3795
+ _$insert(_el$116, _$createComponent(Highlighted, {
3691
3796
  get text() {
3692
3797
  return match();
3693
3798
  },
@@ -3701,140 +3806,140 @@ const tui = async api => {
3701
3806
  return api.theme.current.warning;
3702
3807
  }
3703
3808
  }), null);
3704
- _$effect(_$p => _$setProp(_el$118, "style", {
3809
+ _$effect(_$p => _$setProp(_el$117, "style", {
3705
3810
  fg: api.theme.current.textMuted
3706
3811
  }, _$p));
3707
- return _el$117;
3812
+ return _el$116;
3708
3813
  })()
3709
3814
  }), null);
3710
3815
  _$effect(_p$ => {
3711
- var _v$64 = row.entry.id === selectableEntries()[cursor()]?.id ? api.theme.current.backgroundElement : RGBA.fromInts(0, 0, 0, 0),
3712
- _v$65 = {
3816
+ var _v$72 = row.entry.id === selectableEntries()[cursor()]?.id ? api.theme.current.backgroundElement : RGBA.fromInts(0, 0, 0, 0),
3817
+ _v$73 = {
3713
3818
  fg: row.entry.id === selectableEntries()[cursor()]?.id ? api.theme.current.text : api.theme.current.textMuted
3714
3819
  },
3715
- _v$66 = {
3820
+ _v$74 = {
3716
3821
  fg: pendingDelete()?.id === row.entry.id ? api.theme.current.error : row.entry.id === selectableEntries()[cursor()]?.id ? api.theme.current.text : api.theme.current.textMuted
3717
3822
  };
3718
- _v$64 !== _p$.e && (_p$.e = _$setProp(_el$111, "backgroundColor", _v$64, _p$.e));
3719
- _v$65 !== _p$.t && (_p$.t = _$setProp(_el$113, "style", _v$65, _p$.t));
3720
- _v$66 !== _p$.a && (_p$.a = _$setProp(_el$116, "style", _v$66, _p$.a));
3823
+ _v$72 !== _p$.e && (_p$.e = _$setProp(_el$110, "backgroundColor", _v$72, _p$.e));
3824
+ _v$73 !== _p$.t && (_p$.t = _$setProp(_el$112, "style", _v$73, _p$.t));
3825
+ _v$74 !== _p$.a && (_p$.a = _$setProp(_el$115, "style", _v$74, _p$.a));
3721
3826
  return _p$;
3722
3827
  }, {
3723
3828
  e: undefined,
3724
3829
  t: undefined,
3725
3830
  a: undefined
3726
3831
  });
3727
- return _el$111;
3832
+ return _el$110;
3728
3833
  })();
3729
3834
  }
3730
3835
  }), null);
3731
- _$insert(_el$89, _$createComponent(Show, {
3836
+ _$insert(_el$88, _$createComponent(Show, {
3732
3837
  get when() {
3733
3838
  return matchedGroups().length === 0;
3734
3839
  },
3735
3840
  get children() {
3736
- var _el$90 = _$createElement("box"),
3737
- _el$91 = _$createElement("text");
3738
- _$insertNode(_el$90, _el$91);
3739
- _$setProp(_el$90, "paddingLeft", 4);
3740
- _$setProp(_el$90, "paddingRight", 4);
3741
- _$insert(_el$91, (() => {
3742
- var _c$7 = _$memo(() => !!(waitingOnly() && waitingCoverage() === "loading"));
3743
- return () => _c$7() ? "Checking which sessions need input…" : _$memo(() => !!(waitingOnly() && waitingCoverage() === "unavailable"))() ? "Needs-input data unavailable · turn off the filter" : _$memo(() => !!(pinnedOnly() && pins().sessions.length === 0))() ? "No pinned sessions yet · ctrl+s pins a session" : _$memo(() => !!(!indexProgress().complete && query().trim()))() ? "No matches yet · still searching transcripts…" : _$memo(() => !!scope())() ? `No matches in ${scope()} · ctrl+g for all projects` : waitingOnly() ? "No sessions need input with these filters" : "No sessions match · try another search";
3841
+ var _el$89 = _$createElement("box"),
3842
+ _el$90 = _$createElement("text");
3843
+ _$insertNode(_el$89, _el$90);
3844
+ _$setProp(_el$89, "paddingLeft", 4);
3845
+ _$setProp(_el$89, "paddingRight", 4);
3846
+ _$insert(_el$90, (() => {
3847
+ var _c$6 = _$memo(() => !!(waitingOnly() && waitingCoverage() === "loading"));
3848
+ return () => _c$6() ? "Checking which sessions need input…" : _$memo(() => !!(waitingOnly() && waitingCoverage() === "unavailable"))() ? "Needs-input data unavailable · turn off the filter" : _$memo(() => !!(pinnedOnly() && pins().sessions.length === 0))() ? "No pinned sessions yet · ctrl+s pins a session" : _$memo(() => !!(!indexProgress().complete && query().trim()))() ? "No matches yet · still searching transcripts…" : _$memo(() => !!scope())() ? `No matches in ${scope()} · ctrl+g for all projects` : waitingOnly() ? "No sessions need input with these filters" : "No sessions match · try another search";
3744
3849
  })());
3745
- _$effect(_$p => _$setProp(_el$91, "style", {
3850
+ _$effect(_$p => _$setProp(_el$90, "style", {
3746
3851
  fg: api.theme.current.textMuted
3747
3852
  }, _$p));
3748
- return _el$90;
3853
+ return _el$89;
3749
3854
  }
3750
3855
  }), null);
3751
- _$insertNode(_el$92, _el$93);
3752
- _$setProp(_el$92, "paddingLeft", 4);
3753
- _$setProp(_el$92, "paddingRight", 4);
3754
- _$setProp(_el$92, "flexShrink", 0);
3755
- _$setProp(_el$92, "flexDirection", "column");
3756
- _$insert(_el$93, (() => {
3757
- var _c$8 = _$memo(() => !!pendingDelete());
3758
- return () => _c$8() ? `Delete "${truncate(pendingDelete().title, 40)}"? y confirm · n cancel` : "↑↓ move · enter open · ctrl+g project · option+w input · option+s pinned · option+p preview";
3856
+ _$insertNode(_el$91, _el$92);
3857
+ _$setProp(_el$91, "paddingLeft", 4);
3858
+ _$setProp(_el$91, "paddingRight", 4);
3859
+ _$setProp(_el$91, "flexShrink", 0);
3860
+ _$setProp(_el$91, "flexDirection", "column");
3861
+ _$insert(_el$92, (() => {
3862
+ var _c$7 = _$memo(() => !!pendingDelete());
3863
+ return () => _c$7() ? `Delete "${truncate(pendingDelete().title, 40)}"? y confirm · n cancel` : "↑↓ move · enter open · ctrl+g project · option+w input · option+s pinned · option+p preview";
3759
3864
  })());
3760
- _$insert(_el$92, _$createComponent(Show, {
3865
+ _$insert(_el$91, _$createComponent(Show, {
3761
3866
  get when() {
3762
3867
  return !pendingDelete();
3763
3868
  },
3764
3869
  get children() {
3765
- var _el$94 = _$createElement("text");
3766
- _$insertNode(_el$94, _$createTextNode(`ctrl+s/d pin · option+d delete · ctrl+f fork · esc close`));
3767
- _$effect(_$p => _$setProp(_el$94, "style", {
3870
+ var _el$93 = _$createElement("text");
3871
+ _$insertNode(_el$93, _$createTextNode(`ctrl+s/d pin · option+d delete · ctrl+f fork · esc close`));
3872
+ _$effect(_$p => _$setProp(_el$93, "style", {
3768
3873
  fg: api.theme.current.textMuted
3769
3874
  }, _$p));
3770
- return _el$94;
3875
+ return _el$93;
3771
3876
  }
3772
3877
  }), null);
3773
- _$insert(_el$71, _$createComponent(Show, {
3878
+ _$insert(_el$70, _$createComponent(Show, {
3774
3879
  get when() {
3775
3880
  return showPreview();
3776
3881
  },
3777
3882
  get children() {
3778
- var _el$96 = _$createElement("box"),
3779
- _el$97 = _$createElement("box"),
3883
+ var _el$95 = _$createElement("box"),
3884
+ _el$96 = _$createElement("box"),
3885
+ _el$97 = _$createElement("text"),
3780
3886
  _el$98 = _$createElement("text"),
3781
- _el$99 = _$createElement("text"),
3782
- _el$103 = _$createElement("scrollbox"),
3783
- _el$104 = _$createElement("text");
3887
+ _el$102 = _$createElement("scrollbox"),
3888
+ _el$103 = _$createElement("text");
3889
+ _$insertNode(_el$95, _el$96);
3890
+ _$insertNode(_el$95, _el$102);
3891
+ _$insertNode(_el$95, _el$103);
3892
+ _$setProp(_el$95, "position", "absolute");
3893
+ _$setProp(_el$95, "left", 0);
3894
+ _$setProp(_el$95, "top", 0);
3895
+ _$setProp(_el$95, "width", dialogWidth);
3896
+ _$setProp(_el$95, "flexDirection", "column");
3897
+ _$setProp(_el$95, "paddingLeft", 4);
3898
+ _$setProp(_el$95, "paddingRight", 4);
3899
+ _$setProp(_el$95, "paddingTop", 1);
3900
+ _$setProp(_el$95, "paddingBottom", 1);
3901
+ _$setProp(_el$95, "gap", 1);
3784
3902
  _$insertNode(_el$96, _el$97);
3785
- _$insertNode(_el$96, _el$103);
3786
- _$insertNode(_el$96, _el$104);
3787
- _$setProp(_el$96, "position", "absolute");
3788
- _$setProp(_el$96, "left", 0);
3789
- _$setProp(_el$96, "top", 0);
3790
- _$setProp(_el$96, "width", dialogWidth);
3791
- _$setProp(_el$96, "flexDirection", "column");
3792
- _$setProp(_el$96, "paddingLeft", 4);
3793
- _$setProp(_el$96, "paddingRight", 4);
3794
- _$setProp(_el$96, "paddingTop", 1);
3795
- _$setProp(_el$96, "paddingBottom", 1);
3796
- _$setProp(_el$96, "gap", 1);
3797
- _$insertNode(_el$97, _el$98);
3798
- _$insertNode(_el$97, _el$99);
3799
- _$setProp(_el$97, "flexDirection", "row");
3800
- _$setProp(_el$97, "justifyContent", "space-between");
3801
- _$insert(_el$98, (() => {
3802
- var _c$9 = _$memo(() => !!previewID());
3803
- return () => _c$9() ? truncate(selectableEntries()[cursor()].title, dialogWidth - 18) : "Preview";
3903
+ _$insertNode(_el$96, _el$98);
3904
+ _$setProp(_el$96, "flexDirection", "row");
3905
+ _$setProp(_el$96, "justifyContent", "space-between");
3906
+ _$insert(_el$97, (() => {
3907
+ var _c$8 = _$memo(() => !!previewID());
3908
+ return () => _c$8() ? truncate(selectableEntries()[cursor()].title, dialogWidth - 18) : "Preview";
3804
3909
  })());
3805
- _$insertNode(_el$99, _$createTextNode(`esc close`));
3806
- _$insert(_el$96, _$createComponent(Show, {
3910
+ _$insertNode(_el$98, _$createTextNode(`esc close`));
3911
+ _$insert(_el$95, _$createComponent(Show, {
3807
3912
  get when() {
3808
3913
  return previewID();
3809
3914
  },
3810
3915
  get children() {
3811
- var _el$101 = _$createElement("text"),
3812
- _el$102 = _$createTextNode(` · `);
3813
- _$insertNode(_el$101, _el$102);
3814
- _$insert(_el$101, () => prettyDir(selectableEntries()[cursor()].dir, process.env.HOME ?? ""), _el$102);
3815
- _$insert(_el$101, () => ago(selectableEntries()[cursor()].updated), null);
3816
- _$effect(_$p => _$setProp(_el$101, "style", {
3916
+ var _el$100 = _$createElement("text"),
3917
+ _el$101 = _$createTextNode(` · `);
3918
+ _$insertNode(_el$100, _el$101);
3919
+ _$insert(_el$100, () => prettyDir(selectableEntries()[cursor()].dir, process.env.HOME ?? ""), _el$101);
3920
+ _$insert(_el$100, () => ago(selectableEntries()[cursor()].updated), null);
3921
+ _$effect(_$p => _$setProp(_el$100, "style", {
3817
3922
  fg: api.theme.current.textMuted
3818
3923
  }, _$p));
3819
- return _el$101;
3924
+ return _el$100;
3820
3925
  }
3821
- }), _el$103);
3822
- _$setProp(_el$103, "flexGrow", 1);
3823
- _$setProp(_el$103, "scrollbarOptions", {
3926
+ }), _el$102);
3927
+ _$setProp(_el$102, "flexGrow", 1);
3928
+ _$setProp(_el$102, "scrollbarOptions", {
3824
3929
  visible: false
3825
3930
  });
3826
- _$insert(_el$103, _$createComponent(Show, {
3931
+ _$insert(_el$102, _$createComponent(Show, {
3827
3932
  get when() {
3828
3933
  return previewID();
3829
3934
  },
3830
3935
  get fallback() {
3831
3936
  return (() => {
3832
- var _el$120 = _$createElement("text");
3833
- _$insertNode(_el$120, _$createTextNode(`Select a session to preview`));
3834
- _$effect(_$p => _$setProp(_el$120, "style", {
3937
+ var _el$119 = _$createElement("text");
3938
+ _$insertNode(_el$119, _$createTextNode(`Select a session to preview`));
3939
+ _$effect(_$p => _$setProp(_el$119, "style", {
3835
3940
  fg: api.theme.current.textMuted
3836
3941
  }, _$p));
3837
- return _el$120;
3942
+ return _el$119;
3838
3943
  })();
3839
3944
  },
3840
3945
  get children() {
@@ -3844,55 +3949,55 @@ const tui = async api => {
3844
3949
  },
3845
3950
  get fallback() {
3846
3951
  return (() => {
3847
- var _el$122 = _$createElement("text");
3848
- _$insertNode(_el$122, _$createTextNode(`Loading…`));
3849
- _$effect(_$p => _$setProp(_el$122, "style", {
3952
+ var _el$121 = _$createElement("text");
3953
+ _$insertNode(_el$121, _$createTextNode(`Loading…`));
3954
+ _$effect(_$p => _$setProp(_el$121, "style", {
3850
3955
  fg: api.theme.current.textMuted
3851
3956
  }, _$p));
3852
- return _el$122;
3957
+ return _el$121;
3853
3958
  })();
3854
3959
  },
3855
3960
  children: text => getMarkdownStyle(api.theme.current, api.renderer?.nativeSession) ? (() => {
3856
- var _el$124 = _$createElement("markdown");
3961
+ var _el$123 = _$createElement("markdown");
3857
3962
  _$effect(_p$ => {
3858
- var _v$67 = text(),
3859
- _v$68 = getMarkdownStyle(api.theme.current, api.renderer?.nativeSession),
3860
- _v$69 = getTreeSitterClient();
3861
- _v$67 !== _p$.e && (_p$.e = _$setProp(_el$124, "content", _v$67, _p$.e));
3862
- _v$68 !== _p$.t && (_p$.t = _$setProp(_el$124, "syntaxStyle", _v$68, _p$.t));
3863
- _v$69 !== _p$.a && (_p$.a = _$setProp(_el$124, "treeSitterClient", _v$69, _p$.a));
3963
+ var _v$75 = text(),
3964
+ _v$76 = getMarkdownStyle(api.theme.current, api.renderer?.nativeSession),
3965
+ _v$77 = getTreeSitterClient();
3966
+ _v$75 !== _p$.e && (_p$.e = _$setProp(_el$123, "content", _v$75, _p$.e));
3967
+ _v$76 !== _p$.t && (_p$.t = _$setProp(_el$123, "syntaxStyle", _v$76, _p$.t));
3968
+ _v$77 !== _p$.a && (_p$.a = _$setProp(_el$123, "treeSitterClient", _v$77, _p$.a));
3864
3969
  return _p$;
3865
3970
  }, {
3866
3971
  e: undefined,
3867
3972
  t: undefined,
3868
3973
  a: undefined
3869
3974
  });
3870
- return _el$124;
3975
+ return _el$123;
3871
3976
  })() : (() => {
3872
- var _el$125 = _$createElement("text");
3873
- _$setProp(_el$125, "wrapMode", "word");
3874
- _$insert(_el$125, text);
3875
- return _el$125;
3977
+ var _el$124 = _$createElement("text");
3978
+ _$setProp(_el$124, "wrapMode", "word");
3979
+ _$insert(_el$124, text);
3980
+ return _el$124;
3876
3981
  })()
3877
3982
  });
3878
3983
  }
3879
3984
  }));
3880
- _$insertNode(_el$104, _$createTextNode(`↑↓ switch session · esc back to picker`));
3985
+ _$insertNode(_el$103, _$createTextNode(`↑↓ switch session · esc back to picker`));
3881
3986
  _$effect(_p$ => {
3882
- var _v$40 = dialogHeight(),
3883
- _v$41 = api.theme.current.backgroundPanel,
3884
- _v$42 = TextAttributes.BOLD,
3885
- _v$43 = {
3987
+ var _v$48 = dialogHeight(),
3988
+ _v$49 = api.theme.current.backgroundPanel,
3989
+ _v$50 = TextAttributes.BOLD,
3990
+ _v$51 = {
3886
3991
  fg: api.theme.current.textMuted
3887
3992
  },
3888
- _v$44 = {
3993
+ _v$52 = {
3889
3994
  fg: api.theme.current.textMuted
3890
3995
  };
3891
- _v$40 !== _p$.e && (_p$.e = _$setProp(_el$96, "height", _v$40, _p$.e));
3892
- _v$41 !== _p$.t && (_p$.t = _$setProp(_el$96, "backgroundColor", _v$41, _p$.t));
3893
- _v$42 !== _p$.a && (_p$.a = _$setProp(_el$98, "attributes", _v$42, _p$.a));
3894
- _v$43 !== _p$.o && (_p$.o = _$setProp(_el$99, "style", _v$43, _p$.o));
3895
- _v$44 !== _p$.i && (_p$.i = _$setProp(_el$104, "style", _v$44, _p$.i));
3996
+ _v$48 !== _p$.e && (_p$.e = _$setProp(_el$95, "height", _v$48, _p$.e));
3997
+ _v$49 !== _p$.t && (_p$.t = _$setProp(_el$95, "backgroundColor", _v$49, _p$.t));
3998
+ _v$50 !== _p$.a && (_p$.a = _$setProp(_el$97, "attributes", _v$50, _p$.a));
3999
+ _v$51 !== _p$.o && (_p$.o = _$setProp(_el$98, "style", _v$51, _p$.o));
4000
+ _v$52 !== _p$.i && (_p$.i = _$setProp(_el$103, "style", _v$52, _p$.i));
3896
4001
  return _p$;
3897
4002
  }, {
3898
4003
  e: undefined,
@@ -3901,52 +4006,52 @@ const tui = async api => {
3901
4006
  o: undefined,
3902
4007
  i: undefined
3903
4008
  });
3904
- return _el$96;
4009
+ return _el$95;
3905
4010
  }
3906
4011
  }), null);
3907
4012
  _$effect(_p$ => {
3908
- var _v$45 = dialogHeight(),
3909
- _v$46 = dialogOffset(),
3910
- _v$47 = api.theme.current.backgroundPanel,
3911
- _v$48 = TextAttributes.BOLD,
3912
- _v$49 = {
4013
+ var _v$53 = dialogHeight(),
4014
+ _v$54 = dialogOffset(),
4015
+ _v$55 = api.theme.current.backgroundPanel,
4016
+ _v$56 = TextAttributes.BOLD,
4017
+ _v$57 = {
3913
4018
  fg: api.theme.current.textMuted
3914
4019
  },
3915
- _v$50 = {
4020
+ _v$58 = {
3916
4021
  fg: api.theme.current.textMuted
3917
4022
  },
3918
- _v$51 = query(),
3919
- _v$52 = api.theme.current.textMuted,
3920
- _v$53 = api.theme.current.backgroundPanel,
3921
- _v$54 = api.theme.current.text,
3922
- _v$55 = api.theme.current.primary,
3923
- _v$56 = {
4023
+ _v$59 = query(),
4024
+ _v$60 = api.theme.current.textMuted,
4025
+ _v$61 = api.theme.current.backgroundPanel,
4026
+ _v$62 = api.theme.current.text,
4027
+ _v$63 = api.theme.current.primary,
4028
+ _v$64 = {
3924
4029
  fg: scope() ? api.theme.current.accent : api.theme.current.textMuted
3925
4030
  },
3926
- _v$57 = {
4031
+ _v$65 = {
3927
4032
  fg: waitingOnly() ? api.theme.current.warning : api.theme.current.textMuted
3928
4033
  },
3929
- _v$58 = {
4034
+ _v$66 = {
3930
4035
  fg: pinnedOnly() ? api.theme.current.accent : api.theme.current.textMuted
3931
4036
  },
3932
- _v$59 = {
4037
+ _v$67 = {
3933
4038
  fg: pendingDelete() ? api.theme.current.warning : api.theme.current.textMuted
3934
4039
  };
3935
- _v$45 !== _p$.e && (_p$.e = _$setProp(_el$71, "height", _v$45, _p$.e));
3936
- _v$46 !== _p$.t && (_p$.t = _$setProp(_el$71, "marginTop", _v$46, _p$.t));
3937
- _v$47 !== _p$.a && (_p$.a = _$setProp(_el$71, "backgroundColor", _v$47, _p$.a));
3938
- _v$48 !== _p$.o && (_p$.o = _$setProp(_el$74, "attributes", _v$48, _p$.o));
3939
- _v$49 !== _p$.i && (_p$.i = _$setProp(_el$76, "style", _v$49, _p$.i));
3940
- _v$50 !== _p$.n && (_p$.n = _$setProp(_el$79, "style", _v$50, _p$.n));
3941
- _v$51 !== _p$.s && (_p$.s = _$setProp(_el$82, "value", _v$51, _p$.s));
3942
- _v$52 !== _p$.h && (_p$.h = _$setProp(_el$82, "placeholderColor", _v$52, _p$.h));
3943
- _v$53 !== _p$.r && (_p$.r = _$setProp(_el$82, "focusedBackgroundColor", _v$53, _p$.r));
3944
- _v$54 !== _p$.d && (_p$.d = _$setProp(_el$82, "focusedTextColor", _v$54, _p$.d));
3945
- _v$55 !== _p$.l && (_p$.l = _$setProp(_el$82, "cursorColor", _v$55, _p$.l));
3946
- _v$56 !== _p$.u && (_p$.u = _$setProp(_el$86, "style", _v$56, _p$.u));
3947
- _v$57 !== _p$.c && (_p$.c = _$setProp(_el$87, "style", _v$57, _p$.c));
3948
- _v$58 !== _p$.w && (_p$.w = _$setProp(_el$88, "style", _v$58, _p$.w));
3949
- _v$59 !== _p$.m && (_p$.m = _$setProp(_el$93, "style", _v$59, _p$.m));
4040
+ _v$53 !== _p$.e && (_p$.e = _$setProp(_el$70, "height", _v$53, _p$.e));
4041
+ _v$54 !== _p$.t && (_p$.t = _$setProp(_el$70, "marginTop", _v$54, _p$.t));
4042
+ _v$55 !== _p$.a && (_p$.a = _$setProp(_el$70, "backgroundColor", _v$55, _p$.a));
4043
+ _v$56 !== _p$.o && (_p$.o = _$setProp(_el$73, "attributes", _v$56, _p$.o));
4044
+ _v$57 !== _p$.i && (_p$.i = _$setProp(_el$75, "style", _v$57, _p$.i));
4045
+ _v$58 !== _p$.n && (_p$.n = _$setProp(_el$78, "style", _v$58, _p$.n));
4046
+ _v$59 !== _p$.s && (_p$.s = _$setProp(_el$81, "value", _v$59, _p$.s));
4047
+ _v$60 !== _p$.h && (_p$.h = _$setProp(_el$81, "placeholderColor", _v$60, _p$.h));
4048
+ _v$61 !== _p$.r && (_p$.r = _$setProp(_el$81, "focusedBackgroundColor", _v$61, _p$.r));
4049
+ _v$62 !== _p$.d && (_p$.d = _$setProp(_el$81, "focusedTextColor", _v$62, _p$.d));
4050
+ _v$63 !== _p$.l && (_p$.l = _$setProp(_el$81, "cursorColor", _v$63, _p$.l));
4051
+ _v$64 !== _p$.u && (_p$.u = _$setProp(_el$85, "style", _v$64, _p$.u));
4052
+ _v$65 !== _p$.c && (_p$.c = _$setProp(_el$86, "style", _v$65, _p$.c));
4053
+ _v$66 !== _p$.w && (_p$.w = _$setProp(_el$87, "style", _v$66, _p$.w));
4054
+ _v$67 !== _p$.m && (_p$.m = _$setProp(_el$92, "style", _v$67, _p$.m));
3950
4055
  return _p$;
3951
4056
  }, {
3952
4057
  e: undefined,
@@ -3965,7 +4070,7 @@ const tui = async api => {
3965
4070
  w: undefined,
3966
4071
  m: undefined
3967
4072
  });
3968
- return _el$71;
4073
+ return _el$70;
3969
4074
  })(), () => {
3970
4075
  cleanup();
3971
4076
  });
@@ -4011,105 +4116,105 @@ const tui = async api => {
4011
4116
  }]
4012
4117
  });
4013
4118
  api.ui.dialog.replace(() => (() => {
4014
- var _el$126 = _$createElement("box"),
4015
- _el$127 = _$createElement("text"),
4016
- _el$128 = _$createTextNode(`Cost digest `),
4017
- _el$130 = _$createElement("span"),
4018
- _el$132 = _$createElement("box"),
4019
- _el$133 = _$createElement("text");
4119
+ var _el$125 = _$createElement("box"),
4120
+ _el$126 = _$createElement("text"),
4121
+ _el$127 = _$createTextNode(`Cost digest `),
4122
+ _el$129 = _$createElement("span"),
4123
+ _el$131 = _$createElement("box"),
4124
+ _el$132 = _$createElement("text");
4125
+ _$insertNode(_el$125, _el$126);
4126
+ _$insertNode(_el$125, _el$131);
4127
+ _$setProp(_el$125, "flexDirection", "column");
4128
+ _$setProp(_el$125, "paddingLeft", 4);
4129
+ _$setProp(_el$125, "paddingRight", 4);
4130
+ _$setProp(_el$125, "paddingTop", 1);
4131
+ _$setProp(_el$125, "gap", 1);
4020
4132
  _$insertNode(_el$126, _el$127);
4021
- _$insertNode(_el$126, _el$132);
4022
- _$setProp(_el$126, "flexDirection", "column");
4023
- _$setProp(_el$126, "paddingLeft", 4);
4024
- _$setProp(_el$126, "paddingRight", 4);
4025
- _$setProp(_el$126, "paddingTop", 1);
4026
- _$setProp(_el$126, "gap", 1);
4027
- _$insertNode(_el$127, _el$128);
4028
- _$insertNode(_el$127, _el$130);
4029
- _$insertNode(_el$130, _$createTextNode(`(24h · lifetime)`));
4030
- _$insert(_el$126, _$createComponent(Show, {
4133
+ _$insertNode(_el$126, _el$129);
4134
+ _$insertNode(_el$129, _$createTextNode(`(24h · lifetime)`));
4135
+ _$insert(_el$125, _$createComponent(Show, {
4031
4136
  get when() {
4032
4137
  return !failed && rows.length > 0;
4033
4138
  },
4034
4139
  get fallback() {
4035
4140
  return (() => {
4036
- var _el$135 = _$createElement("text");
4037
- _$insert(_el$135, failed ? "Cost data unavailable." : "No assistant cost recorded.");
4038
- _$effect(_$p => _$setProp(_el$135, "style", {
4141
+ var _el$134 = _$createElement("text");
4142
+ _$insert(_el$134, failed ? "Cost data unavailable." : "No assistant cost recorded.");
4143
+ _$effect(_$p => _$setProp(_el$134, "style", {
4039
4144
  fg: api.theme.current.textMuted
4040
4145
  }, _$p));
4041
- return _el$135;
4146
+ return _el$134;
4042
4147
  })();
4043
4148
  },
4044
4149
  get children() {
4045
4150
  return _$createComponent(For, {
4046
4151
  each: rows,
4047
4152
  children: row => (() => {
4048
- var _el$136 = _$createElement("box"),
4153
+ var _el$135 = _$createElement("box"),
4154
+ _el$136 = _$createElement("text"),
4049
4155
  _el$137 = _$createElement("text"),
4050
4156
  _el$138 = _$createElement("text"),
4051
- _el$139 = _$createElement("text"),
4052
- _el$140 = _$createTextNode(`(`),
4053
- _el$141 = _$createTextNode(`)`),
4054
- _el$142 = _$createElement("text");
4055
- _$insertNode(_el$136, _el$137);
4056
- _$insertNode(_el$136, _el$138);
4057
- _$insertNode(_el$136, _el$139);
4058
- _$insertNode(_el$136, _el$142);
4059
- _$setProp(_el$136, "flexDirection", "row");
4060
- _$setProp(_el$136, "gap", 2);
4157
+ _el$139 = _$createTextNode(`(`),
4158
+ _el$140 = _$createTextNode(`)`),
4159
+ _el$141 = _$createElement("text");
4160
+ _$insertNode(_el$135, _el$136);
4161
+ _$insertNode(_el$135, _el$137);
4162
+ _$insertNode(_el$135, _el$138);
4163
+ _$insertNode(_el$135, _el$141);
4164
+ _$setProp(_el$135, "flexDirection", "row");
4165
+ _$setProp(_el$135, "gap", 2);
4166
+ _$setProp(_el$136, "flexShrink", 0);
4167
+ _$insert(_el$136, () => money(row.window));
4061
4168
  _$setProp(_el$137, "flexShrink", 0);
4062
- _$insert(_el$137, () => money(row.window));
4169
+ _$insert(_el$137, () => money(row.lifetime));
4170
+ _$insertNode(_el$138, _el$139);
4171
+ _$insertNode(_el$138, _el$140);
4063
4172
  _$setProp(_el$138, "flexShrink", 0);
4064
- _$insert(_el$138, () => money(row.lifetime));
4065
- _$insertNode(_el$139, _el$140);
4066
- _$insertNode(_el$139, _el$141);
4067
- _$setProp(_el$139, "flexShrink", 0);
4068
- _$insert(_el$139, () => row.sessions, _el$141);
4069
- _$setProp(_el$142, "flexGrow", 1);
4070
- _$setProp(_el$142, "flexShrink", 1);
4071
- _$setProp(_el$142, "wrapMode", "none");
4072
- _$insert(_el$142, () => prettyDir(row.directory, home));
4173
+ _$insert(_el$138, () => row.sessions, _el$140);
4174
+ _$setProp(_el$141, "flexGrow", 1);
4175
+ _$setProp(_el$141, "flexShrink", 1);
4176
+ _$setProp(_el$141, "wrapMode", "none");
4177
+ _$insert(_el$141, () => prettyDir(row.directory, home));
4073
4178
  _$effect(_p$ => {
4074
- var _v$74 = {
4179
+ var _v$82 = {
4075
4180
  fg: api.theme.current.success
4076
4181
  },
4077
- _v$75 = {
4182
+ _v$83 = {
4078
4183
  fg: api.theme.current.textMuted
4079
4184
  },
4080
- _v$76 = {
4185
+ _v$84 = {
4081
4186
  fg: api.theme.current.textMuted
4082
4187
  };
4083
- _v$74 !== _p$.e && (_p$.e = _$setProp(_el$137, "style", _v$74, _p$.e));
4084
- _v$75 !== _p$.t && (_p$.t = _$setProp(_el$138, "style", _v$75, _p$.t));
4085
- _v$76 !== _p$.a && (_p$.a = _$setProp(_el$139, "style", _v$76, _p$.a));
4188
+ _v$82 !== _p$.e && (_p$.e = _$setProp(_el$136, "style", _v$82, _p$.e));
4189
+ _v$83 !== _p$.t && (_p$.t = _$setProp(_el$137, "style", _v$83, _p$.t));
4190
+ _v$84 !== _p$.a && (_p$.a = _$setProp(_el$138, "style", _v$84, _p$.a));
4086
4191
  return _p$;
4087
4192
  }, {
4088
4193
  e: undefined,
4089
4194
  t: undefined,
4090
4195
  a: undefined
4091
4196
  });
4092
- return _el$136;
4197
+ return _el$135;
4093
4198
  })()
4094
4199
  });
4095
4200
  }
4096
- }), _el$132);
4097
- _$insertNode(_el$132, _el$133);
4098
- _$setProp(_el$132, "flexShrink", 0);
4099
- _$insertNode(_el$133, _$createTextNode(`esc close`));
4201
+ }), _el$131);
4202
+ _$insertNode(_el$131, _el$132);
4203
+ _$setProp(_el$131, "flexShrink", 0);
4204
+ _$insertNode(_el$132, _$createTextNode(`esc close`));
4100
4205
  _$effect(_p$ => {
4101
- var _v$70 = api.theme.current.backgroundPanel,
4102
- _v$71 = TextAttributes.BOLD,
4103
- _v$72 = {
4206
+ var _v$78 = api.theme.current.backgroundPanel,
4207
+ _v$79 = TextAttributes.BOLD,
4208
+ _v$80 = {
4104
4209
  fg: api.theme.current.textMuted
4105
4210
  },
4106
- _v$73 = {
4211
+ _v$81 = {
4107
4212
  fg: api.theme.current.textMuted
4108
4213
  };
4109
- _v$70 !== _p$.e && (_p$.e = _$setProp(_el$126, "backgroundColor", _v$70, _p$.e));
4110
- _v$71 !== _p$.t && (_p$.t = _$setProp(_el$127, "attributes", _v$71, _p$.t));
4111
- _v$72 !== _p$.a && (_p$.a = _$setProp(_el$130, "style", _v$72, _p$.a));
4112
- _v$73 !== _p$.o && (_p$.o = _$setProp(_el$133, "style", _v$73, _p$.o));
4214
+ _v$78 !== _p$.e && (_p$.e = _$setProp(_el$125, "backgroundColor", _v$78, _p$.e));
4215
+ _v$79 !== _p$.t && (_p$.t = _$setProp(_el$126, "attributes", _v$79, _p$.t));
4216
+ _v$80 !== _p$.a && (_p$.a = _$setProp(_el$129, "style", _v$80, _p$.a));
4217
+ _v$81 !== _p$.o && (_p$.o = _$setProp(_el$132, "style", _v$81, _p$.o));
4113
4218
  return _p$;
4114
4219
  }, {
4115
4220
  e: undefined,
@@ -4117,7 +4222,7 @@ const tui = async api => {
4117
4222
  a: undefined,
4118
4223
  o: undefined
4119
4224
  });
4120
- return _el$126;
4225
+ return _el$125;
4121
4226
  })(), () => {
4122
4227
  disposeKeys();
4123
4228
  });
@@ -4222,79 +4327,79 @@ const tui = async api => {
4222
4327
  });
4223
4328
  const home = process.env.HOME ?? "";
4224
4329
  api.ui.dialog.replace(() => (() => {
4225
- var _el$143 = _$createElement("box"),
4226
- _el$144 = _$createElement("text"),
4227
- _el$145 = _$createTextNode(`Needs input `),
4228
- _el$147 = _$createElement("span"),
4229
- _el$148 = _$createTextNode(`(`),
4230
- _el$149 = _$createTextNode(` · longest waiting first)`),
4231
- _el$150 = _$createElement("scrollbox"),
4232
- _el$151 = _$createElement("box"),
4233
- _el$152 = _$createElement("text");
4330
+ var _el$142 = _$createElement("box"),
4331
+ _el$143 = _$createElement("text"),
4332
+ _el$144 = _$createTextNode(`Needs input `),
4333
+ _el$146 = _$createElement("span"),
4334
+ _el$147 = _$createTextNode(`(`),
4335
+ _el$148 = _$createTextNode(` · longest waiting first)`),
4336
+ _el$149 = _$createElement("scrollbox"),
4337
+ _el$150 = _$createElement("box"),
4338
+ _el$151 = _$createElement("text");
4339
+ _$insertNode(_el$142, _el$143);
4340
+ _$insertNode(_el$142, _el$149);
4341
+ _$insertNode(_el$142, _el$150);
4342
+ _$setProp(_el$142, "flexDirection", "column");
4343
+ _$setProp(_el$142, "paddingLeft", 4);
4344
+ _$setProp(_el$142, "paddingRight", 4);
4345
+ _$setProp(_el$142, "paddingTop", 1);
4346
+ _$setProp(_el$142, "gap", 1);
4234
4347
  _$insertNode(_el$143, _el$144);
4235
- _$insertNode(_el$143, _el$150);
4236
- _$insertNode(_el$143, _el$151);
4237
- _$setProp(_el$143, "flexDirection", "column");
4238
- _$setProp(_el$143, "paddingLeft", 4);
4239
- _$setProp(_el$143, "paddingRight", 4);
4240
- _$setProp(_el$143, "paddingTop", 1);
4241
- _$setProp(_el$143, "gap", 1);
4242
- _$insertNode(_el$144, _el$145);
4243
- _$insertNode(_el$144, _el$147);
4244
- _$insertNode(_el$147, _el$148);
4245
- _$insertNode(_el$147, _el$149);
4246
- _$insert(_el$147, () => items.length, _el$149);
4247
- _$setProp(_el$150, "flexGrow", 1);
4248
- _$setProp(_el$150, "scrollbarOptions", {
4348
+ _$insertNode(_el$143, _el$146);
4349
+ _$insertNode(_el$146, _el$147);
4350
+ _$insertNode(_el$146, _el$148);
4351
+ _$insert(_el$146, () => items.length, _el$148);
4352
+ _$setProp(_el$149, "flexGrow", 1);
4353
+ _$setProp(_el$149, "scrollbarOptions", {
4249
4354
  visible: false
4250
4355
  });
4251
- _$insert(_el$150, _$createComponent(For, {
4356
+ _$insert(_el$149, _$createComponent(For, {
4252
4357
  each: items,
4253
4358
  children: (item, index) => (() => {
4254
- var _el$154 = _$createElement("box"),
4359
+ var _el$153 = _$createElement("box"),
4360
+ _el$154 = _$createElement("text"),
4255
4361
  _el$155 = _$createElement("text"),
4256
4362
  _el$156 = _$createElement("text"),
4257
- _el$157 = _$createElement("text"),
4258
- _el$158 = _$createTextNode(` · `);
4259
- _$insertNode(_el$154, _el$155);
4260
- _$insertNode(_el$154, _el$156);
4261
- _$insertNode(_el$154, _el$157);
4262
- _$setProp(_el$154, "flexDirection", "row");
4263
- _$setProp(_el$154, "gap", 2);
4264
- _$setProp(_el$154, "paddingLeft", 1);
4265
- _$setProp(_el$154, "paddingRight", 1);
4266
- _$setProp(_el$154, "onMouseDown", () => {
4363
+ _el$157 = _$createTextNode(` · `);
4364
+ _$insertNode(_el$153, _el$154);
4365
+ _$insertNode(_el$153, _el$155);
4366
+ _$insertNode(_el$153, _el$156);
4367
+ _$setProp(_el$153, "flexDirection", "row");
4368
+ _$setProp(_el$153, "gap", 2);
4369
+ _$setProp(_el$153, "paddingLeft", 1);
4370
+ _$setProp(_el$153, "paddingRight", 1);
4371
+ _$setProp(_el$153, "onMouseDown", () => {
4267
4372
  setCursor(index());
4268
4373
  choose(item);
4269
4374
  });
4270
- _$setProp(_el$155, "flexGrow", 1);
4271
- _$setProp(_el$155, "flexShrink", 1);
4272
- _$setProp(_el$155, "wrapMode", "none");
4273
- _$insert(_el$155, () => truncate(item.entry.title, 48));
4375
+ _$setProp(_el$154, "flexGrow", 1);
4376
+ _$setProp(_el$154, "flexShrink", 1);
4377
+ _$setProp(_el$154, "wrapMode", "none");
4378
+ _$insert(_el$154, () => truncate(item.entry.title, 48));
4379
+ _$setProp(_el$155, "flexShrink", 0);
4380
+ _$insert(_el$155, () => item.reason);
4381
+ _$insertNode(_el$156, _el$157);
4274
4382
  _$setProp(_el$156, "flexShrink", 0);
4275
- _$insert(_el$156, () => item.reason);
4276
- _$insertNode(_el$157, _el$158);
4277
- _$setProp(_el$157, "flexShrink", 0);
4278
- _$insert(_el$157, () => prettyDir(item.entry.dir, home), _el$158);
4279
- _$insert(_el$157, (() => {
4280
- var _c$1 = _$memo(() => item.since === undefined);
4281
- return () => _c$1() ? "time unknown" : `waiting ${ago(item.since)}`;
4383
+ _$insert(_el$156, () => prettyDir(item.entry.dir, home), _el$157);
4384
+ _$insert(_el$156, (() => {
4385
+ var _c$0 = _$memo(() => item.since === undefined);
4386
+ return () => _c$0() ? "time unknown" : `waiting ${ago(item.since)}`;
4282
4387
  })(), null);
4283
4388
  _$effect(_p$ => {
4284
- var _v$82 = index() === cursor() ? api.theme.current.backgroundElement : RGBA.fromInts(0, 0, 0, 0),
4285
- _v$83 = {
4389
+ var _v$90 = index() === cursor() ? api.theme.current.backgroundElement : RGBA.fromInts(0, 0, 0, 0),
4390
+ _v$91 = {
4286
4391
  fg: index() === cursor() ? api.theme.current.text : api.theme.current.text
4287
4392
  },
4288
- _v$84 = {
4393
+ _v$92 = {
4289
4394
  fg: index() === cursor() ? api.theme.current.text : api.theme.current.warning
4290
4395
  },
4291
- _v$85 = {
4396
+ _v$93 = {
4292
4397
  fg: index() === cursor() ? api.theme.current.text : api.theme.current.textMuted
4293
4398
  };
4294
- _v$82 !== _p$.e && (_p$.e = _$setProp(_el$154, "backgroundColor", _v$82, _p$.e));
4295
- _v$83 !== _p$.t && (_p$.t = _$setProp(_el$155, "style", _v$83, _p$.t));
4296
- _v$84 !== _p$.a && (_p$.a = _$setProp(_el$156, "style", _v$84, _p$.a));
4297
- _v$85 !== _p$.o && (_p$.o = _$setProp(_el$157, "style", _v$85, _p$.o));
4399
+ _v$90 !== _p$.e && (_p$.e = _$setProp(_el$153, "backgroundColor", _v$90, _p$.e));
4400
+ _v$91 !== _p$.t && (_p$.t = _$setProp(_el$154, "style", _v$91, _p$.t));
4401
+ _v$92 !== _p$.a && (_p$.a = _$setProp(_el$155, "style", _v$92, _p$.a));
4402
+ _v$93 !== _p$.o && (_p$.o = _$setProp(_el$156, "style", _v$93, _p$.o));
4298
4403
  return _p$;
4299
4404
  }, {
4300
4405
  e: undefined,
@@ -4302,27 +4407,27 @@ const tui = async api => {
4302
4407
  a: undefined,
4303
4408
  o: undefined
4304
4409
  });
4305
- return _el$154;
4410
+ return _el$153;
4306
4411
  })()
4307
4412
  }));
4308
- _$insertNode(_el$151, _el$152);
4309
- _$setProp(_el$151, "flexShrink", 0);
4310
- _$insertNode(_el$152, _$createTextNode(`↑↓ navigate · enter open · n open next waiting · esc close`));
4413
+ _$insertNode(_el$150, _el$151);
4414
+ _$setProp(_el$150, "flexShrink", 0);
4415
+ _$insertNode(_el$151, _$createTextNode(`↑↓ navigate · enter open · n open next waiting · esc close`));
4311
4416
  _$effect(_p$ => {
4312
- var _v$77 = api.theme.current.backgroundPanel,
4313
- _v$78 = TextAttributes.BOLD,
4314
- _v$79 = {
4417
+ var _v$85 = api.theme.current.backgroundPanel,
4418
+ _v$86 = TextAttributes.BOLD,
4419
+ _v$87 = {
4315
4420
  fg: api.theme.current.textMuted
4316
4421
  },
4317
- _v$80 = Math.max(6, Math.floor(api.renderer.height / 2) - 10),
4318
- _v$81 = {
4422
+ _v$88 = Math.max(6, Math.floor(api.renderer.height / 2) - 10),
4423
+ _v$89 = {
4319
4424
  fg: api.theme.current.textMuted
4320
4425
  };
4321
- _v$77 !== _p$.e && (_p$.e = _$setProp(_el$143, "backgroundColor", _v$77, _p$.e));
4322
- _v$78 !== _p$.t && (_p$.t = _$setProp(_el$144, "attributes", _v$78, _p$.t));
4323
- _v$79 !== _p$.a && (_p$.a = _$setProp(_el$147, "style", _v$79, _p$.a));
4324
- _v$80 !== _p$.o && (_p$.o = _$setProp(_el$150, "height", _v$80, _p$.o));
4325
- _v$81 !== _p$.i && (_p$.i = _$setProp(_el$152, "style", _v$81, _p$.i));
4426
+ _v$85 !== _p$.e && (_p$.e = _$setProp(_el$142, "backgroundColor", _v$85, _p$.e));
4427
+ _v$86 !== _p$.t && (_p$.t = _$setProp(_el$143, "attributes", _v$86, _p$.t));
4428
+ _v$87 !== _p$.a && (_p$.a = _$setProp(_el$146, "style", _v$87, _p$.a));
4429
+ _v$88 !== _p$.o && (_p$.o = _$setProp(_el$149, "height", _v$88, _p$.o));
4430
+ _v$89 !== _p$.i && (_p$.i = _$setProp(_el$151, "style", _v$89, _p$.i));
4326
4431
  return _p$;
4327
4432
  }, {
4328
4433
  e: undefined,
@@ -4331,7 +4436,7 @@ const tui = async api => {
4331
4436
  o: undefined,
4332
4437
  i: undefined
4333
4438
  });
4334
- return _el$143;
4439
+ return _el$142;
4335
4440
  })(), () => {
4336
4441
  disposeNav();
4337
4442
  });
@@ -4567,9 +4672,9 @@ function createApi(ctx) {
4567
4672
  render: cfg.slots.sidebar_content
4568
4673
  }));
4569
4674
  }
4570
- if (cfg.slots.home_bottom) {
4675
+ if (cfg.slots.home_bottom && ctx.options?.showHome !== false) {
4571
4676
  slotDisposers.push(ctx.ui.slot({
4572
- prepend: "home.footer",
4677
+ append: "prompt.footer",
4573
4678
  render: cfg.slots.home_bottom
4574
4679
  }));
4575
4680
  }