From 2486eeda47098dd758106bc66d0d487d5a850c58 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 25 Sep 2026 04:52:28 +0000 Subject: [PATCH] chore: sync public mirror from internal --- .repository-projection.json | 6 ++-- packages/local-host-rs/src/semantic_text.rs | 31 +++++++++++++++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/.repository-projection.json b/.repository-projection.json index 5d38bc6ad..82356407f 100644 --- a/.repository-projection.json +++ b/.repository-projection.json @@ -3,11 +3,11 @@ "projection": "deixic-code", "projectionSchemaVersion": 1, "sourceRepository": "dx-corp/mono", - "sourceSha": "29f82f72c4a2fb5964d303282bb74638f134ec0c", + "sourceSha": "02645b8e43be7823667784ae0a93054b5ca00649", "destinationRepository": "dx-corp/code", - "priorProjectedBase": "2d1fe9cde03a021bb4d22539ab9440f2ab5ef30b", + "priorProjectedBase": "c65262972f2e38983206eb9e00f6e43868e6d12c", "definitionDigest": "82936441c776e3e8edb5d215a75007ec9714a233f489d460075d79d5ef5ba32f", "toolDigest": "89cbdbe1d79917bad52655817aab0eb545b89183915380eaedc3217f014e6715", - "contentDigest": "cd4484854c325b7a6c6766c9755e49588a1810aa5fa395ed0c05323deb2c7314", + "contentDigest": "5c2d1b66ab844ec7b443e56334c005ef4719e4c3447c0775c46f9ef42d1efb67", "publicationEligible": true } diff --git a/packages/local-host-rs/src/semantic_text.rs b/packages/local-host-rs/src/semantic_text.rs index 204661279..b572a3d30 100644 --- a/packages/local-host-rs/src/semantic_text.rs +++ b/packages/local-host-rs/src/semantic_text.rs @@ -83,7 +83,9 @@ impl SemanticTextRelease { let mut releases = Vec::new(); for ch in delta.chars() { if self.pending.len() + ch.len_utf8() > self.max_bytes { - self.release(now_ms, Some(FlushReason::SizeLimit), &mut releases); + let forced = (!self.line_non_title || self.following != Following::None) + .then_some(FlushReason::SizeLimit); + self.release(now_ms, forced, &mut releases); self.line.clear(); self.line_non_title = true; } @@ -108,18 +110,20 @@ impl SemanticTextRelease { && !could_be_title(&self.line) { // Ordinary prose need not wait for a line or a transport timer. - self.release(now_ms, None, &mut releases); self.line.clear(); self.line_non_title = true; - } else if self.line_non_title && self.following == Following::None { - self.release(now_ms, None, &mut releases); } if self.pending.len() >= self.max_bytes { - self.release(now_ms, Some(FlushReason::SizeLimit), &mut releases); + let forced = (!self.line_non_title || self.following != Following::None) + .then_some(FlushReason::SizeLimit); + self.release(now_ms, forced, &mut releases); self.line.clear(); self.line_non_title = true; } } + if self.line_non_title && self.following == Following::None { + self.release(now_ms, None, &mut releases); + } if self .held_since_ms .is_some_and(|start| now_ms.saturating_sub(start) >= self.max_hold_ms) @@ -514,4 +518,21 @@ mod tests { policy.peak_held_bytes() ); } + + #[test] + fn large_prose_delta_releases_promptly_without_a_forced_flush() { + let input = "ordinary assistant prose. ".repeat(1_000); + let mut policy = SemanticTextRelease::default(); + let releases = policy.push(&input, 42); + assert_eq!( + releases + .iter() + .map(|release| release.text.as_str()) + .collect::(), + input + ); + assert!(releases.iter().all(|release| release.forced.is_none())); + assert!(releases.iter().all(|release| release.text.len() <= 4_096)); + assert_eq!(policy.held_bytes(), 0); + } }