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

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 (80) hide show
  1. package/dist/bin/rig.js +287 -578
  2. package/dist/src/app-opentui/adapters/common.d.ts +3 -0
  3. package/dist/src/app-opentui/adapters/common.js +4 -0
  4. package/dist/src/app-opentui/adapters/family.js +31 -4
  5. package/dist/src/app-opentui/adapters/pi-attach.d.ts +7 -0
  6. package/dist/src/app-opentui/adapters/pi-attach.js +527 -473
  7. package/dist/src/app-opentui/adapters/tasks.js +82 -468
  8. package/dist/src/app-opentui/bootstrap.js +287 -578
  9. package/dist/src/app-opentui/command-palette.js +1 -0
  10. package/dist/src/app-opentui/drone.js +1 -0
  11. package/dist/src/app-opentui/index.js +127 -446
  12. package/dist/src/app-opentui/keymap.js +2 -387
  13. package/dist/src/app-opentui/list-search.d.ts +5 -1
  14. package/dist/src/app-opentui/list-search.js +2 -2
  15. package/dist/src/app-opentui/pi-host-child.js +31 -4
  16. package/dist/src/app-opentui/pi-pty-host.d.ts +14 -64
  17. package/dist/src/app-opentui/pi-pty-host.js +3 -397
  18. package/dist/src/app-opentui/react/App.js +107 -433
  19. package/dist/src/app-opentui/react/Backdrop.js +1 -0
  20. package/dist/src/app-opentui/react/ChromeHost.js +34 -410
  21. package/dist/src/app-opentui/react/SceneFrameView.js +55 -5
  22. package/dist/src/app-opentui/react/launch.js +171 -472
  23. package/dist/src/app-opentui/react/syntax.js +1 -0
  24. package/dist/src/app-opentui/registry.js +99 -487
  25. package/dist/src/app-opentui/render/graphics.js +1 -0
  26. package/dist/src/app-opentui/render/hover.d.ts +11 -0
  27. package/dist/src/app-opentui/render/hover.js +34 -0
  28. package/dist/src/app-opentui/render/native-host.js +1 -0
  29. package/dist/src/app-opentui/render/panels.js +50 -3
  30. package/dist/src/app-opentui/render/preloader.js +1 -0
  31. package/dist/src/app-opentui/render/scene.js +1 -0
  32. package/dist/src/app-opentui/render/terminal-handoff.d.ts +16 -0
  33. package/dist/src/app-opentui/render/terminal-handoff.js +14 -0
  34. package/dist/src/app-opentui/render/text.d.ts +13 -0
  35. package/dist/src/app-opentui/render/text.js +54 -5
  36. package/dist/src/app-opentui/render/type-bar.js +1 -0
  37. package/dist/src/app-opentui/runtime.js +127 -446
  38. package/dist/src/app-opentui/scenes/command.js +1 -0
  39. package/dist/src/app-opentui/scenes/doctor.js +1 -0
  40. package/dist/src/app-opentui/scenes/error.js +1 -0
  41. package/dist/src/app-opentui/scenes/family-domains/agent.js +1 -0
  42. package/dist/src/app-opentui/scenes/family-domains/browser.js +1 -0
  43. package/dist/src/app-opentui/scenes/family-domains/dist.js +1 -0
  44. package/dist/src/app-opentui/scenes/family-domains/git.js +1 -0
  45. package/dist/src/app-opentui/scenes/family-domains/github.js +1 -0
  46. package/dist/src/app-opentui/scenes/family-domains/harness.js +1 -0
  47. package/dist/src/app-opentui/scenes/family-domains/index.js +1 -0
  48. package/dist/src/app-opentui/scenes/family-domains/kit.js +1 -0
  49. package/dist/src/app-opentui/scenes/family-domains/profile.js +1 -0
  50. package/dist/src/app-opentui/scenes/family-domains/queue.js +1 -0
  51. package/dist/src/app-opentui/scenes/family-domains/remote.js +1 -0
  52. package/dist/src/app-opentui/scenes/family-domains/review.js +1 -0
  53. package/dist/src/app-opentui/scenes/family-domains/setup.js +1 -0
  54. package/dist/src/app-opentui/scenes/family-domains/stats.js +1 -0
  55. package/dist/src/app-opentui/scenes/family.js +1 -0
  56. package/dist/src/app-opentui/scenes/fleet.js +3 -5
  57. package/dist/src/app-opentui/scenes/handoff.js +1 -0
  58. package/dist/src/app-opentui/scenes/help.js +1 -0
  59. package/dist/src/app-opentui/scenes/inbox.js +1 -0
  60. package/dist/src/app-opentui/scenes/init.js +1 -0
  61. package/dist/src/app-opentui/scenes/inspect.js +1 -0
  62. package/dist/src/app-opentui/scenes/main.js +1 -0
  63. package/dist/src/app-opentui/scenes/pi.js +1 -0
  64. package/dist/src/app-opentui/scenes/plugin.js +1 -0
  65. package/dist/src/app-opentui/scenes/repo.js +1 -0
  66. package/dist/src/app-opentui/scenes/run-detail.js +1 -0
  67. package/dist/src/app-opentui/scenes/server.js +1 -0
  68. package/dist/src/app-opentui/scenes/tasks.js +3 -5
  69. package/dist/src/app-opentui/scenes/workspace.js +1 -0
  70. package/dist/src/app-opentui/selectable.js +1 -0
  71. package/dist/src/app-opentui/theme.d.ts +1 -0
  72. package/dist/src/app-opentui/theme.js +1 -0
  73. package/dist/src/commands/_operator-view.js +31 -4
  74. package/dist/src/commands/_pi-frontend.d.ts +25 -0
  75. package/dist/src/commands/_pi-frontend.js +32 -4
  76. package/dist/src/commands/run.js +31 -4
  77. package/dist/src/commands/task.js +31 -4
  78. package/dist/src/commands.js +31 -4
  79. package/dist/src/index.js +31 -4
  80. package/package.json +8 -8
@@ -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",
@@ -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",
@@ -0,0 +1,16 @@
1
+ import type { CliRenderer } from "@opentui/core";
2
+ /** Resume the OpenTUI renderer after an external full-screen TUI (native Pi)
3
+ * owned the terminal.
4
+ *
5
+ * A plain `renderer.resume()` diff-renders against a now-stale frame buffer and
6
+ * leaves the external program's screen content behind: OpenTUI's `resume()` only
7
+ * re-runs `setupTerminal` (re-enter alt-screen + clear + force a full repaint)
8
+ * when its internal `pendingSuspendedTerminalSetup` flag is set — and the
9
+ * suspend path used for shelling out does NOT set it, so a plain resume takes
10
+ * the `resumeRenderer` fast path and the screen stays corrupted (Pi's exit
11
+ * banner, a misplaced cursor, the type-bar rule painted at the top).
12
+ *
13
+ * We force the flag so `resume()` does a clean terminal re-setup, then request a
14
+ * full render. The `as`-casts reach two @opentui/core internals; guarded so a
15
+ * version that renames them degrades to a plain resume rather than throwing. */
16
+ export declare function resumeRendererClean(renderer: CliRenderer): void;
@@ -0,0 +1,14 @@
1
+ // @bun
2
+ // packages/cli/src/app-opentui/render/terminal-handoff.ts
3
+ function resumeRendererClean(renderer) {
4
+ try {
5
+ renderer.pendingSuspendedTerminalSetup = true;
6
+ } catch {}
7
+ renderer.resume();
8
+ try {
9
+ renderer.requestRender?.();
10
+ } catch {}
11
+ }
12
+ export {
13
+ resumeRendererClean
14
+ };
@@ -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",