@h-rig/cli 0.0.6-alpha.85 → 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 (69) hide show
  1. package/dist/bin/rig.js +79 -1027
  2. package/dist/src/app-opentui/bootstrap.js +79 -1027
  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 -1024
  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 +62 -970
  9. package/dist/src/app-opentui/react/Backdrop.js +3 -9
  10. package/dist/src/app-opentui/react/ChromeHost.js +6 -1038
  11. package/dist/src/app-opentui/react/SceneFrameView.js +55 -5
  12. package/dist/src/app-opentui/react/launch.js +62 -970
  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/constants.d.ts +0 -1
  16. package/dist/src/app-opentui/render/constants.js +0 -2
  17. package/dist/src/app-opentui/render/graphics.js +3 -9
  18. package/dist/src/app-opentui/render/hover.d.ts +11 -0
  19. package/dist/src/app-opentui/render/hover.js +34 -0
  20. package/dist/src/app-opentui/render/native-host.js +1 -0
  21. package/dist/src/app-opentui/render/panels.js +50 -3
  22. package/dist/src/app-opentui/render/preloader.js +1 -0
  23. package/dist/src/app-opentui/render/scene.js +1 -0
  24. package/dist/src/app-opentui/render/text.d.ts +13 -0
  25. package/dist/src/app-opentui/render/text.js +54 -5
  26. package/dist/src/app-opentui/render/type-bar.js +1 -0
  27. package/dist/src/app-opentui/runtime.js +62 -1025
  28. package/dist/src/app-opentui/scenes/command.js +1 -0
  29. package/dist/src/app-opentui/scenes/doctor.js +1 -0
  30. package/dist/src/app-opentui/scenes/error.js +1 -0
  31. package/dist/src/app-opentui/scenes/family-domains/agent.js +1 -0
  32. package/dist/src/app-opentui/scenes/family-domains/browser.js +1 -0
  33. package/dist/src/app-opentui/scenes/family-domains/dist.js +1 -0
  34. package/dist/src/app-opentui/scenes/family-domains/git.js +1 -0
  35. package/dist/src/app-opentui/scenes/family-domains/github.js +1 -0
  36. package/dist/src/app-opentui/scenes/family-domains/harness.js +1 -0
  37. package/dist/src/app-opentui/scenes/family-domains/index.js +1 -0
  38. package/dist/src/app-opentui/scenes/family-domains/kit.js +1 -0
  39. package/dist/src/app-opentui/scenes/family-domains/profile.js +1 -0
  40. package/dist/src/app-opentui/scenes/family-domains/queue.js +1 -0
  41. package/dist/src/app-opentui/scenes/family-domains/remote.js +1 -0
  42. package/dist/src/app-opentui/scenes/family-domains/review.js +1 -0
  43. package/dist/src/app-opentui/scenes/family-domains/setup.js +1 -0
  44. package/dist/src/app-opentui/scenes/family-domains/stats.js +1 -0
  45. package/dist/src/app-opentui/scenes/family.js +1 -0
  46. package/dist/src/app-opentui/scenes/fleet.js +3 -5
  47. package/dist/src/app-opentui/scenes/handoff.js +1 -0
  48. package/dist/src/app-opentui/scenes/help.js +1 -0
  49. package/dist/src/app-opentui/scenes/inbox.js +1 -0
  50. package/dist/src/app-opentui/scenes/init.js +1 -0
  51. package/dist/src/app-opentui/scenes/inspect.js +1 -0
  52. package/dist/src/app-opentui/scenes/main.js +1 -0
  53. package/dist/src/app-opentui/scenes/pi.js +1 -0
  54. package/dist/src/app-opentui/scenes/plugin.js +1 -0
  55. package/dist/src/app-opentui/scenes/repo.js +1 -0
  56. package/dist/src/app-opentui/scenes/run-detail.js +1 -0
  57. package/dist/src/app-opentui/scenes/server.js +1 -0
  58. package/dist/src/app-opentui/scenes/tasks.js +3 -5
  59. package/dist/src/app-opentui/scenes/workspace.js +1 -0
  60. package/dist/src/app-opentui/selectable.js +1 -0
  61. package/dist/src/app-opentui/theme.d.ts +1 -0
  62. package/dist/src/app-opentui/theme.js +1 -0
  63. package/package.json +8 -8
  64. package/dist/src/app-opentui/render/image-visual-layer-worker.d.ts +0 -1
  65. package/dist/src/app-opentui/render/image-visual-layer-worker.js +0 -1084
  66. package/dist/src/app-opentui/render/image-visual-layer.d.ts +0 -109
  67. package/dist/src/app-opentui/render/image-visual-layer.js +0 -1068
  68. package/dist/src/app-opentui/terminal-capabilities.d.ts +0 -7
  69. package/dist/src/app-opentui/terminal-capabilities.js +0 -15
@@ -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",
@@ -17045,6 +17045,7 @@ var RIG_UI = {
17045
17045
  bg2: "#0b0c0e",
17046
17046
  panel: "#101115",
17047
17047
  panel2: "#14161b",
17048
+ hover: "#181b24",
17048
17049
  glass: "#1e2230",
17049
17050
  border: "#2a2e3a",
17050
17051
  ink: "#f4f5f8",
@@ -19347,11 +19348,8 @@ function renderFamilyScene(state, layout) {
19347
19348
  }
19348
19349
 
19349
19350
  // packages/cli/src/app-opentui/list-search.ts
19350
- function isListSearchScene(scene) {
19351
- return scene === "fleet" || scene === "tasks";
19352
- }
19353
- function listSearchQuery(state) {
19354
- return isListSearchScene(state.scene) ? state.typeBar.value.trim() : "";
19351
+ function listSearchQuery(_state) {
19352
+ return "";
19355
19353
  }
19356
19354
  function valueText(value) {
19357
19355
  if (value === undefined || value === null)
@@ -28,4 +28,3 @@ export declare const RAIL_YS_LOOP: readonly [0.18, 0.5, 0.82];
28
28
  export declare const RAIL_YS_CARRIER: readonly [0.24, 0.54, 0.82];
29
29
  export declare const RAIL_YS_DISPATCH: readonly [0.18, 0.58, 0.82];
30
30
  export declare const GLOW_FALLOFF_EXP_ASCII = 2.2;
31
- export declare const GLOW_FALLOFF_EXP_IMAGE = 2.4;
@@ -30,7 +30,6 @@ var RAIL_YS_LOOP = [0.18, 0.5, 0.82];
30
30
  var RAIL_YS_CARRIER = [0.24, 0.54, 0.82];
31
31
  var RAIL_YS_DISPATCH = [0.18, 0.58, 0.82];
32
32
  var GLOW_FALLOFF_EXP_ASCII = 2.2;
33
- var GLOW_FALLOFF_EXP_IMAGE = 2.4;
34
33
  export {
35
34
  RAIL_YS_LOOP,
36
35
  RAIL_YS_DISPATCH,
@@ -47,7 +46,6 @@ export {
47
46
  LANE_LEN_BASE,
48
47
  LANE_INTERP_STEPS,
49
48
  LANE_CURVE_RANGE,
50
- GLOW_FALLOFF_EXP_IMAGE,
51
49
  GLOW_FALLOFF_EXP_ASCII,
52
50
  DISPATCH_PACKETS_WIDE,
53
51
  DISPATCH_PACKETS_COMPACT,
@@ -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",
@@ -597,27 +598,20 @@ function writeCell(layer, x, y, char, fg, bg) {
597
598
  function drawFullCell(layer, x, y, bg) {
598
599
  writeCell(layer, x, y, " ", TRANSPARENT, bg);
599
600
  }
600
- function drawCornerCut(layer, x, y, char, fg) {
601
- writeCell(layer, x, y, char, fg, BACKDROP);
602
- }
603
- function drawRoundedFill(layer, left, top, right, bottom, dividerY) {
601
+ function drawPanelFill(layer, left, top, right, bottom, dividerY) {
604
602
  const bgForY = (y) => y < dividerY ? PANEL_HEADER_BG : PANEL_BG;
605
603
  for (let y = top;y <= bottom; y += 1) {
606
604
  const bg = bgForY(y);
607
605
  for (let x = left;x <= right; x += 1)
608
606
  drawFullCell(layer, x, y, bg);
609
607
  }
610
- drawCornerCut(layer, left, top, "\u2597", PANEL_HEADER_BG);
611
- drawCornerCut(layer, right, top, "\u2596", PANEL_HEADER_BG);
612
- drawCornerCut(layer, left, bottom, "\u259D", PANEL_BG);
613
- drawCornerCut(layer, right, bottom, "\u2598", PANEL_BG);
614
608
  }
615
609
  function drawAdTerminalPanel(layer, layout, panel) {
616
610
  const rect = panelCellRect(layout, panel);
617
611
  if (!rect)
618
612
  return;
619
613
  const { left, top, width, right, bottom, headerHeight, dividerY } = rect;
620
- drawRoundedFill(layer, left, top, right, bottom, dividerY);
614
+ drawPanelFill(layer, left, top, right, bottom, dividerY);
621
615
  if (dividerY > top && dividerY < bottom) {
622
616
  for (let x = left + 2;x < right - 1; x += 1) {
623
617
  writeCell(layer, x, dividerY, "\u2500", PANEL_LINE_DIM, PANEL_BG);
@@ -0,0 +1,11 @@
1
+ export declare function getHoveredSelectableId(): string | undefined;
2
+ export declare function isHovered(id: string | undefined): boolean;
3
+ /** Set the hovered row (or clear with `undefined`). No-ops when unchanged so we
4
+ * don't churn renders on every mouse-move event within the same row. */
5
+ export declare function setHoveredSelectableId(id: string | undefined): void;
6
+ /** Clear the hover only if `id` is the currently-hovered row — guards against a
7
+ * stale mouseout (from a row we already left) wiping a newer hover. */
8
+ export declare function clearHoveredSelectableId(id: string | undefined): void;
9
+ /** Subscribe to hover changes. Legacy shell passes its render scheduler; the
10
+ * react shell bridges this into a re-render. Returns an unsubscribe fn. */
11
+ export declare function subscribeHover(listener: () => void): () => void;
@@ -0,0 +1,34 @@
1
+ // @bun
2
+ // packages/cli/src/app-opentui/render/hover.ts
3
+ var hoveredId;
4
+ var listeners = new Set;
5
+ function getHoveredSelectableId() {
6
+ return hoveredId;
7
+ }
8
+ function isHovered(id) {
9
+ return id !== undefined && id === hoveredId;
10
+ }
11
+ function setHoveredSelectableId(id) {
12
+ if (hoveredId === id)
13
+ return;
14
+ hoveredId = id;
15
+ for (const listener of listeners)
16
+ listener();
17
+ }
18
+ function clearHoveredSelectableId(id) {
19
+ if (id !== undefined && hoveredId === id)
20
+ setHoveredSelectableId(undefined);
21
+ }
22
+ function subscribeHover(listener) {
23
+ listeners.add(listener);
24
+ return () => {
25
+ listeners.delete(listener);
26
+ };
27
+ }
28
+ export {
29
+ subscribeHover,
30
+ setHoveredSelectableId,
31
+ isHovered,
32
+ getHoveredSelectableId,
33
+ clearHoveredSelectableId
34
+ };
@@ -24,6 +24,7 @@ var RIG_UI = {
24
24
  bg2: "#0b0c0e",
25
25
  panel: "#101115",
26
26
  panel2: "#14161b",
27
+ hover: "#181b24",
27
28
  glass: "#1e2230",
28
29
  border: "#2a2e3a",
29
30
  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",
@@ -74,15 +75,60 @@ function panelContentRect(layout, panel) {
74
75
 
75
76
  // packages/cli/src/app-opentui/render/text.ts
76
77
  import { RGBA, TextAttributes as TextAttributes2, TextRenderable } from "@opentui/core";
78
+
79
+ // packages/cli/src/app-opentui/render/hover.ts
80
+ var hoveredId;
81
+ var listeners = new Set;
82
+ function isHovered(id) {
83
+ return id !== undefined && id === hoveredId;
84
+ }
85
+ function setHoveredSelectableId(id) {
86
+ if (hoveredId === id)
87
+ return;
88
+ hoveredId = id;
89
+ for (const listener of listeners)
90
+ listener();
91
+ }
92
+ function clearHoveredSelectableId(id) {
93
+ if (id !== undefined && hoveredId === id)
94
+ setHoveredSelectableId(undefined);
95
+ }
96
+
97
+ // packages/cli/src/app-opentui/render/text.ts
77
98
  var TRANSPARENT = RGBA.fromInts(0, 0, 0, 0);
99
+ var HOVER_BG = RGBA.fromHex(RIG_UI.hover);
100
+ function lineIsClickable(line) {
101
+ return line?.selectable !== undefined || line?.selectableIndex !== undefined;
102
+ }
103
+ function lineSelectableId(line) {
104
+ return line?.selectable?.id ?? line?.selectableId;
105
+ }
106
+ function lineBackground(line) {
107
+ if (line?.bg)
108
+ return RGBA.fromHex(line.bg);
109
+ const id = lineSelectableId(line);
110
+ if (id !== undefined && isHovered(id))
111
+ return HOVER_BG;
112
+ return TRANSPARENT;
113
+ }
78
114
  function selectableMouseHandler(currentLineRef, onLineMouseDown) {
79
115
  return (event) => {
80
116
  const currentLine = currentLineRef();
81
- if (currentLine?.selectableIndex === undefined)
117
+ if (!lineIsClickable(currentLine))
82
118
  return;
83
119
  onLineMouseDown?.(currentLine, event);
84
120
  };
85
121
  }
122
+ function hoverHandlers(currentLineRef) {
123
+ return {
124
+ onMouseOver: () => {
125
+ const id = lineSelectableId(currentLineRef());
126
+ if (id !== undefined)
127
+ setHoveredSelectableId(id);
128
+ },
129
+ onMouseOut: () => clearHoveredSelectableId(lineSelectableId(currentLineRef()))
130
+ };
131
+ }
86
132
  function createFlowTextLine(renderer, id, onLineMouseDown) {
87
133
  let currentLine;
88
134
  const renderable = new TextRenderable(renderer, {
@@ -93,7 +139,8 @@ function createFlowTextLine(renderer, id, onLineMouseDown) {
93
139
  flexShrink: 0,
94
140
  fg: RIG_UI.ink2,
95
141
  selectable: true,
96
- onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown)
142
+ onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown),
143
+ ...hoverHandlers(() => currentLine)
97
144
  });
98
145
  renderable.setRigSceneLine = (line) => {
99
146
  currentLine = line;
@@ -107,7 +154,7 @@ function applyFlowTextLine(renderable, line, width) {
107
154
  renderable.width = Math.max(1, width);
108
155
  renderable.content = line?.styledText ?? line?.text ?? "";
109
156
  renderable.fg = line?.fg ?? RIG_UI.ink2;
110
- renderable.bg = line?.bg ?? TRANSPARENT;
157
+ renderable.bg = lineBackground(line);
111
158
  renderable.attributes = line?.bold ? TextAttributes2.BOLD : line?.dim ? TextAttributes2.DIM : 0;
112
159
  }
113
160
 
@@ -12,6 +12,7 @@ var RIG_UI = {
12
12
  bg2: "#0b0c0e",
13
13
  panel: "#101115",
14
14
  panel2: "#14161b",
15
+ hover: "#181b24",
15
16
  glass: "#1e2230",
16
17
  border: "#2a2e3a",
17
18
  ink: "#f4f5f8",
@@ -37,6 +37,7 @@ var RIG_UI = {
37
37
  bg2: "#0b0c0e",
38
38
  panel: "#101115",
39
39
  panel2: "#14161b",
40
+ hover: "#181b24",
40
41
  glass: "#1e2230",
41
42
  border: "#2a2e3a",
42
43
  ink: "#f4f5f8",
@@ -6,6 +6,19 @@ import type { AppSceneLine } from "../types";
6
6
  * this is the one selection-highlight mechanism, plumbed end-to-end here so
7
7
  * scenes only set `bg` on the AppSceneLine and never touch RGBA. */
8
8
  export declare const TRANSPARENT: RGBA;
9
+ /** A line is clickable when it carries a selectable. The imperative shell stamps
10
+ * `selectableId`/`selectableIndex` via remapSelectableLine; the @opentui/react
11
+ * shell does not, so it only carries `selectable`. Check all three so clicks +
12
+ * hover work identically in both shells. */
13
+ export declare function lineIsClickable(line: AppSceneLine | undefined): boolean;
14
+ /** The stable id used to key hover (and click resolution): the selectable's id,
15
+ * falling back to the imperative-stamped selectableId. Identical in both shells
16
+ * (remapSelectableLine sets selectableId = selectable.id). */
17
+ export declare function lineSelectableId(line: AppSceneLine | undefined): string | undefined;
18
+ /** The bg a line paints: an explicit `bg` (a selected row) always wins;
19
+ * otherwise a clickable row that is currently mouse-hovered gets the hover bar;
20
+ * otherwise transparent so the panel ground shows through. */
21
+ export declare function lineBackground(line: AppSceneLine | undefined): RGBA;
9
22
  export type TextLineRenderable = TextRenderable & {
10
23
  setRigSceneLine?(line: AppSceneLine | undefined): void;
11
24
  };
@@ -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",
@@ -42,16 +43,59 @@ var styles = {
42
43
  magenta: otuiFg(RIG_UI.magenta)
43
44
  };
44
45
 
46
+ // packages/cli/src/app-opentui/render/hover.ts
47
+ var hoveredId;
48
+ var listeners = new Set;
49
+ function isHovered(id) {
50
+ return id !== undefined && id === hoveredId;
51
+ }
52
+ function setHoveredSelectableId(id) {
53
+ if (hoveredId === id)
54
+ return;
55
+ hoveredId = id;
56
+ for (const listener of listeners)
57
+ listener();
58
+ }
59
+ function clearHoveredSelectableId(id) {
60
+ if (id !== undefined && hoveredId === id)
61
+ setHoveredSelectableId(undefined);
62
+ }
63
+
45
64
  // packages/cli/src/app-opentui/render/text.ts
46
65
  var TRANSPARENT = RGBA.fromInts(0, 0, 0, 0);
66
+ var HOVER_BG = RGBA.fromHex(RIG_UI.hover);
67
+ function lineIsClickable(line) {
68
+ return line?.selectable !== undefined || line?.selectableIndex !== undefined;
69
+ }
70
+ function lineSelectableId(line) {
71
+ return line?.selectable?.id ?? line?.selectableId;
72
+ }
73
+ function lineBackground(line) {
74
+ if (line?.bg)
75
+ return RGBA.fromHex(line.bg);
76
+ const id = lineSelectableId(line);
77
+ if (id !== undefined && isHovered(id))
78
+ return HOVER_BG;
79
+ return TRANSPARENT;
80
+ }
47
81
  function selectableMouseHandler(currentLineRef, onLineMouseDown) {
48
82
  return (event) => {
49
83
  const currentLine = currentLineRef();
50
- if (currentLine?.selectableIndex === undefined)
84
+ if (!lineIsClickable(currentLine))
51
85
  return;
52
86
  onLineMouseDown?.(currentLine, event);
53
87
  };
54
88
  }
89
+ function hoverHandlers(currentLineRef) {
90
+ return {
91
+ onMouseOver: () => {
92
+ const id = lineSelectableId(currentLineRef());
93
+ if (id !== undefined)
94
+ setHoveredSelectableId(id);
95
+ },
96
+ onMouseOut: () => clearHoveredSelectableId(lineSelectableId(currentLineRef()))
97
+ };
98
+ }
55
99
  function createTextLine(renderer, id, top, onLineMouseDown) {
56
100
  let currentLine;
57
101
  const renderable = new TextRenderable(renderer, {
@@ -63,7 +107,8 @@ function createTextLine(renderer, id, top, onLineMouseDown) {
63
107
  width: 1,
64
108
  fg: RIG_UI.ink2,
65
109
  selectable: true,
66
- onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown)
110
+ onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown),
111
+ ...hoverHandlers(() => currentLine)
67
112
  });
68
113
  renderable.setRigSceneLine = (line) => {
69
114
  currentLine = line;
@@ -80,7 +125,8 @@ function createFlowTextLine(renderer, id, onLineMouseDown) {
80
125
  flexShrink: 0,
81
126
  fg: RIG_UI.ink2,
82
127
  selectable: true,
83
- onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown)
128
+ onMouseDown: selectableMouseHandler(() => currentLine, onLineMouseDown),
129
+ ...hoverHandlers(() => currentLine)
84
130
  });
85
131
  renderable.setRigSceneLine = (line) => {
86
132
  currentLine = line;
@@ -94,7 +140,7 @@ function applyTextLine(renderable, line, top, left, width) {
94
140
  renderable.width = width;
95
141
  renderable.content = line?.styledText ?? line?.text ?? "";
96
142
  renderable.fg = line?.fg ?? RIG_UI.ink2;
97
- renderable.bg = line?.bg ?? TRANSPARENT;
143
+ renderable.bg = lineBackground(line);
98
144
  renderable.attributes = line?.bold ? TextAttributes2.BOLD : line?.dim ? TextAttributes2.DIM : 0;
99
145
  }
100
146
  function applyFlowTextLine(renderable, line, width) {
@@ -104,7 +150,7 @@ function applyFlowTextLine(renderable, line, width) {
104
150
  renderable.width = Math.max(1, width);
105
151
  renderable.content = line?.styledText ?? line?.text ?? "";
106
152
  renderable.fg = line?.fg ?? RIG_UI.ink2;
107
- renderable.bg = line?.bg ?? TRANSPARENT;
153
+ renderable.bg = lineBackground(line);
108
154
  renderable.attributes = line?.bold ? TextAttributes2.BOLD : line?.dim ? TextAttributes2.DIM : 0;
109
155
  }
110
156
  function clearTextLines(renderables, from = 0) {
@@ -119,6 +165,9 @@ function clearTextLines(renderables, from = 0) {
119
165
  }
120
166
  }
121
167
  export {
168
+ lineSelectableId,
169
+ lineIsClickable,
170
+ lineBackground,
122
171
  createTextLine,
123
172
  createFlowTextLine,
124
173
  clearTextLines,
@@ -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",