| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
P0 (data corruption / dead-on-install / documented-usage traps):
- edit_file: replace via a function so $$/$&/$' in new_string are
written literally instead of corrupting the file
- CLI: realpath argv[1] before comparing to import.meta.url — npm bin
symlinks made the installed command silently do nothing
- Agent.chat: finally-backfill tool replies when a consumer abandons
the generator (for-await break poisoned the history permanently)
- SSE body phase: abort now cancels the reader (unblocks reads and
closes the connection) and each read races an idle timer, so a
stalled stream errors instead of hanging the turn forever
P1 (hangs / silently wrong):
- bash kill: SIGTERM now escalates to SIGKILL after a 5s grace, so a
TERM-trapping child can't wedge the REPL; timer cleared on exit
- tools: makeAllTools() factory — a second Agent no longer re-points
the first Agent's shared SubAgentTool at itself
- context: compression LLM calls take the turn's AbortSignal
- llm: tool-call arguments parsing coerces null/array/scalar to {}
- context: layer-0 truncation for a single message that alone exceeds
the window (was an unrecoverable 413 loop)
- glob: strip leading ./ and support [ch]/[!x] character classes
(both silently matched nothing)
- cwd: tracked cwd moved to paths.ts so every tool resolves relative
paths against it, and cd parsing follows ;/|| chains too
Adds 11 regression tests (54 total pass).
- Revert the cross-tool cwd unification and ;/|| parsing (magic state, out of min's scope — the split-brain stays a documented limitation) - Replace silent oversized-message truncation with an up-front refusal in Agent.chat (the truncation math ignored the fixed overhead and silently altered user input; refusing is honest and simpler) - Kill sequence now starts at most once (a second trigger orphaned the first SIGKILL escalation timer, which settle() could never clear) - rounds() closes the inner LLM generator in a finally, so abandoning a turn during text streaming cancels the SSE reader and releases the connection (hand-driven .next() gets no auto-close from yield*) - isDirectRun's catch falls back to a plain compare instead of silently refusing to start - Keep the [ch]/[!x] character classes: verified native in Python pathlib.glob — this is port parity, not added syntax Tests: drop the cwd case, add oversized-refusal and abandon-during-text-streaming-closes-connection. 54/54 pass.
|
Revised per review. Accepted and fixed: kill-sequence single-shot flag (orphaned escalation timer), inner-generator close in a finally (abandoning during text streaming now cancels the SSE connection — new regression test), oversized input now refused up front instead of silently truncated (the truncation math ignored fixed overhead), realpath catch falls back to a plain compare. Withdrawn from this PR: cross-tool cwd unification and ;/|| parsing (out of min's scope). Kept with evidence: [ch]/[!x] character classes and ./ stripping are native in Python pathlib.glob — port parity, not added syntax. 54/54 tests pass. |
Sorry, something went wrong.
…asses - rounds() awaits stream.return() and sseEvents awaits reader.cancel(): for-await's break waits on the return() chain, so teardown now completes before break returns, and a throwing inner finally surfaces as a handled rejection instead of an unhandled one. The regression test asserts closure immediately after break, no sleep. - Character classes now follow Python fnmatch semantics on the edges: ^ is a literal member (only ! negates), ] right after [ or [! is a literal member, and an invalid range like [z-a] matches nothing instead of throwing. The doc comment states the supported subset explicitly — no claim of a full glob dialect.
|
Round 2 addressed. Blocker: the teardown chain is now fully awaited (rounds() awaits stream.return(), sseEvents awaits reader.cancel()) — the regression test asserts the connection is closed immediately after break returns, with no sleep. Glob classes: took both suggested options at once — minimal fnmatch-semantic fixes (^ literal, []], [!]], [z-a] → matches nothing) plus a doc comment that promises exactly the supported subset and nothing more. 55/55 tests pass. |
Sorry, something went wrong.
…onesty - kill goes straight to SIGKILL on the whole process group: Python's subprocess.run timeout behavior (kill outright), hardened from the direct child to the group. The TERM->timer->KILL machinery is gone. - remove the oversized-input pre-check: it judged user input by an estimate and could refuse legitimate messages; the provider's own context error is the honest answer. - /tokens prints 'unknown' when the provider has never reported usage, instead of dressing unknown up as 0 (usageSeen on LLMClient). - write the token-accounting principle into context.ts, document the no-usage degradation on observe(), compress the sseEvents comments.
|
Final revision per the adjudication: kill is now a straight group SIGKILL (subprocess.run parity, hardened to the group — state machine deleted), the oversized-input pre-check is gone (an estimate must not veto user input), /tokens says unknown instead of 0 when no usage was ever reported (usageSeen), the token-accounting principle is written into context.ts, and the SSE comments are compressed. Net for this round: −55 lines. 55/55 tests pass. |
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
One commit, eleven fixes, each traced to a verified failure during the full-source review. All fixes carry regression tests — 54/54 pass locally (Node 20).
P0 — data corruption / dead on install / documented usage traps
P1 — hangs / silently wrong
Origin split (from the port-fidelity audit): 1/2/4/7/10 are port-introduced, 3 comes with the generator redesign, 5 completes PR #2, 6/9/11 are inherited from the Python original, 8 is shared but the port amplified the blast radius.