Jeremy Rose
103adcdf2d
fix: esc w/ queued messages overwrites draft in composer ( #4237 )
...
Instead of overwriting the contents of the composer when pressing
<kbd>Esc</kbd> when there's a queued message, prepend the queued
message(s) to the composer draft.
2025-09-25 10:07:27 -07:00
Michael Bolin
d61dea6fe6
feat: add support for CODEX_SECURE_MODE=1 to restrict process observability ( #4220 )
...
Because the `codex` process could contain sensitive information in
memory, such as API keys, we add logic so that when
`CODEX_SECURE_MODE=1` is specified, we avail ourselves of whatever the
operating system provides to restrict observability/tampering, which
includes:
- disabling `ptrace(2)`, so it is not possible to attach to the process
with a debugger, such as `gdb`
- disabling core dumps
Admittedly, a user with root privileges can defeat these safeguards.
For now, we only add support for this in the `codex` multitool, but we
may ultimately want to support this in some of the smaller CLIs that are
buildable out of our Cargo workspace.
2025-09-25 10:02:28 -07:00
Michael Bolin
55787ccfaa
Merge 6587f82484 into sapling-pr-archive-bolinfest
2025-09-25 09:37:49 -07:00
Michael Bolin
6587f82484
chore: refactor attempt_stream_responses() out of stream_responses()
2025-09-25 09:37:41 -07:00
Michael Bolin
375c2638fd
merge commit for archive created by Sapling
2025-09-25 09:25:48 -07:00
Michael Bolin
8bdb940340
feat: add support for CODEX_SECURE_MODE=1 to restrict process observability
2025-09-25 09:25:41 -07:00
Michael Bolin
1c9284fc39
merge commit for archive created by Sapling
2025-09-25 09:18:39 -07:00
Michael Bolin
943b8af3b7
feat: add support for CODEX_SECURE_MODE=1 to restrict process observability
2025-09-25 09:18:34 -07:00
Michael Bolin
abf89d2293
merge commit for archive created by Sapling
2025-09-25 09:17:49 -07:00
Michael Bolin
9415870df6
feat: add support for CODEX_SECURE_MODE=1 to restrict process observability
2025-09-25 09:17:43 -07:00
Michael Bolin
f83923be42
merge commit for archive created by Sapling
2025-09-25 09:14:22 -07:00
Michael Bolin
6590790931
feat: add support for CODEX_SECURE_MODE=1 to restrict process observability
2025-09-25 09:14:16 -07:00
Michael Bolin
38f6272639
merge commit for archive created by Sapling
2025-09-25 08:52:17 -07:00
Michael Bolin
948aaa703d
feat: add support for CODEX_SECURE_MODE=1 to restrict process observability
2025-09-25 08:52:08 -07:00
Ahmed Ibrahim
e363dac249
revamp /status ( #4196 )
...
<img width="543" height="520" alt="image"
src="https://github.com/user-attachments/assets/bbc0eec0-e40b-45e7-bcd0-a997f8eeffa2 "
/>
2025-09-25 15:38:50 +00:00
jif-oai
250b244ab4
ref: full state refactor ( #4174 )
...
## Current State Observations
- `Session` currently holds many unrelated responsibilities (history,
approval queues, task handles, rollout recorder, shell discovery, token
tracking, etc.), making it hard to reason about ownership and lifetimes.
- The anonymous `State` struct inside `codex.rs` mixes session-long data
with turn-scoped queues and approval bookkeeping.
- Turn execution (`run_task`) relies on ad-hoc local variables that
should conceptually belong to a per-turn state object.
- External modules (`codex::compact`, tests) frequently poke the raw
`Session.state` mutex, which couples them to implementation details.
- Interrupts, approvals, and rollout persistence all have bespoke
cleanup paths, contributing to subtle bugs when a turn is aborted
mid-flight.
## Desired End State
- Keep a slim `Session` object that acts as the orchestrator and façade.
It should expose a focused API (submit, approvals, interrupts, event
emission) without storing unrelated fields directly.
- Introduce a `state` module that encapsulates all mutable data
structures:
- `SessionState`: session-persistent data (history, approved commands,
token/rate-limit info, maybe user preferences).
- `ActiveTurn`: metadata for the currently running turn (sub-id, task
kind, abort handle) and an `Arc<TurnState>`.
- `TurnState`: all turn-scoped pieces (pending inputs, approval waiters,
diff tracker, review history, auto-compact flags, last agent message,
outstanding tool call bookkeeping).
- Group long-lived helpers/managers into a dedicated `SessionServices`
struct so `Session` does not accumulate "random" fields.
- Provide clear, lock-safe APIs so other modules never touch raw
mutexes.
- Ensure every turn creates/drops a `TurnState` and that
interrupts/finishes delegate cleanup to it.
2025-09-25 12:16:06 +02:00
Michael Bolin
5e3ba737cc
merge commit for archive created by Sapling
2025-09-25 00:44:56 -07:00
Michael Bolin
f3615680cc
feat: add support for CODEX_SECURE_MODE=1 to restrict process observability
2025-09-25 00:44:51 -07:00
Michael Bolin
da9d9fa328
merge commit for archive created by Sapling
2025-09-25 00:39:50 -07:00
Michael Bolin
1470e85b5b
feat: add support for CODEX_SECURE_MODE=1 to restrict process observability
2025-09-25 00:39:43 -07:00
Michael Bolin
592662ea38
Merge e5594b1680 into sapling-pr-archive-bolinfest
2025-09-25 00:26:46 -07:00
Michael Bolin
e5594b1680
feat: add support for CODEX_SECURE_MODE=1 to restrict process observability
2025-09-25 00:25:38 -07:00
pakrym-oai
d1ed3a4cef
github: update codespell action to v2.1 in workflow ( #4205 )
...
Old version fails to find python 3.8 docker image
2025-09-25 04:05:00 +00:00
pakrym-oai
e85742635f
Send text parameter for non-gpt-5 models ( #4195 )
...
We had a hardcoded check for gpt-5 before.
Fixes: https://github.com/openai/codex/issues/4181
2025-09-24 22:00:06 +00:00
Michael Bolin
de7158cc75
Merge 49f836ea86 into sapling-pr-archive-bolinfest
2025-09-24 14:31:46 -07:00
Michael Bolin
49f836ea86
chore: refactor attempt_stream_responses() out of stream_responses()
2025-09-24 14:31:38 -07:00
Michael Bolin
87b299aa3f
chore: drop unused values from env_flags ( #4188 )
...
For the most part, we try to avoid environment variables in favor of
config options so the environment variables do not leak into child
processes. These environment variables are no longer honored, so let's
delete them to be clear.
Ultimately, I would also like to eliminate `CODEX_RS_SSE_FIXTURE` in
favor of something cleaner.
2025-09-24 14:29:51 -07:00
iceweasel-oai
0e58870634
adds a windows-specific method to check if a command is safe ( #4119 )
...
refactors command_safety files into its own package, so we can add
platform-specific ones
Also creates a windows-specific of `is_known_safe_command` that just
returns false always, since that is what happens today.
2025-09-24 14:03:43 -07:00
Jeremy Rose
42847baaf7
pageless session list ( #3194 )
2025-09-24 13:44:48 -07:00
Jeremy Rose
6032d784ee
improve MCP tool call styling ( #3871 )
...
<img width="760" height="213" alt="Screenshot 2025-09-18 at 12 29 15 PM"
src="https://github.com/user-attachments/assets/48a205b7-b95a-4988-8c76-efceb998dee7 "
/>
2025-09-24 13:36:01 -07:00
Michael Bolin
c75ac4977f
Merge 4fb5dc058c into sapling-pr-archive-bolinfest
2025-09-24 13:03:03 -07:00
Michael Bolin
4fb5dc058c
chore: drop unused values from env_flags
2025-09-24 13:02:55 -07:00
Jeremy Rose
7bff8df10e
hide the status indicator when the answer stream starts ( #4101 )
...
This eliminates a "bounce" at the end of streaming where we hide the
status indicator at the end of the turn and the composer moves up two
lines.
Also, simplify streaming further by removing the HistorySink and
inverting control, and collapsing a few single-element structures.
2025-09-24 11:51:48 -07:00
pakrym-oai
addc946d13
Simplify tool implemetations ( #4160 )
...
Use Result<String, FunctionCallError> for all tool handling code and
rely on error propagation instead of creating failed items everywhere.
2025-09-24 17:27:35 +00:00
dependabot[bot]
bffdbec2c5
chore(deps): bump chrono from 0.4.41 to 0.4.42 in /codex-rs ( #4028 )
...
Bumps [chrono](https://github.com/chronotope/chrono ) from 0.4.41 to
0.4.42.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/chronotope/chrono/releases ">chrono's
releases</a>.</em></p>
<blockquote>
<h2>0.4.42</h2>
<h2>What's Changed</h2>
<ul>
<li>Add fuzzer for DateTime::parse_from_str by <a
href="https://github.com/tyler92 "><code>@tyler92</code></a> in <a
href="https://redirect.github.com/chronotope/chrono/pull/1700 ">chronotope/chrono#1700</a></li>
<li>Fix wrong amount of micro/milliseconds by <a
href="https://github.com/nmlt "><code>@nmlt</code></a> in <a
href="https://redirect.github.com/chronotope/chrono/pull/1703 ">chronotope/chrono#1703</a></li>
<li>Add warning about MappedLocalTime and wasm by <a
href="https://github.com/lutzky "><code>@lutzky</code></a> in <a
href="https://redirect.github.com/chronotope/chrono/pull/1702 ">chronotope/chrono#1702</a></li>
<li>Fix incorrect parsing of fixed-length second fractions by <a
href="https://github.com/chris-leach "><code>@chris-leach</code></a> in
<a
href="https://redirect.github.com/chronotope/chrono/pull/1705 ">chronotope/chrono#1705</a></li>
<li>Fix cfgs for <code>wasm32-linux</code> support by <a
href="https://github.com/arjunr2 "><code>@arjunr2</code></a> in <a
href="https://redirect.github.com/chronotope/chrono/pull/1707 ">chronotope/chrono#1707</a></li>
<li>Fix OpenHarmony's <code>tzdata</code> parsing by <a
href="https://github.com/ldm0 "><code>@ldm0</code></a> in <a
href="https://redirect.github.com/chronotope/chrono/pull/1679 ">chronotope/chrono#1679</a></li>
<li>Convert NaiveDate to/from days since unix epoch by <a
href="https://github.com/findepi "><code>@findepi</code></a> in <a
href="https://redirect.github.com/chronotope/chrono/pull/1715 ">chronotope/chrono#1715</a></li>
<li>Add <code>?Sized</code> bound to related methods of
<code>DelayedFormat::write_to</code> by <a
href="https://github.com/Huliiiiii "><code>@Huliiiiii</code></a> in <a
href="https://redirect.github.com/chronotope/chrono/pull/1721 ">chronotope/chrono#1721</a></li>
<li>Add <code>from_timestamp_secs</code> method to <code>DateTime</code>
by <a href="https://github.com/jasonaowen "><code>@jasonaowen</code></a>
in <a
href="https://redirect.github.com/chronotope/chrono/pull/1719 ">chronotope/chrono#1719</a></li>
<li>Migrate to core::error::Error by <a
href="https://github.com/benbrittain "><code>@benbrittain</code></a> in
<a
href="https://redirect.github.com/chronotope/chrono/pull/1704 ">chronotope/chrono#1704</a></li>
<li>Upgrade to windows-bindgen 0.63 by <a
href="https://github.com/djc "><code>@djc</code></a> in <a
href="https://redirect.github.com/chronotope/chrono/pull/1730 ">chronotope/chrono#1730</a></li>
<li>strftime: simplify error handling by <a
href="https://github.com/djc "><code>@djc</code></a> in <a
href="https://redirect.github.com/chronotope/chrono/pull/1731 ">chronotope/chrono#1731</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/chronotope/chrono/commit/f3fd15f976c8c8e56d97eda6237af4d485ba2297 "><code>f3fd15f</code></a>
Bump version to 0.4.42</li>
<li><a
href="https://github.com/chronotope/chrono/commit/5cf56035007f291b1b8f457fa3bfc79fb367419a "><code>5cf5603</code></a>
strftime: add regression test case</li>
<li><a
href="https://github.com/chronotope/chrono/commit/a6231701ee934cbbeb595fe71328fcbbf1b584d5 "><code>a623170</code></a>
strftime: simplify error handling</li>
<li><a
href="https://github.com/chronotope/chrono/commit/36fbfb1221da05b1482eb9dd18254e6bd736cb31 "><code>36fbfb1</code></a>
strftime: move specifier handling out of match to reduce rightward
drift</li>
<li><a
href="https://github.com/chronotope/chrono/commit/7f413c363b74e293d495dc6109335c02dda9d629 "><code>7f413c3</code></a>
strftime: yield None early</li>
<li><a
href="https://github.com/chronotope/chrono/commit/9d5dfe164098186bfff8af7d5eecbb05d7712d4d "><code>9d5dfe1</code></a>
strftime: outline constants</li>
<li><a
href="https://github.com/chronotope/chrono/commit/e5f6be7db4a0c2756cad0a7c8186a5a180873f7a "><code>e5f6be7</code></a>
strftime: move error() method below caller</li>
<li><a
href="https://github.com/chronotope/chrono/commit/d516c2764d74e467fa37e25e8e88d5633478bafa "><code>d516c27</code></a>
strftime: merge impl blocks</li>
<li><a
href="https://github.com/chronotope/chrono/commit/0ee2172fb92df4e0be4cf7a733c860226eec37a0 "><code>0ee2172</code></a>
strftime: re-order items to keep impls together</li>
<li><a
href="https://github.com/chronotope/chrono/commit/757a8b0226e9c0a23b5334c7dc0986f1e487b8ac "><code>757a8b0</code></a>
Upgrade to windows-bindgen 0.63</li>
<li>Additional commits viewable in <a
href="https://github.com/chronotope/chrono/compare/v0.4.41...v0.4.42 ">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores )
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 16:53:26 +00:00
dependabot[bot]
353a5c2046
chore(deps): bump unicode-width from 0.1.14 to 0.2.1 in /codex-rs ( #2156 )
...
Bumps [unicode-width](https://github.com/unicode-rs/unicode-width ) from
0.1.14 to 0.2.1.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/unicode-rs/unicode-width/commit/0085e91db72ae9a4498e62030d9651f1c1d09b4f "><code>0085e91</code></a>
Publish 0.2.1</li>
<li><a
href="https://github.com/unicode-rs/unicode-width/commit/6db0c14cbde54b1343335be38c7fdcb6451efb25 "><code>6db0c14</code></a>
Remove <code>compiler-builtins</code> from <code>rustc-dep-of-std</code>
dependencies (<a
href="https://redirect.github.com/unicode-rs/unicode-width/issues/77 ">#77</a>)</li>
<li><a
href="https://github.com/unicode-rs/unicode-width/commit/0bccd3f1b55b15e7796a5f591a9f24ef28889b1b "><code>0bccd3f</code></a>
update copyright year (<a
href="https://redirect.github.com/unicode-rs/unicode-width/issues/76 ">#76</a>)</li>
<li><a
href="https://github.com/unicode-rs/unicode-width/commit/7a7fcdc8134a67e0b8deaac7deb4f12559550eaf "><code>7a7fcdc</code></a>
Support Unicode 16 (<a
href="https://redirect.github.com/unicode-rs/unicode-width/issues/74 ">#74</a>)</li>
<li><a
href="https://github.com/unicode-rs/unicode-width/commit/82d7136b494ded1fe83a269e673fd85dfc4a92a6 "><code>82d7136</code></a>
Advertise and enforce MSRV (<a
href="https://redirect.github.com/unicode-rs/unicode-width/issues/73 ">#73</a>)</li>
<li><a
href="https://github.com/unicode-rs/unicode-width/commit/e77b2929bc863841147786ef573b297581f94fe4 "><code>e77b292</code></a>
Make characters with <code>Line_Break=Ambiguous</code> ambiguous (<a
href="https://redirect.github.com/unicode-rs/unicode-width/issues/61 ">#61</a>)</li>
<li><a
href="https://github.com/unicode-rs/unicode-width/commit/5a7fced663028d86d603cffbddcabedfdf7c7199 "><code>5a7fced</code></a>
Update version number in Readme (<a
href="https://redirect.github.com/unicode-rs/unicode-width/issues/70 ">#70</a>)</li>
<li><a
href="https://github.com/unicode-rs/unicode-width/commit/79eab0d9fc2060783b43046f9611648dcd35172f "><code>79eab0d</code></a>
Publish 0.2.0 with newlines treated as width 1 (<a
href="https://redirect.github.com/unicode-rs/unicode-width/issues/68 ">#68</a>)</li>
<li>See full diff in <a
href="https://github.com/unicode-rs/unicode-width/compare/v0.1.14...v0.2.1 ">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores )
You can trigger a rebase of this PR by commenting `@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
> **Note**
> Automatic rebases have been disabled on this pull request as it has
been open for over 30 days.
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 16:33:46 +00:00
Tien Nguyen
00c7f7a16c
chore: remove once_cell dependency from multiple crates ( #4154 )
...
This commit removes the `once_cell` dependency from `Cargo.toml` files
in the `codex-rs` and `apply-patch` directories, replacing its usage
with `std::sync::LazyLock` and `std::sync::OnceLock` where applicable.
This change simplifies the dependency tree and utilizes standard library
features for lazy initialization.
# External (non-OpenAI) Pull Request Requirements
Before opening this Pull Request, please read the dedicated
"Contributing" markdown file or your PR may be closed:
https://github.com/openai/codex/blob/main/docs/contributing.md
If your PR conforms to our contribution guidelines, replace this text
with a detailed and high quality description of your changes.
2025-09-24 09:15:57 -07:00
Michael Bolin
82e65975b2
fix: add tolerance for ambiguous behavior in gh run list ( #4162 )
...
I am not sure what is going on, as
https://github.com/openai/codex/pull/3660 introduced this new logic and
I swear that CI was green before I merged that PR, but I am seeing
failures in this CI job this morning. This feels like a
non-backwards-compatible change in `gh`, but that feels unlikely...
Nevertheless, this is what I currently see on my laptop:
```
$ gh --version
gh version 2.76.2 (2025-07-30)
https://github.com/cli/cli/releases/tag/v2.76.2
$ gh run list --workflow .github/workflows/rust-release.yml --branch rust-v0.40.0 --json workflowName,url,headSha --jq 'first(.[])'
{
"headSha": "5268705a69713752adcbd8416ef9e84a683f7aa3",
"url": "https://github.com/openai/codex/actions/runs/17952349351 ",
"workflowName": ".github/workflows/rust-release.yml"
}
```
Looking at sample output from an old GitHub issue
(https://github.com/cli/cli/issues/6678 ), it appears that, at least at
one point in time, the `workflowName` was _not_ the path to the
workflow.
2025-09-24 09:15:03 -07:00
Michael Bolin
72acf257bd
merge commit for archive created by Sapling
2025-09-24 09:09:15 -07:00
Michael Bolin
793f4421b9
fix: add tolerance for ambiguous behavior in gh run list
2025-09-24 09:09:09 -07:00
Michael Bolin
ab31890f35
Merge 25b4ef279c into sapling-pr-archive-bolinfest
2025-09-24 08:58:31 -07:00
Michael Bolin
25b4ef279c
fix: add tolerance for ambiguous behavior in gh run list
2025-09-24 08:58:25 -07:00
Michael Bolin
f930289a38
Merge 98df710750 into sapling-pr-archive-bolinfest
2025-09-24 08:37:43 -07:00
Michael Bolin
98df710750
fix: create per-architecture versions of the npm module
2025-09-24 08:37:32 -07:00
Michael Bolin
639a6fd2f3
chore: upgrade to Rust 1.90 ( #4124 )
...
Inspired by Dependabot's attempt to do this:
https://github.com/openai/codex/pull/4029
The new version of Clippy found some unused structs that are removed in
this PR.
Though nothing stood out to me in the Release Notes in terms of things
we should start to take advantage of:
https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/ .
2025-09-24 08:32:00 -07:00
jif-oai
db4aa6f916
nit: 350k tokens ( #4156 )
...
350k tokens for gpt-5-codex auto-compaction and update comments for
better description
2025-09-24 15:31:27 +00:00
Ahmed Ibrahim
cb96f4f596
Add Reset in for rate limits ( #4111 )
...
- Parse the headers
- Reorganize the struct because it's getting too long
- show the resets at in the tui
<img width="324" height="79" alt="image"
src="https://github.com/user-attachments/assets/ca15cd48-f112-4556-91ab-1e3a9bc4683d "
/>
2025-09-24 15:31:08 +00:00
jif-oai
5b910f1f05
chore: extract readiness in a dedicated utils crate ( #4140 )
...
Create an `utils` directory for the small utils crates
2025-09-24 10:15:54 +00:00
jif-oai
af6304c641
nit: drop instruction override for auto-compact ( #4137 )
...
drop instruction override for auto-compact as this is not used and
dangerous as it invalidates the cache
2025-09-24 10:47:12 +01:00
jif-oai
b90eeabd74
nit: update auto compact to 250k ( #4135 )
...
update auto compact for gpt-5-codex to 250k
2025-09-24 09:41:33 +00:00