fix(shell): replace global static output buffer with per-instance TempDir#7632
fix(shell): replace global static output buffer with per-instance TempDir#7632codefromthecrypt merged 2 commits intomainfrom
Conversation
|
@michaelneale @baxen this is primarily a test deflake thing for me, but I went ahead and made it safer with cleanup |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1d4145e9f9
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
michaelneale
left a comment
There was a problem hiding this comment.
seems ok, if you want to tweak go ahead. yeah panic is ugly in rust (although if can't write to tmp... not in a good state is it!)
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7d815e8f78
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| Ok(Self { | ||
| info, | ||
| shell_tool: Arc::new(ShellTool::new()), | ||
| shell_tool: Arc::new(ShellTool::new()?), |
There was a problem hiding this comment.
Handle ShellTool init failures without process panic
ShellTool::new() is now fallible (tempfile::tempdir()?), but this constructor path is still used from the platform extension registry via DeveloperClient::new(ctx).unwrap() in crates/goose/src/agents/platform_extensions/mod.rs, so an unwritable/invalid temp directory now crashes extension initialization instead of returning a tool error. This turns a recoverable environment issue (e.g., broken TMPDIR, disk/inode exhaustion) into a startup panic for the developer extension.
Useful? React with 👍 / 👎.
…pDir Shell output truncation used a global static Mutex<HashMap> to cache temp file paths. This was racy under concurrent tool calls dispatched via stream::select_all in agent.rs, and leaked files via NamedTempFile::keep(). ShellTool now owns a TempDir and an AtomicUsize call index. Concurrent calls round-robin through a fixed number of file slots (fetch_add % OUTPUT_SLOTS, same pattern as elastic/elasticsearch-rs RoundRobin). Files are bounded and cleaned up when the tool drops. Signed-off-by: Adrian Cole <[email protected]>
Signed-off-by: Adrian Cole <[email protected]>
7d815e8 to
131d631
Compare
…pDir (block#7632) Signed-off-by: Adrian Cole <[email protected]>
* origin/main: fix(shell): replace global static output buffer with per-instance TempDir (#7632) opt: remove timestamped config file backup (#7618) chore(deps): bump @hono/node-server from 1.19.9 to 1.19.10 in /ui/desktop (#7662) chore(deps): bump hono from 4.12.3 to 4.12.5 in /evals/open-model-gym/mcp-harness (#7661) chore(deps): bump hono from 4.12.2 to 4.12.5 in /ui/desktop (#7660) fix: resolve parameters in initial message with autosubmit (#7659) fix: this should not be blocked (#7656) Relax the assertion for the model list ACP test (#7653) fix: add analyzer extension in recipe to maintain backwards compatibility (#7652) docs: add GOOSE_INPUT_LIMIT environment variable documentation (#7299)
* origin/main: (29 commits) Update to rmcp 1.1.0 (#7619) Fix max turns configuration (#7612) feat: add base path field to custom provider configuration (#7614) fix: compare extension configs before skipping add_extension (#7650) chore(release): release version 1.27.0 (minor) (#7611) feat: better private channel detection, bot version debugging (#7680) chore(deps): bump svgo from 3.3.2 to 3.3.3 in /documentation (#7667) fix: only add viewable channels to bot context (#7678) chore: added a recipe to help identify high risk change prs for testing (#7651) fix: make sure platform binary exists (#7676) fix(shell): replace global static output buffer with per-instance TempDir (#7632) opt: remove timestamped config file backup (#7618) chore(deps): bump @hono/node-server from 1.19.9 to 1.19.10 in /ui/desktop (#7662) chore(deps): bump hono from 4.12.3 to 4.12.5 in /evals/open-model-gym/mcp-harness (#7661) chore(deps): bump hono from 4.12.2 to 4.12.5 in /ui/desktop (#7660) fix: resolve parameters in initial message with autosubmit (#7659) fix: this should not be blocked (#7656) Relax the assertion for the model list ACP test (#7653) fix: add analyzer extension in recipe to maintain backwards compatibility (#7652) docs: add GOOSE_INPUT_LIMIT environment variable documentation (#7299) ...
* origin/main: (40 commits) fix: make TLS configurable in goosed agent via GOOSE_TLS env var (#7686) Update to rmcp 1.1.0 (#7619) Fix max turns configuration (#7612) feat: add base path field to custom provider configuration (#7614) fix: compare extension configs before skipping add_extension (#7650) chore(release): release version 1.27.0 (minor) (#7611) feat: better private channel detection, bot version debugging (#7680) chore(deps): bump svgo from 3.3.2 to 3.3.3 in /documentation (#7667) fix: only add viewable channels to bot context (#7678) chore: added a recipe to help identify high risk change prs for testing (#7651) fix: make sure platform binary exists (#7676) fix(shell): replace global static output buffer with per-instance TempDir (#7632) opt: remove timestamped config file backup (#7618) chore(deps): bump @hono/node-server from 1.19.9 to 1.19.10 in /ui/desktop (#7662) chore(deps): bump hono from 4.12.3 to 4.12.5 in /evals/open-model-gym/mcp-harness (#7661) chore(deps): bump hono from 4.12.2 to 4.12.5 in /ui/desktop (#7660) fix: resolve parameters in initial message with autosubmit (#7659) fix: this should not be blocked (#7656) Relax the assertion for the model list ACP test (#7653) fix: add analyzer extension in recipe to maintain backwards compatibility (#7652) ...
…pDir (block#7632) Signed-off-by: Adrian Cole <[email protected]>
* origin/main: (59 commits) fix: restore smart-approve mode (#7690) fix: make TLS configurable in goosed agent via GOOSE_TLS env var (#7686) Update to rmcp 1.1.0 (#7619) Fix max turns configuration (#7612) feat: add base path field to custom provider configuration (#7614) fix: compare extension configs before skipping add_extension (#7650) chore(release): release version 1.27.0 (minor) (#7611) feat: better private channel detection, bot version debugging (#7680) chore(deps): bump svgo from 3.3.2 to 3.3.3 in /documentation (#7667) fix: only add viewable channels to bot context (#7678) chore: added a recipe to help identify high risk change prs for testing (#7651) fix: make sure platform binary exists (#7676) fix(shell): replace global static output buffer with per-instance TempDir (#7632) opt: remove timestamped config file backup (#7618) chore(deps): bump @hono/node-server from 1.19.9 to 1.19.10 in /ui/desktop (#7662) chore(deps): bump hono from 4.12.3 to 4.12.5 in /evals/open-model-gym/mcp-harness (#7661) chore(deps): bump hono from 4.12.2 to 4.12.5 in /ui/desktop (#7660) fix: resolve parameters in initial message with autosubmit (#7659) fix: this should not be blocked (#7656) Relax the assertion for the model list ACP test (#7653) ...
Summary
Shell output truncation uses a global
static Mutex<HashMap>to cache temp file paths. This is racy in production too, not just tests:agent.rsdispatches tool calls concurrently viastream::select_all, so two shell commands in the same turn can clobber each other's saved output. The temp files also leak becauseNamedTempFile::keep()persists them forever.This moves the temp directory onto
ShellToolitself and adds anAtomicUsizecall index that round-robins through a fixed number of file slots (fetch_add % OUTPUT_SLOTS, same pattern as elastic/elasticsearch-rs). Concurrent calls get distinct slots, sequential calls reuse them, and everything is cleaned up when the tool drops.Type of Change
AI Assistance
Testing
two new tests for slot cycling and distinctness.