@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.
- package/dist/bin/rig.js +287 -578
- package/dist/src/app-opentui/adapters/common.d.ts +3 -0
- package/dist/src/app-opentui/adapters/common.js +4 -0
- package/dist/src/app-opentui/adapters/family.js +31 -4
- package/dist/src/app-opentui/adapters/pi-attach.d.ts +7 -0
- package/dist/src/app-opentui/adapters/pi-attach.js +527 -473
- package/dist/src/app-opentui/adapters/tasks.js +82 -468
- package/dist/src/app-opentui/bootstrap.js +287 -578
- package/dist/src/app-opentui/command-palette.js +1 -0
- package/dist/src/app-opentui/drone.js +1 -0
- package/dist/src/app-opentui/index.js +127 -446
- package/dist/src/app-opentui/keymap.js +2 -387
- package/dist/src/app-opentui/list-search.d.ts +5 -1
- package/dist/src/app-opentui/list-search.js +2 -2
- package/dist/src/app-opentui/pi-host-child.js +31 -4
- package/dist/src/app-opentui/pi-pty-host.d.ts +14 -64
- package/dist/src/app-opentui/pi-pty-host.js +3 -397
- package/dist/src/app-opentui/react/App.js +107 -433
- package/dist/src/app-opentui/react/Backdrop.js +1 -0
- package/dist/src/app-opentui/react/ChromeHost.js +34 -410
- package/dist/src/app-opentui/react/SceneFrameView.js +55 -5
- package/dist/src/app-opentui/react/launch.js +171 -472
- package/dist/src/app-opentui/react/syntax.js +1 -0
- package/dist/src/app-opentui/registry.js +99 -487
- package/dist/src/app-opentui/render/graphics.js +1 -0
- package/dist/src/app-opentui/render/hover.d.ts +11 -0
- package/dist/src/app-opentui/render/hover.js +34 -0
- package/dist/src/app-opentui/render/native-host.js +1 -0
- package/dist/src/app-opentui/render/panels.js +50 -3
- package/dist/src/app-opentui/render/preloader.js +1 -0
- package/dist/src/app-opentui/render/scene.js +1 -0
- package/dist/src/app-opentui/render/terminal-handoff.d.ts +16 -0
- package/dist/src/app-opentui/render/terminal-handoff.js +14 -0
- package/dist/src/app-opentui/render/text.d.ts +13 -0
- package/dist/src/app-opentui/render/text.js +54 -5
- package/dist/src/app-opentui/render/type-bar.js +1 -0
- package/dist/src/app-opentui/runtime.js +127 -446
- package/dist/src/app-opentui/scenes/command.js +1 -0
- package/dist/src/app-opentui/scenes/doctor.js +1 -0
- package/dist/src/app-opentui/scenes/error.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/agent.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/browser.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/dist.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/git.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/github.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/harness.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/index.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/kit.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/profile.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/queue.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/remote.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/review.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/setup.js +1 -0
- package/dist/src/app-opentui/scenes/family-domains/stats.js +1 -0
- package/dist/src/app-opentui/scenes/family.js +1 -0
- package/dist/src/app-opentui/scenes/fleet.js +3 -5
- package/dist/src/app-opentui/scenes/handoff.js +1 -0
- package/dist/src/app-opentui/scenes/help.js +1 -0
- package/dist/src/app-opentui/scenes/inbox.js +1 -0
- package/dist/src/app-opentui/scenes/init.js +1 -0
- package/dist/src/app-opentui/scenes/inspect.js +1 -0
- package/dist/src/app-opentui/scenes/main.js +1 -0
- package/dist/src/app-opentui/scenes/pi.js +1 -0
- package/dist/src/app-opentui/scenes/plugin.js +1 -0
- package/dist/src/app-opentui/scenes/repo.js +1 -0
- package/dist/src/app-opentui/scenes/run-detail.js +1 -0
- package/dist/src/app-opentui/scenes/server.js +1 -0
- package/dist/src/app-opentui/scenes/tasks.js +3 -5
- package/dist/src/app-opentui/scenes/workspace.js +1 -0
- package/dist/src/app-opentui/selectable.js +1 -0
- package/dist/src/app-opentui/theme.d.ts +1 -0
- package/dist/src/app-opentui/theme.js +1 -0
- package/dist/src/commands/_operator-view.js +31 -4
- package/dist/src/commands/_pi-frontend.d.ts +25 -0
- package/dist/src/commands/_pi-frontend.js +32 -4
- package/dist/src/commands/run.js +31 -4
- package/dist/src/commands/task.js +31 -4
- package/dist/src/commands.js +31 -4
- package/dist/src/index.js +31 -4
- package/package.json +8 -8
|
@@ -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
|
+
};
|
|
@@ -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
|
|
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
|
|
157
|
+
renderable.bg = lineBackground(line);
|
|
111
158
|
renderable.attributes = line?.bold ? TextAttributes2.BOLD : line?.dim ? TextAttributes2.DIM : 0;
|
|
112
159
|
}
|
|
113
160
|
|
|
@@ -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
|
|
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
|
|
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
|
|
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,
|