Commit Graph
54 Commits
Author SHA1 Message Date
Ryan Ragona ffe7e2277f artial, broken 2025-04-27 12:42:27 -07:00
Ryan Ragona b344757fb0 first pass at get 2025-04-27 09:00:37 -07:00
Ryan Ragona 0fbe5f2069 cleanup 2025-04-27 08:46:45 -07:00
Ryan Ragona aef7f25302 cleanup 2025-04-27 08:43:44 -07:00
Ryan Ragona 66a2e970f7 humansize 2025-04-27 08:35:21 -07:00
Ryan Ragona e96055be36 move to_args closer to args 2025-04-27 08:12:09 -07:00
Ryan Ragona 359a09cd8d fmt 2025-04-27 07:50:12 -07:00
Ryan Ragona 8c672d5442 cuter job names 2025-04-27 07:49:59 -07:00
Ryan Ragona 4d26c773b9 drop ascii art 2025-04-26 16:34:03 -07:00
Ryan Ragona 026990fcc0 fmt 2025-04-26 16:31:47 -07:00
Ryan Ragona ee51ffc130 fmt 2025-04-26 16:25:17 -07:00
Ryan Ragona a4197ec97a truncate 2025-04-26 16:25:02 -07:00
Ryan Ragona 56e609d481 cleanup on clap args 2025-04-26 16:19:15 -07:00
Ryan Ragona 2b55e5a8f2 remove overcomments 2025-04-26 16:03:43 -07:00
Ryan Ragona 2420a6a898 clippy 2025-04-26 15:57:49 -07:00
Ryan Ragona 8ed2704191 in progress cleanup 2025-04-26 15:45:09 -07:00
Ryan Ragona 07911ddc3e cleanup pass 2025-04-26 15:34:08 -07:00
Ryan Ragona f1c6625bf2 shorten timestamp 2025-04-26 14:38:17 -07:00
Ryan Ragona 337164738a fmt 2025-04-26 14:25:35 -07:00
Ryan Ragona 96d8d2a37a save session metadata 2025-04-26 14:25:26 -07:00
Ryan Ragona e782378176 gate on windows 2025-04-26 12:20:27 -07:00
Ryan Ragona d3b69e98bd fmt 2025-04-26 12:13:24 -07:00
Ryan Ragona 3d9ce18299 fix for tail 2025-04-26 12:13:17 -07:00
Ryan Ragona 1e2983d612 cleanup on failure 2025-04-26 12:09:04 -07:00
Ryan Ragona a7a8fa1753 session validation 2025-04-26 11:48:42 -07:00
Ryan Ragona 6f0e4a5733 tail 2025-04-26 11:42:50 -07:00
Ryan Ragona a09be2144e stdout tailing 2025-04-26 11:36:48 -07:00
Ryan Ragona d0e8aa5233 impl kill 2025-04-26 11:20:46 -07:00
Ryan Ragona dab7b1734d fmt 2025-04-26 10:03:34 -07:00
Ryan Ragona 9f10ec53b6 remove tui socket stuff 2025-04-26 10:03:24 -07:00
Ryan Ragona 786c81d706 draft still broken 2025-04-26 09:44:50 -07:00
Ryan Ragona 1d0d725494 draft broken 2025-04-26 09:41:06 -07:00
Ryan Ragona f2b7b14284 draft of tui sock 2025-04-26 09:13:57 -07:00
Ryan Ragona 63ec18989a display kind 2025-04-26 08:27:26 -07:00
Ryan Ragona 2aa7f42dc9 fmt 2025-04-26 08:11:04 -07:00
Ryan Ragona 8f8479fd80 add repl subcommand 2025-04-26 08:10:46 -07:00
Ryan Ragona 9aaa947828 numeric prefix 2025-04-26 07:32:26 -07:00
Ryan Ragona 342ac711ca use dot dir 2025-04-26 07:06:20 -07:00
Ryan Ragona b41f26f484 metadata 2025-04-26 07:05:19 -07:00
Ryan Ragona abf0198a49 progress 2025-04-26 06:53:03 -07:00
Ryan Ragona 314d2216cb codex draft 2025-04-26 06:40:39 -07:00
Michael Bolin b0ba65a936 fix: write logs to ~/.codex/log instead of /tmp (#669)
Previously, the Rust TUI was writing log files to `/tmp`, which is
world-readable and not available on Windows, so that isn't great.

This PR tries to clean things up by adding a function that provides the
path to the "Codex config dir," e.g., `~/.codex` (though I suppose we
could support `$CODEX_HOME` to override this?) and then defines other
paths in terms of the result of `codex_dir()`.

For example, `log_dir()` returns the folder where log files should be
written which is defined in terms of `codex_dir()`. I updated the TUI to
use this function. On UNIX, we even go so far as to `chmod 600` the log
file by default, though as noted in a comment, it's a bit tedious to do
the equivalent on Windows, so we just let that go for now.

This also changes the default logging level to `info` for `codex_core`
and `codex_tui` when `RUST_LOG` is not specified. I'm not really sure if
we should use a more verbose default (it may be helpful when debugging
user issues), though if so, we should probably also set up log rotation?
2025-04-25 17:37:41 -07:00
Misha Davidov 15bf5ca971 fix: handling weird unicode characters in apply_patch (#674)
I � unicode
2025-04-25 16:01:58 -07:00
Michael Bolin c18f1689a9 fix: small fixes so Codex compiles on Windows (#673)
Small fixes required:

* `ExitStatusExt` differs because UNIX expects exit code to be `i32`
whereas Windows does `u32`
* Marking a file "executable only by owner" is a bit more involved on
Windows. We just do something approximate for now (and add a TODO) to
get things compiling.

I created this PR on my personal Windows machine and `cargo test` and
`cargo clippy` succeed. Once this is in, I'll rebase
https://github.com/openai/codex/pull/665 on top so Windows stays fixed!
2025-04-25 15:58:44 -07:00
Michael Bolin ebd2ae4abd fix: remove dependency on expanduser crate (#667)
In putting up https://github.com/openai/codex/pull/665, I discovered
that the `expanduser` crate does not compile on Windows. Looking into
it, we do not seem to need it because we were only using it with a value
that was passed in via a command-line flag, so the shell expands `~` for
us before we see it, anyway. (I changed the type in `Cli` from `String`
to `PathBuf`, to boot.)

If we do need this sort of functionality in the future,
https://docs.rs/shellexpand/latest/shellexpand/fn.tilde.html seems
promising.
2025-04-25 14:20:21 -07:00
Michael Bolin 9c3ebac3b7 fix: flipped the sense of Prompt.store in #642 (#663)
I got the sense of this wrong in
https://github.com/openai/codex/pull/642. In that PR, I made
`--disable-response-storage` work, but broke the default case.

With this fix, both cases work and I think the code is a bit cleaner.
2025-04-25 13:41:17 -07:00
Parker Thompson 7d9de34bc7 [codex-rs] Improve linux sandbox timeouts (#662)
* Fixes flaking rust unit test
* Adds explicit sandbox exec timeout handling
2025-04-25 12:56:20 -07:00
Michael Bolin b323d10ea7 feat: add ZDR support to Rust implementation (#642)
This adds support for the `--disable-response-storage` flag across our
multiple Rust CLIs to support customers who have opted into Zero-Data
Retention (ZDR). The analogous changes to the TypeScript CLI were:

* https://github.com/openai/codex/pull/481
* https://github.com/openai/codex/pull/543

For a client using ZDR, `previous_response_id` will never be available,
so the `input` field of an API request must include the full transcript
of the conversation thus far. As such, this PR changes the type of
`Prompt.input` from `Vec<ResponseInputItem>` to `Vec<ResponseItem>`.

Practically speaking, `ResponseItem` was effectively a "superset" of
`ResponseInputItem` already. The main difference for us is that
`ResponseItem` includes the `FunctionCall` variant that we have to
include as part of the conversation history in the ZDR case.

Another key change in this PR is modifying `try_run_turn()` so that it
returns the `Vec<ResponseItem>` for the turn in addition to the
`Vec<ResponseInputItem>` produced by `try_run_turn()`. This is because
the caller of `run_turn()` needs to record the `Vec<ResponseItem>` when
ZDR is enabled.

To that end, this PR introduces `ZdrTranscript` (and adds
`zdr_transcript: Option<ZdrTranscript>` to `struct State` in `codex.rs`)
to take responsibility for maintaining the conversation transcript in
the ZDR case.
2025-04-25 12:08:18 -07:00
Michael Bolin dc7b83666a feat(tui-rs): add support for mousewheel scrolling (#641)
It is intuitive to try to scroll the conversation history using the
mouse in the TUI, but prior to this change, we only supported scrolling
via keyboard events.

This PR enables mouse capture upon initialization (and disables it on
exit) such that we get `ScrollUp` and `ScrollDown` events in
`codex-rs/tui/src/app.rs`. I initially mapped each event to scrolling by
one line, but that felt sluggish. I decided to introduce
`ScrollEventHelper` so we could debounce scroll events and measure the
number of scroll events in a 100ms window to determine the "magnitude"
of the scroll event. I put in a basic heuristic to start, but perhaps
someone more motivated can play with it over time.

`ScrollEventHelper` takes care of handling the atomic fields and thread
management to ensure an `AppEvent::Scroll` event is pumped back through
the event loop at the appropriate time with the accumulated delta.
2025-04-25 12:01:52 -07:00
oai-ragona d7a40195e6 [codex-rs] Reliability pass on networking (#658)
We currently see a behavior that looks like this:
```
2025-04-25T16:52:24.552789Z  WARN codex_core::codex: stream disconnected - retrying turn (1/10 in 232ms)...
codex> event: BackgroundEvent { message: "stream error: stream disconnected before completion: Transport error: error decoding response body; retrying 1/10 in 232ms…" }
2025-04-25T16:52:54.789885Z  WARN codex_core::codex: stream disconnected - retrying turn (2/10 in 418ms)...
codex> event: BackgroundEvent { message: "stream error: stream disconnected before completion: Transport error: error decoding response body; retrying 2/10 in 418ms…" }
```

This PR contains a few different fixes that attempt to resolve/improve
this:
1. **Remove overall client timeout.** I think
[this](https://github.com/openai/codex/pull/658/files#diff-c39945d3c42f29b506ff54b7fa2be0795b06d7ad97f1bf33956f60e3c6f19c19L173)
is perhaps the big fix -- it looks to me like this was actually timing
out even if events were still coming through, and that was causing a
disconnect right in the middle of a healthy stream.
2. **Cap response sizes.** We were frequently sending MUCH larger
responses than the upstream typescript `codex`, and that was definitely
not helping. [Fix
here](https://github.com/openai/codex/pull/658/files#diff-d792bef59aa3ee8cb0cbad8b176dbfefe451c227ac89919da7c3e536a9d6cdc0R21-R26)
for that one.
3. **Much higher idle timeout.** Our idle timeout value was much lower
than typescript.
4. **Sub-linear backoff.** We were much too aggressively backing off,
[this](https://github.com/openai/codex/pull/658/files#diff-5d5959b95c6239e6188516da5c6b7eb78154cd9cfedfb9f753d30a7b6d6b8b06R30-R33)
makes it sub-exponential but maintains the jitter and such.

I was seeing that `stream error: stream disconnected` behavior
constantly, and anecdotally I can no longer reproduce. It feels much
snappier.
2025-04-25 11:44:22 -07:00