The parallel streaming walker accumulated match_count toward the
first-page stop budget, but match_count can exceed the matches actually
returned (collected) by one whenever a file overflows its per-file cap.
With the production config (max_count=2000, max_count_per_file=21) that
over-count could quit the walk a few percent short of the requested
page. Budget on collected instead, matching run_sequential_grep and
aggregate_parallel_results.
Carried the streaming-grep match budget into the parallel visitor via a shared atomic counter so production callers (`maxCount: INTERNAL_TOTAL_CAP`) early-stop the walker instead of scanning the rest of the tree. Kept the sequential ordered path for small budgets where strict path ordering matters; the parallel path tolerates up to one extra file per worker in the tail, far better than walking the entire tree.\n\nFixes #2738
Merged main into the PR branch and preserved the ordered small-budget grep cutoff on top of main's searched-file accounting and active-streaming worker fallback.\n\nFixes #2738
Limited the ordered streaming grep early-stop path to small first-page budgets so broad content searches keep the parallel walker. Added coverage that large budgets do not take the serial early-stop route.\n\nFixes #2738
The pi-natives test module had 8 warnings on Windows. Root cause: test
helpers (TempDirGuard, write_file, make_fifo, base_grep_config) and their
imports are only used by #[cfg(unix)] tests, so they appear as dead code
when compiled on Windows where those tests are excluded.
Fix: gate all unix-only test helpers, their imports, and the super::
imports they reference (classify_file_type, GrepConfig, GrepOutputMode,
grep_sync, crate::task, mpsc) with #[cfg(unix)] so they are excluded
from Windows compilation entirely. On Linux (CI), all helpers compile
and are used by the unix test suite.
Also removed genuinely unused import: Duration (from grep.rs test module
only — Duration in shell.rs is used by a non-cfg-gated test).
Verified: 0 warnings, 105 tests pass on Windows. Unix tests retain all
their helpers and imports.
Gate platform-specific XDG functions (APP_NAME, xdg_state_logs,
default_agent_dir) and their tests with #[cfg(any(target_os = "linux",
target_os = "macos"))] so they are not flagged as dead code on Windows.
Suppress the false-positive missing_const_for_fn lint on Process::group_id
(#[napi] generates a non-const wrapper).
These 4 clippy warnings broke bun check (check:rs) and the CI
native_linux_x64 baseline job on every PR.
- Updated various truncation and overflow messages across `pi-shell` and `coding-agent` to use the consistent `[...N units elided...]` format.
- Improved clarity of elided output by explicitly stating the count and type of omitted information.
- Standardized elision markers across all tool outputs and filters to use cohesive `[...N [type] elided...]`, `[...Nln elided...]`, and `[...xB elided...]` syntax.
- Updated documentation, prompts, and test expectations to reflect the unified elision format.
- Improved transcript viewer robustness by preventing content aliasing through path-inclusive signature hashing.
- Added logic to clear stale transcript content when associated session files are deleted, accompanied by verifying test cases.
- Updated line wrapping in module documentation and test blocks for consistent style.
- Adjusted variable assignment formatting in the segmented chain test to improve readability.
- Validated every stage of a pipeline against `simple_command_is_safe` instead of only the first stage to prevent improper segmentation of compound shell constructs.
- Guarded segment re-execution by verifying that each `Display`-reconstructed command parses back to the expected pipeline shape.
- Configured segmented-chain execution to fall back to an unsegmented, whole-command path whenever a reconstructed segment diverges from the original AST.
- Resolved a syntax error during command execution by preventing `Display` from stripping terminators from compound commands like `while` and `for` loops.
- Removed the `cache` option from `GrepOptions` and eliminated the internal directory cache path.
- Implemented `run_sequential_grep` as a single-threaded fallback when too many concurrent streaming searches are active.
- Restricted concurrent grep workers under heavy resource contention using a global `ACTIVE_STREAMING_GREPS` atomic counter.
- Cleaned up obsolete benchmark scenarios, typescript type definitions, and reference tests for cached grep searches.
- Removed the `cache` option from `GrepOptions` and internal caching mechanisms in `grep_sync`.
- Implemented file tracking during search using an `AtomicU64` counter.
- Integrated the counter into parallel visitor structures to increment with each visited file.
- Updated the streaming grep function signature to return the cumulative count of searched files.
- Expanded the native test suite to verify accurate file counts and edge cases like empty search directories.
- Added a JavaScript unit test to validate that advise tool calls are summarized correctly by their note argument.
- Added a `files_searched` atomic counter to `run_parallel_search` to track the total number of files processed.
- Increments the search counter during parallel execution immediately after a file is successfully read.
- Short-circuits and filters out file search results that yield zero matches.
- Configured searcher line numbers based on whether the output mode is set to content.
- Updated `build_searcher` and `build_searcher_for_params` to accept and set the line number flag.
- Changed `select_folded_spans` to skip an unfold candidate that exceeded `unfold_limit` and continue processing the remaining BFS queue instead of breaking.
- Added a regression test in `summary.rs` proving a large `<style>` raw-text span no longer starves sibling HTML sections from unfolding.
- Updated the summary unfold-ceiling setting description to document that overflowed candidates stay folded while BFS continues.
Add the tree-sitter-elisp grammar plus language wiring, highlight mapping, and .emacs/.el detection. Native side verified via cargo (pi-ast elisp tests + pi-natives alias test).
Moved the streaming max-count shortcut onto the ordered walker so early exits preserve path-order first-page results. Counted emitted matches rather than raw per-file match totals for the stop budget.\n\nFixes #2738
Stopped streaming directory grep once content searches have collected the requested first page of matches instead of continuing to walk large trees until the timeout trips. Added native coverage for the streaming budget cutoff.\n\nFixes #2738
Register tree-sitter-elisp in the shared AST language registry so
.el files infer the emacs-lisp grammar across blockRangeAt,
summarizeCode, astGrep/astEdit, and native aliases.
This fixes edit-tool block operations on top-level Emacs Lisp forms
instead of returning unsupported-language block errors.
- Add canonical emacs-lisp aliases and .el extension inference.
- Teach summaries to fold Lisp forms without grouping arbitrary lists.
- Map .el rendering and highlighting aliases through coding-agent/native.
- Cover defun, ERT, use-package, with-eval-after-load, pcase,
summary, astMatch, astEdit, and edit-tool insertion paths.
- Document the language and update package changelogs.