fix(tui): count conversation separators for pruning
CI / load-versions (pull_request) Successful in 16s
CI / push-validation (pull_request) Successful in 24s
CI / lint (pull_request) Successful in 50s
CI / quality (pull_request) Successful in 57s
CI / typecheck (pull_request) Successful in 1m3s
CI / security (pull_request) Successful in 1m4s
CI / build (pull_request) Successful in 43s
CI / helm (pull_request) Successful in 40s
CI / unit_tests (pull_request) Successful in 7m7s
CI / docker (pull_request) Successful in 2m11s
CI / integration_tests (pull_request) Successful in 11m38s
CI / coverage (pull_request) Successful in 10m18s
CI / status-check (pull_request) Successful in 3s
CI / load-versions (pull_request) Successful in 16s
CI / push-validation (pull_request) Successful in 24s
CI / lint (pull_request) Successful in 50s
CI / quality (pull_request) Successful in 57s
CI / typecheck (pull_request) Successful in 1m3s
CI / security (pull_request) Successful in 1m4s
CI / build (pull_request) Successful in 43s
CI / helm (pull_request) Successful in 40s
CI / unit_tests (pull_request) Successful in 7m7s
CI / docker (pull_request) Successful in 2m11s
CI / integration_tests (pull_request) Successful in 11m38s
CI / coverage (pull_request) Successful in 10m18s
CI / status-check (pull_request) Successful in 3s
This commit is contained in:
@@ -40,6 +40,13 @@ def _multiline_block(n_lines: int, label: str = "line") -> str:
|
||||
return "\n".join(f"{label} {i}" for i in range(n_lines))
|
||||
|
||||
|
||||
def _rendered_line_count(stream: ConversationStream) -> int:
|
||||
rendered = stream.render()
|
||||
if not rendered:
|
||||
return 0
|
||||
return rendered.count("\n") + 1
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Subcommands
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -48,9 +55,9 @@ def _multiline_block(n_lines: int, label: str = "line") -> str:
|
||||
def cmd_prune_trigger() -> None:
|
||||
"""Verify pruning fires and total_lines returns to <= prune_low_mark."""
|
||||
stream = _make_stream(prune_low_mark=100, prune_excess=50)
|
||||
# trigger_line_count = 150; push 210 lines to trigger pruning twice,
|
||||
# trigger_line_count = 150; push enough rendered lines to trigger pruning twice,
|
||||
# ensuring total_lines ends at prune_low_mark or below.
|
||||
for i in range(21):
|
||||
for i in range(24):
|
||||
stream.add_block(_multiline_block(10, f"msg{i}"), block_type="message")
|
||||
|
||||
assert stream.total_lines <= 100, (
|
||||
@@ -59,6 +66,33 @@ def cmd_prune_trigger() -> None:
|
||||
print("tui-prune-trigger-ok")
|
||||
|
||||
|
||||
def cmd_separator_aware_prune() -> None:
|
||||
"""Verify rendered inter-block separators count toward pruning thresholds."""
|
||||
stream = _make_stream(
|
||||
prune_low_mark=100,
|
||||
prune_excess=50,
|
||||
preserve_recent_lines=0,
|
||||
)
|
||||
|
||||
for i in range(100):
|
||||
stream.add_block(f"one-line-{i}", block_type="message")
|
||||
|
||||
rendered = stream.render()
|
||||
assert stream.total_lines == _rendered_line_count(stream), (
|
||||
"Expected total_lines to match rendered line count, "
|
||||
f"got total_lines={stream.total_lines}, rendered={_rendered_line_count(stream)}"
|
||||
)
|
||||
assert stream.total_lines <= 150, (
|
||||
"Expected rendered lines to stay within trigger threshold, "
|
||||
f"got {stream.total_lines}"
|
||||
)
|
||||
assert "one-line-0" not in rendered, "Expected oldest one-line block to be pruned"
|
||||
assert any(block.block_type == "note" for block in stream.blocks), (
|
||||
"Expected pruning note after separator-aware pruning"
|
||||
)
|
||||
print("tui-separator-aware-prune-ok")
|
||||
|
||||
|
||||
def cmd_prune_note_inserted() -> None:
|
||||
"""Verify a note block is at index 0 with the expected text after pruning."""
|
||||
stream = _make_stream(prune_low_mark=100, prune_excess=50)
|
||||
@@ -140,6 +174,7 @@ def cmd_settings_defaults() -> None:
|
||||
|
||||
COMMANDS = {
|
||||
"prune-trigger": cmd_prune_trigger,
|
||||
"separator-aware-prune": cmd_separator_aware_prune,
|
||||
"prune-note-inserted": cmd_prune_note_inserted,
|
||||
"prune-protected": cmd_prune_protected,
|
||||
"clear-resets-state": cmd_clear_resets_state,
|
||||
|
||||
@@ -27,6 +27,17 @@ ConversationStream Prunes Oldest Blocks When Threshold Exceeded
|
||||
Should Be Equal As Integers ${result.rc} 0
|
||||
Should Contain ${result.stdout} tui-prune-trigger-ok
|
||||
|
||||
ConversationStream Counts Rendered Separators When Pruning
|
||||
[Documentation] Verify many one-line blocks prune based on rendered blank
|
||||
... separators, not only block-local line counts.
|
||||
[Tags] tui_conversation_pruning tdd_issue tdd_issue_6350
|
||||
${result}= Run Process ${PYTHON} ${HELPER} separator-aware-prune
|
||||
... cwd=${WORKSPACE}
|
||||
Log ${result.stdout}
|
||||
Log ${result.stderr}
|
||||
Should Be Equal As Integers ${result.rc} 0
|
||||
Should Contain ${result.stdout} tui-separator-aware-prune-ok
|
||||
|
||||
ConversationStream Inserts Note Block After Pruning
|
||||
[Documentation] Verify a pruned-note block is inserted at index 0 after pruning.
|
||||
[Tags] tui_conversation_pruning tdd_issue tdd_issue_6350
|
||||
|
||||
Reference in New Issue
Block a user