opencode-sesh 2.1.2 → 2.1.4

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
@@ -637,7 +637,9 @@ async function openTranscriptDb() {
637
637
  }
638
638
  }
639
639
  function createSessionPoll(api, refreshPins) {
640
- const listeners = new Set();
640
+ // Listener -> whether it reads `snapshot.waiting`. The needs-input query is
641
+ // synchronous on the TUI thread, so it only runs while such a listener exists.
642
+ const listeners = new Map();
641
643
  let snapshot = {
642
644
  entries: [],
643
645
  waiting: new Map(),
@@ -645,7 +647,11 @@ function createSessionPoll(api, refreshPins) {
645
647
  };
646
648
  let clock;
647
649
  let inFlight;
650
+ // Whether `snapshot.waiting` came from a poll that ran the query; a poll
651
+ // without waiting listeners clears it so a later subscriber never sees a stale set.
652
+ let waitingLoaded = false;
648
653
  const active = () => listeners.size > 0;
654
+ const wantsWaiting = () => [...listeners.values()].some(Boolean);
649
655
  const load = () => {
650
656
  if (inFlight || !active()) return;
651
657
  inFlight = (async () => {
@@ -671,30 +677,42 @@ function createSessionPoll(api, refreshPins) {
671
677
  };
672
678
  }
673
679
  if (!active()) return;
674
- const db = await openTranscriptDb();
680
+ const db = wantsWaiting() ? await openTranscriptDb() : undefined;
675
681
  if (db) {
676
682
  try {
677
- if (active()) snapshot = {
678
- ...snapshot,
679
- waiting: await queryWaitingIds(db)
680
- };
683
+ if (wantsWaiting()) {
684
+ snapshot = {
685
+ ...snapshot,
686
+ waiting: await queryWaitingIds(db)
687
+ };
688
+ waitingLoaded = true;
689
+ }
681
690
  } catch {
682
691
  // Keep the previous waiting set when the local store is unavailable.
683
692
  } finally {
684
693
  db.close();
685
694
  }
695
+ } else if (!wantsWaiting()) {
696
+ snapshot = {
697
+ ...snapshot,
698
+ waiting: new Map()
699
+ };
700
+ waitingLoaded = false;
686
701
  }
687
- for (const listener of listeners) listener(snapshot);
702
+ for (const listener of [...listeners.keys()]) listener(snapshot);
688
703
  })().finally(() => {
689
704
  inFlight = undefined;
690
705
  });
691
706
  };
692
- return listener => {
693
- listeners.add(listener);
707
+ return (listener, options = {}) => {
708
+ const needsWaiting = options.waiting === true;
709
+ listeners.set(listener, needsWaiting);
694
710
  listener(snapshot);
695
711
  if (!clock) {
696
712
  load();
697
713
  clock = setInterval(load, POLL_MS);
714
+ } else if (needsWaiting && !waitingLoaded) {
715
+ load();
698
716
  }
699
717
  return () => {
700
718
  listeners.delete(listener);
@@ -1212,6 +1230,8 @@ function SidebarSessions(props) {
1212
1230
  setEntries(snapshot.entries);
1213
1231
  setLoadFailed(snapshot.failed);
1214
1232
  setWaiting(snapshot.waiting);
1233
+ }, {
1234
+ waiting: true
1215
1235
  })));
1216
1236
  const filteredEntries = createMemo(() => {
1217
1237
  const q = query().trim().toLowerCase();
@@ -2163,9 +2183,27 @@ function SidebarSessions(props) {
2163
2183
  })();
2164
2184
  }
2165
2185
  const HOME_SESSION_LIMIT = 6;
2186
+ // Layout baseline: OpenCode 2.2.4. Re-check these assumptions and the matching
2187
+ // tests/tui-home.mjs fixture when upgrading OpenCode: the fixture mirrors the
2188
+ // host layout, so it cannot detect upstream layout changes on its own.
2189
+ // Sources pinned to that release:
2190
+ // https://github.com/anomalyco/opencode/blob/45898d0f8569225eb1ddb4ee13f8581b34dff311/packages/tui/src/routes/home.tsx
2191
+ // https://github.com/anomalyco/opencode/blob/45898d0f8569225eb1ddb4ee13f8581b34dff311/packages/tui/src/component/prompt/index.tsx#L1676
2192
+ // https://github.com/anomalyco/opencode/blob/45898d0f8569225eb1ddb4ee13f8581b34dff311/packages/tui/src/component/logo.tsx
2193
+ // https://github.com/anomalyco/opencode/blob/45898d0f8569225eb1ddb4ee13f8581b34dff311/packages/tui/src/feature-plugins/home/footer.tsx
2194
+ // The native home needs room for its logo, composer chrome and status footer.
2195
+ // Reserve the editor's *maximum* height (one third of the terminal, at least
2196
+ // six lines), so typing/wrapping a prompt cannot push it into our footer.
2197
+ // Chrome: logo (4) + gap (1) + composer (6) + status (3). Below 44 columns,
2198
+ // the logo stacks to seven lines but the three-line status footer disappears.
2199
+ const HOME_CHROME_ROWS = 14;
2166
2200
  function HomeSessions(props) {
2167
2201
  const theme = () => props.api.theme.current;
2168
2202
  const home = process.env.HOME ?? "";
2203
+ const [dimensions, setDimensions] = createSignal({
2204
+ width: props.api.renderer.width,
2205
+ height: props.api.renderer.height
2206
+ });
2169
2207
  const [entries, setEntries] = createSignal([]);
2170
2208
  const [query, setQuery] = createSignal("");
2171
2209
  const [hovered, setHovered] = createSignal();
@@ -2301,7 +2339,15 @@ function HomeSessions(props) {
2301
2339
  onMount(() => {
2302
2340
  ensureRootMouse(props.api.renderer);
2303
2341
  rootMouseHandlers.add(onRootMouseDown);
2304
- onCleanup(() => rootMouseHandlers.delete(onRootMouseDown));
2342
+ const resize = () => setDimensions({
2343
+ width: props.api.renderer.width,
2344
+ height: props.api.renderer.height
2345
+ });
2346
+ props.api.renderer.on("resize", resize);
2347
+ onCleanup(() => {
2348
+ rootMouseHandlers.delete(onRootMouseDown);
2349
+ props.api.renderer.off("resize", resize);
2350
+ });
2305
2351
  });
2306
2352
  const appendQuery = input => {
2307
2353
  if (input === "\b") setQuery(value => value.slice(0, -1));else setQuery(value => value + input);
@@ -2360,24 +2406,46 @@ function HomeSessions(props) {
2360
2406
  setEntries(snapshot.entries);
2361
2407
  setLoadFailed(snapshot.failed);
2362
2408
  })));
2363
- const visible = createMemo(() => {
2409
+ const filtered = createMemo(() => {
2364
2410
  const q = query().trim().toLowerCase();
2365
2411
  const list = q ? entries().filter(entry => entry.title.toLowerCase().includes(q) || entry.dir.toLowerCase().includes(q)) : entries();
2366
- return pinnedFirst(list, props.pins()).slice(0, HOME_SESSION_LIMIT);
2412
+ return pinnedFirst(list, props.pins());
2413
+ });
2414
+ const layout = createMemo(() => {
2415
+ const rows = dimensions().height;
2416
+ const budget = Math.max(0, rows - Math.max(6, Math.floor(rows / 3)) - HOME_CHROME_ROWS);
2417
+ // Drop decorative padding/spacing before sessions. Keep the full list in
2418
+ // the picker when even a heading and one session cannot fit.
2419
+ const padding = budget >= HOME_SESSION_LIMIT + 2 ? 1 : 0;
2420
+ const limit = Math.min(HOME_SESSION_LIMIT, Math.max(0, budget - padding - 1));
2421
+ const count = Math.max(1, Math.min(filtered().length, limit));
2422
+ return {
2423
+ budget,
2424
+ limit,
2425
+ padding,
2426
+ gap: budget >= 1 + padding + count * 2 ? 1 : 0
2427
+ };
2428
+ });
2429
+ const visible = createMemo(() => filtered().slice(0, layout().limit));
2430
+ createEffect(() => {
2431
+ const ids = new Set(visible().map(entry => entry.id));
2432
+ if (hovered() && !ids.has(hovered())) setHovered(undefined);
2433
+ if (pendingDelete() && !ids.has(pendingDelete())) cancelDelete();
2434
+ if (layout().limit === 0) setSearching(false);
2367
2435
  });
2368
2436
  return (() => {
2369
2437
  var _el$49 = _$createElement("box"),
2370
2438
  _el$50 = _$createElement("box");
2371
2439
  _$insertNode(_el$49, _el$50);
2372
2440
  _$setProp(_el$49, "width", "100%");
2441
+ _$setProp(_el$49, "flexShrink", 0);
2442
+ _$setProp(_el$49, "overflow", "hidden");
2373
2443
  _$setProp(_el$49, "alignItems", "center");
2374
2444
  _$setProp(_el$50, "flexDirection", "column");
2375
2445
  _$setProp(_el$50, "width", "100%");
2376
2446
  _$setProp(_el$50, "maxWidth", 72);
2377
2447
  _$setProp(_el$50, "paddingLeft", 1);
2378
2448
  _$setProp(_el$50, "paddingRight", 1);
2379
- _$setProp(_el$50, "paddingTop", 1);
2380
- _$setProp(_el$50, "gap", 1);
2381
2449
  _$insert(_el$50, _$createComponent(Show, {
2382
2450
  get when() {
2383
2451
  return entries().length > 0;
@@ -2386,27 +2454,17 @@ function HomeSessions(props) {
2386
2454
  return (() => {
2387
2455
  var _el$64 = _$createElement("box"),
2388
2456
  _el$65 = _$createElement("text"),
2389
- _el$67 = _$createElement("text");
2457
+ _el$66 = _$createTextNode(`Recent sessions `);
2390
2458
  _$insertNode(_el$64, _el$65);
2391
- _$insertNode(_el$64, _el$67);
2392
- _$setProp(_el$64, "flexDirection", "row");
2393
- _$setProp(_el$64, "gap", 1);
2394
- _$insertNode(_el$65, _$createTextNode(`Recent sessions`));
2395
- _$insert(_el$67, () => loadFailed() ? "· list unavailable, will retry" : "· none yet, option+o to browse");
2396
- _$effect(_p$ => {
2397
- var _v$33 = {
2398
- fg: theme().textMuted
2399
- },
2400
- _v$34 = {
2401
- fg: theme().textMuted
2402
- };
2403
- _v$33 !== _p$.e && (_p$.e = _$setProp(_el$65, "style", _v$33, _p$.e));
2404
- _v$34 !== _p$.t && (_p$.t = _$setProp(_el$67, "style", _v$34, _p$.t));
2405
- return _p$;
2406
- }, {
2407
- e: undefined,
2408
- t: undefined
2409
- });
2459
+ _$setProp(_el$64, "height", 1);
2460
+ _$setProp(_el$64, "flexShrink", 0);
2461
+ _$insertNode(_el$65, _el$66);
2462
+ _$setProp(_el$65, "wrapMode", "none");
2463
+ _$setProp(_el$65, "overflow", "hidden");
2464
+ _$insert(_el$65, () => loadFailed() ? "· list unavailable, will retry" : "· none yet, option+o to browse", null);
2465
+ _$effect(_$p => _$setProp(_el$65, "style", {
2466
+ fg: theme().textMuted
2467
+ }, _$p));
2410
2468
  return _el$64;
2411
2469
  })();
2412
2470
  },
@@ -2415,23 +2473,40 @@ function HomeSessions(props) {
2415
2473
  var _el$51 = _$createElement("box"),
2416
2474
  _el$52 = _$createElement("box"),
2417
2475
  _el$53 = _$createElement("text"),
2418
- _el$55 = _$createElement("text"),
2419
2476
  _el$57 = _$createElement("box"),
2420
2477
  _el$58 = _$createElement("box"),
2421
2478
  _el$59 = _$createElement("text");
2422
2479
  _$insertNode(_el$51, _el$52);
2423
2480
  _$insertNode(_el$51, _el$57);
2481
+ _$setProp(_el$51, "height", 1);
2482
+ _$setProp(_el$51, "flexShrink", 0);
2424
2483
  _$setProp(_el$51, "flexDirection", "row");
2425
2484
  _$setProp(_el$51, "justifyContent", "space-between");
2426
2485
  _$setProp(_el$51, "gap", 2);
2486
+ _$setProp(_el$51, "overflow", "hidden");
2427
2487
  _$insertNode(_el$52, _el$53);
2428
- _$insertNode(_el$52, _el$55);
2429
2488
  _$setProp(_el$52, "flexDirection", "row");
2430
2489
  _$setProp(_el$52, "gap", 1);
2490
+ _$setProp(_el$52, "flexShrink", 0);
2431
2491
  _$insertNode(_el$53, _$createTextNode(`Recent sessions`));
2432
- _$insertNode(_el$55, _$createTextNode(`· option+o for all`));
2492
+ _$setProp(_el$53, "wrapMode", "none");
2493
+ _$insert(_el$52, _$createComponent(Show, {
2494
+ get when() {
2495
+ return dimensions().width >= 68;
2496
+ },
2497
+ get children() {
2498
+ var _el$55 = _$createElement("text");
2499
+ _$insertNode(_el$55, _$createTextNode(`· option+o for all`));
2500
+ _$effect(_$p => _$setProp(_el$55, "style", {
2501
+ fg: theme().textMuted
2502
+ }, _$p));
2503
+ return _el$55;
2504
+ }
2505
+ }), null);
2433
2506
  _$insertNode(_el$57, _el$58);
2434
2507
  _$setProp(_el$57, "flexDirection", "row");
2508
+ _$setProp(_el$57, "flexShrink", 1);
2509
+ _$setProp(_el$57, "minWidth", 0);
2435
2510
  _$setProp(_el$57, "gap", 1);
2436
2511
  _$setProp(_el$57, "paddingLeft", 1);
2437
2512
  _$setProp(_el$57, "paddingRight", 1);
@@ -2441,6 +2516,8 @@ function HomeSessions(props) {
2441
2516
  });
2442
2517
  _$insertNode(_el$58, _el$59);
2443
2518
  _$setProp(_el$58, "width", 24);
2519
+ _$setProp(_el$58, "flexShrink", 1);
2520
+ _$setProp(_el$58, "minWidth", 0);
2444
2521
  _$setProp(_el$59, "flexGrow", 1);
2445
2522
  _$setProp(_el$59, "flexShrink", 1);
2446
2523
  _$setProp(_el$59, "overflow", "hidden");
@@ -2466,23 +2543,18 @@ function HomeSessions(props) {
2466
2543
  var _v$29 = {
2467
2544
  fg: theme().textMuted
2468
2545
  },
2469
- _v$30 = {
2470
- fg: theme().textMuted
2471
- },
2472
- _v$31 = searching() ? theme().backgroundElement : RGBA.fromInts(0, 0, 0, 0),
2473
- _v$32 = {
2546
+ _v$30 = searching() ? theme().backgroundElement : RGBA.fromInts(0, 0, 0, 0),
2547
+ _v$31 = {
2474
2548
  fg: query() ? theme().text : theme().textMuted
2475
2549
  };
2476
2550
  _v$29 !== _p$.e && (_p$.e = _$setProp(_el$53, "style", _v$29, _p$.e));
2477
- _v$30 !== _p$.t && (_p$.t = _$setProp(_el$55, "style", _v$30, _p$.t));
2478
- _v$31 !== _p$.a && (_p$.a = _$setProp(_el$57, "backgroundColor", _v$31, _p$.a));
2479
- _v$32 !== _p$.o && (_p$.o = _$setProp(_el$59, "style", _v$32, _p$.o));
2551
+ _v$30 !== _p$.t && (_p$.t = _$setProp(_el$57, "backgroundColor", _v$30, _p$.t));
2552
+ _v$31 !== _p$.a && (_p$.a = _$setProp(_el$59, "style", _v$31, _p$.a));
2480
2553
  return _p$;
2481
2554
  }, {
2482
2555
  e: undefined,
2483
2556
  t: undefined,
2484
- a: undefined,
2485
- o: undefined
2557
+ a: undefined
2486
2558
  });
2487
2559
  return _el$51;
2488
2560
  })(), _$createComponent(For, {
@@ -2490,21 +2562,24 @@ function HomeSessions(props) {
2490
2562
  return visible();
2491
2563
  },
2492
2564
  children: entry => (() => {
2493
- var _el$68 = _$createElement("box"),
2494
- _el$69 = _$createElement("text"),
2495
- _el$71 = _$createElement("text");
2496
- _$insertNode(_el$68, _el$69);
2497
- _$insertNode(_el$68, _el$71);
2498
- _$setProp(_el$68, "flexDirection", "row");
2499
- _$setProp(_el$68, "gap", 1);
2500
- _$setProp(_el$68, "onMouseOver", () => setHovered(entry.id));
2501
- _$setProp(_el$68, "onMouseOut", () => setHovered(undefined));
2502
- _$setProp(_el$68, "onMouseDown", event => event.button === RIGHT_BUTTON ? openInCmuxWorkspace(props.api, entry) : props.api.route.navigate("session", {
2565
+ var _el$67 = _$createElement("box"),
2566
+ _el$68 = _$createElement("text"),
2567
+ _el$70 = _$createElement("text");
2568
+ _$insertNode(_el$67, _el$68);
2569
+ _$insertNode(_el$67, _el$70);
2570
+ _$setProp(_el$67, "height", 1);
2571
+ _$setProp(_el$67, "flexShrink", 0);
2572
+ _$setProp(_el$67, "overflow", "hidden");
2573
+ _$setProp(_el$67, "flexDirection", "row");
2574
+ _$setProp(_el$67, "gap", 1);
2575
+ _$setProp(_el$67, "onMouseOver", () => setHovered(entry.id));
2576
+ _$setProp(_el$67, "onMouseOut", () => setHovered(undefined));
2577
+ _$setProp(_el$67, "onMouseDown", event => event.button === RIGHT_BUTTON ? openInCmuxWorkspace(props.api, entry) : props.api.route.navigate("session", {
2503
2578
  sessionID: entry.id
2504
2579
  }));
2505
- _$insertNode(_el$69, _$createTextNode(`○`));
2506
- _$setProp(_el$69, "flexShrink", 0);
2507
- _$insert(_el$68, _$createComponent(Highlighted, {
2580
+ _$insertNode(_el$68, _$createTextNode(`○`));
2581
+ _$setProp(_el$68, "flexShrink", 0);
2582
+ _$insert(_el$67, _$createComponent(Highlighted, {
2508
2583
  get text() {
2509
2584
  return `${props.pins().sessions.includes(entry.id) ? "★ " : ""}${truncate(entry.title, HOME_TITLE_WIDTH - (props.pins().sessions.includes(entry.id) ? 2 : 0))}`;
2510
2585
  },
@@ -2517,30 +2592,35 @@ function HomeSessions(props) {
2517
2592
  get matchColor() {
2518
2593
  return theme().warning;
2519
2594
  }
2520
- }), _el$71);
2521
- _$setProp(_el$71, "flexShrink", 0);
2522
- _$insert(_el$71, (() => {
2595
+ }), _el$70);
2596
+ _$setProp(_el$70, "flexShrink", 1);
2597
+ _$setProp(_el$70, "wrapMode", "none");
2598
+ _$setProp(_el$70, "overflow", "hidden");
2599
+ _$insert(_el$70, (() => {
2523
2600
  var _c$5 = _$memo(() => pendingDelete() === entry.id);
2524
2601
  return () => _c$5() ? "option+d again" : `${props.pins().directories.includes(entry.dir) ? "★ " : ""}${prettyDir(entry.dir, home)} · ${ago(entry.updated)}`;
2525
2602
  })());
2526
2603
  _$effect(_p$ => {
2527
- var _v$35 = entry.id === hovered() ? theme().backgroundElement : RGBA.fromInts(0, 0, 0, 0),
2528
- _v$36 = {
2604
+ var _v$36 = entry.id === hovered() ? theme().backgroundElement : RGBA.fromInts(0, 0, 0, 0),
2605
+ _v$37 = {
2529
2606
  fg: theme().textMuted
2530
2607
  },
2531
- _v$37 = {
2608
+ _v$38 = Math.max(0, Math.floor((Math.min(72, dimensions().width) - 4) / 2)),
2609
+ _v$39 = {
2532
2610
  fg: pendingDelete() === entry.id ? theme().error : theme().textMuted
2533
2611
  };
2534
- _v$35 !== _p$.e && (_p$.e = _$setProp(_el$68, "backgroundColor", _v$35, _p$.e));
2535
- _v$36 !== _p$.t && (_p$.t = _$setProp(_el$69, "style", _v$36, _p$.t));
2536
- _v$37 !== _p$.a && (_p$.a = _$setProp(_el$71, "style", _v$37, _p$.a));
2612
+ _v$36 !== _p$.e && (_p$.e = _$setProp(_el$67, "backgroundColor", _v$36, _p$.e));
2613
+ _v$37 !== _p$.t && (_p$.t = _$setProp(_el$68, "style", _v$37, _p$.t));
2614
+ _v$38 !== _p$.a && (_p$.a = _$setProp(_el$70, "maxWidth", _v$38, _p$.a));
2615
+ _v$39 !== _p$.o && (_p$.o = _$setProp(_el$70, "style", _v$39, _p$.o));
2537
2616
  return _p$;
2538
2617
  }, {
2539
2618
  e: undefined,
2540
2619
  t: undefined,
2541
- a: undefined
2620
+ a: undefined,
2621
+ o: undefined
2542
2622
  });
2543
- return _el$68;
2623
+ return _el$67;
2544
2624
  })()
2545
2625
  }), _$createComponent(Show, {
2546
2626
  get when() {
@@ -2549,6 +2629,10 @@ function HomeSessions(props) {
2549
2629
  get children() {
2550
2630
  var _el$62 = _$createElement("text");
2551
2631
  _$insertNode(_el$62, _$createTextNode(`No title or directory matches · option+o to search transcripts`));
2632
+ _$setProp(_el$62, "height", 1);
2633
+ _$setProp(_el$62, "flexShrink", 0);
2634
+ _$setProp(_el$62, "wrapMode", "none");
2635
+ _$setProp(_el$62, "overflow", "hidden");
2552
2636
  _$effect(_$p => _$setProp(_el$62, "style", {
2553
2637
  fg: theme().textMuted
2554
2638
  }, _$p));
@@ -2557,6 +2641,22 @@ function HomeSessions(props) {
2557
2641
  })];
2558
2642
  }
2559
2643
  }));
2644
+ _$effect(_p$ => {
2645
+ var _v$32 = layout().limit > 0,
2646
+ _v$33 = layout().budget,
2647
+ _v$34 = layout().padding,
2648
+ _v$35 = layout().gap;
2649
+ _v$32 !== _p$.e && (_p$.e = _$setProp(_el$49, "visible", _v$32, _p$.e));
2650
+ _v$33 !== _p$.t && (_p$.t = _$setProp(_el$49, "maxHeight", _v$33, _p$.t));
2651
+ _v$34 !== _p$.a && (_p$.a = _$setProp(_el$50, "paddingTop", _v$34, _p$.a));
2652
+ _v$35 !== _p$.o && (_p$.o = _$setProp(_el$50, "gap", _v$35, _p$.o));
2653
+ return _p$;
2654
+ }, {
2655
+ e: undefined,
2656
+ t: undefined,
2657
+ a: undefined,
2658
+ o: undefined
2659
+ });
2560
2660
  return _el$49;
2561
2661
  })();
2562
2662
  }
@@ -3120,64 +3220,64 @@ const tui = async api => {
3120
3220
  if (previewTimer) clearTimeout(previewTimer);
3121
3221
  };
3122
3222
  api.ui.dialog.replace(() => (() => {
3123
- var _el$72 = _$createElement("box"),
3223
+ var _el$71 = _$createElement("box"),
3224
+ _el$72 = _$createElement("box"),
3124
3225
  _el$73 = _$createElement("box"),
3125
- _el$74 = _$createElement("box"),
3126
- _el$75 = _$createElement("text"),
3127
- _el$76 = _$createTextNode(`Sessions `),
3128
- _el$77 = _$createElement("span"),
3129
- _el$78 = _$createTextNode(`(`),
3130
- _el$79 = _$createTextNode(`)`),
3131
- _el$80 = _$createElement("text"),
3132
- _el$82 = _$createElement("box"),
3133
- _el$83 = _$createElement("input"),
3134
- _el$86 = _$createElement("box"),
3226
+ _el$74 = _$createElement("text"),
3227
+ _el$75 = _$createTextNode(`Sessions `),
3228
+ _el$76 = _$createElement("span"),
3229
+ _el$77 = _$createTextNode(`(`),
3230
+ _el$78 = _$createTextNode(`)`),
3231
+ _el$79 = _$createElement("text"),
3232
+ _el$81 = _$createElement("box"),
3233
+ _el$82 = _$createElement("input"),
3234
+ _el$85 = _$createElement("box"),
3235
+ _el$86 = _$createElement("text"),
3135
3236
  _el$87 = _$createElement("text"),
3136
3237
  _el$88 = _$createElement("text"),
3137
- _el$89 = _$createElement("text"),
3138
- _el$90 = _$createElement("box"),
3139
- _el$93 = _$createElement("box"),
3140
- _el$94 = _$createElement("text");
3238
+ _el$89 = _$createElement("box"),
3239
+ _el$92 = _$createElement("box"),
3240
+ _el$93 = _$createElement("text");
3241
+ _$insertNode(_el$71, _el$72);
3242
+ _$insertNode(_el$71, _el$89);
3243
+ _$insertNode(_el$71, _el$92);
3244
+ _$setProp(_el$71, "flexDirection", "column");
3245
+ _$setProp(_el$71, "paddingTop", 1);
3246
+ _$setProp(_el$71, "paddingBottom", 1);
3247
+ _$setProp(_el$71, "gap", 1);
3141
3248
  _$insertNode(_el$72, _el$73);
3142
- _$insertNode(_el$72, _el$90);
3143
- _$insertNode(_el$72, _el$93);
3144
- _$setProp(_el$72, "flexDirection", "column");
3145
- _$setProp(_el$72, "paddingTop", 1);
3146
- _$setProp(_el$72, "paddingBottom", 1);
3147
- _$setProp(_el$72, "gap", 1);
3249
+ _$insertNode(_el$72, _el$81);
3250
+ _$insertNode(_el$72, _el$85);
3251
+ _$setProp(_el$72, "paddingLeft", 4);
3252
+ _$setProp(_el$72, "paddingRight", 4);
3148
3253
  _$insertNode(_el$73, _el$74);
3149
- _$insertNode(_el$73, _el$82);
3150
- _$insertNode(_el$73, _el$86);
3151
- _$setProp(_el$73, "paddingLeft", 4);
3152
- _$setProp(_el$73, "paddingRight", 4);
3254
+ _$insertNode(_el$73, _el$79);
3255
+ _$setProp(_el$73, "flexDirection", "row");
3256
+ _$setProp(_el$73, "justifyContent", "space-between");
3153
3257
  _$insertNode(_el$74, _el$75);
3154
- _$insertNode(_el$74, _el$80);
3155
- _$setProp(_el$74, "flexDirection", "row");
3156
- _$setProp(_el$74, "justifyContent", "space-between");
3157
- _$insertNode(_el$75, _el$76);
3158
- _$insertNode(_el$75, _el$77);
3159
- _$insertNode(_el$77, _el$78);
3160
- _$insertNode(_el$77, _el$79);
3161
- _$insert(_el$77, () => selectableEntries().length, _el$79);
3162
- _$insertNode(_el$80, _$createTextNode(`esc`));
3163
- _$setProp(_el$80, "onMouseUp", close);
3164
- _$insertNode(_el$82, _el$83);
3165
- _$setProp(_el$82, "paddingTop", 1);
3166
- _$setProp(_el$83, "focused", true);
3167
- _$setProp(_el$83, "placeholder", "Search title, directory, transcript…");
3168
- _$setProp(_el$83, "cursorStyle", {
3258
+ _$insertNode(_el$74, _el$76);
3259
+ _$insertNode(_el$76, _el$77);
3260
+ _$insertNode(_el$76, _el$78);
3261
+ _$insert(_el$76, () => selectableEntries().length, _el$78);
3262
+ _$insertNode(_el$79, _$createTextNode(`esc`));
3263
+ _$setProp(_el$79, "onMouseUp", close);
3264
+ _$insertNode(_el$81, _el$82);
3265
+ _$setProp(_el$81, "paddingTop", 1);
3266
+ _$setProp(_el$82, "focused", true);
3267
+ _$setProp(_el$82, "placeholder", "Search title, directory, transcript…");
3268
+ _$setProp(_el$82, "cursorStyle", {
3169
3269
  style: "line",
3170
3270
  blinking: false
3171
3271
  });
3172
- _$setProp(_el$83, "onInput", value => {
3272
+ _$setProp(_el$82, "onInput", value => {
3173
3273
  if (pendingDelete()) return;
3174
3274
  setQuery(value);
3175
3275
  });
3176
- _$setProp(_el$83, "onSubmit", () => {
3276
+ _$setProp(_el$82, "onSubmit", () => {
3177
3277
  if (confirmArmed()) return;
3178
3278
  choose();
3179
3279
  });
3180
- _$setProp(_el$83, "onKeyDown", event => {
3280
+ _$setProp(_el$82, "onKeyDown", event => {
3181
3281
  if (event.name === "escape") {
3182
3282
  event.preventDefault();
3183
3283
  handleEscape();
@@ -3209,92 +3309,92 @@ const tui = async api => {
3209
3309
  }
3210
3310
  }
3211
3311
  });
3212
- _$insert(_el$73, _$createComponent(Show, {
3312
+ _$insert(_el$72, _$createComponent(Show, {
3213
3313
  get when() {
3214
3314
  return coverageLabel();
3215
3315
  },
3216
3316
  get children() {
3217
- var _el$84 = _$createElement("box"),
3218
- _el$85 = _$createElement("text");
3219
- _$insertNode(_el$84, _el$85);
3220
- _$setProp(_el$84, "paddingTop", 1);
3221
- _$insert(_el$85, coverageLabel);
3222
- _$effect(_$p => _$setProp(_el$85, "style", {
3317
+ var _el$83 = _$createElement("box"),
3318
+ _el$84 = _$createElement("text");
3319
+ _$insertNode(_el$83, _el$84);
3320
+ _$setProp(_el$83, "paddingTop", 1);
3321
+ _$insert(_el$84, coverageLabel);
3322
+ _$effect(_$p => _$setProp(_el$84, "style", {
3223
3323
  fg: api.theme.current.textMuted
3224
3324
  }, _$p));
3225
- return _el$84;
3325
+ return _el$83;
3226
3326
  }
3227
- }), _el$86);
3228
- _$insertNode(_el$86, _el$87);
3229
- _$insertNode(_el$86, _el$88);
3230
- _$insertNode(_el$86, _el$89);
3231
- _$setProp(_el$86, "flexDirection", "row");
3232
- _$setProp(_el$86, "gap", 2);
3233
- _$setProp(_el$86, "paddingTop", 1);
3234
- _$setProp(_el$87, "onMouseDown", () => {
3327
+ }), _el$85);
3328
+ _$insertNode(_el$85, _el$86);
3329
+ _$insertNode(_el$85, _el$87);
3330
+ _$insertNode(_el$85, _el$88);
3331
+ _$setProp(_el$85, "flexDirection", "row");
3332
+ _$setProp(_el$85, "gap", 2);
3333
+ _$setProp(_el$85, "paddingTop", 1);
3334
+ _$setProp(_el$86, "onMouseDown", () => {
3235
3335
  const group = currentProject();
3236
3336
  if (group) setScope(scope() === group ? undefined : group);else api.ui.toast({
3237
3337
  message: "No current project to filter",
3238
3338
  variant: "info"
3239
3339
  });
3240
3340
  });
3241
- _$insert(_el$87, (() => {
3341
+ _$insert(_el$86, (() => {
3242
3342
  var _c$6 = _$memo(() => !!scope());
3243
3343
  return () => _c$6() ? `Project: ${truncate(scope(), 22)}` : "Project: all";
3244
3344
  })());
3245
- _$setProp(_el$88, "onMouseDown", () => setWaitingOnly(value => !value));
3246
- _$insert(_el$88, () => waitingOnly() ? "● Needs input" : "○ Needs input");
3247
- _$setProp(_el$89, "onMouseDown", () => setPinnedOnly(value => !value));
3248
- _$insert(_el$89, () => pinnedOnly() ? "★ Pinned" : "☆ Pinned");
3249
- _$setProp(_el$90, "flexDirection", "column");
3250
- _$setProp(_el$90, "flexGrow", 1);
3251
- _$setProp(_el$90, "overflow", "hidden");
3252
- _$setProp(_el$90, "onMouseScroll", event => {
3345
+ _$setProp(_el$87, "onMouseDown", () => setWaitingOnly(value => !value));
3346
+ _$insert(_el$87, () => waitingOnly() ? "● Needs input" : "○ Needs input");
3347
+ _$setProp(_el$88, "onMouseDown", () => setPinnedOnly(value => !value));
3348
+ _$insert(_el$88, () => pinnedOnly() ? "★ Pinned" : "☆ Pinned");
3349
+ _$setProp(_el$89, "flexDirection", "column");
3350
+ _$setProp(_el$89, "flexGrow", 1);
3351
+ _$setProp(_el$89, "overflow", "hidden");
3352
+ _$setProp(_el$89, "onMouseScroll", event => {
3253
3353
  scrollPicker(event.scroll);
3254
3354
  });
3255
- _$insert(_el$90, _$createComponent(For, {
3355
+ _$insert(_el$89, _$createComponent(For, {
3256
3356
  get each() {
3257
3357
  return visiblePickerRows();
3258
3358
  },
3259
3359
  children: row => {
3260
3360
  if (row.kind === "group") return (() => {
3261
- var _el$107 = _$createElement("box"),
3361
+ var _el$106 = _$createElement("box"),
3362
+ _el$107 = _$createElement("text"),
3262
3363
  _el$108 = _$createElement("text"),
3263
- _el$109 = _$createElement("text"),
3264
- _el$110 = _$createTextNode(` (`),
3265
- _el$111 = _$createTextNode(`)`);
3266
- _$insertNode(_el$107, _el$108);
3267
- _$insertNode(_el$107, _el$109);
3268
- _$setProp(_el$107, "flexDirection", "row");
3269
- _$setProp(_el$107, "paddingLeft", 4);
3270
- _$setProp(_el$107, "paddingRight", 4);
3271
- _$setProp(_el$107, "onMouseDown", () => setCollapsed(state => ({
3364
+ _el$109 = _$createTextNode(` (`),
3365
+ _el$110 = _$createTextNode(`)`);
3366
+ _$insertNode(_el$106, _el$107);
3367
+ _$insertNode(_el$106, _el$108);
3368
+ _$setProp(_el$106, "flexDirection", "row");
3369
+ _$setProp(_el$106, "paddingLeft", 4);
3370
+ _$setProp(_el$106, "paddingRight", 4);
3371
+ _$setProp(_el$106, "onMouseDown", () => setCollapsed(state => ({
3272
3372
  ...state,
3273
3373
  [row.dir]: !state[row.dir]
3274
3374
  })));
3275
- _$setProp(_el$108, "flexGrow", 1);
3276
- _$setProp(_el$108, "flexShrink", 1);
3277
- _$setProp(_el$108, "wrapMode", "none");
3278
- _$insert(_el$108, () => collapsed()[row.dir] && !query().trim() ? "▸ " : "▾ ", null);
3279
- _$insert(_el$108, () => row.pinned ? "★ " : "", null);
3280
- _$insert(_el$108, () => row.label, null);
3281
- _$insertNode(_el$109, _el$110);
3282
- _$insertNode(_el$109, _el$111);
3283
- _$setProp(_el$109, "flexShrink", 0);
3284
- _$insert(_el$109, () => row.count, _el$111);
3375
+ _$setProp(_el$107, "flexGrow", 1);
3376
+ _$setProp(_el$107, "flexShrink", 1);
3377
+ _$setProp(_el$107, "wrapMode", "none");
3378
+ _$insert(_el$107, () => collapsed()[row.dir] && !query().trim() ? "▸ " : "▾ ", null);
3379
+ _$insert(_el$107, () => row.pinned ? "★ " : "", null);
3380
+ _$insert(_el$107, () => row.label, null);
3381
+ _$insertNode(_el$108, _el$109);
3382
+ _$insertNode(_el$108, _el$110);
3383
+ _$setProp(_el$108, "flexShrink", 0);
3384
+ _$insert(_el$108, () => row.count, _el$110);
3285
3385
  _$effect(_p$ => {
3286
- var _v$58 = row.continued ? 0 : 1,
3287
- _v$59 = {
3386
+ var _v$60 = row.continued ? 0 : 1,
3387
+ _v$61 = {
3288
3388
  fg: api.theme.current.accent
3289
3389
  },
3290
- _v$60 = TextAttributes.BOLD,
3291
- _v$61 = {
3390
+ _v$62 = TextAttributes.BOLD,
3391
+ _v$63 = {
3292
3392
  fg: api.theme.current.textMuted
3293
3393
  };
3294
- _v$58 !== _p$.e && (_p$.e = _$setProp(_el$107, "paddingTop", _v$58, _p$.e));
3295
- _v$59 !== _p$.t && (_p$.t = _$setProp(_el$108, "style", _v$59, _p$.t));
3296
- _v$60 !== _p$.a && (_p$.a = _$setProp(_el$108, "attributes", _v$60, _p$.a));
3297
- _v$61 !== _p$.o && (_p$.o = _$setProp(_el$109, "style", _v$61, _p$.o));
3394
+ _v$60 !== _p$.e && (_p$.e = _$setProp(_el$106, "paddingTop", _v$60, _p$.e));
3395
+ _v$61 !== _p$.t && (_p$.t = _$setProp(_el$107, "style", _v$61, _p$.t));
3396
+ _v$62 !== _p$.a && (_p$.a = _$setProp(_el$107, "attributes", _v$62, _p$.a));
3397
+ _v$63 !== _p$.o && (_p$.o = _$setProp(_el$108, "style", _v$63, _p$.o));
3298
3398
  return _p$;
3299
3399
  }, {
3300
3400
  e: undefined,
@@ -3302,46 +3402,46 @@ const tui = async api => {
3302
3402
  a: undefined,
3303
3403
  o: undefined
3304
3404
  });
3305
- return _el$107;
3405
+ return _el$106;
3306
3406
  })();
3307
3407
  const excerpt = createMemo(() => transcriptMatchExcerpt(searchIndex().get(row.entry.id), row.entry, query()));
3308
3408
  return (() => {
3309
- var _el$112 = _$createElement("box"),
3310
- _el$113 = _$createElement("box"),
3311
- _el$114 = _$createElement("text"),
3312
- _el$117 = _$createElement("text");
3313
- _$insertNode(_el$112, _el$113);
3314
- _$setProp(_el$112, "flexDirection", "column");
3315
- _$setProp(_el$112, "paddingLeft", 6);
3316
- _$setProp(_el$112, "paddingRight", 4);
3317
- _$setProp(_el$112, "onMouseMove", () => {
3409
+ var _el$111 = _$createElement("box"),
3410
+ _el$112 = _$createElement("box"),
3411
+ _el$113 = _$createElement("text"),
3412
+ _el$116 = _$createElement("text");
3413
+ _$insertNode(_el$111, _el$112);
3414
+ _$setProp(_el$111, "flexDirection", "column");
3415
+ _$setProp(_el$111, "paddingLeft", 6);
3416
+ _$setProp(_el$111, "paddingRight", 4);
3417
+ _$setProp(_el$111, "onMouseMove", () => {
3318
3418
  // Repainting under a stationary pointer must not select
3319
3419
  // another row while the wheel is moving the viewport.
3320
3420
  const index = selectableEntries().findIndex(entry => entry.id === row.entry.id);
3321
3421
  if (index >= 0) setCursor(index);
3322
3422
  });
3323
- _$setProp(_el$112, "onMouseDown", event => event.button === RIGHT_BUTTON ? (cleanup(), api.ui.dialog.clear(), openInCmuxWorkspace(api, row.entry)) : choose(row.entry));
3324
- _$insertNode(_el$113, _el$114);
3325
- _$insertNode(_el$113, _el$117);
3326
- _$setProp(_el$113, "flexDirection", "row");
3327
- _$setProp(_el$113, "gap", 1);
3328
- _$setProp(_el$114, "flexShrink", 0);
3329
- _$insert(_el$114, () => row.last ? "└" : "├");
3330
- _$insert(_el$113, _$createComponent(Show, {
3423
+ _$setProp(_el$111, "onMouseDown", event => event.button === RIGHT_BUTTON ? (cleanup(), api.ui.dialog.clear(), openInCmuxWorkspace(api, row.entry)) : choose(row.entry));
3424
+ _$insertNode(_el$112, _el$113);
3425
+ _$insertNode(_el$112, _el$116);
3426
+ _$setProp(_el$112, "flexDirection", "row");
3427
+ _$setProp(_el$112, "gap", 1);
3428
+ _$setProp(_el$113, "flexShrink", 0);
3429
+ _$insert(_el$113, () => row.last ? "└" : "├");
3430
+ _$insert(_el$112, _$createComponent(Show, {
3331
3431
  get when() {
3332
3432
  return row.entry.id === currentSessionID();
3333
3433
  },
3334
3434
  get children() {
3335
- var _el$115 = _$createElement("text");
3336
- _$insertNode(_el$115, _$createTextNode(`●`));
3337
- _$setProp(_el$115, "flexShrink", 0);
3338
- _$effect(_$p => _$setProp(_el$115, "style", {
3435
+ var _el$114 = _$createElement("text");
3436
+ _$insertNode(_el$114, _$createTextNode(`●`));
3437
+ _$setProp(_el$114, "flexShrink", 0);
3438
+ _$effect(_$p => _$setProp(_el$114, "style", {
3339
3439
  fg: row.entry.id === selectableEntries()[cursor()]?.id ? api.theme.current.text : api.theme.current.primary
3340
3440
  }, _$p));
3341
- return _el$115;
3441
+ return _el$114;
3342
3442
  }
3343
- }), _el$117);
3344
- _$insert(_el$113, _$createComponent(Highlighted, {
3443
+ }), _el$116);
3444
+ _$insert(_el$112, _$createComponent(Highlighted, {
3345
3445
  get text() {
3346
3446
  return `${pins().sessions.includes(row.entry.id) ? "★ " : ""}${truncate(row.entry.title, pins().sessions.includes(row.entry.id) ? 59 : 61)}`;
3347
3447
  },
@@ -3357,26 +3457,26 @@ const tui = async api => {
3357
3457
  get matchColor() {
3358
3458
  return _$memo(() => row.entry.id === selectableEntries()[cursor()]?.id)() ? api.theme.current.text : api.theme.current.warning;
3359
3459
  }
3360
- }), _el$117);
3361
- _$setProp(_el$117, "flexShrink", 0);
3362
- _$insert(_el$117, (() => {
3460
+ }), _el$116);
3461
+ _$setProp(_el$116, "flexShrink", 0);
3462
+ _$insert(_el$116, (() => {
3363
3463
  var _c$0 = _$memo(() => pendingDelete()?.id === row.entry.id);
3364
3464
  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" : ""}`;
3365
3465
  })());
3366
- _$insert(_el$112, _$createComponent(Show, {
3466
+ _$insert(_el$111, _$createComponent(Show, {
3367
3467
  get when() {
3368
3468
  return excerpt();
3369
3469
  },
3370
3470
  children: match => (() => {
3371
- var _el$118 = _$createElement("box"),
3372
- _el$119 = _$createElement("text");
3373
- _$insertNode(_el$118, _el$119);
3374
- _$setProp(_el$118, "flexDirection", "row");
3375
- _$setProp(_el$118, "gap", 1);
3376
- _$setProp(_el$118, "paddingLeft", 2);
3377
- _$insertNode(_el$119, _$createTextNode(`↳`));
3378
- _$setProp(_el$119, "flexShrink", 0);
3379
- _$insert(_el$118, _$createComponent(Highlighted, {
3471
+ var _el$117 = _$createElement("box"),
3472
+ _el$118 = _$createElement("text");
3473
+ _$insertNode(_el$117, _el$118);
3474
+ _$setProp(_el$117, "flexDirection", "row");
3475
+ _$setProp(_el$117, "gap", 1);
3476
+ _$setProp(_el$117, "paddingLeft", 2);
3477
+ _$insertNode(_el$118, _$createTextNode(`↳`));
3478
+ _$setProp(_el$118, "flexShrink", 0);
3479
+ _$insert(_el$117, _$createComponent(Highlighted, {
3380
3480
  get text() {
3381
3481
  return match();
3382
3482
  },
@@ -3390,140 +3490,140 @@ const tui = async api => {
3390
3490
  return api.theme.current.warning;
3391
3491
  }
3392
3492
  }), null);
3393
- _$effect(_$p => _$setProp(_el$119, "style", {
3493
+ _$effect(_$p => _$setProp(_el$118, "style", {
3394
3494
  fg: api.theme.current.textMuted
3395
3495
  }, _$p));
3396
- return _el$118;
3496
+ return _el$117;
3397
3497
  })()
3398
3498
  }), null);
3399
3499
  _$effect(_p$ => {
3400
- var _v$62 = row.entry.id === selectableEntries()[cursor()]?.id ? api.theme.current.backgroundElement : RGBA.fromInts(0, 0, 0, 0),
3401
- _v$63 = {
3500
+ var _v$64 = row.entry.id === selectableEntries()[cursor()]?.id ? api.theme.current.backgroundElement : RGBA.fromInts(0, 0, 0, 0),
3501
+ _v$65 = {
3402
3502
  fg: row.entry.id === selectableEntries()[cursor()]?.id ? api.theme.current.text : api.theme.current.textMuted
3403
3503
  },
3404
- _v$64 = {
3504
+ _v$66 = {
3405
3505
  fg: pendingDelete()?.id === row.entry.id ? api.theme.current.error : row.entry.id === selectableEntries()[cursor()]?.id ? api.theme.current.text : api.theme.current.textMuted
3406
3506
  };
3407
- _v$62 !== _p$.e && (_p$.e = _$setProp(_el$112, "backgroundColor", _v$62, _p$.e));
3408
- _v$63 !== _p$.t && (_p$.t = _$setProp(_el$114, "style", _v$63, _p$.t));
3409
- _v$64 !== _p$.a && (_p$.a = _$setProp(_el$117, "style", _v$64, _p$.a));
3507
+ _v$64 !== _p$.e && (_p$.e = _$setProp(_el$111, "backgroundColor", _v$64, _p$.e));
3508
+ _v$65 !== _p$.t && (_p$.t = _$setProp(_el$113, "style", _v$65, _p$.t));
3509
+ _v$66 !== _p$.a && (_p$.a = _$setProp(_el$116, "style", _v$66, _p$.a));
3410
3510
  return _p$;
3411
3511
  }, {
3412
3512
  e: undefined,
3413
3513
  t: undefined,
3414
3514
  a: undefined
3415
3515
  });
3416
- return _el$112;
3516
+ return _el$111;
3417
3517
  })();
3418
3518
  }
3419
3519
  }), null);
3420
- _$insert(_el$90, _$createComponent(Show, {
3520
+ _$insert(_el$89, _$createComponent(Show, {
3421
3521
  get when() {
3422
3522
  return matchedGroups().length === 0;
3423
3523
  },
3424
3524
  get children() {
3425
- var _el$91 = _$createElement("box"),
3426
- _el$92 = _$createElement("text");
3427
- _$insertNode(_el$91, _el$92);
3428
- _$setProp(_el$91, "paddingLeft", 4);
3429
- _$setProp(_el$91, "paddingRight", 4);
3430
- _$insert(_el$92, (() => {
3525
+ var _el$90 = _$createElement("box"),
3526
+ _el$91 = _$createElement("text");
3527
+ _$insertNode(_el$90, _el$91);
3528
+ _$setProp(_el$90, "paddingLeft", 4);
3529
+ _$setProp(_el$90, "paddingRight", 4);
3530
+ _$insert(_el$91, (() => {
3431
3531
  var _c$7 = _$memo(() => !!(waitingOnly() && waitingCoverage() === "loading"));
3432
3532
  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";
3433
3533
  })());
3434
- _$effect(_$p => _$setProp(_el$92, "style", {
3534
+ _$effect(_$p => _$setProp(_el$91, "style", {
3435
3535
  fg: api.theme.current.textMuted
3436
3536
  }, _$p));
3437
- return _el$91;
3537
+ return _el$90;
3438
3538
  }
3439
3539
  }), null);
3440
- _$insertNode(_el$93, _el$94);
3441
- _$setProp(_el$93, "paddingLeft", 4);
3442
- _$setProp(_el$93, "paddingRight", 4);
3443
- _$setProp(_el$93, "flexShrink", 0);
3444
- _$setProp(_el$93, "flexDirection", "column");
3445
- _$insert(_el$94, (() => {
3540
+ _$insertNode(_el$92, _el$93);
3541
+ _$setProp(_el$92, "paddingLeft", 4);
3542
+ _$setProp(_el$92, "paddingRight", 4);
3543
+ _$setProp(_el$92, "flexShrink", 0);
3544
+ _$setProp(_el$92, "flexDirection", "column");
3545
+ _$insert(_el$93, (() => {
3446
3546
  var _c$8 = _$memo(() => !!pendingDelete());
3447
3547
  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";
3448
3548
  })());
3449
- _$insert(_el$93, _$createComponent(Show, {
3549
+ _$insert(_el$92, _$createComponent(Show, {
3450
3550
  get when() {
3451
3551
  return !pendingDelete();
3452
3552
  },
3453
3553
  get children() {
3454
- var _el$95 = _$createElement("text");
3455
- _$insertNode(_el$95, _$createTextNode(`ctrl+s/d pin · option+d delete · ctrl+f fork · esc close`));
3456
- _$effect(_$p => _$setProp(_el$95, "style", {
3554
+ var _el$94 = _$createElement("text");
3555
+ _$insertNode(_el$94, _$createTextNode(`ctrl+s/d pin · option+d delete · ctrl+f fork · esc close`));
3556
+ _$effect(_$p => _$setProp(_el$94, "style", {
3457
3557
  fg: api.theme.current.textMuted
3458
3558
  }, _$p));
3459
- return _el$95;
3559
+ return _el$94;
3460
3560
  }
3461
3561
  }), null);
3462
- _$insert(_el$72, _$createComponent(Show, {
3562
+ _$insert(_el$71, _$createComponent(Show, {
3463
3563
  get when() {
3464
3564
  return showPreview();
3465
3565
  },
3466
3566
  get children() {
3467
- var _el$97 = _$createElement("box"),
3468
- _el$98 = _$createElement("box"),
3567
+ var _el$96 = _$createElement("box"),
3568
+ _el$97 = _$createElement("box"),
3569
+ _el$98 = _$createElement("text"),
3469
3570
  _el$99 = _$createElement("text"),
3470
- _el$100 = _$createElement("text"),
3471
- _el$104 = _$createElement("scrollbox"),
3472
- _el$105 = _$createElement("text");
3571
+ _el$103 = _$createElement("scrollbox"),
3572
+ _el$104 = _$createElement("text");
3573
+ _$insertNode(_el$96, _el$97);
3574
+ _$insertNode(_el$96, _el$103);
3575
+ _$insertNode(_el$96, _el$104);
3576
+ _$setProp(_el$96, "position", "absolute");
3577
+ _$setProp(_el$96, "left", 0);
3578
+ _$setProp(_el$96, "top", 0);
3579
+ _$setProp(_el$96, "width", dialogWidth);
3580
+ _$setProp(_el$96, "flexDirection", "column");
3581
+ _$setProp(_el$96, "paddingLeft", 4);
3582
+ _$setProp(_el$96, "paddingRight", 4);
3583
+ _$setProp(_el$96, "paddingTop", 1);
3584
+ _$setProp(_el$96, "paddingBottom", 1);
3585
+ _$setProp(_el$96, "gap", 1);
3473
3586
  _$insertNode(_el$97, _el$98);
3474
- _$insertNode(_el$97, _el$104);
3475
- _$insertNode(_el$97, _el$105);
3476
- _$setProp(_el$97, "position", "absolute");
3477
- _$setProp(_el$97, "left", 0);
3478
- _$setProp(_el$97, "top", 0);
3479
- _$setProp(_el$97, "width", dialogWidth);
3480
- _$setProp(_el$97, "flexDirection", "column");
3481
- _$setProp(_el$97, "paddingLeft", 4);
3482
- _$setProp(_el$97, "paddingRight", 4);
3483
- _$setProp(_el$97, "paddingTop", 1);
3484
- _$setProp(_el$97, "paddingBottom", 1);
3485
- _$setProp(_el$97, "gap", 1);
3486
- _$insertNode(_el$98, _el$99);
3487
- _$insertNode(_el$98, _el$100);
3488
- _$setProp(_el$98, "flexDirection", "row");
3489
- _$setProp(_el$98, "justifyContent", "space-between");
3490
- _$insert(_el$99, (() => {
3587
+ _$insertNode(_el$97, _el$99);
3588
+ _$setProp(_el$97, "flexDirection", "row");
3589
+ _$setProp(_el$97, "justifyContent", "space-between");
3590
+ _$insert(_el$98, (() => {
3491
3591
  var _c$9 = _$memo(() => !!previewID());
3492
3592
  return () => _c$9() ? truncate(selectableEntries()[cursor()].title, dialogWidth - 18) : "Preview";
3493
3593
  })());
3494
- _$insertNode(_el$100, _$createTextNode(`esc close`));
3495
- _$insert(_el$97, _$createComponent(Show, {
3594
+ _$insertNode(_el$99, _$createTextNode(`esc close`));
3595
+ _$insert(_el$96, _$createComponent(Show, {
3496
3596
  get when() {
3497
3597
  return previewID();
3498
3598
  },
3499
3599
  get children() {
3500
- var _el$102 = _$createElement("text"),
3501
- _el$103 = _$createTextNode(` · `);
3502
- _$insertNode(_el$102, _el$103);
3503
- _$insert(_el$102, () => prettyDir(selectableEntries()[cursor()].dir, process.env.HOME ?? ""), _el$103);
3504
- _$insert(_el$102, () => ago(selectableEntries()[cursor()].updated), null);
3505
- _$effect(_$p => _$setProp(_el$102, "style", {
3600
+ var _el$101 = _$createElement("text"),
3601
+ _el$102 = _$createTextNode(` · `);
3602
+ _$insertNode(_el$101, _el$102);
3603
+ _$insert(_el$101, () => prettyDir(selectableEntries()[cursor()].dir, process.env.HOME ?? ""), _el$102);
3604
+ _$insert(_el$101, () => ago(selectableEntries()[cursor()].updated), null);
3605
+ _$effect(_$p => _$setProp(_el$101, "style", {
3506
3606
  fg: api.theme.current.textMuted
3507
3607
  }, _$p));
3508
- return _el$102;
3608
+ return _el$101;
3509
3609
  }
3510
- }), _el$104);
3511
- _$setProp(_el$104, "flexGrow", 1);
3512
- _$setProp(_el$104, "scrollbarOptions", {
3610
+ }), _el$103);
3611
+ _$setProp(_el$103, "flexGrow", 1);
3612
+ _$setProp(_el$103, "scrollbarOptions", {
3513
3613
  visible: false
3514
3614
  });
3515
- _$insert(_el$104, _$createComponent(Show, {
3615
+ _$insert(_el$103, _$createComponent(Show, {
3516
3616
  get when() {
3517
3617
  return previewID();
3518
3618
  },
3519
3619
  get fallback() {
3520
3620
  return (() => {
3521
- var _el$121 = _$createElement("text");
3522
- _$insertNode(_el$121, _$createTextNode(`Select a session to preview`));
3523
- _$effect(_$p => _$setProp(_el$121, "style", {
3621
+ var _el$120 = _$createElement("text");
3622
+ _$insertNode(_el$120, _$createTextNode(`Select a session to preview`));
3623
+ _$effect(_$p => _$setProp(_el$120, "style", {
3524
3624
  fg: api.theme.current.textMuted
3525
3625
  }, _$p));
3526
- return _el$121;
3626
+ return _el$120;
3527
3627
  })();
3528
3628
  },
3529
3629
  get children() {
@@ -3533,55 +3633,55 @@ const tui = async api => {
3533
3633
  },
3534
3634
  get fallback() {
3535
3635
  return (() => {
3536
- var _el$123 = _$createElement("text");
3537
- _$insertNode(_el$123, _$createTextNode(`Loading…`));
3538
- _$effect(_$p => _$setProp(_el$123, "style", {
3636
+ var _el$122 = _$createElement("text");
3637
+ _$insertNode(_el$122, _$createTextNode(`Loading…`));
3638
+ _$effect(_$p => _$setProp(_el$122, "style", {
3539
3639
  fg: api.theme.current.textMuted
3540
3640
  }, _$p));
3541
- return _el$123;
3641
+ return _el$122;
3542
3642
  })();
3543
3643
  },
3544
3644
  children: text => getMarkdownStyle(api.theme.current, api.renderer?.nativeSession) ? (() => {
3545
- var _el$125 = _$createElement("markdown");
3645
+ var _el$124 = _$createElement("markdown");
3546
3646
  _$effect(_p$ => {
3547
- var _v$65 = text(),
3548
- _v$66 = getMarkdownStyle(api.theme.current, api.renderer?.nativeSession),
3549
- _v$67 = getTreeSitterClient();
3550
- _v$65 !== _p$.e && (_p$.e = _$setProp(_el$125, "content", _v$65, _p$.e));
3551
- _v$66 !== _p$.t && (_p$.t = _$setProp(_el$125, "syntaxStyle", _v$66, _p$.t));
3552
- _v$67 !== _p$.a && (_p$.a = _$setProp(_el$125, "treeSitterClient", _v$67, _p$.a));
3647
+ var _v$67 = text(),
3648
+ _v$68 = getMarkdownStyle(api.theme.current, api.renderer?.nativeSession),
3649
+ _v$69 = getTreeSitterClient();
3650
+ _v$67 !== _p$.e && (_p$.e = _$setProp(_el$124, "content", _v$67, _p$.e));
3651
+ _v$68 !== _p$.t && (_p$.t = _$setProp(_el$124, "syntaxStyle", _v$68, _p$.t));
3652
+ _v$69 !== _p$.a && (_p$.a = _$setProp(_el$124, "treeSitterClient", _v$69, _p$.a));
3553
3653
  return _p$;
3554
3654
  }, {
3555
3655
  e: undefined,
3556
3656
  t: undefined,
3557
3657
  a: undefined
3558
3658
  });
3559
- return _el$125;
3659
+ return _el$124;
3560
3660
  })() : (() => {
3561
- var _el$126 = _$createElement("text");
3562
- _$setProp(_el$126, "wrapMode", "word");
3563
- _$insert(_el$126, text);
3564
- return _el$126;
3661
+ var _el$125 = _$createElement("text");
3662
+ _$setProp(_el$125, "wrapMode", "word");
3663
+ _$insert(_el$125, text);
3664
+ return _el$125;
3565
3665
  })()
3566
3666
  });
3567
3667
  }
3568
3668
  }));
3569
- _$insertNode(_el$105, _$createTextNode(`↑↓ switch session · esc back to picker`));
3669
+ _$insertNode(_el$104, _$createTextNode(`↑↓ switch session · esc back to picker`));
3570
3670
  _$effect(_p$ => {
3571
- var _v$38 = dialogHeight(),
3572
- _v$39 = api.theme.current.backgroundPanel,
3573
- _v$40 = TextAttributes.BOLD,
3574
- _v$41 = {
3671
+ var _v$40 = dialogHeight(),
3672
+ _v$41 = api.theme.current.backgroundPanel,
3673
+ _v$42 = TextAttributes.BOLD,
3674
+ _v$43 = {
3575
3675
  fg: api.theme.current.textMuted
3576
3676
  },
3577
- _v$42 = {
3677
+ _v$44 = {
3578
3678
  fg: api.theme.current.textMuted
3579
3679
  };
3580
- _v$38 !== _p$.e && (_p$.e = _$setProp(_el$97, "height", _v$38, _p$.e));
3581
- _v$39 !== _p$.t && (_p$.t = _$setProp(_el$97, "backgroundColor", _v$39, _p$.t));
3582
- _v$40 !== _p$.a && (_p$.a = _$setProp(_el$99, "attributes", _v$40, _p$.a));
3583
- _v$41 !== _p$.o && (_p$.o = _$setProp(_el$100, "style", _v$41, _p$.o));
3584
- _v$42 !== _p$.i && (_p$.i = _$setProp(_el$105, "style", _v$42, _p$.i));
3680
+ _v$40 !== _p$.e && (_p$.e = _$setProp(_el$96, "height", _v$40, _p$.e));
3681
+ _v$41 !== _p$.t && (_p$.t = _$setProp(_el$96, "backgroundColor", _v$41, _p$.t));
3682
+ _v$42 !== _p$.a && (_p$.a = _$setProp(_el$98, "attributes", _v$42, _p$.a));
3683
+ _v$43 !== _p$.o && (_p$.o = _$setProp(_el$99, "style", _v$43, _p$.o));
3684
+ _v$44 !== _p$.i && (_p$.i = _$setProp(_el$104, "style", _v$44, _p$.i));
3585
3685
  return _p$;
3586
3686
  }, {
3587
3687
  e: undefined,
@@ -3590,52 +3690,52 @@ const tui = async api => {
3590
3690
  o: undefined,
3591
3691
  i: undefined
3592
3692
  });
3593
- return _el$97;
3693
+ return _el$96;
3594
3694
  }
3595
3695
  }), null);
3596
3696
  _$effect(_p$ => {
3597
- var _v$43 = dialogHeight(),
3598
- _v$44 = dialogOffset(),
3599
- _v$45 = api.theme.current.backgroundPanel,
3600
- _v$46 = TextAttributes.BOLD,
3601
- _v$47 = {
3697
+ var _v$45 = dialogHeight(),
3698
+ _v$46 = dialogOffset(),
3699
+ _v$47 = api.theme.current.backgroundPanel,
3700
+ _v$48 = TextAttributes.BOLD,
3701
+ _v$49 = {
3602
3702
  fg: api.theme.current.textMuted
3603
3703
  },
3604
- _v$48 = {
3704
+ _v$50 = {
3605
3705
  fg: api.theme.current.textMuted
3606
3706
  },
3607
- _v$49 = query(),
3608
- _v$50 = api.theme.current.textMuted,
3609
- _v$51 = api.theme.current.backgroundPanel,
3610
- _v$52 = api.theme.current.text,
3611
- _v$53 = api.theme.current.primary,
3612
- _v$54 = {
3707
+ _v$51 = query(),
3708
+ _v$52 = api.theme.current.textMuted,
3709
+ _v$53 = api.theme.current.backgroundPanel,
3710
+ _v$54 = api.theme.current.text,
3711
+ _v$55 = api.theme.current.primary,
3712
+ _v$56 = {
3613
3713
  fg: scope() ? api.theme.current.accent : api.theme.current.textMuted
3614
3714
  },
3615
- _v$55 = {
3715
+ _v$57 = {
3616
3716
  fg: waitingOnly() ? api.theme.current.warning : api.theme.current.textMuted
3617
3717
  },
3618
- _v$56 = {
3718
+ _v$58 = {
3619
3719
  fg: pinnedOnly() ? api.theme.current.accent : api.theme.current.textMuted
3620
3720
  },
3621
- _v$57 = {
3721
+ _v$59 = {
3622
3722
  fg: pendingDelete() ? api.theme.current.warning : api.theme.current.textMuted
3623
3723
  };
3624
- _v$43 !== _p$.e && (_p$.e = _$setProp(_el$72, "height", _v$43, _p$.e));
3625
- _v$44 !== _p$.t && (_p$.t = _$setProp(_el$72, "marginTop", _v$44, _p$.t));
3626
- _v$45 !== _p$.a && (_p$.a = _$setProp(_el$72, "backgroundColor", _v$45, _p$.a));
3627
- _v$46 !== _p$.o && (_p$.o = _$setProp(_el$75, "attributes", _v$46, _p$.o));
3628
- _v$47 !== _p$.i && (_p$.i = _$setProp(_el$77, "style", _v$47, _p$.i));
3629
- _v$48 !== _p$.n && (_p$.n = _$setProp(_el$80, "style", _v$48, _p$.n));
3630
- _v$49 !== _p$.s && (_p$.s = _$setProp(_el$83, "value", _v$49, _p$.s));
3631
- _v$50 !== _p$.h && (_p$.h = _$setProp(_el$83, "placeholderColor", _v$50, _p$.h));
3632
- _v$51 !== _p$.r && (_p$.r = _$setProp(_el$83, "focusedBackgroundColor", _v$51, _p$.r));
3633
- _v$52 !== _p$.d && (_p$.d = _$setProp(_el$83, "focusedTextColor", _v$52, _p$.d));
3634
- _v$53 !== _p$.l && (_p$.l = _$setProp(_el$83, "cursorColor", _v$53, _p$.l));
3635
- _v$54 !== _p$.u && (_p$.u = _$setProp(_el$87, "style", _v$54, _p$.u));
3636
- _v$55 !== _p$.c && (_p$.c = _$setProp(_el$88, "style", _v$55, _p$.c));
3637
- _v$56 !== _p$.w && (_p$.w = _$setProp(_el$89, "style", _v$56, _p$.w));
3638
- _v$57 !== _p$.m && (_p$.m = _$setProp(_el$94, "style", _v$57, _p$.m));
3724
+ _v$45 !== _p$.e && (_p$.e = _$setProp(_el$71, "height", _v$45, _p$.e));
3725
+ _v$46 !== _p$.t && (_p$.t = _$setProp(_el$71, "marginTop", _v$46, _p$.t));
3726
+ _v$47 !== _p$.a && (_p$.a = _$setProp(_el$71, "backgroundColor", _v$47, _p$.a));
3727
+ _v$48 !== _p$.o && (_p$.o = _$setProp(_el$74, "attributes", _v$48, _p$.o));
3728
+ _v$49 !== _p$.i && (_p$.i = _$setProp(_el$76, "style", _v$49, _p$.i));
3729
+ _v$50 !== _p$.n && (_p$.n = _$setProp(_el$79, "style", _v$50, _p$.n));
3730
+ _v$51 !== _p$.s && (_p$.s = _$setProp(_el$82, "value", _v$51, _p$.s));
3731
+ _v$52 !== _p$.h && (_p$.h = _$setProp(_el$82, "placeholderColor", _v$52, _p$.h));
3732
+ _v$53 !== _p$.r && (_p$.r = _$setProp(_el$82, "focusedBackgroundColor", _v$53, _p$.r));
3733
+ _v$54 !== _p$.d && (_p$.d = _$setProp(_el$82, "focusedTextColor", _v$54, _p$.d));
3734
+ _v$55 !== _p$.l && (_p$.l = _$setProp(_el$82, "cursorColor", _v$55, _p$.l));
3735
+ _v$56 !== _p$.u && (_p$.u = _$setProp(_el$86, "style", _v$56, _p$.u));
3736
+ _v$57 !== _p$.c && (_p$.c = _$setProp(_el$87, "style", _v$57, _p$.c));
3737
+ _v$58 !== _p$.w && (_p$.w = _$setProp(_el$88, "style", _v$58, _p$.w));
3738
+ _v$59 !== _p$.m && (_p$.m = _$setProp(_el$93, "style", _v$59, _p$.m));
3639
3739
  return _p$;
3640
3740
  }, {
3641
3741
  e: undefined,
@@ -3654,7 +3754,7 @@ const tui = async api => {
3654
3754
  w: undefined,
3655
3755
  m: undefined
3656
3756
  });
3657
- return _el$72;
3757
+ return _el$71;
3658
3758
  })(), () => {
3659
3759
  cleanup();
3660
3760
  });
@@ -3700,105 +3800,105 @@ const tui = async api => {
3700
3800
  }]
3701
3801
  });
3702
3802
  api.ui.dialog.replace(() => (() => {
3703
- var _el$127 = _$createElement("box"),
3704
- _el$128 = _$createElement("text"),
3705
- _el$129 = _$createTextNode(`Cost digest `),
3706
- _el$131 = _$createElement("span"),
3707
- _el$133 = _$createElement("box"),
3708
- _el$134 = _$createElement("text");
3803
+ var _el$126 = _$createElement("box"),
3804
+ _el$127 = _$createElement("text"),
3805
+ _el$128 = _$createTextNode(`Cost digest `),
3806
+ _el$130 = _$createElement("span"),
3807
+ _el$132 = _$createElement("box"),
3808
+ _el$133 = _$createElement("text");
3809
+ _$insertNode(_el$126, _el$127);
3810
+ _$insertNode(_el$126, _el$132);
3811
+ _$setProp(_el$126, "flexDirection", "column");
3812
+ _$setProp(_el$126, "paddingLeft", 4);
3813
+ _$setProp(_el$126, "paddingRight", 4);
3814
+ _$setProp(_el$126, "paddingTop", 1);
3815
+ _$setProp(_el$126, "gap", 1);
3709
3816
  _$insertNode(_el$127, _el$128);
3710
- _$insertNode(_el$127, _el$133);
3711
- _$setProp(_el$127, "flexDirection", "column");
3712
- _$setProp(_el$127, "paddingLeft", 4);
3713
- _$setProp(_el$127, "paddingRight", 4);
3714
- _$setProp(_el$127, "paddingTop", 1);
3715
- _$setProp(_el$127, "gap", 1);
3716
- _$insertNode(_el$128, _el$129);
3717
- _$insertNode(_el$128, _el$131);
3718
- _$insertNode(_el$131, _$createTextNode(`(24h · lifetime)`));
3719
- _$insert(_el$127, _$createComponent(Show, {
3817
+ _$insertNode(_el$127, _el$130);
3818
+ _$insertNode(_el$130, _$createTextNode(`(24h · lifetime)`));
3819
+ _$insert(_el$126, _$createComponent(Show, {
3720
3820
  get when() {
3721
3821
  return !failed && rows.length > 0;
3722
3822
  },
3723
3823
  get fallback() {
3724
3824
  return (() => {
3725
- var _el$136 = _$createElement("text");
3726
- _$insert(_el$136, failed ? "Cost data unavailable." : "No assistant cost recorded.");
3727
- _$effect(_$p => _$setProp(_el$136, "style", {
3825
+ var _el$135 = _$createElement("text");
3826
+ _$insert(_el$135, failed ? "Cost data unavailable." : "No assistant cost recorded.");
3827
+ _$effect(_$p => _$setProp(_el$135, "style", {
3728
3828
  fg: api.theme.current.textMuted
3729
3829
  }, _$p));
3730
- return _el$136;
3830
+ return _el$135;
3731
3831
  })();
3732
3832
  },
3733
3833
  get children() {
3734
3834
  return _$createComponent(For, {
3735
3835
  each: rows,
3736
3836
  children: row => (() => {
3737
- var _el$137 = _$createElement("box"),
3837
+ var _el$136 = _$createElement("box"),
3838
+ _el$137 = _$createElement("text"),
3738
3839
  _el$138 = _$createElement("text"),
3739
3840
  _el$139 = _$createElement("text"),
3740
- _el$140 = _$createElement("text"),
3741
- _el$141 = _$createTextNode(`(`),
3742
- _el$142 = _$createTextNode(`)`),
3743
- _el$143 = _$createElement("text");
3744
- _$insertNode(_el$137, _el$138);
3745
- _$insertNode(_el$137, _el$139);
3746
- _$insertNode(_el$137, _el$140);
3747
- _$insertNode(_el$137, _el$143);
3748
- _$setProp(_el$137, "flexDirection", "row");
3749
- _$setProp(_el$137, "gap", 2);
3841
+ _el$140 = _$createTextNode(`(`),
3842
+ _el$141 = _$createTextNode(`)`),
3843
+ _el$142 = _$createElement("text");
3844
+ _$insertNode(_el$136, _el$137);
3845
+ _$insertNode(_el$136, _el$138);
3846
+ _$insertNode(_el$136, _el$139);
3847
+ _$insertNode(_el$136, _el$142);
3848
+ _$setProp(_el$136, "flexDirection", "row");
3849
+ _$setProp(_el$136, "gap", 2);
3850
+ _$setProp(_el$137, "flexShrink", 0);
3851
+ _$insert(_el$137, () => money(row.window));
3750
3852
  _$setProp(_el$138, "flexShrink", 0);
3751
- _$insert(_el$138, () => money(row.window));
3853
+ _$insert(_el$138, () => money(row.lifetime));
3854
+ _$insertNode(_el$139, _el$140);
3855
+ _$insertNode(_el$139, _el$141);
3752
3856
  _$setProp(_el$139, "flexShrink", 0);
3753
- _$insert(_el$139, () => money(row.lifetime));
3754
- _$insertNode(_el$140, _el$141);
3755
- _$insertNode(_el$140, _el$142);
3756
- _$setProp(_el$140, "flexShrink", 0);
3757
- _$insert(_el$140, () => row.sessions, _el$142);
3758
- _$setProp(_el$143, "flexGrow", 1);
3759
- _$setProp(_el$143, "flexShrink", 1);
3760
- _$setProp(_el$143, "wrapMode", "none");
3761
- _$insert(_el$143, () => prettyDir(row.directory, home));
3857
+ _$insert(_el$139, () => row.sessions, _el$141);
3858
+ _$setProp(_el$142, "flexGrow", 1);
3859
+ _$setProp(_el$142, "flexShrink", 1);
3860
+ _$setProp(_el$142, "wrapMode", "none");
3861
+ _$insert(_el$142, () => prettyDir(row.directory, home));
3762
3862
  _$effect(_p$ => {
3763
- var _v$72 = {
3863
+ var _v$74 = {
3764
3864
  fg: api.theme.current.success
3765
3865
  },
3766
- _v$73 = {
3866
+ _v$75 = {
3767
3867
  fg: api.theme.current.textMuted
3768
3868
  },
3769
- _v$74 = {
3869
+ _v$76 = {
3770
3870
  fg: api.theme.current.textMuted
3771
3871
  };
3772
- _v$72 !== _p$.e && (_p$.e = _$setProp(_el$138, "style", _v$72, _p$.e));
3773
- _v$73 !== _p$.t && (_p$.t = _$setProp(_el$139, "style", _v$73, _p$.t));
3774
- _v$74 !== _p$.a && (_p$.a = _$setProp(_el$140, "style", _v$74, _p$.a));
3872
+ _v$74 !== _p$.e && (_p$.e = _$setProp(_el$137, "style", _v$74, _p$.e));
3873
+ _v$75 !== _p$.t && (_p$.t = _$setProp(_el$138, "style", _v$75, _p$.t));
3874
+ _v$76 !== _p$.a && (_p$.a = _$setProp(_el$139, "style", _v$76, _p$.a));
3775
3875
  return _p$;
3776
3876
  }, {
3777
3877
  e: undefined,
3778
3878
  t: undefined,
3779
3879
  a: undefined
3780
3880
  });
3781
- return _el$137;
3881
+ return _el$136;
3782
3882
  })()
3783
3883
  });
3784
3884
  }
3785
- }), _el$133);
3786
- _$insertNode(_el$133, _el$134);
3787
- _$setProp(_el$133, "flexShrink", 0);
3788
- _$insertNode(_el$134, _$createTextNode(`esc close`));
3885
+ }), _el$132);
3886
+ _$insertNode(_el$132, _el$133);
3887
+ _$setProp(_el$132, "flexShrink", 0);
3888
+ _$insertNode(_el$133, _$createTextNode(`esc close`));
3789
3889
  _$effect(_p$ => {
3790
- var _v$68 = api.theme.current.backgroundPanel,
3791
- _v$69 = TextAttributes.BOLD,
3792
- _v$70 = {
3890
+ var _v$70 = api.theme.current.backgroundPanel,
3891
+ _v$71 = TextAttributes.BOLD,
3892
+ _v$72 = {
3793
3893
  fg: api.theme.current.textMuted
3794
3894
  },
3795
- _v$71 = {
3895
+ _v$73 = {
3796
3896
  fg: api.theme.current.textMuted
3797
3897
  };
3798
- _v$68 !== _p$.e && (_p$.e = _$setProp(_el$127, "backgroundColor", _v$68, _p$.e));
3799
- _v$69 !== _p$.t && (_p$.t = _$setProp(_el$128, "attributes", _v$69, _p$.t));
3800
- _v$70 !== _p$.a && (_p$.a = _$setProp(_el$131, "style", _v$70, _p$.a));
3801
- _v$71 !== _p$.o && (_p$.o = _$setProp(_el$134, "style", _v$71, _p$.o));
3898
+ _v$70 !== _p$.e && (_p$.e = _$setProp(_el$126, "backgroundColor", _v$70, _p$.e));
3899
+ _v$71 !== _p$.t && (_p$.t = _$setProp(_el$127, "attributes", _v$71, _p$.t));
3900
+ _v$72 !== _p$.a && (_p$.a = _$setProp(_el$130, "style", _v$72, _p$.a));
3901
+ _v$73 !== _p$.o && (_p$.o = _$setProp(_el$133, "style", _v$73, _p$.o));
3802
3902
  return _p$;
3803
3903
  }, {
3804
3904
  e: undefined,
@@ -3806,7 +3906,7 @@ const tui = async api => {
3806
3906
  a: undefined,
3807
3907
  o: undefined
3808
3908
  });
3809
- return _el$127;
3909
+ return _el$126;
3810
3910
  })(), () => {
3811
3911
  disposeKeys();
3812
3912
  });
@@ -3915,79 +4015,79 @@ const tui = async api => {
3915
4015
  });
3916
4016
  const home = process.env.HOME ?? "";
3917
4017
  api.ui.dialog.replace(() => (() => {
3918
- var _el$144 = _$createElement("box"),
3919
- _el$145 = _$createElement("text"),
3920
- _el$146 = _$createTextNode(`Needs input `),
3921
- _el$148 = _$createElement("span"),
3922
- _el$149 = _$createTextNode(`(`),
3923
- _el$150 = _$createTextNode(` · longest waiting first)`),
3924
- _el$151 = _$createElement("scrollbox"),
3925
- _el$152 = _$createElement("box"),
3926
- _el$153 = _$createElement("text");
4018
+ var _el$143 = _$createElement("box"),
4019
+ _el$144 = _$createElement("text"),
4020
+ _el$145 = _$createTextNode(`Needs input `),
4021
+ _el$147 = _$createElement("span"),
4022
+ _el$148 = _$createTextNode(`(`),
4023
+ _el$149 = _$createTextNode(` · longest waiting first)`),
4024
+ _el$150 = _$createElement("scrollbox"),
4025
+ _el$151 = _$createElement("box"),
4026
+ _el$152 = _$createElement("text");
4027
+ _$insertNode(_el$143, _el$144);
4028
+ _$insertNode(_el$143, _el$150);
4029
+ _$insertNode(_el$143, _el$151);
4030
+ _$setProp(_el$143, "flexDirection", "column");
4031
+ _$setProp(_el$143, "paddingLeft", 4);
4032
+ _$setProp(_el$143, "paddingRight", 4);
4033
+ _$setProp(_el$143, "paddingTop", 1);
4034
+ _$setProp(_el$143, "gap", 1);
3927
4035
  _$insertNode(_el$144, _el$145);
3928
- _$insertNode(_el$144, _el$151);
3929
- _$insertNode(_el$144, _el$152);
3930
- _$setProp(_el$144, "flexDirection", "column");
3931
- _$setProp(_el$144, "paddingLeft", 4);
3932
- _$setProp(_el$144, "paddingRight", 4);
3933
- _$setProp(_el$144, "paddingTop", 1);
3934
- _$setProp(_el$144, "gap", 1);
3935
- _$insertNode(_el$145, _el$146);
3936
- _$insertNode(_el$145, _el$148);
3937
- _$insertNode(_el$148, _el$149);
3938
- _$insertNode(_el$148, _el$150);
3939
- _$insert(_el$148, () => items.length, _el$150);
3940
- _$setProp(_el$151, "flexGrow", 1);
3941
- _$setProp(_el$151, "scrollbarOptions", {
4036
+ _$insertNode(_el$144, _el$147);
4037
+ _$insertNode(_el$147, _el$148);
4038
+ _$insertNode(_el$147, _el$149);
4039
+ _$insert(_el$147, () => items.length, _el$149);
4040
+ _$setProp(_el$150, "flexGrow", 1);
4041
+ _$setProp(_el$150, "scrollbarOptions", {
3942
4042
  visible: false
3943
4043
  });
3944
- _$insert(_el$151, _$createComponent(For, {
4044
+ _$insert(_el$150, _$createComponent(For, {
3945
4045
  each: items,
3946
4046
  children: (item, index) => (() => {
3947
- var _el$155 = _$createElement("box"),
4047
+ var _el$154 = _$createElement("box"),
4048
+ _el$155 = _$createElement("text"),
3948
4049
  _el$156 = _$createElement("text"),
3949
4050
  _el$157 = _$createElement("text"),
3950
- _el$158 = _$createElement("text"),
3951
- _el$159 = _$createTextNode(` · `);
3952
- _$insertNode(_el$155, _el$156);
3953
- _$insertNode(_el$155, _el$157);
3954
- _$insertNode(_el$155, _el$158);
3955
- _$setProp(_el$155, "flexDirection", "row");
3956
- _$setProp(_el$155, "gap", 2);
3957
- _$setProp(_el$155, "paddingLeft", 1);
3958
- _$setProp(_el$155, "paddingRight", 1);
3959
- _$setProp(_el$155, "onMouseDown", () => {
4051
+ _el$158 = _$createTextNode(` · `);
4052
+ _$insertNode(_el$154, _el$155);
4053
+ _$insertNode(_el$154, _el$156);
4054
+ _$insertNode(_el$154, _el$157);
4055
+ _$setProp(_el$154, "flexDirection", "row");
4056
+ _$setProp(_el$154, "gap", 2);
4057
+ _$setProp(_el$154, "paddingLeft", 1);
4058
+ _$setProp(_el$154, "paddingRight", 1);
4059
+ _$setProp(_el$154, "onMouseDown", () => {
3960
4060
  setCursor(index());
3961
4061
  choose(item);
3962
4062
  });
3963
- _$setProp(_el$156, "flexGrow", 1);
3964
- _$setProp(_el$156, "flexShrink", 1);
3965
- _$setProp(_el$156, "wrapMode", "none");
3966
- _$insert(_el$156, () => truncate(item.entry.title, 48));
4063
+ _$setProp(_el$155, "flexGrow", 1);
4064
+ _$setProp(_el$155, "flexShrink", 1);
4065
+ _$setProp(_el$155, "wrapMode", "none");
4066
+ _$insert(_el$155, () => truncate(item.entry.title, 48));
4067
+ _$setProp(_el$156, "flexShrink", 0);
4068
+ _$insert(_el$156, () => item.reason);
4069
+ _$insertNode(_el$157, _el$158);
3967
4070
  _$setProp(_el$157, "flexShrink", 0);
3968
- _$insert(_el$157, () => item.reason);
3969
- _$insertNode(_el$158, _el$159);
3970
- _$setProp(_el$158, "flexShrink", 0);
3971
- _$insert(_el$158, () => prettyDir(item.entry.dir, home), _el$159);
3972
- _$insert(_el$158, (() => {
4071
+ _$insert(_el$157, () => prettyDir(item.entry.dir, home), _el$158);
4072
+ _$insert(_el$157, (() => {
3973
4073
  var _c$1 = _$memo(() => item.since === undefined);
3974
4074
  return () => _c$1() ? "time unknown" : `waiting ${ago(item.since)}`;
3975
4075
  })(), null);
3976
4076
  _$effect(_p$ => {
3977
- var _v$80 = index() === cursor() ? api.theme.current.backgroundElement : RGBA.fromInts(0, 0, 0, 0),
3978
- _v$81 = {
4077
+ var _v$82 = index() === cursor() ? api.theme.current.backgroundElement : RGBA.fromInts(0, 0, 0, 0),
4078
+ _v$83 = {
3979
4079
  fg: index() === cursor() ? api.theme.current.text : api.theme.current.text
3980
4080
  },
3981
- _v$82 = {
4081
+ _v$84 = {
3982
4082
  fg: index() === cursor() ? api.theme.current.text : api.theme.current.warning
3983
4083
  },
3984
- _v$83 = {
4084
+ _v$85 = {
3985
4085
  fg: index() === cursor() ? api.theme.current.text : api.theme.current.textMuted
3986
4086
  };
3987
- _v$80 !== _p$.e && (_p$.e = _$setProp(_el$155, "backgroundColor", _v$80, _p$.e));
3988
- _v$81 !== _p$.t && (_p$.t = _$setProp(_el$156, "style", _v$81, _p$.t));
3989
- _v$82 !== _p$.a && (_p$.a = _$setProp(_el$157, "style", _v$82, _p$.a));
3990
- _v$83 !== _p$.o && (_p$.o = _$setProp(_el$158, "style", _v$83, _p$.o));
4087
+ _v$82 !== _p$.e && (_p$.e = _$setProp(_el$154, "backgroundColor", _v$82, _p$.e));
4088
+ _v$83 !== _p$.t && (_p$.t = _$setProp(_el$155, "style", _v$83, _p$.t));
4089
+ _v$84 !== _p$.a && (_p$.a = _$setProp(_el$156, "style", _v$84, _p$.a));
4090
+ _v$85 !== _p$.o && (_p$.o = _$setProp(_el$157, "style", _v$85, _p$.o));
3991
4091
  return _p$;
3992
4092
  }, {
3993
4093
  e: undefined,
@@ -3995,27 +4095,27 @@ const tui = async api => {
3995
4095
  a: undefined,
3996
4096
  o: undefined
3997
4097
  });
3998
- return _el$155;
4098
+ return _el$154;
3999
4099
  })()
4000
4100
  }));
4001
- _$insertNode(_el$152, _el$153);
4002
- _$setProp(_el$152, "flexShrink", 0);
4003
- _$insertNode(_el$153, _$createTextNode(`↑↓ navigate · enter open · n open next waiting · esc close`));
4101
+ _$insertNode(_el$151, _el$152);
4102
+ _$setProp(_el$151, "flexShrink", 0);
4103
+ _$insertNode(_el$152, _$createTextNode(`↑↓ navigate · enter open · n open next waiting · esc close`));
4004
4104
  _$effect(_p$ => {
4005
- var _v$75 = api.theme.current.backgroundPanel,
4006
- _v$76 = TextAttributes.BOLD,
4007
- _v$77 = {
4105
+ var _v$77 = api.theme.current.backgroundPanel,
4106
+ _v$78 = TextAttributes.BOLD,
4107
+ _v$79 = {
4008
4108
  fg: api.theme.current.textMuted
4009
4109
  },
4010
- _v$78 = Math.max(6, Math.floor(api.renderer.height / 2) - 10),
4011
- _v$79 = {
4110
+ _v$80 = Math.max(6, Math.floor(api.renderer.height / 2) - 10),
4111
+ _v$81 = {
4012
4112
  fg: api.theme.current.textMuted
4013
4113
  };
4014
- _v$75 !== _p$.e && (_p$.e = _$setProp(_el$144, "backgroundColor", _v$75, _p$.e));
4015
- _v$76 !== _p$.t && (_p$.t = _$setProp(_el$145, "attributes", _v$76, _p$.t));
4016
- _v$77 !== _p$.a && (_p$.a = _$setProp(_el$148, "style", _v$77, _p$.a));
4017
- _v$78 !== _p$.o && (_p$.o = _$setProp(_el$151, "height", _v$78, _p$.o));
4018
- _v$79 !== _p$.i && (_p$.i = _$setProp(_el$153, "style", _v$79, _p$.i));
4114
+ _v$77 !== _p$.e && (_p$.e = _$setProp(_el$143, "backgroundColor", _v$77, _p$.e));
4115
+ _v$78 !== _p$.t && (_p$.t = _$setProp(_el$144, "attributes", _v$78, _p$.t));
4116
+ _v$79 !== _p$.a && (_p$.a = _$setProp(_el$147, "style", _v$79, _p$.a));
4117
+ _v$80 !== _p$.o && (_p$.o = _$setProp(_el$150, "height", _v$80, _p$.o));
4118
+ _v$81 !== _p$.i && (_p$.i = _$setProp(_el$152, "style", _v$81, _p$.i));
4019
4119
  return _p$;
4020
4120
  }, {
4021
4121
  e: undefined,
@@ -4024,7 +4124,7 @@ const tui = async api => {
4024
4124
  o: undefined,
4025
4125
  i: undefined
4026
4126
  });
4027
- return _el$144;
4127
+ return _el$143;
4028
4128
  })(), () => {
4029
4129
  disposeNav();
4030
4130
  });