@h-rig/cli 0.0.6-alpha.86 → 0.0.6-alpha.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/bin/rig.js +79 -18
  2. package/dist/src/app-opentui/bootstrap.js +79 -18
  3. package/dist/src/app-opentui/command-palette.js +1 -0
  4. package/dist/src/app-opentui/drone.js +1 -0
  5. package/dist/src/app-opentui/index.js +61 -7
  6. package/dist/src/app-opentui/list-search.d.ts +5 -1
  7. package/dist/src/app-opentui/list-search.js +2 -2
  8. package/dist/src/app-opentui/react/App.js +67 -8
  9. package/dist/src/app-opentui/react/Backdrop.js +1 -0
  10. package/dist/src/app-opentui/react/ChromeHost.js +7 -0
  11. package/dist/src/app-opentui/react/SceneFrameView.js +55 -5
  12. package/dist/src/app-opentui/react/launch.js +67 -8
  13. package/dist/src/app-opentui/react/syntax.js +1 -0
  14. package/dist/src/app-opentui/registry.js +3 -5
  15. package/dist/src/app-opentui/render/graphics.js +1 -0
  16. package/dist/src/app-opentui/render/hover.d.ts +11 -0
  17. package/dist/src/app-opentui/render/hover.js +34 -0
  18. package/dist/src/app-opentui/render/native-host.js +1 -0
  19. package/dist/src/app-opentui/render/panels.js +50 -3
  20. package/dist/src/app-opentui/render/preloader.js +1 -0
  21. package/dist/src/app-opentui/render/scene.js +1 -0
  22. package/dist/src/app-opentui/render/text.d.ts +13 -0
  23. package/dist/src/app-opentui/render/text.js +54 -5
  24. package/dist/src/app-opentui/render/type-bar.js +1 -0
  25. package/dist/src/app-opentui/runtime.js +61 -7
  26. package/dist/src/app-opentui/scenes/command.js +1 -0
  27. package/dist/src/app-opentui/scenes/doctor.js +1 -0
  28. package/dist/src/app-opentui/scenes/error.js +1 -0
  29. package/dist/src/app-opentui/scenes/family-domains/agent.js +1 -0
  30. package/dist/src/app-opentui/scenes/family-domains/browser.js +1 -0
  31. package/dist/src/app-opentui/scenes/family-domains/dist.js +1 -0
  32. package/dist/src/app-opentui/scenes/family-domains/git.js +1 -0
  33. package/dist/src/app-opentui/scenes/family-domains/github.js +1 -0
  34. package/dist/src/app-opentui/scenes/family-domains/harness.js +1 -0
  35. package/dist/src/app-opentui/scenes/family-domains/index.js +1 -0
  36. package/dist/src/app-opentui/scenes/family-domains/kit.js +1 -0
  37. package/dist/src/app-opentui/scenes/family-domains/profile.js +1 -0
  38. package/dist/src/app-opentui/scenes/family-domains/queue.js +1 -0
  39. package/dist/src/app-opentui/scenes/family-domains/remote.js +1 -0
  40. package/dist/src/app-opentui/scenes/family-domains/review.js +1 -0
  41. package/dist/src/app-opentui/scenes/family-domains/setup.js +1 -0
  42. package/dist/src/app-opentui/scenes/family-domains/stats.js +1 -0
  43. package/dist/src/app-opentui/scenes/family.js +1 -0
  44. package/dist/src/app-opentui/scenes/fleet.js +3 -5
  45. package/dist/src/app-opentui/scenes/handoff.js +1 -0
  46. package/dist/src/app-opentui/scenes/help.js +1 -0
  47. package/dist/src/app-opentui/scenes/inbox.js +1 -0
  48. package/dist/src/app-opentui/scenes/init.js +1 -0
  49. package/dist/src/app-opentui/scenes/inspect.js +1 -0
  50. package/dist/src/app-opentui/scenes/main.js +1 -0
  51. package/dist/src/app-opentui/scenes/pi.js +1 -0
  52. package/dist/src/app-opentui/scenes/plugin.js +1 -0
  53. package/dist/src/app-opentui/scenes/repo.js +1 -0
  54. package/dist/src/app-opentui/scenes/run-detail.js +1 -0
  55. package/dist/src/app-opentui/scenes/server.js +1 -0
  56. package/dist/src/app-opentui/scenes/tasks.js +3 -5
  57. package/dist/src/app-opentui/scenes/workspace.js +1 -0
  58. package/dist/src/app-opentui/selectable.js +1 -0
  59. package/dist/src/app-opentui/theme.d.ts +1 -0
  60. package/dist/src/app-opentui/theme.js +1 -0
  61. package/package.json +8 -8
package/dist/bin/rig.js CHANGED
@@ -17453,6 +17453,7 @@ var init_theme2 = __esm(() => {
17453
17453
  bg2: "#0b0c0e",
17454
17454
  panel: "#101115",
17455
17455
  panel2: "#14161b",
17456
+ hover: "#181b24",
17456
17457
  glass: "#1e2230",
17457
17458
  border: "#2a2e3a",
17458
17459
  ink: "#f4f5f8",
@@ -19802,11 +19803,8 @@ var init_family2 = __esm(() => {
19802
19803
  });
19803
19804
 
19804
19805
  // packages/cli/src/app-opentui/list-search.ts
19805
- function isListSearchScene(scene) {
19806
- return scene === "fleet" || scene === "tasks";
19807
- }
19808
- function listSearchQuery(state) {
19809
- return isListSearchScene(state.scene) ? state.typeBar.value.trim() : "";
19806
+ function listSearchQuery(_state) {
19807
+ return "";
19810
19808
  }
19811
19809
  function valueText(value) {
19812
19810
  if (value === undefined || value === null)
@@ -24863,16 +24861,69 @@ var init_graphics = __esm(() => {
24863
24861
  ];
24864
24862
  });
24865
24863
 
24864
+ // packages/cli/src/app-opentui/render/hover.ts
24865
+ function getHoveredSelectableId() {
24866
+ return hoveredId;
24867
+ }
24868
+ function isHovered(id) {
24869
+ return id !== undefined && id === hoveredId;
24870
+ }
24871
+ function setHoveredSelectableId(id) {
24872
+ if (hoveredId === id)
24873
+ return;
24874
+ hoveredId = id;
24875
+ for (const listener of listeners)
24876
+ listener();
24877
+ }
24878
+ function clearHoveredSelectableId(id) {
24879
+ if (id !== undefined && hoveredId === id)
24880
+ setHoveredSelectableId(undefined);
24881
+ }
24882
+ function subscribeHover(listener) {
24883
+ listeners.add(listener);
24884
+ return () => {
24885
+ listeners.delete(listener);
24886
+ };
24887
+ }
24888
+ var hoveredId, listeners;
24889
+ var init_hover = __esm(() => {
24890
+ listeners = new Set;
24891
+ });
24892
+
24866
24893
  // packages/cli/src/app-opentui/render/text.ts
24867
24894
  import { RGBA as RGBA4, TextAttributes as TextAttributes4, TextRenderable } from "@opentui/core";
24895
+ function lineIsClickable(line2) {
24896
+ return line2?.selectable !== undefined || line2?.selectableIndex !== undefined;
24897
+ }
24898
+ function lineSelectableId(line2) {
24899
+ return line2?.selectable?.id ?? line2?.selectableId;
24900
+ }
24901
+ function lineBackground(line2) {
24902
+ if (line2?.bg)
24903
+ return RGBA4.fromHex(line2.bg);
24904
+ const id = lineSelectableId(line2);
24905
+ if (id !== undefined && isHovered(id))
24906
+ return HOVER_BG;
24907
+ return TRANSPARENT2;
24908
+ }
24868
24909
  function selectableMouseHandler(currentLineRef, onLineMouseDown) {
24869
24910
  return (event) => {
24870
24911
  const currentLine = currentLineRef();
24871
- if (currentLine?.selectableIndex === undefined)
24912
+ if (!lineIsClickable(currentLine))
24872
24913
  return;
24873
24914
  onLineMouseDown?.(currentLine, event);
24874
24915
  };
24875
24916
  }
24917
+ function hoverHandlers(currentLineRef) {
24918
+ return {
24919
+ onMouseOver: () => {
24920
+ const id = lineSelectableId(currentLineRef());
24921
+ if (id !== undefined)
24922
+ setHoveredSelectableId(id);
24923
+ },
24924
+ onMouseOut: () => clearHoveredSelectableId(lineSelectableId(currentLineRef()))
24925
+ };
24926
+ }
24876
24927
  function createTextLine(renderer, id, top, onLineMouseDown) {
24877
24928
  let currentLine;
24878
24929
  const renderable = new TextRenderable(renderer, {
@@ -24884,7 +24935,8 @@ function createTextLine(renderer, id, top, onLineMouseDown) {
24884
24935
  width: 1,
24885
24936
  fg: RIG_UI.ink2,
24886
24937
  selectable: true,
24887
- onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown)
24938
+ onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown),
24939
+ ...hoverHandlers(() => currentLine)
24888
24940
  });
24889
24941
  renderable.setRigSceneLine = (line2) => {
24890
24942
  currentLine = line2;
@@ -24901,7 +24953,8 @@ function createFlowTextLine(renderer, id, onLineMouseDown) {
24901
24953
  flexShrink: 0,
24902
24954
  fg: RIG_UI.ink2,
24903
24955
  selectable: true,
24904
- onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown)
24956
+ onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown),
24957
+ ...hoverHandlers(() => currentLine)
24905
24958
  });
24906
24959
  renderable.setRigSceneLine = (line2) => {
24907
24960
  currentLine = line2;
@@ -24915,7 +24968,7 @@ function applyTextLine(renderable, line2, top, left, width) {
24915
24968
  renderable.width = width;
24916
24969
  renderable.content = line2?.styledText ?? line2?.text ?? "";
24917
24970
  renderable.fg = line2?.fg ?? RIG_UI.ink2;
24918
- renderable.bg = line2?.bg ?? TRANSPARENT2;
24971
+ renderable.bg = lineBackground(line2);
24919
24972
  renderable.attributes = line2?.bold ? TextAttributes4.BOLD : line2?.dim ? TextAttributes4.DIM : 0;
24920
24973
  }
24921
24974
  function applyFlowTextLine(renderable, line2, width) {
@@ -24925,7 +24978,7 @@ function applyFlowTextLine(renderable, line2, width) {
24925
24978
  renderable.width = Math.max(1, width);
24926
24979
  renderable.content = line2?.styledText ?? line2?.text ?? "";
24927
24980
  renderable.fg = line2?.fg ?? RIG_UI.ink2;
24928
- renderable.bg = line2?.bg ?? TRANSPARENT2;
24981
+ renderable.bg = lineBackground(line2);
24929
24982
  renderable.attributes = line2?.bold ? TextAttributes4.BOLD : line2?.dim ? TextAttributes4.DIM : 0;
24930
24983
  }
24931
24984
  function clearTextLines(renderables, from = 0) {
@@ -24939,10 +24992,12 @@ function clearTextLines(renderables, from = 0) {
24939
24992
  renderable.bg = TRANSPARENT2;
24940
24993
  }
24941
24994
  }
24942
- var TRANSPARENT2;
24995
+ var TRANSPARENT2, HOVER_BG;
24943
24996
  var init_text = __esm(() => {
24944
24997
  init_theme2();
24998
+ init_hover();
24945
24999
  TRANSPARENT2 = RGBA4.fromInts(0, 0, 0, 0);
25000
+ HOVER_BG = RGBA4.fromHex(RIG_UI.hover);
24946
25001
  });
24947
25002
 
24948
25003
  // packages/cli/src/app-opentui/render/panels.ts
@@ -26290,8 +26345,7 @@ async function launchRigOpenTuiApp(options) {
26290
26345
  } else if (!selectById(store, id, renderedSelectableItems)) {
26291
26346
  return;
26292
26347
  }
26293
- if (line2.activateOnClick)
26294
- runAppAction("Activate selection", () => activateSelection(runtime, renderedSelectableItems));
26348
+ runAppAction("Activate selection", () => activateSelection(runtime, renderedSelectableItems));
26295
26349
  };
26296
26350
  for (let index = 0;index < MAX_SCENE_PANELS; index += 1) {
26297
26351
  const panel = createScrollPanelLayer(renderer, `rig-scroll-panel-${index}`, onLineClick);
@@ -26358,6 +26412,7 @@ async function launchRigOpenTuiApp(options) {
26358
26412
  };
26359
26413
  renderer.keyInput.on("keypress", onKeyPress);
26360
26414
  resources.add(() => renderer?.keyInput.off("keypress", onKeyPress));
26415
+ resources.add(subscribeHover(() => scheduleAppRender(0)));
26361
26416
  const onPaste = (event) => {
26362
26417
  const state = store.getState();
26363
26418
  if (state.scene === "handoff") {
@@ -26599,6 +26654,7 @@ var init_runtime = __esm(() => {
26599
26654
  init_graphics();
26600
26655
  init_fleet_stats();
26601
26656
  init_text();
26657
+ init_hover();
26602
26658
  init_panels();
26603
26659
  init_type_bar();
26604
26660
  init_scene();
@@ -26736,13 +26792,16 @@ function lineContent(line2) {
26736
26792
  }
26737
26793
  function LineView(props) {
26738
26794
  const { line: line2, onLineClick } = props;
26795
+ const id = lineSelectableId(line2);
26739
26796
  return /* @__PURE__ */ jsxDEV("text", {
26740
26797
  style: { position: "absolute", left: props.left, top: props.top, width: props.width, zIndex: 5 },
26741
26798
  fg: line2.fg ?? RIG_UI.ink2,
26742
- bg: line2.bg ?? TRANSPARENT2,
26799
+ bg: lineBackground(line2),
26743
26800
  attributes: lineAttributes(line2),
26744
26801
  content: lineContent(line2),
26745
- onMouseDown: onLineClick ? () => onLineClick(line2) : undefined
26802
+ onMouseDown: onLineClick ? () => onLineClick(line2) : undefined,
26803
+ onMouseOver: id !== undefined ? () => setHoveredSelectableId(id) : undefined,
26804
+ onMouseOut: id !== undefined ? () => clearHoveredSelectableId(id) : undefined
26746
26805
  }, undefined, false, undefined, this);
26747
26806
  }
26748
26807
  function PanelHost(props) {
@@ -26829,6 +26888,7 @@ var init_SceneFrameView = __esm(() => {
26829
26888
  init_theme2();
26830
26889
  init_scene();
26831
26890
  init_text();
26891
+ init_hover();
26832
26892
  init_panels();
26833
26893
  init_native_host();
26834
26894
  init_scroll();
@@ -26982,7 +27042,7 @@ var init_nav = __esm(() => {
26982
27042
  });
26983
27043
 
26984
27044
  // packages/cli/src/app-opentui/react/App.tsx
26985
- import { useMemo, useRef as useRef4 } from "react";
27045
+ import { useMemo, useRef as useRef4, useSyncExternalStore as useSyncExternalStore2 } from "react";
26986
27046
  import { useKeyboard, useRenderer as useRenderer4, useTerminalDimensions as useTerminalDimensions2 } from "@opentui/react";
26987
27047
  import { jsxDEV as jsxDEV3 } from "@opentui/react/jsx-dev-runtime";
26988
27048
  function defaultFrame(state) {
@@ -27000,6 +27060,7 @@ function App(props) {
27000
27060
  const runAppAction = useRunAppAction();
27001
27061
  const store = useStore();
27002
27062
  const renderer = useRenderer4();
27063
+ useSyncExternalStore2(subscribeHover, getHoveredSelectableId, getHoveredSelectableId);
27003
27064
  const dims = useTerminalDimensions2();
27004
27065
  const layout = computeStageLayout(dims.width, dims.height);
27005
27066
  const registry = useMemo(() => ({ ...BUILTIN, ...props.sceneRenderers ?? {} }), [props.sceneRenderers]);
@@ -27034,8 +27095,7 @@ function App(props) {
27034
27095
  } else {
27035
27096
  return;
27036
27097
  }
27037
- if (line2.activateOnClick)
27038
- runAppAction("Activate selection", () => activateSelection(runtime, items));
27098
+ runAppAction("Activate selection", () => activateSelection(runtime, items));
27039
27099
  };
27040
27100
  return /* @__PURE__ */ jsxDEV3("box", {
27041
27101
  style: { position: "absolute", left: 0, top: 0, width: "100%", height: "100%" },
@@ -27085,6 +27145,7 @@ var init_App = __esm(() => {
27085
27145
  init_SceneFrameView();
27086
27146
  init_ChromeHost();
27087
27147
  init_scroll();
27148
+ init_hover();
27088
27149
  init_context();
27089
27150
  init_nav();
27090
27151
  BUILTIN = {
@@ -15585,6 +15585,7 @@ var init_theme2 = __esm(() => {
15585
15585
  bg2: "#0b0c0e",
15586
15586
  panel: "#101115",
15587
15587
  panel2: "#14161b",
15588
+ hover: "#181b24",
15588
15589
  glass: "#1e2230",
15589
15590
  border: "#2a2e3a",
15590
15591
  ink: "#f4f5f8",
@@ -17872,16 +17873,69 @@ var init_graphics = __esm(() => {
17872
17873
  ];
17873
17874
  });
17874
17875
 
17876
+ // packages/cli/src/app-opentui/render/hover.ts
17877
+ function getHoveredSelectableId() {
17878
+ return hoveredId;
17879
+ }
17880
+ function isHovered(id) {
17881
+ return id !== undefined && id === hoveredId;
17882
+ }
17883
+ function setHoveredSelectableId(id) {
17884
+ if (hoveredId === id)
17885
+ return;
17886
+ hoveredId = id;
17887
+ for (const listener of listeners)
17888
+ listener();
17889
+ }
17890
+ function clearHoveredSelectableId(id) {
17891
+ if (id !== undefined && hoveredId === id)
17892
+ setHoveredSelectableId(undefined);
17893
+ }
17894
+ function subscribeHover(listener) {
17895
+ listeners.add(listener);
17896
+ return () => {
17897
+ listeners.delete(listener);
17898
+ };
17899
+ }
17900
+ var hoveredId, listeners;
17901
+ var init_hover = __esm(() => {
17902
+ listeners = new Set;
17903
+ });
17904
+
17875
17905
  // packages/cli/src/app-opentui/render/text.ts
17876
17906
  import { RGBA as RGBA4, TextAttributes as TextAttributes4, TextRenderable } from "@opentui/core";
17907
+ function lineIsClickable(line2) {
17908
+ return line2?.selectable !== undefined || line2?.selectableIndex !== undefined;
17909
+ }
17910
+ function lineSelectableId(line2) {
17911
+ return line2?.selectable?.id ?? line2?.selectableId;
17912
+ }
17913
+ function lineBackground(line2) {
17914
+ if (line2?.bg)
17915
+ return RGBA4.fromHex(line2.bg);
17916
+ const id = lineSelectableId(line2);
17917
+ if (id !== undefined && isHovered(id))
17918
+ return HOVER_BG;
17919
+ return TRANSPARENT2;
17920
+ }
17877
17921
  function selectableMouseHandler(currentLineRef, onLineMouseDown) {
17878
17922
  return (event) => {
17879
17923
  const currentLine = currentLineRef();
17880
- if (currentLine?.selectableIndex === undefined)
17924
+ if (!lineIsClickable(currentLine))
17881
17925
  return;
17882
17926
  onLineMouseDown?.(currentLine, event);
17883
17927
  };
17884
17928
  }
17929
+ function hoverHandlers(currentLineRef) {
17930
+ return {
17931
+ onMouseOver: () => {
17932
+ const id = lineSelectableId(currentLineRef());
17933
+ if (id !== undefined)
17934
+ setHoveredSelectableId(id);
17935
+ },
17936
+ onMouseOut: () => clearHoveredSelectableId(lineSelectableId(currentLineRef()))
17937
+ };
17938
+ }
17885
17939
  function createTextLine(renderer, id, top, onLineMouseDown) {
17886
17940
  let currentLine;
17887
17941
  const renderable = new TextRenderable(renderer, {
@@ -17893,7 +17947,8 @@ function createTextLine(renderer, id, top, onLineMouseDown) {
17893
17947
  width: 1,
17894
17948
  fg: RIG_UI.ink2,
17895
17949
  selectable: true,
17896
- onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown)
17950
+ onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown),
17951
+ ...hoverHandlers(() => currentLine)
17897
17952
  });
17898
17953
  renderable.setRigSceneLine = (line2) => {
17899
17954
  currentLine = line2;
@@ -17910,7 +17965,8 @@ function createFlowTextLine(renderer, id, onLineMouseDown) {
17910
17965
  flexShrink: 0,
17911
17966
  fg: RIG_UI.ink2,
17912
17967
  selectable: true,
17913
- onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown)
17968
+ onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown),
17969
+ ...hoverHandlers(() => currentLine)
17914
17970
  });
17915
17971
  renderable.setRigSceneLine = (line2) => {
17916
17972
  currentLine = line2;
@@ -17924,7 +17980,7 @@ function applyTextLine(renderable, line2, top, left, width) {
17924
17980
  renderable.width = width;
17925
17981
  renderable.content = line2?.styledText ?? line2?.text ?? "";
17926
17982
  renderable.fg = line2?.fg ?? RIG_UI.ink2;
17927
- renderable.bg = line2?.bg ?? TRANSPARENT2;
17983
+ renderable.bg = lineBackground(line2);
17928
17984
  renderable.attributes = line2?.bold ? TextAttributes4.BOLD : line2?.dim ? TextAttributes4.DIM : 0;
17929
17985
  }
17930
17986
  function applyFlowTextLine(renderable, line2, width) {
@@ -17934,7 +17990,7 @@ function applyFlowTextLine(renderable, line2, width) {
17934
17990
  renderable.width = Math.max(1, width);
17935
17991
  renderable.content = line2?.styledText ?? line2?.text ?? "";
17936
17992
  renderable.fg = line2?.fg ?? RIG_UI.ink2;
17937
- renderable.bg = line2?.bg ?? TRANSPARENT2;
17993
+ renderable.bg = lineBackground(line2);
17938
17994
  renderable.attributes = line2?.bold ? TextAttributes4.BOLD : line2?.dim ? TextAttributes4.DIM : 0;
17939
17995
  }
17940
17996
  function clearTextLines(renderables, from = 0) {
@@ -17948,10 +18004,12 @@ function clearTextLines(renderables, from = 0) {
17948
18004
  renderable.bg = TRANSPARENT2;
17949
18005
  }
17950
18006
  }
17951
- var TRANSPARENT2;
18007
+ var TRANSPARENT2, HOVER_BG;
17952
18008
  var init_text = __esm(() => {
17953
18009
  init_theme2();
18010
+ init_hover();
17954
18011
  TRANSPARENT2 = RGBA4.fromInts(0, 0, 0, 0);
18012
+ HOVER_BG = RGBA4.fromHex(RIG_UI.hover);
17955
18013
  });
17956
18014
 
17957
18015
  // packages/cli/src/app-opentui/render/panels.ts
@@ -19299,8 +19357,7 @@ async function launchRigOpenTuiApp(options) {
19299
19357
  } else if (!selectById(store, id, renderedSelectableItems)) {
19300
19358
  return;
19301
19359
  }
19302
- if (line2.activateOnClick)
19303
- runAppAction("Activate selection", () => activateSelection(runtime, renderedSelectableItems));
19360
+ runAppAction("Activate selection", () => activateSelection(runtime, renderedSelectableItems));
19304
19361
  };
19305
19362
  for (let index = 0;index < MAX_SCENE_PANELS; index += 1) {
19306
19363
  const panel = createScrollPanelLayer(renderer, `rig-scroll-panel-${index}`, onLineClick);
@@ -19367,6 +19424,7 @@ async function launchRigOpenTuiApp(options) {
19367
19424
  };
19368
19425
  renderer.keyInput.on("keypress", onKeyPress);
19369
19426
  resources.add(() => renderer?.keyInput.off("keypress", onKeyPress));
19427
+ resources.add(subscribeHover(() => scheduleAppRender(0)));
19370
19428
  const onPaste = (event) => {
19371
19429
  const state = store.getState();
19372
19430
  if (state.scene === "handoff") {
@@ -19608,6 +19666,7 @@ var init_runtime = __esm(() => {
19608
19666
  init_graphics();
19609
19667
  init_fleet_stats();
19610
19668
  init_text();
19669
+ init_hover();
19611
19670
  init_panels();
19612
19671
  init_type_bar();
19613
19672
  init_scene();
@@ -19745,13 +19804,16 @@ function lineContent(line2) {
19745
19804
  }
19746
19805
  function LineView(props) {
19747
19806
  const { line: line2, onLineClick } = props;
19807
+ const id = lineSelectableId(line2);
19748
19808
  return /* @__PURE__ */ jsxDEV("text", {
19749
19809
  style: { position: "absolute", left: props.left, top: props.top, width: props.width, zIndex: 5 },
19750
19810
  fg: line2.fg ?? RIG_UI.ink2,
19751
- bg: line2.bg ?? TRANSPARENT2,
19811
+ bg: lineBackground(line2),
19752
19812
  attributes: lineAttributes(line2),
19753
19813
  content: lineContent(line2),
19754
- onMouseDown: onLineClick ? () => onLineClick(line2) : undefined
19814
+ onMouseDown: onLineClick ? () => onLineClick(line2) : undefined,
19815
+ onMouseOver: id !== undefined ? () => setHoveredSelectableId(id) : undefined,
19816
+ onMouseOut: id !== undefined ? () => clearHoveredSelectableId(id) : undefined
19755
19817
  }, undefined, false, undefined, this);
19756
19818
  }
19757
19819
  function PanelHost(props) {
@@ -19838,6 +19900,7 @@ var init_SceneFrameView = __esm(() => {
19838
19900
  init_theme2();
19839
19901
  init_scene();
19840
19902
  init_text();
19903
+ init_hover();
19841
19904
  init_panels();
19842
19905
  init_native_host();
19843
19906
  init_scroll();
@@ -19991,7 +20054,7 @@ var init_nav = __esm(() => {
19991
20054
  });
19992
20055
 
19993
20056
  // packages/cli/src/app-opentui/react/App.tsx
19994
- import { useMemo, useRef as useRef4 } from "react";
20057
+ import { useMemo, useRef as useRef4, useSyncExternalStore as useSyncExternalStore2 } from "react";
19995
20058
  import { useKeyboard, useRenderer as useRenderer4, useTerminalDimensions as useTerminalDimensions2 } from "@opentui/react";
19996
20059
  import { jsxDEV as jsxDEV3 } from "@opentui/react/jsx-dev-runtime";
19997
20060
  function defaultFrame(state) {
@@ -20009,6 +20072,7 @@ function App(props) {
20009
20072
  const runAppAction = useRunAppAction();
20010
20073
  const store = useStore();
20011
20074
  const renderer = useRenderer4();
20075
+ useSyncExternalStore2(subscribeHover, getHoveredSelectableId, getHoveredSelectableId);
20012
20076
  const dims = useTerminalDimensions2();
20013
20077
  const layout = computeStageLayout(dims.width, dims.height);
20014
20078
  const registry = useMemo(() => ({ ...BUILTIN, ...props.sceneRenderers ?? {} }), [props.sceneRenderers]);
@@ -20043,8 +20107,7 @@ function App(props) {
20043
20107
  } else {
20044
20108
  return;
20045
20109
  }
20046
- if (line2.activateOnClick)
20047
- runAppAction("Activate selection", () => activateSelection(runtime, items));
20110
+ runAppAction("Activate selection", () => activateSelection(runtime, items));
20048
20111
  };
20049
20112
  return /* @__PURE__ */ jsxDEV3("box", {
20050
20113
  style: { position: "absolute", left: 0, top: 0, width: "100%", height: "100%" },
@@ -20094,6 +20157,7 @@ var init_App = __esm(() => {
20094
20157
  init_SceneFrameView();
20095
20158
  init_ChromeHost();
20096
20159
  init_scroll();
20160
+ init_hover();
20097
20161
  init_context();
20098
20162
  init_nav();
20099
20163
  BUILTIN = {
@@ -23990,11 +24054,8 @@ init_scene();
23990
24054
  init_selectable();
23991
24055
 
23992
24056
  // packages/cli/src/app-opentui/list-search.ts
23993
- function isListSearchScene(scene) {
23994
- return scene === "fleet" || scene === "tasks";
23995
- }
23996
- function listSearchQuery(state) {
23997
- return isListSearchScene(state.scene) ? state.typeBar.value.trim() : "";
24057
+ function listSearchQuery(_state) {
24058
+ return "";
23998
24059
  }
23999
24060
  function valueText(value) {
24000
24061
  if (value === undefined || value === null)
@@ -909,6 +909,7 @@ var RIG_UI = {
909
909
  bg2: "#0b0c0e",
910
910
  panel: "#101115",
911
911
  panel2: "#14161b",
912
+ hover: "#181b24",
912
913
  glass: "#1e2230",
913
914
  border: "#2a2e3a",
914
915
  ink: "#f4f5f8",
@@ -15,6 +15,7 @@ var RIG_UI = {
15
15
  bg2: "#0b0c0e",
16
16
  panel: "#101115",
17
17
  panel2: "#14161b",
18
+ hover: "#181b24",
18
19
  glass: "#1e2230",
19
20
  border: "#2a2e3a",
20
21
  ink: "#f4f5f8",
@@ -2242,6 +2242,7 @@ var RIG_UI = {
2242
2242
  bg2: "#0b0c0e",
2243
2243
  panel: "#101115",
2244
2244
  panel2: "#14161b",
2245
+ hover: "#181b24",
2245
2246
  glass: "#1e2230",
2246
2247
  border: "#2a2e3a",
2247
2248
  ink: "#f4f5f8",
@@ -3398,15 +3399,66 @@ function sparklineString(values, width) {
3398
3399
 
3399
3400
  // packages/cli/src/app-opentui/render/text.ts
3400
3401
  import { RGBA as RGBA4, TextAttributes as TextAttributes4, TextRenderable } from "@opentui/core";
3402
+
3403
+ // packages/cli/src/app-opentui/render/hover.ts
3404
+ var hoveredId;
3405
+ var listeners = new Set;
3406
+ function isHovered(id) {
3407
+ return id !== undefined && id === hoveredId;
3408
+ }
3409
+ function setHoveredSelectableId(id) {
3410
+ if (hoveredId === id)
3411
+ return;
3412
+ hoveredId = id;
3413
+ for (const listener of listeners)
3414
+ listener();
3415
+ }
3416
+ function clearHoveredSelectableId(id) {
3417
+ if (id !== undefined && hoveredId === id)
3418
+ setHoveredSelectableId(undefined);
3419
+ }
3420
+ function subscribeHover(listener) {
3421
+ listeners.add(listener);
3422
+ return () => {
3423
+ listeners.delete(listener);
3424
+ };
3425
+ }
3426
+
3427
+ // packages/cli/src/app-opentui/render/text.ts
3401
3428
  var TRANSPARENT2 = RGBA4.fromInts(0, 0, 0, 0);
3429
+ var HOVER_BG = RGBA4.fromHex(RIG_UI.hover);
3430
+ function lineIsClickable(line2) {
3431
+ return line2?.selectable !== undefined || line2?.selectableIndex !== undefined;
3432
+ }
3433
+ function lineSelectableId(line2) {
3434
+ return line2?.selectable?.id ?? line2?.selectableId;
3435
+ }
3436
+ function lineBackground(line2) {
3437
+ if (line2?.bg)
3438
+ return RGBA4.fromHex(line2.bg);
3439
+ const id = lineSelectableId(line2);
3440
+ if (id !== undefined && isHovered(id))
3441
+ return HOVER_BG;
3442
+ return TRANSPARENT2;
3443
+ }
3402
3444
  function selectableMouseHandler(currentLineRef, onLineMouseDown) {
3403
3445
  return (event) => {
3404
3446
  const currentLine = currentLineRef();
3405
- if (currentLine?.selectableIndex === undefined)
3447
+ if (!lineIsClickable(currentLine))
3406
3448
  return;
3407
3449
  onLineMouseDown?.(currentLine, event);
3408
3450
  };
3409
3451
  }
3452
+ function hoverHandlers(currentLineRef) {
3453
+ return {
3454
+ onMouseOver: () => {
3455
+ const id = lineSelectableId(currentLineRef());
3456
+ if (id !== undefined)
3457
+ setHoveredSelectableId(id);
3458
+ },
3459
+ onMouseOut: () => clearHoveredSelectableId(lineSelectableId(currentLineRef()))
3460
+ };
3461
+ }
3410
3462
  function createTextLine(renderer, id, top, onLineMouseDown) {
3411
3463
  let currentLine;
3412
3464
  const renderable = new TextRenderable(renderer, {
@@ -3418,7 +3470,8 @@ function createTextLine(renderer, id, top, onLineMouseDown) {
3418
3470
  width: 1,
3419
3471
  fg: RIG_UI.ink2,
3420
3472
  selectable: true,
3421
- onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown)
3473
+ onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown),
3474
+ ...hoverHandlers(() => currentLine)
3422
3475
  });
3423
3476
  renderable.setRigSceneLine = (line2) => {
3424
3477
  currentLine = line2;
@@ -3435,7 +3488,8 @@ function createFlowTextLine(renderer, id, onLineMouseDown) {
3435
3488
  flexShrink: 0,
3436
3489
  fg: RIG_UI.ink2,
3437
3490
  selectable: true,
3438
- onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown)
3491
+ onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown),
3492
+ ...hoverHandlers(() => currentLine)
3439
3493
  });
3440
3494
  renderable.setRigSceneLine = (line2) => {
3441
3495
  currentLine = line2;
@@ -3449,7 +3503,7 @@ function applyTextLine(renderable, line2, top, left, width) {
3449
3503
  renderable.width = width;
3450
3504
  renderable.content = line2?.styledText ?? line2?.text ?? "";
3451
3505
  renderable.fg = line2?.fg ?? RIG_UI.ink2;
3452
- renderable.bg = line2?.bg ?? TRANSPARENT2;
3506
+ renderable.bg = lineBackground(line2);
3453
3507
  renderable.attributes = line2?.bold ? TextAttributes4.BOLD : line2?.dim ? TextAttributes4.DIM : 0;
3454
3508
  }
3455
3509
  function applyFlowTextLine(renderable, line2, width) {
@@ -3459,7 +3513,7 @@ function applyFlowTextLine(renderable, line2, width) {
3459
3513
  renderable.width = Math.max(1, width);
3460
3514
  renderable.content = line2?.styledText ?? line2?.text ?? "";
3461
3515
  renderable.fg = line2?.fg ?? RIG_UI.ink2;
3462
- renderable.bg = line2?.bg ?? TRANSPARENT2;
3516
+ renderable.bg = lineBackground(line2);
3463
3517
  renderable.attributes = line2?.bold ? TextAttributes4.BOLD : line2?.dim ? TextAttributes4.DIM : 0;
3464
3518
  }
3465
3519
  function clearTextLines(renderables, from = 0) {
@@ -4782,8 +4836,7 @@ async function launchRigOpenTuiApp(options) {
4782
4836
  } else if (!selectById(store, id, renderedSelectableItems)) {
4783
4837
  return;
4784
4838
  }
4785
- if (line2.activateOnClick)
4786
- runAppAction("Activate selection", () => activateSelection(runtime, renderedSelectableItems));
4839
+ runAppAction("Activate selection", () => activateSelection(runtime, renderedSelectableItems));
4787
4840
  };
4788
4841
  for (let index = 0;index < MAX_SCENE_PANELS; index += 1) {
4789
4842
  const panel = createScrollPanelLayer(renderer, `rig-scroll-panel-${index}`, onLineClick);
@@ -4850,6 +4903,7 @@ async function launchRigOpenTuiApp(options) {
4850
4903
  };
4851
4904
  renderer.keyInput.on("keypress", onKeyPress);
4852
4905
  resources.add(() => renderer?.keyInput.off("keypress", onKeyPress));
4906
+ resources.add(subscribeHover(() => scheduleAppRender(0)));
4853
4907
  const onPaste = (event) => {
4854
4908
  const state = store.getState();
4855
4909
  if (state.scene === "handoff") {
@@ -2,7 +2,11 @@ import type { AppRunRecord } from "./adapters/fleet";
2
2
  import type { AppTaskRecord } from "./adapters/tasks";
3
3
  import type { AppSceneId, AppState } from "./types";
4
4
  export declare function isListSearchScene(scene: AppSceneId): boolean;
5
- export declare function listSearchQuery(state: AppState): string;
5
+ /** Table filtering from keyboard navigation has been removed: typing in the
6
+ * command bar no longer live-filters the runs/tasks tables. This always returns
7
+ * "" so the fleet/tasks scenes render the full (sorted) row set. The `_state`
8
+ * arg is retained so callers stay source-compatible. */
9
+ export declare function listSearchQuery(_state: AppState): string;
6
10
  export declare function filterRunsForSearch(runs: readonly AppRunRecord[], query: string): AppRunRecord[];
7
11
  export declare function filterTasksForSearch(tasks: readonly AppTaskRecord[], query: string): AppTaskRecord[];
8
12
  export declare function searchSummary(kind: "runs" | "tasks", query: string, visible: number, total: number): string;
@@ -3,8 +3,8 @@
3
3
  function isListSearchScene(scene) {
4
4
  return scene === "fleet" || scene === "tasks";
5
5
  }
6
- function listSearchQuery(state) {
7
- return isListSearchScene(state.scene) ? state.typeBar.value.trim() : "";
6
+ function listSearchQuery(_state) {
7
+ return "";
8
8
  }
9
9
  function valueText(value) {
10
10
  if (value === undefined || value === null)