Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions test/deepagents-code-tui-startup-check.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ describe("Deep Agents Code TUI startup check helpers", () => {
"ensure_expect_available() { return 0; }",
"run_tui_expect() {",
' printf "What would you like to do next?\\nNEMOCLAW_TUI_READY\\nNEMOCLAW_TUI_EXIT_CAPTURED:130\\n" >>"$2"',
" return 0",
"}",
"main",
].join("\n"),
Expand All @@ -158,6 +159,56 @@ describe("Deep Agents Code TUI startup check helpers", () => {
}
});

it("preserves a failed expect status and emits only the sanitized capture excerpt", () => {
const captureDir = fs.mkdtempSync(path.join(os.tmpdir(), "nemoclaw-dcode-tui-failure-"));

try {
const result = runTuiStartupCheckHelperResult(
[
"sandbox_exec() { printf 'NEMOCLAW_DCODE_PROBE:deepagents\\n'; }",
"ensure_expect_available() { return 0; }",
"run_tui_expect() {",
' printf "NEMOCLAW_TUI_EOF_BEFORE_READY\\n" >>"$2"',
" return 21",
"}",
"main",
].join("\n"),
{ DEEPAGENTS_TUI_CAPTURE_DIR: captureDir },
);

expect(result.status).toBe(1);
expect(result.stderr).toContain("finite expect harness exited 21");
expect(result.stderr).toContain("sanitized capture excerpt (last 20000 bytes)");
expect(result.stderr).toContain("NEMOCLAW_TUI_EOF_BEFORE_READY");
} finally {
fs.rmSync(captureDir, { force: true, recursive: true });
}
});

it("suppresses the capture excerpt when secret-shaped data remains", () => {
const captureDir = fs.mkdtempSync(path.join(os.tmpdir(), "nemoclaw-dcode-tui-secret-"));
const capture = path.join(captureDir, "sanitized.log");
const secret = `sk-${"A".repeat(20)}`;

try {
fs.writeFileSync(capture, `diagnostic body\n${secret}\n`);
const result = runTuiStartupCheckHelperResult('print_sanitized_capture_excerpt "$CAPTURE"', {
CAPTURE: capture,
});

expect(result.status).toBe(0);
expect(result.stdout).toContain(
"sanitized TUI capture omitted because secret-shaped data remains",
);
expect(result.stdout).not.toContain(secret);
expect(result.stderr).not.toContain(secret);
expect(result.stderr).not.toContain("sanitized capture excerpt");
expect(result.stderr).not.toContain("diagnostic body");
} finally {
fs.rmSync(captureDir, { force: true, recursive: true });
}
});

it("detects and redacts every canonical secret family in TUI startup artifacts", () => {
const detectsSecret = (token: string) =>
runTuiStartupCheckHelper(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,22 @@ expect {
EXPECT
}

print_sanitized_capture_excerpt() {
local plain_capture_file="$1"
if [ ! -r "$plain_capture_file" ]; then
info "sanitized TUI capture unavailable for diagnostics"
return
fi
if contains_secret <"$plain_capture_file"; then
info "sanitized TUI capture omitted because secret-shaped data remains"
return
fi

printf '%s\n' "${PREFIX}: sanitized capture excerpt (last 20000 bytes):" >&2
tail -c 20000 -- "$plain_capture_file" >&2
printf '\n%s\n' "${PREFIX}: end sanitized capture excerpt" >&2
}

assert_clean_exit_code() {
local plain_capture_file="$1"
local exit_code
Expand Down Expand Up @@ -280,9 +296,9 @@ main() {
info "Running Deep Agents Code TUI startup check in sandbox: $SANDBOX_NAME"
info "Capture directory: $capture_dir"

local expect_rc
set +e
run_tui_expect "$raw_capture_file" "$marker_capture_file" >"$expect_log_file" 2>&1
local expect_rc
expect_rc=$?
set -e

Expand All @@ -304,6 +320,7 @@ main() {
pass "finite expect harness reached startup and observed exit"
else
fail_test "finite expect harness exited ${expect_rc}"
print_sanitized_capture_excerpt "$plain_capture_file"
fi

if grep -q "NEMOCLAW_TUI_READY" "$plain_capture_file" && is_tui_ready_capture <"$plain_capture_file"; then
Expand Down
4 changes: 4 additions & 0 deletions test/langchain-deepagents-code-image.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,10 @@ describe("LangChain Deep Agents Code image contracts", () => {
expect(tuiStartupCheck).toContain(
'cat "$raw_capture_file" "$expect_log_file" "$marker_capture_file"',
);
expect(tuiStartupCheck.indexOf("local expect_rc")).toBeLessThan(
tuiStartupCheck.indexOf('run_tui_expect "$raw_capture_file"'),
);
expect(tuiStartupCheck).toContain('print_sanitized_capture_excerpt "$plain_capture_file"');
expect(tuiStartupCheck).toContain("DEEPAGENTS_TUI_TIMEOUT must be a positive integer");
expect(tuiStartupCheck).toContain("strip_terminal_control_sequences");
expect(tuiStartupCheck).toContain("is_tui_ready_capture");
Expand Down
Loading