@aiwayds/dsh-tui-pi 0.1.0 → 0.1.1
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/README.md +33 -30
- package/lib/index.js +41 -9
- package/lib/index.js.map +1 -1
- package/lib/live-widgets.d.ts +77 -29
- package/lib/live-widgets.js +190 -93
- package/lib/live-widgets.js.map +1 -1
- package/lib/messages.d.ts +4 -2
- package/lib/messages.js +8 -3
- package/lib/messages.js.map +1 -1
- package/lib/provider-catalog.d.ts +31 -8
- package/lib/provider-catalog.js +63 -8
- package/lib/provider-catalog.js.map +1 -1
- package/lib/selectors.js +4 -1
- package/lib/selectors.js.map +1 -1
- package/lib/session.d.ts +11 -0
- package/lib/session.js +34 -0
- package/lib/session.js.map +1 -1
- package/lib/settings.js +29 -2
- package/lib/settings.js.map +1 -1
- package/lib/tui.d.ts +16 -10
- package/lib/tui.js +11 -29
- package/lib/tui.js.map +1 -1
- package/package.json +1 -1
package/lib/tui.d.ts
CHANGED
|
@@ -7,8 +7,10 @@
|
|
|
7
7
|
* │ scrollable transcript (ScrollView) │ basis 0 / grow 1 — fills the rest
|
|
8
8
|
* ├──────────────────────────────────────┤
|
|
9
9
|
* │ statusContainer │ ┐
|
|
10
|
-
* │ widgetsContainer (Todos
|
|
10
|
+
* │ widgetsContainer (Todos) │ │ dock — basis auto / grow 0,
|
|
11
11
|
* │ editor │ │ sized to its content
|
|
12
|
+
* │ lastRequestContainer │ │ ← also hosts the merged
|
|
13
|
+
* │ (last-request + activity lines) │ │ running-agent activity
|
|
12
14
|
* │ footerContainer │ ┘
|
|
13
15
|
* └──────────────────────────────────────┘
|
|
14
16
|
*
|
|
@@ -34,8 +36,13 @@ export interface TuiHandle {
|
|
|
34
36
|
readonly tui: TUI;
|
|
35
37
|
/** The scrollable transcript document container. */
|
|
36
38
|
readonly transcript: Container;
|
|
37
|
-
/** Fixed slot pinned above the chat window — live Todos
|
|
39
|
+
/** Fixed slot pinned above the chat window — the live Todos widget. */
|
|
38
40
|
readonly widgets: Container;
|
|
41
|
+
/**
|
|
42
|
+
* Fixed dock slot below the editor — the last-request line + merged
|
|
43
|
+
* running-agent activity (LiveWidgets owns both).
|
|
44
|
+
*/
|
|
45
|
+
readonly lastRequest: Container;
|
|
39
46
|
/** Fixed dock slot rendered between transcript and editor. */
|
|
40
47
|
readonly status: Container;
|
|
41
48
|
/** The input editor. */
|
|
@@ -50,12 +57,13 @@ export interface TuiHandle {
|
|
|
50
57
|
*/
|
|
51
58
|
readonly theme: TuiTheme;
|
|
52
59
|
/**
|
|
53
|
-
* Hot-swap the theme bundle: repaints the editor border
|
|
54
|
-
*
|
|
55
|
-
* `
|
|
56
|
-
* (`setTheme`)
|
|
57
|
-
*
|
|
58
|
-
* bundle is unchanged (themes are module
|
|
60
|
+
* Hot-swap the theme bundle: repaints the editor border and the placeholder,
|
|
61
|
+
* and updates every subsequent `theme` read. Transcript repainting is the
|
|
62
|
+
* TranscriptRenderer's job (`setTheme`), and the last-request / running-agent
|
|
63
|
+
* lines are the LiveWidgets' job (`setTheme`) — both owned by the caller;
|
|
64
|
+
* call them before `applyTheme` so the one throttled render frame paints
|
|
65
|
+
* everything at once. No-op when the bundle is unchanged (themes are module
|
|
66
|
+
* singletons).
|
|
59
67
|
*/
|
|
60
68
|
applyTheme(theme: TuiTheme): void;
|
|
61
69
|
/** Autocomplete provider for the editor; re-applied across editor rebuilds. */
|
|
@@ -64,7 +72,5 @@ export interface TuiHandle {
|
|
|
64
72
|
setEditorBranchProvider(provider: () => string | undefined): void;
|
|
65
73
|
/** Live permission-preset display-name source for the editor; re-applied across editor rebuilds. */
|
|
66
74
|
setEditorPermissionProvider(provider: () => string | undefined): void;
|
|
67
|
-
/** Show/hide the "last request" widget below the editor. */
|
|
68
|
-
setLastRequest(text: string | undefined): void;
|
|
69
75
|
}
|
|
70
76
|
export declare function startTui(options?: StartTuiOptions): TuiHandle;
|
package/lib/tui.js
CHANGED
|
@@ -7,8 +7,10 @@
|
|
|
7
7
|
* │ scrollable transcript (ScrollView) │ basis 0 / grow 1 — fills the rest
|
|
8
8
|
* ├──────────────────────────────────────┤
|
|
9
9
|
* │ statusContainer │ ┐
|
|
10
|
-
* │ widgetsContainer (Todos
|
|
10
|
+
* │ widgetsContainer (Todos) │ │ dock — basis auto / grow 0,
|
|
11
11
|
* │ editor │ │ sized to its content
|
|
12
|
+
* │ lastRequestContainer │ │ ← also hosts the merged
|
|
13
|
+
* │ (last-request + activity lines) │ │ running-agent activity
|
|
12
14
|
* │ footerContainer │ ┘
|
|
13
15
|
* └──────────────────────────────────────┘
|
|
14
16
|
*
|
|
@@ -19,7 +21,6 @@
|
|
|
19
21
|
import { Container, matchesKey, ProcessTerminal, ScrollView, Spacer, Text, TuiAltScreen, VStack, } from '@earendil-works/pi-tui';
|
|
20
22
|
import { CwdBorderEditor } from "./editor.js";
|
|
21
23
|
import { ansiFg, RESET, resolveTheme } from "./theme/index.js";
|
|
22
|
-
import { clipToWidth } from "./text.js";
|
|
23
24
|
export function startTui(options = {}) {
|
|
24
25
|
const terminal = new ProcessTerminal();
|
|
25
26
|
const tui = new TuiAltScreen(terminal, true);
|
|
@@ -27,9 +28,9 @@ export function startTui(options = {}) {
|
|
|
27
28
|
// getter, baked closures below) observes the new bundle on the next call.
|
|
28
29
|
let themeRef = resolveTheme(process.env, options.themePreference ?? 'auto');
|
|
29
30
|
// ------------------------------------------------------------- component tree --
|
|
30
|
-
// Live Todos
|
|
31
|
-
//
|
|
32
|
-
// (bordered-panel) content while the model has todos
|
|
31
|
+
// Live Todos widget, pinned ABOVE the chat input: a plain Container with
|
|
32
|
+
// auto height — it renders zero rows while empty and grows to its
|
|
33
|
+
// (bordered-panel) content while the model has todos.
|
|
33
34
|
const widgets = new Container();
|
|
34
35
|
const transcript = new Container();
|
|
35
36
|
const transcriptView = new ScrollView(transcript, {
|
|
@@ -48,10 +49,12 @@ export function startTui(options = {}) {
|
|
|
48
49
|
let autocompleteProvider;
|
|
49
50
|
let branchProvider;
|
|
50
51
|
let permissionProvider;
|
|
52
|
+
// Last-request + merged running-agent activity, pinned BELOW the editor: a
|
|
53
|
+
// plain Container with auto height; LiveWidgets owns the ` ↳ ` line and the
|
|
54
|
+
// compact agent lines it hosts. It collapses to zero rows when both the
|
|
55
|
+
// last-request line is cleared and no subagent runs.
|
|
51
56
|
const lastRequest = new Container();
|
|
52
57
|
const footer = new Container();
|
|
53
|
-
let lastRequestText;
|
|
54
|
-
let lastRequestDisplay;
|
|
55
58
|
const dock = new VStack([
|
|
56
59
|
{ component: status, shrink: 1, minSize: 0 },
|
|
57
60
|
{ component: widgets, shrink: 1, minSize: 0 },
|
|
@@ -121,6 +124,7 @@ export function startTui(options = {}) {
|
|
|
121
124
|
tui,
|
|
122
125
|
transcript,
|
|
123
126
|
widgets,
|
|
127
|
+
lastRequest,
|
|
124
128
|
status,
|
|
125
129
|
get editor() {
|
|
126
130
|
return editor;
|
|
@@ -137,9 +141,6 @@ export function startTui(options = {}) {
|
|
|
137
141
|
return;
|
|
138
142
|
themeRef = theme;
|
|
139
143
|
rebuildEditor();
|
|
140
|
-
if (lastRequestDisplay !== undefined && lastRequestText !== undefined) {
|
|
141
|
-
lastRequestText.setText(ansiFg(themeRef.palette.fgMuted) + ` ↳ ${lastRequestDisplay}` + RESET);
|
|
142
|
-
}
|
|
143
144
|
tui.requestRender();
|
|
144
145
|
},
|
|
145
146
|
setEditorAutocompleteProvider(provider) {
|
|
@@ -154,25 +155,6 @@ export function startTui(options = {}) {
|
|
|
154
155
|
permissionProvider = provider;
|
|
155
156
|
editor.setPermissionProvider(provider);
|
|
156
157
|
},
|
|
157
|
-
setLastRequest(text) {
|
|
158
|
-
if (text === undefined || text.trim() === '') {
|
|
159
|
-
if (lastRequestText !== undefined) {
|
|
160
|
-
lastRequest.removeChild(lastRequestText);
|
|
161
|
-
lastRequestText = undefined;
|
|
162
|
-
lastRequestDisplay = undefined;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
const display = clipToWidth(text, 200);
|
|
167
|
-
if (lastRequestText === undefined) {
|
|
168
|
-
lastRequestText = new Text('', 1, 0);
|
|
169
|
-
lastRequest.addChild(lastRequestText);
|
|
170
|
-
}
|
|
171
|
-
lastRequestDisplay = display;
|
|
172
|
-
lastRequestText.setText(ansiFg(themeRef.palette.fgMuted) + ` ↳ ${display}` + RESET);
|
|
173
|
-
}
|
|
174
|
-
tui.requestRender();
|
|
175
|
-
},
|
|
176
158
|
};
|
|
177
159
|
// ------------------------------------------------------------- input & focus --
|
|
178
160
|
tui.setFocus(editor);
|
package/lib/tui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiwayds/dsh-tui-pi",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "pi-style terminal UI for DeepSeek Harness (dsh) — pi-tui look & feel, dsh slash commands, GitHub light/dark themes, powerline footer",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|