Просмотр исходного кода

fix(examples): restore the tui-demo pre-boot TTY refusal and stabilize the PTY smoke

The built-bin fail-loud test needs the TTY refusal before Loader boot (a
compose-time throw is logged per-entry, not rethrown); the PTY driver drops
COLORTERM so a developer's truecolor shell cannot flip the banner to the
gradient path mid-assertion; the scripted fixture persists raw JSONL so the
smoke's system-prompt inspection can read the log.
Turtle 2 месяцев назад
Родитель
Сommit
cf95986d5b

+ 3 - 0
examples/tui-agent/tests/fixtures/tui-scripted.cordis.yml

@@ -21,6 +21,9 @@
     provider: tui-scripted
     model: tui-scripted-model
     persistenceRoot: './.sessions'
+    # The smoke's log inspection reads plain `.jsonl`; keep the scripted
+    # fixture uncompressed like the other snapshot-facing configs.
+    persistenceCompression: none
     workspaceContext:
       maxBytes: 65536
     welcome: 'scripted TUI ready.'

+ 4 - 0
examples/tui-agent/tests/tui-keyless-smoke.e2e.ts

@@ -22,6 +22,10 @@ env.update({
     "COLUMNS": "100",
     "LINES": "30",
 })
+# Deterministic banner: a developer shell's COLORTERM=truecolor would switch the
+# banner to the per-letter gradient (one SGR per letter), breaking the literal
+# DEEPSEEK assertions. The gradient path has its own unit and snapshot coverage.
+env.pop("COLORTERM", None)
 if resume_session_id:
     env["RESUME_SESSION_ID"] = resume_session_id
 pid, fd = pty.fork()

+ 10 - 2
packages/examples/tui-demo/src/bin.ts

@@ -11,8 +11,16 @@ import { boot, installFailLoud, loadEnv, resolveConfigPath } from '@deepseek-ai/
 const NAME = 'dsh-tui-demo'
 
 /* v8 ignore start -- thin self-executing composition over the unit-tested
-   dsh-app-boot helpers; exercised end-to-end by the keyless Loader-path and
-   built-bin smokes */
+   dsh-app-boot helpers; exercised end-to-end by the tui-agent PTY smoke and
+   the built-bin fail-loud smoke */
+// Refuse pipes BEFORE booting: a compose-time throw inside the Loader tree is
+// logged per-entry rather than rethrown, so a piped launch would otherwise
+// settle into an idle UI-less process instead of exiting nonzero.
+if (!process.stdin.isTTY || !process.stdout.isTTY) {
+  process.stderr.write(`${NAME}: the TUI requires stdin and stdout to be interactive TTYs; `
+    + 'use the one-shot dsh-cli-demo bin for pipes and automation\n')
+  process.exit(1)
+}
 installFailLoud(NAME)
 loadEnv(NAME)
 await boot(NAME, resolveConfigPath(process.argv[2] ?? './cordis.yml', undefined))