@aiwayds/dsh-tui-pi 0.7.0 → 0.7.2
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/lib/tui.js +6 -1
- package/lib/tui.js.map +1 -1
- package/package.json +5 -5
- package/scripts/diagnose-container-tui.sh +612 -0
- package/pnpm-workspace.yaml +0 -2
package/lib/tui.js
CHANGED
|
@@ -36,7 +36,12 @@ export function startTui(options = {}) {
|
|
|
36
36
|
// where the pane background belongs to the multiplexer. DSH_TUI_TRANSPARENT=1
|
|
37
37
|
// opts back into the old see-through canvas for users who want their
|
|
38
38
|
// terminal theme to stay visible.
|
|
39
|
-
|
|
39
|
+
// Feature-detected: the repo patches pi-tui via pnpm patchedDependencies,
|
|
40
|
+
// which never propagates to consumers — an unpatched pi-tui has no
|
|
41
|
+
// setCanvasBackground, and calling it would crash TUI startup into a
|
|
42
|
+
// silent blank screen. Degrade to the transparent canvas instead.
|
|
43
|
+
const paintCanvas = process.env.DSH_TUI_TRANSPARENT !== '1'
|
|
44
|
+
&& typeof tui.setCanvasBackground === 'function';
|
|
40
45
|
if (paintCanvas)
|
|
41
46
|
tui.setCanvasBackground(ansiBg(themeRef.palette.canvas));
|
|
42
47
|
// ------------------------------------------------------------- component tree --
|
package/lib/tui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,SAAS,EACT,UAAU,EACV,eAAe,EACf,UAAU,EACV,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,MAAM,GAGP,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAoC,MAAM,aAAa,CAAA;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAuC,MAAM,kBAAkB,CAAA;AAqE3G,MAAM,UAAU,QAAQ,CAAC,UAA2B,EAAE;IACpD,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAA;IACtC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC5C,wEAAwE;IACxE,0EAA0E;IAC1E,IAAI,QAAQ,GAAa,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,eAAe,IAAI,MAAM,CAAC,CAAA;IACrF,qEAAqE;IACrE,2EAA2E;IAC3E,2EAA2E;IAC3E,uEAAuE;IACvE,4EAA4E;IAC5E,8EAA8E;IAC9E,qEAAqE;IACrE,kCAAkC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,CAAA;
|
|
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.7.
|
|
3
|
+
"version": "0.7.2",
|
|
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
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -31,22 +31,22 @@
|
|
|
31
31
|
"bin",
|
|
32
32
|
"cordis.patch.yml",
|
|
33
33
|
"patches",
|
|
34
|
-
"pnpm-workspace.yaml",
|
|
35
34
|
"scripts",
|
|
36
35
|
"templates",
|
|
37
36
|
"README.md",
|
|
38
37
|
"LICENSE"
|
|
39
38
|
],
|
|
40
39
|
"scripts": {
|
|
41
|
-
"
|
|
40
|
+
"link-closure": "node scripts/link-dsh-closure.mjs",
|
|
42
41
|
"build": "tsc -p tsconfig.json",
|
|
43
42
|
"check": "tsc --noEmit -p tsconfig.json",
|
|
43
|
+
"precheck": "node scripts/link-dsh-closure.mjs",
|
|
44
44
|
"pretest": "npm run build",
|
|
45
45
|
"test": "node --test test/*.test.mjs"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@aiwayds/dsh-dcp": "
|
|
49
|
-
"@aiwayds/dsh-subagent-registry": "
|
|
48
|
+
"@aiwayds/dsh-dcp": "0.4.0",
|
|
49
|
+
"@aiwayds/dsh-subagent-registry": "0.1.3",
|
|
50
50
|
"@earendil-works/pi-tui": "0.84.2"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
@@ -0,0 +1,612 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# diagnose-container-tui.sh — pipe this into a bare Ubuntu 22 container to
|
|
3
|
+
# diagnose why dsh-tui-pi shows a blank TUI after plugin install.
|
|
4
|
+
#
|
|
5
|
+
# Usage:
|
|
6
|
+
# podman run --rm -i ubuntu:22.04 bash < scripts/diagnose-container-tui.sh
|
|
7
|
+
#
|
|
8
|
+
# Or with docker:
|
|
9
|
+
# docker run --rm -i ubuntu:22.04 bash < scripts/diagnose-container-tui.sh
|
|
10
|
+
#
|
|
11
|
+
# The script is self-contained: it installs Node 22, pnpm, dsh 0.1.0-rc.7,
|
|
12
|
+
# and @aiwayds/dsh-tui-pi@0.7.1, then runs a battery of diagnostic checks.
|
|
13
|
+
# No code is modified — this is purely diagnostic.
|
|
14
|
+
|
|
15
|
+
set -uo pipefail
|
|
16
|
+
|
|
17
|
+
# ---------------------------------------------------------------------------
|
|
18
|
+
# helpers
|
|
19
|
+
# ---------------------------------------------------------------------------
|
|
20
|
+
PASS=0
|
|
21
|
+
FAIL=0
|
|
22
|
+
WARN=0
|
|
23
|
+
STEP=0
|
|
24
|
+
|
|
25
|
+
banner() {
|
|
26
|
+
printf '\n%s\n' "================================================================"
|
|
27
|
+
printf ' %s\n' "$1"
|
|
28
|
+
printf '%s\n\n' "================================================================"
|
|
29
|
+
}
|
|
30
|
+
step() {
|
|
31
|
+
STEP=$((STEP+1))
|
|
32
|
+
printf '\n--- [%d] %s ---\n' "$STEP" "$1"
|
|
33
|
+
}
|
|
34
|
+
ok() { printf ' [OK] %s\n' "$1"; PASS=$((PASS+1)); }
|
|
35
|
+
fail() { printf ' [FAIL] %s\n' "$1"; FAIL=$((FAIL+1)); }
|
|
36
|
+
warn() { printf ' [WARN] %s\n' "$1"; WARN=$((WARN+1)); }
|
|
37
|
+
info() { printf ' [INFO] %s\n' "$1"; }
|
|
38
|
+
|
|
39
|
+
# ---------------------------------------------------------------------------
|
|
40
|
+
banner "dsh-tui-pi container TUI diagnostics"
|
|
41
|
+
info "Date: $(date -u '+%Y-%m-%d %H:%M:%S UTC')"
|
|
42
|
+
info "Host: $(uname -a)"
|
|
43
|
+
# ---------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
# ===== 0. Environment setup =====
|
|
46
|
+
step "Installing Node 22 (nodesource) + pnpm + utilities"
|
|
47
|
+
|
|
48
|
+
apt-get update -qq >/dev/null 2>&1
|
|
49
|
+
# script(1) is in bsdutils on Ubuntu; some images have it already
|
|
50
|
+
apt-get install -y -qq curl ca-certificates bsdutils >/dev/null 2>&1 || true
|
|
51
|
+
|
|
52
|
+
# nodesource Node 22
|
|
53
|
+
if ! command -v node &>/dev/null; then
|
|
54
|
+
curl -fsSL https://deb.nodesource.com/setup_22.x | bash - >/dev/null 2>&1
|
|
55
|
+
apt-get install -y -qq nodejs >/dev/null 2>&1
|
|
56
|
+
fi
|
|
57
|
+
info "node $(node --version), npm $(npm --version)"
|
|
58
|
+
|
|
59
|
+
if ! command -v pnpm &>/dev/null; then
|
|
60
|
+
npm install -g pnpm >/dev/null 2>&1
|
|
61
|
+
fi
|
|
62
|
+
info "pnpm $(pnpm --version)"
|
|
63
|
+
|
|
64
|
+
# TERM for TUI rendering
|
|
65
|
+
export TERM=xterm-256color
|
|
66
|
+
info "TERM=$TERM"
|
|
67
|
+
|
|
68
|
+
# ===== 1. Install dsh =====
|
|
69
|
+
step "Installing @deepseek-ai/dsh@0.1.0-rc.7"
|
|
70
|
+
|
|
71
|
+
npm install -g @deepseek-ai/dsh@0.1.0-rc.7 2>&1 | tail -5
|
|
72
|
+
if command -v dsh &>/dev/null; then
|
|
73
|
+
ok "dsh on PATH: $(which dsh)"
|
|
74
|
+
info "dsh --version: $(dsh --version 2>&1 || echo '(flag not supported)')"
|
|
75
|
+
else
|
|
76
|
+
fail "dsh not found on PATH after install"
|
|
77
|
+
echo "ABORT: cannot continue without dsh"
|
|
78
|
+
exit 1
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
# ===== 2. Install dsh-tui-pi plugin =====
|
|
82
|
+
step "Installing @aiwayds/dsh-tui-pi@0.7.1 into profile 'tui'"
|
|
83
|
+
|
|
84
|
+
INSTALL_OUTPUT=$(dsh plugin --profile tui add @aiwayds/dsh-tui-pi@0.7.1 2>&1) || true
|
|
85
|
+
INSTALL_EXIT=$?
|
|
86
|
+
info "dsh plugin add exit code: $INSTALL_EXIT"
|
|
87
|
+
echo "$INSTALL_OUTPUT" | head -30 | sed 's/^/ /'
|
|
88
|
+
if [ "$INSTALL_EXIT" -eq 0 ]; then
|
|
89
|
+
ok "Plugin install reported success (exit 0)"
|
|
90
|
+
else
|
|
91
|
+
fail "Plugin install failed (exit $INSTALL_EXIT)"
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# ===== 3. Profile directory structure =====
|
|
95
|
+
step "Profile directory structure"
|
|
96
|
+
|
|
97
|
+
PROFILE_DIR="$HOME/.dsh/profiles/tui"
|
|
98
|
+
if [ -d "$PROFILE_DIR" ]; then
|
|
99
|
+
ok "Profile dir exists: $PROFILE_DIR"
|
|
100
|
+
info "Top-level contents:"
|
|
101
|
+
ls -la "$PROFILE_DIR/" 2>&1 | sed 's/^/ /'
|
|
102
|
+
else
|
|
103
|
+
fail "Profile dir does not exist: $PROFILE_DIR"
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
# ===== 4. Check profile bundles =====
|
|
107
|
+
step "Profile bundles / cordis.patch.yml registration"
|
|
108
|
+
|
|
109
|
+
FOUND_BUNDLES=0
|
|
110
|
+
for f in "$PROFILE_DIR/dsh.profile" "$PROFILE_DIR/dsh.profile.yml" "$PROFILE_DIR/dsh.profile.yaml"; do
|
|
111
|
+
if [ -f "$f" ]; then
|
|
112
|
+
ok "Found profile config: $f"
|
|
113
|
+
echo " --- contents ---"
|
|
114
|
+
cat "$f" 2>&1 | sed 's/^/ /'
|
|
115
|
+
echo " --- end ---"
|
|
116
|
+
FOUND_BUNDLES=1
|
|
117
|
+
fi
|
|
118
|
+
done
|
|
119
|
+
|
|
120
|
+
# Also check package.json for bundle references
|
|
121
|
+
if [ -f "$PROFILE_DIR/package.json" ]; then
|
|
122
|
+
info "package.json dependencies:"
|
|
123
|
+
node -e "
|
|
124
|
+
const pkg = JSON.parse(require('fs').readFileSync('$PROFILE_DIR/package.json','utf8'));
|
|
125
|
+
const deps = {...(pkg.dependencies||{}), ...(pkg.devDependencies||{})};
|
|
126
|
+
for (const [k,v] of Object.entries(deps)) {
|
|
127
|
+
console.log(' ' + k + ': ' + v);
|
|
128
|
+
}
|
|
129
|
+
" 2>&1 || true
|
|
130
|
+
|
|
131
|
+
# Check if dsh-tui-pi is in dependencies
|
|
132
|
+
if node -e "
|
|
133
|
+
const pkg = JSON.parse(require('fs').readFileSync('$PROFILE_DIR/package.json','utf8'));
|
|
134
|
+
const deps = {...(pkg.dependencies||{}), ...(pkg.devDependencies||{})};
|
|
135
|
+
const has = deps['@aiwayds/dsh-tui-pi'] || deps['dsh-tui-pi'];
|
|
136
|
+
process.exit(has ? 0 : 1);
|
|
137
|
+
" 2>/dev/null; then
|
|
138
|
+
ok "dsh-tui-pi is listed in profile package.json dependencies"
|
|
139
|
+
else
|
|
140
|
+
fail "dsh-tui-pi NOT found in profile package.json dependencies"
|
|
141
|
+
fi
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
if [ "$FOUND_BUNDLES" -eq 0 ]; then
|
|
145
|
+
# Check if cordis.patch.yml was copied into the profile
|
|
146
|
+
if find "$PROFILE_DIR" -name "cordis.patch.yml" 2>/dev/null | head -1 | grep -q .; then
|
|
147
|
+
ok "cordis.patch.yml found in profile tree"
|
|
148
|
+
else
|
|
149
|
+
warn "No dsh.profile file and no cordis.patch.yml found in profile"
|
|
150
|
+
info "dsh-tui-pi registers via cordis.patch.yml (insert id: tui-pi)"
|
|
151
|
+
info "The plugin loader must discover this file in node_modules"
|
|
152
|
+
fi
|
|
153
|
+
fi
|
|
154
|
+
|
|
155
|
+
# ===== 5. Check node_modules for plugin package =====
|
|
156
|
+
step "Plugin package in node_modules"
|
|
157
|
+
|
|
158
|
+
TUI_PKG_DIR=""
|
|
159
|
+
for candidate in \
|
|
160
|
+
"$PROFILE_DIR/node_modules/@aiwayds/dsh-tui-pi" \
|
|
161
|
+
"$PROFILE_DIR/node_modules/dsh-tui-pi"; do
|
|
162
|
+
if [ -d "$candidate" ]; then
|
|
163
|
+
ok "Plugin package found: $candidate"
|
|
164
|
+
TUI_PKG_DIR="$candidate"
|
|
165
|
+
info "Version: $(node -e "console.log(JSON.parse(require('fs').readFileSync('$candidate/package.json','utf8')).version)" 2>&1 || echo 'unreadable')"
|
|
166
|
+
info "lib/ contents:"
|
|
167
|
+
ls "$candidate/lib/" 2>&1 | head -15 | sed 's/^/ /'
|
|
168
|
+
break
|
|
169
|
+
fi
|
|
170
|
+
done
|
|
171
|
+
if [ -z "$TUI_PKG_DIR" ]; then
|
|
172
|
+
fail "dsh-tui-pi package NOT found in node_modules"
|
|
173
|
+
fi
|
|
174
|
+
|
|
175
|
+
# ===== 6. cordis.patch.yml verification =====
|
|
176
|
+
step "cordis.patch.yml content (bundle registration id)"
|
|
177
|
+
|
|
178
|
+
if [ -n "$TUI_PKG_DIR" ] && [ -f "$TUI_PKG_DIR/cordis.patch.yml" ]; then
|
|
179
|
+
ok "cordis.patch.yml found in plugin package"
|
|
180
|
+
echo " --- contents ---"
|
|
181
|
+
cat "$TUI_PKG_DIR/cordis.patch.yml" | sed 's/^/ /'
|
|
182
|
+
echo " --- end ---"
|
|
183
|
+
|
|
184
|
+
if grep -q "tui-pi" "$TUI_PKG_DIR/cordis.patch.yml"; then
|
|
185
|
+
ok "Bundle id 'tui-pi' present in patch"
|
|
186
|
+
else
|
|
187
|
+
fail "Bundle id 'tui-pi' NOT found in cordis.patch.yml"
|
|
188
|
+
fi
|
|
189
|
+
else
|
|
190
|
+
fail "cordis.patch.yml NOT found in plugin package"
|
|
191
|
+
fi
|
|
192
|
+
|
|
193
|
+
# ===== 7. @deepseek-ai closure symlinks =====
|
|
194
|
+
step "@deepseek-ai closure (critical: single cordis instance contract)"
|
|
195
|
+
|
|
196
|
+
# The consumer runtime closure: ~/.dsh/profiles/node_modules/@deepseek-ai/
|
|
197
|
+
GLOBAL_CLOSURE="$HOME/.dsh/profiles/node_modules/@deepseek-ai"
|
|
198
|
+
if [ -d "$GLOBAL_CLOSURE" ]; then
|
|
199
|
+
ok "Global closure exists: $GLOBAL_CLOSURE"
|
|
200
|
+
info "Contents:"
|
|
201
|
+
ls -la "$GLOBAL_CLOSURE/" 2>&1 | sed 's/^/ /'
|
|
202
|
+
|
|
203
|
+
# Check if cordis is symlink or physical (AGENTS.md iron rule 8)
|
|
204
|
+
CORDIS_PATH="$GLOBAL_CLOSURE/cordis"
|
|
205
|
+
if [ -e "$CORDIS_PATH" ]; then
|
|
206
|
+
if [ -L "$CORDIS_PATH" ]; then
|
|
207
|
+
ok "cordis is a symlink (correct — single closure)"
|
|
208
|
+
info " -> $(readlink "$CORDIS_PATH")"
|
|
209
|
+
else
|
|
210
|
+
fail "cordis is a PHYSICAL directory (WRONG — causes dual cordis instances)"
|
|
211
|
+
info " This triggers 'Cannot read properties of undefined (reading prepare)' crash"
|
|
212
|
+
fi
|
|
213
|
+
else
|
|
214
|
+
fail "cordis NOT found in global closure"
|
|
215
|
+
fi
|
|
216
|
+
else
|
|
217
|
+
warn "Global closure dir not found: $GLOBAL_CLOSURE"
|
|
218
|
+
info "Checking plugin-local @deepseek-ai..."
|
|
219
|
+
PLUGIN_CLOSURE="${TUI_PKG_DIR:+$TUI_PKG_DIR/node_modules/@deepseek-ai}"
|
|
220
|
+
if [ -n "$PLUGIN_CLOSURE" ] && [ -d "$PLUGIN_CLOSURE" ]; then
|
|
221
|
+
info "Plugin-local @deepseek-ai found: $PLUGIN_CLOSURE"
|
|
222
|
+
ls -la "$PLUGIN_CLOSURE/" 2>&1 | sed 's/^/ /'
|
|
223
|
+
else
|
|
224
|
+
fail "No @deepseek-ai found anywhere — plugin cannot resolve cordis types"
|
|
225
|
+
fi
|
|
226
|
+
fi
|
|
227
|
+
|
|
228
|
+
# dsh global install's own closure
|
|
229
|
+
DSH_BIN=$(which dsh 2>/dev/null || echo "")
|
|
230
|
+
if [ -n "$DSH_BIN" ]; then
|
|
231
|
+
DSH_REAL=$(realpath "$DSH_BIN" 2>/dev/null || echo "$DSH_BIN")
|
|
232
|
+
DSH_GLOBAL_CLOSURE="$(dirname "$(dirname "$DSH_REAL")")/node_modules/@deepseek-ai"
|
|
233
|
+
if [ -d "$DSH_GLOBAL_CLOSURE" ]; then
|
|
234
|
+
ok "dsh global closure: $DSH_GLOBAL_CLOSURE"
|
|
235
|
+
info "Contents:"
|
|
236
|
+
ls "$DSH_GLOBAL_CLOSURE/" 2>&1 | sed 's/^/ /'
|
|
237
|
+
else
|
|
238
|
+
warn "dsh global closure not at expected path: $DSH_GLOBAL_CLOSURE"
|
|
239
|
+
fi
|
|
240
|
+
fi
|
|
241
|
+
|
|
242
|
+
# ===== 8. Node module resolution test =====
|
|
243
|
+
step "Module resolution: can the plugin resolve @deepseek-ai/cordis?"
|
|
244
|
+
|
|
245
|
+
if [ -n "$TUI_PKG_DIR" ]; then
|
|
246
|
+
RESOLVE_TEST=$(node -e "
|
|
247
|
+
try {
|
|
248
|
+
const path = require.resolve('@deepseek-ai/cordis', { paths: ['$TUI_PKG_DIR'] });
|
|
249
|
+
console.log('RESOLVED: ' + path);
|
|
250
|
+
} catch (e) {
|
|
251
|
+
console.log('FAILED: ' + e.message);
|
|
252
|
+
}
|
|
253
|
+
" 2>&1)
|
|
254
|
+
info "@deepseek-ai/cordis from plugin dir:"
|
|
255
|
+
echo " $RESOLVE_TEST"
|
|
256
|
+
|
|
257
|
+
if echo "$RESOLVE_TEST" | grep -q "RESOLVED"; then
|
|
258
|
+
ok "@deepseek-ai/cordis resolves from plugin directory"
|
|
259
|
+
else
|
|
260
|
+
fail "@deepseek-ai/cordis does NOT resolve from plugin directory"
|
|
261
|
+
info "This is the most common root cause of blank TUI"
|
|
262
|
+
fi
|
|
263
|
+
|
|
264
|
+
# Also check pi-tui
|
|
265
|
+
PIUI_TEST=$(node -e "
|
|
266
|
+
try {
|
|
267
|
+
const path = require.resolve('@earendil-works/pi-tui', { paths: ['$TUI_PKG_DIR'] });
|
|
268
|
+
console.log('RESOLVED: ' + path);
|
|
269
|
+
} catch (e) {
|
|
270
|
+
console.log('FAILED: ' + e.message);
|
|
271
|
+
}
|
|
272
|
+
" 2>&1)
|
|
273
|
+
info "@earendil-works/pi-tui from plugin dir:"
|
|
274
|
+
echo " $PIUI_TEST"
|
|
275
|
+
|
|
276
|
+
if echo "$PIUI_TEST" | grep -q "RESOLVED"; then
|
|
277
|
+
ok "@earendil-works/pi-tui resolves"
|
|
278
|
+
else
|
|
279
|
+
fail "@earendil-works/pi-tui does NOT resolve"
|
|
280
|
+
fi
|
|
281
|
+
fi
|
|
282
|
+
|
|
283
|
+
# ===== 9. pi-tui native bindings (informational — Linux degrades gracefully) =====
|
|
284
|
+
step "pi-tui native bindings (informational — Linux has no native helpers)"
|
|
285
|
+
|
|
286
|
+
if [ -n "$TUI_PKG_DIR" ]; then
|
|
287
|
+
PIUI_PKG=$(node -e "
|
|
288
|
+
try { console.log(require.resolve('@earendil-works/pi-tui/package.json', { paths: ['$TUI_PKG_DIR'] }).replace('/package.json','')); }
|
|
289
|
+
catch { console.log(''); }
|
|
290
|
+
" 2>/dev/null || echo "")
|
|
291
|
+
|
|
292
|
+
if [ -n "$PIUI_PKG" ] && [ -d "$PIUI_PKG" ]; then
|
|
293
|
+
info "pi-tui package: $PIUI_PKG"
|
|
294
|
+
if [ -d "$PIUI_PKG/native" ]; then
|
|
295
|
+
info "Native platforms shipped:"
|
|
296
|
+
ls "$PIUI_PKG/native/" 2>&1 | sed 's/^/ /'
|
|
297
|
+
|
|
298
|
+
# Check linux availability
|
|
299
|
+
if [ -d "$PIUI_PKG/native/linux" ]; then
|
|
300
|
+
ok "Linux native bindings exist"
|
|
301
|
+
else
|
|
302
|
+
info "No linux native bindings — but this is EXPECTED and harmless"
|
|
303
|
+
info "pi-tui native-modifiers.js returns undefined on process.platform !== 'darwin'/'win32'"
|
|
304
|
+
info "The native helpers are only for darwin modifier keys and win32 console mode"
|
|
305
|
+
info "Linux terminal input works without native bindings (process.stdin raw mode)"
|
|
306
|
+
fi
|
|
307
|
+
fi
|
|
308
|
+
fi
|
|
309
|
+
fi
|
|
310
|
+
|
|
311
|
+
# ===== 10. dsh --help — command registration check =====
|
|
312
|
+
step "dsh --profile tui --help (are TUI commands visible?)"
|
|
313
|
+
|
|
314
|
+
HELP_OUTPUT=$(dsh --profile tui --help 2>&1) || true
|
|
315
|
+
echo "$HELP_OUTPUT" | head -30 | sed 's/^/ /'
|
|
316
|
+
|
|
317
|
+
TUI_CMDS=0
|
|
318
|
+
for cmd in "/login" "/logout" "/settings" "/model" "/theme" "/session" "/resume" "/hotkeys" "/reload"; do
|
|
319
|
+
if echo "$HELP_OUTPUT" | grep -qi "$cmd"; then
|
|
320
|
+
ok "Command in help: $cmd"
|
|
321
|
+
TUI_CMDS=$((TUI_CMDS+1))
|
|
322
|
+
fi
|
|
323
|
+
done
|
|
324
|
+
if [ "$TUI_CMDS" -eq 0 ]; then
|
|
325
|
+
fail "No dsh-tui-pi commands found in --help output"
|
|
326
|
+
info "This suggests the plugin is NOT being loaded by dsh"
|
|
327
|
+
else
|
|
328
|
+
ok "$TUI_CMDS dsh-tui-pi commands found in --help"
|
|
329
|
+
fi
|
|
330
|
+
|
|
331
|
+
# ===== 11. dsh --profile tui --version =====
|
|
332
|
+
step "dsh --profile tui --version (non-interactive sanity check)"
|
|
333
|
+
|
|
334
|
+
VERSION_OUTPUT=$(dsh --profile tui --version 2>&1) || true
|
|
335
|
+
info "Output:"
|
|
336
|
+
echo "$VERSION_OUTPUT" | sed 's/^/ /'
|
|
337
|
+
if echo "$VERSION_OUTPUT" | grep -qi "dsh-tui-pi\|0\.7\.1\|tui-pi"; then
|
|
338
|
+
ok "Version output mentions dsh-tui-pi or version"
|
|
339
|
+
else
|
|
340
|
+
warn "Version output does not mention dsh-tui-pi"
|
|
341
|
+
fi
|
|
342
|
+
|
|
343
|
+
# ===== 12. Check if dsh exits cleanly without TTY =====
|
|
344
|
+
step "dsh --profile tui exit behavior (no TTY, 5s timeout)"
|
|
345
|
+
|
|
346
|
+
EXIT_LOG="/tmp/dsh-exit-test.log"
|
|
347
|
+
START_TS=$(date +%s)
|
|
348
|
+
timeout 5 dsh --profile tui </dev/null >"$EXIT_LOG" 2>&1 || true
|
|
349
|
+
EXIT_CODE=$?
|
|
350
|
+
END_TS=$(date +%s)
|
|
351
|
+
DURATION=$((END_TS - START_TS))
|
|
352
|
+
|
|
353
|
+
info "Exit code: $EXIT_CODE (after ${DURATION}s)"
|
|
354
|
+
info "Output bytes: $(wc -c < "$EXIT_LOG")"
|
|
355
|
+
|
|
356
|
+
if [ "$EXIT_CODE" -eq 124 ]; then
|
|
357
|
+
info "Exit 124 = timeout (TUI started but did not exit on its own)"
|
|
358
|
+
info "This is expected: TUI waits for user input"
|
|
359
|
+
ok "TUI process is alive (timeout = it ran for 5 seconds)"
|
|
360
|
+
elif [ "$EXIT_CODE" -eq 0 ]; then
|
|
361
|
+
warn "Exit 0 = TUI exited immediately without error"
|
|
362
|
+
info "Possible cause: TUI detects no TTY and exits gracefully"
|
|
363
|
+
else
|
|
364
|
+
warn "Exit $EXIT_CODE = TUI exited with error"
|
|
365
|
+
fi
|
|
366
|
+
|
|
367
|
+
if [ -s "$EXIT_LOG" ]; then
|
|
368
|
+
info "Exit test output:"
|
|
369
|
+
cat "$EXIT_LOG" | head -30 | cat -v | sed 's/^/ /'
|
|
370
|
+
else
|
|
371
|
+
info "(no output captured)"
|
|
372
|
+
fi
|
|
373
|
+
|
|
374
|
+
# ===== 13. script command capture =====
|
|
375
|
+
step "Terminal capture with 'script -q' (PTY emulation)"
|
|
376
|
+
|
|
377
|
+
SCRIPT_LOG="/tmp/dsh-tui-script.log"
|
|
378
|
+
# script provides a pseudo-TTY, which may let the TUI render
|
|
379
|
+
timeout 5 script -q "$SCRIPT_LOG" -c "dsh --profile tui" </dev/null 2>&1 || true
|
|
380
|
+
|
|
381
|
+
SCRIPT_SIZE=$(wc -c < "$SCRIPT_LOG" 2>/dev/null || echo 0)
|
|
382
|
+
info "script log size: $SCRIPT_SIZE bytes"
|
|
383
|
+
|
|
384
|
+
if [ "$SCRIPT_SIZE" -gt 0 ]; then
|
|
385
|
+
ok "script captured output ($SCRIPT_SIZE bytes)"
|
|
386
|
+
info "First 50 lines (cat -v shows escape sequences):"
|
|
387
|
+
head -50 "$SCRIPT_LOG" | cat -v | sed 's/^/ /'
|
|
388
|
+
|
|
389
|
+
# Check for alt-screen activation: ESC[?1049h
|
|
390
|
+
if cat -v "$SCRIPT_LOG" | grep -q '\[?1049h\|\[2J\|\[H'; then
|
|
391
|
+
ok "Alt-screen / cursor-home escape sequences detected"
|
|
392
|
+
else
|
|
393
|
+
info "No alt-screen escapes (TUI may not have entered alt-screen mode)"
|
|
394
|
+
fi
|
|
395
|
+
|
|
396
|
+
# Strip escape sequences and check for visible text
|
|
397
|
+
VISIBLE=$(sed 's/\x1b\[[0-9;]*[a-zA-Z]//g; s/\x1b\][^\x07]*\x07//g; s/\x1b[()][AB012]//g' "$SCRIPT_LOG" | tr -d '[:cntrl:]' | tr -s ' ')
|
|
398
|
+
if [ -n "$VISIBLE" ] && [ ${#VISIBLE} -gt 10 ]; then
|
|
399
|
+
ok "Visible text content found after stripping escapes"
|
|
400
|
+
info "Cleaned text (first 300 chars):"
|
|
401
|
+
echo "$VISIBLE" | head -c 300 | sed 's/^/ /'
|
|
402
|
+
else
|
|
403
|
+
fail "No visible text content — TUI output is blank or all-escape"
|
|
404
|
+
info "This confirms the blank TUI symptom"
|
|
405
|
+
fi
|
|
406
|
+
else
|
|
407
|
+
fail "script captured zero bytes — TUI produced no output at all"
|
|
408
|
+
fi
|
|
409
|
+
|
|
410
|
+
# ===== 14. Direct pipe capture =====
|
|
411
|
+
step "Direct pipe capture: dsh --profile tui 2>&1 (no PTY)"
|
|
412
|
+
|
|
413
|
+
PIPE_LOG="/tmp/dsh-tui-pipe.log"
|
|
414
|
+
timeout 5 dsh --profile tui </dev/null >"$PIPE_LOG" 2>&1 || true
|
|
415
|
+
|
|
416
|
+
PIPE_SIZE=$(wc -c < "$PIPE_LOG" 2>/dev/null || echo 0)
|
|
417
|
+
info "Pipe log size: $PIPE_SIZE bytes"
|
|
418
|
+
|
|
419
|
+
if [ "$PIPE_SIZE" -gt 0 ]; then
|
|
420
|
+
ok "Pipe captured output ($PIPE_SIZE bytes)"
|
|
421
|
+
info "Raw output (cat -v):"
|
|
422
|
+
cat -v "$PIPE_LOG" | head -50 | sed 's/^/ /'
|
|
423
|
+
|
|
424
|
+
# Check for TUI content markers
|
|
425
|
+
if cat "$PIPE_LOG" | grep -qi "dsh-tui-pi\|pi-tui\|whale\|DSH TUI\|welcome"; then
|
|
426
|
+
ok "TUI content markers found in pipe output"
|
|
427
|
+
else
|
|
428
|
+
info "No TUI content markers in pipe output"
|
|
429
|
+
fi
|
|
430
|
+
else
|
|
431
|
+
fail "Pipe captured zero bytes — TUI is silent without a PTY"
|
|
432
|
+
fi
|
|
433
|
+
|
|
434
|
+
# ===== 15. stderr-only capture =====
|
|
435
|
+
step "Stderr capture (error diagnostics)"
|
|
436
|
+
|
|
437
|
+
STDERR_LOG="/tmp/dsh-stderr.log"
|
|
438
|
+
timeout 5 dsh --profile tui </dev/null 2>"$STDERR_LOG" || true
|
|
439
|
+
|
|
440
|
+
STDERR_SIZE=$(wc -c < "$STDERR_LOG" 2>/dev/null || echo 0)
|
|
441
|
+
info "Stderr size: $STDERR_SIZE bytes"
|
|
442
|
+
|
|
443
|
+
if [ "$STDERR_SIZE" -gt 0 ]; then
|
|
444
|
+
warn "Stderr has output (may contain errors):"
|
|
445
|
+
cat "$STDERR_LOG" | head -40 | sed 's/^/ /'
|
|
446
|
+
else
|
|
447
|
+
info "Stderr is empty (no error output)"
|
|
448
|
+
fi
|
|
449
|
+
|
|
450
|
+
# ===== 16. DSH home directory inspection =====
|
|
451
|
+
step "DSH home directory (~/.dsh/)"
|
|
452
|
+
|
|
453
|
+
if [ -d "$HOME/.dsh" ]; then
|
|
454
|
+
ok "$HOME/.dsh exists"
|
|
455
|
+
info "Top-level:"
|
|
456
|
+
ls -la "$HOME/.dsh/" 2>&1 | sed 's/^/ /'
|
|
457
|
+
|
|
458
|
+
# Log files
|
|
459
|
+
info "Looking for log files..."
|
|
460
|
+
LOGS=$(find "$HOME/.dsh" -maxdepth 3 \( -name "*.log" -o -name "debug*" -o -name "error*" -o -name "crash*" \) 2>/dev/null)
|
|
461
|
+
if [ -n "$LOGS" ]; then
|
|
462
|
+
ok "Log files found:"
|
|
463
|
+
echo "$LOGS" | sed 's/^/ /'
|
|
464
|
+
# Show last few lines of each log
|
|
465
|
+
for lf in $LOGS; do
|
|
466
|
+
info "--- $lf (last 10 lines) ---"
|
|
467
|
+
tail -10 "$lf" 2>&1 | sed 's/^/ /'
|
|
468
|
+
done
|
|
469
|
+
else
|
|
470
|
+
info "No log files found in ~/.dsh/"
|
|
471
|
+
fi
|
|
472
|
+
|
|
473
|
+
# settings.yaml
|
|
474
|
+
if [ -f "$HOME/.dsh/settings.yaml" ]; then
|
|
475
|
+
ok "settings.yaml exists"
|
|
476
|
+
info "Contents:"
|
|
477
|
+
cat "$HOME/.dsh/settings.yaml" | sed 's/^/ /'
|
|
478
|
+
else
|
|
479
|
+
warn "No settings.yaml (fresh install, no config yet)"
|
|
480
|
+
fi
|
|
481
|
+
|
|
482
|
+
# .credentials.yaml
|
|
483
|
+
if [ -f "$HOME/.dsh/.credentials.yaml" ]; then
|
|
484
|
+
ok ".credentials.yaml exists"
|
|
485
|
+
else
|
|
486
|
+
warn "No .credentials.yaml — /login may be required"
|
|
487
|
+
info "TUI might show blank if it blocks on authentication"
|
|
488
|
+
fi
|
|
489
|
+
else
|
|
490
|
+
fail "$HOME/.dsh does not exist"
|
|
491
|
+
fi
|
|
492
|
+
|
|
493
|
+
# ===== 17. NODE_DEBUG=module trace =====
|
|
494
|
+
step "Module loading trace (NODE_DEBUG=module)"
|
|
495
|
+
|
|
496
|
+
MODULE_LOG="/tmp/dsh-module-debug.log"
|
|
497
|
+
timeout 5 NODE_DEBUG=module dsh --profile tui </dev/null 2>"$MODULE_LOG" || true
|
|
498
|
+
|
|
499
|
+
MODULE_SIZE=$(wc -c < "$MODULE_LOG" 2>/dev/null || echo 0)
|
|
500
|
+
info "Module debug log: $MODULE_SIZE bytes"
|
|
501
|
+
|
|
502
|
+
if [ "$MODULE_SIZE" -gt 0 ]; then
|
|
503
|
+
# Check for plugin loading
|
|
504
|
+
if grep -i "dsh-tui-pi\|tui-pi\|@aiwayds" "$MODULE_LOG" >/dev/null 2>&1; then
|
|
505
|
+
ok "Module trace mentions dsh-tui-pi"
|
|
506
|
+
grep -i "dsh-tui-pi\|tui-pi\|@aiwayds" "$MODULE_LOG" | head -5 | sed 's/^/ /'
|
|
507
|
+
else
|
|
508
|
+
fail "Module trace does NOT mention dsh-tui-pi — plugin never loaded"
|
|
509
|
+
fi
|
|
510
|
+
|
|
511
|
+
# Check for errors
|
|
512
|
+
ERRORS=$(grep -i "error\|ERR_\|MODULE_NOT_FOUND\|cannot find\|not found" "$MODULE_LOG" 2>/dev/null | head -10)
|
|
513
|
+
if [ -n "$ERRORS" ]; then
|
|
514
|
+
warn "Errors in module debug:"
|
|
515
|
+
echo "$ERRORS" | sed 's/^/ /'
|
|
516
|
+
fi
|
|
517
|
+
else
|
|
518
|
+
warn "Module debug log empty"
|
|
519
|
+
fi
|
|
520
|
+
|
|
521
|
+
# ===== 18. dsh profile list =====
|
|
522
|
+
step "dsh profile list"
|
|
523
|
+
|
|
524
|
+
PROFILE_LIST=$(dsh profile list 2>&1) || true
|
|
525
|
+
echo "$PROFILE_LIST" | sed 's/^/ /'
|
|
526
|
+
if echo "$PROFILE_LIST" | grep -qi "tui"; then
|
|
527
|
+
ok "Profile 'tui' in profile list"
|
|
528
|
+
else
|
|
529
|
+
warn "Profile 'tui' not in profile list"
|
|
530
|
+
fi
|
|
531
|
+
|
|
532
|
+
# ===== 19. dsh plugin list =====
|
|
533
|
+
step "dsh plugin --profile tui list"
|
|
534
|
+
|
|
535
|
+
PLUGIN_LIST=$(dsh plugin --profile tui list 2>&1) || true
|
|
536
|
+
echo "$PLUGIN_LIST" | sed 's/^/ /'
|
|
537
|
+
if echo "$PLUGIN_LIST" | grep -qi "dsh-tui-pi\|tui-pi\|@aiwayds"; then
|
|
538
|
+
ok "dsh-tui-pi in plugin list"
|
|
539
|
+
else
|
|
540
|
+
fail "dsh-tui-pi NOT in plugin list"
|
|
541
|
+
fi
|
|
542
|
+
|
|
543
|
+
# ===== 20. Full plugin node_modules listing =====
|
|
544
|
+
step "Full node_modules listing for @deepseek-ai and @earendil-works"
|
|
545
|
+
|
|
546
|
+
if [ -n "$TUI_PKG_DIR" ]; then
|
|
547
|
+
info "@deepseek-ai in plugin node_modules:"
|
|
548
|
+
ls -la "$TUI_PKG_DIR/node_modules/@deepseek-ai/" 2>&1 | sed 's/^/ /' || info " (not found)"
|
|
549
|
+
|
|
550
|
+
info "@earendil-works in plugin node_modules:"
|
|
551
|
+
ls -la "$TUI_PKG_DIR/node_modules/@earendil-works/" 2>&1 | sed 's/^/ /' || info " (not found)"
|
|
552
|
+
fi
|
|
553
|
+
|
|
554
|
+
# Also check the profile-level node_modules
|
|
555
|
+
info "@deepseek-ai in profile node_modules:"
|
|
556
|
+
ls -la "$PROFILE_DIR/node_modules/@deepseek-ai/" 2>&1 | sed 's/^/ /' || info " (not found)"
|
|
557
|
+
|
|
558
|
+
# ===== 21. strace-lite: check if process opens any files =====
|
|
559
|
+
step "Process activity trace (strace-lite via /proc)"
|
|
560
|
+
|
|
561
|
+
# On Ubuntu, we can check /proc for the dsh process
|
|
562
|
+
timeout 3 bash -c '
|
|
563
|
+
dsh --profile tui </dev/null &
|
|
564
|
+
PID=$!
|
|
565
|
+
sleep 1
|
|
566
|
+
if [ -d "/proc/$PID" ]; then
|
|
567
|
+
echo " [INFO] dsh process alive as PID $PID"
|
|
568
|
+
echo " [INFO] Open file descriptors:"
|
|
569
|
+
ls -la /proc/$PID/fd 2>/dev/null | tail -20 | sed "s/^/ /"
|
|
570
|
+
echo " [INFO] Memory maps (node modules loaded):"
|
|
571
|
+
grep "node_modules\|pi-tui\|dsh-tui" /proc/$PID/maps 2>/dev/null | head -10 | sed "s/^/ /"
|
|
572
|
+
else
|
|
573
|
+
echo " [INFO] dsh process already exited"
|
|
574
|
+
fi
|
|
575
|
+
wait $PID 2>/dev/null || true
|
|
576
|
+
' 2>&1 || true
|
|
577
|
+
|
|
578
|
+
# ===== Summary =====
|
|
579
|
+
banner "DIAGNOSTIC SUMMARY"
|
|
580
|
+
echo ""
|
|
581
|
+
printf " PASS: %d\n" "$PASS"
|
|
582
|
+
printf " FAIL: %d\n" "$FAIL"
|
|
583
|
+
printf " WARN: %d\n" "$WARN"
|
|
584
|
+
echo ""
|
|
585
|
+
|
|
586
|
+
if [ "$FAIL" -gt 0 ]; then
|
|
587
|
+
echo " ISSUES DETECTED — review [FAIL] items above."
|
|
588
|
+
echo ""
|
|
589
|
+
echo " Common root causes for blank TUI in containers:"
|
|
590
|
+
echo " 1. @deepseek-ai/cordis not resolvable from plugin (closure broken)"
|
|
591
|
+
echo " 2. Plugin not registered in profile bundles (cordis.patch.yml missing)"
|
|
592
|
+
echo " 3. No TTY — pi-tui TuiAltScreen requires a real terminal"
|
|
593
|
+
echo " (podman run -i without -t gives stdin but no PTY)"
|
|
594
|
+
echo " 4. Missing .credentials.yaml — TUI may block waiting for /login"
|
|
595
|
+
echo " 5. pi-tui process.platform check fails silently on unexpected env"
|
|
596
|
+
echo ""
|
|
597
|
+
echo " NOTE: pi-tui native bindings (darwin-modifiers, win32-console-mode)"
|
|
598
|
+
echo " are NOT needed on Linux — native-modifiers.js returns undefined"
|
|
599
|
+
echo " gracefully for platform !== 'darwin'/'win32'. This is NOT the cause."
|
|
600
|
+
else
|
|
601
|
+
echo " All checks passed."
|
|
602
|
+
echo " Blank TUI is likely a rendering issue (no PTY or terminal detection)."
|
|
603
|
+
fi
|
|
604
|
+
|
|
605
|
+
echo ""
|
|
606
|
+
echo " Diagnostic logs:"
|
|
607
|
+
echo " /tmp/dsh-tui-script.log (script PTY capture)"
|
|
608
|
+
echo " /tmp/dsh-tui-pipe.log (direct pipe capture)"
|
|
609
|
+
echo " /tmp/dsh-stderr.log (stderr)"
|
|
610
|
+
echo " /tmp/dsh-module-debug.log (NODE_DEBUG=module)"
|
|
611
|
+
echo " /tmp/dsh-exit-test.log (exit behavior)"
|
|
612
|
+
echo ""
|
package/pnpm-workspace.yaml
DELETED