Repository navigation
fix: post-merge edge cases in stream retry, serve behind a proxy, and script artifacts - #407
Merged
Merged
Conversation
…'s verb
Two renderer bugs measured with GPT-5.5 under Code Execution.
The artifact panel never offered a file a script wrote when the command or
path sat in a variable (`const cmd = "printf ... > /p/notes.md";
shell({ command: cmd })`). The source scan looked a name up only inside a
`${...}` template, never as the argument itself.
- fileArtifactPathsFromToolCall takes the tool result. For execute_code it
now reads the result meta's `biorouter/tool-calls` records, which carry
the arguments each call really ran with; only calls recorded `ok` count.
A record cut at the backend's 2 KB cap is read from its complete leading
fields, and a cut that hides a field a rule needs marks the answer
incomplete. The source scan stays as the fallback for results without
records, and fills in (minus paths of failed calls) when the records are
incomplete or some calls went unrecorded.
- The source scan reads call objects by their top-level properties (string
and comment aware, shorthand and quoted keys), resolves a value that is
one string literal or a name bound to one, and leaves out names bound or
assigned twice and literals followed by more expression (`"/w/" + name`
used to yield "/w/"). str_replace_editor gets the same command gate as
text_editor.
- File-link provenance now trusts a script's `ok` write records, never its
source, so an unexecuted branch still promotes nothing.
Script rows read "Ran run ls -la", "Failed to run write the requested
markdown file": summarizeToolGraph put "Running" in front of a step the
model wrote as an imperative. The step's own opening verb now becomes the
gerund toolRowLabel conjugates ("Running ls -la", "Ran ls -la", "Failed to
write the requested markdown file"); a step that opens with no known verb
stands in sentence case and fails as "Failed: Attempt the command", the
existing non-verb form. A step named only by its tool still runs that tool.
Found by the live tests after #403, #404 and #405 merged. Stream retry (#403/#405): - A tool call written as text and cut by a retryable error was shown and saved as a reply, and the retry was told to continue it. The local providers' text recovery now marks text it releases only because of an error; the reply loop drops it when the error will be retried (MistakeTracker::would_retry) and shows it otherwise. - A whitespace-only partial reply counted as a partial reply. - The <info-msg> block was dropped from every request after a stored reply ending in whitespace: inject_moim no longer treats the trailing-whitespace and empty-message cleanups as its own fault. - The mid-task note read "Server does.. No tool ran". - The compute-error notice no longer asks the person to try again right before Biorouter does. Serve behind a proxy (#404): - Every session and app cookie value is read, so a stale cookie at a longer path no longer shadows a fresh token. - Cookies set at an https address are marked Secure; plain http never. - A valid token redeemed outside the declared --public-url path says which address to use instead of "needs its access token". - The shell links its icon relative to <base>, so /favicon.ico is no longer requested outside the prefix. - The browser's marketplace fetches the live registry (no referrer, no credentials) instead of requesting <mount>/undefined. - A daemon with no token configured no longer copies ?t= into Set-Cookie. - browser-access.md covers the app "No Biorouter backend" banner behind an https,http chain (fix: --public-url).
Broccolito
added a commit
that referenced
this pull request
Oct 18, 2026
…he site updated for #399-#407 Models and providers gains "Choose a computer for local models": what has to fit in the memory the GPU can use, a memory table (under 32 GB, 32, 48, 64 to 128 GB), why an Intel Mac or a computer without a fast GPU is slow whatever its memory, disk space per model, and what to do when the first reply times out. Every figure is taken from the Llama Server catalog, its context-window tiers and the timeout defaults. The Local paragraph points to it instead of repeating the memory figures. The rest follows this cycle's merges: - Command line: serve behind an HTTPS reverse proxy, with --public-url for an address under a path prefix, and the browser's marketplace row. - Crew: open workspaces by default (and older ones staying managed), setup giving agents "As me on the server" with --agent-access for less, @agent in the message box, deleting a workspace, and which models server access needs. - The desktop app: the Crew tasks model setting.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes for the edge cases the live post-merge tests found after #403, #404, #405 and #406 landed, plus two desktop renderer bugs from the same sweep.
Stream retry (#403/#405)
{"name": "developer__shell", "arguments": {"comm) was shown, saved as a reply, and the retry was told to continue it.MistakeTracker::would_retry, the same decisionobserve_provider_errormakes) and shows it otherwise.<info-msg>block dropped out of later requests. It went missing from every request after a stored reply that ended in whitespace, becauseinject_moimread the normal trailing-whitespace and empty-message cleanups as its own fault.biorouter servebehind a proxy (#404)--public-urlrefused every new link.Secure. They never are on plain http, loopback included.--public-urlpath now gets a page naming the right address, not "This link needs its access token".<base>, so/favicon.icois no longer requested outside the prefix.<mount>/undefined.?t=intoSet-Cookie, where a;could add attributes and a CR/LF caused a 500.browser-access.mdcovers the "No Biorouter backend" app banner behind anhttps,httpproxy chain; the fix is--public-url.Desktop renderer
okcall records first and falls back to the source scan.Test plan
cargo test -p biorouter --lib -- providers:: agents::: 2873 passed.cargo test -p biorouter --test output_recovery_agent_loop: 14 passed.soft_interrupt_agent_loop,turn_abort_tests,subagent_delegation,steer_always_lands.cargo test -p biorouter-server --lib: 1011 passed, plus the new tokenless-cookie test.cargo test -p biorouter-cli --test serve_lifecycle: 9 passed.npx vitest run: 14742 passed.npm run lint:check,npm run format:check,check-no-goose-block.shandcheck-crew-manual.mjspass.🤖 Generated with Claude Code