22 Commits
Author SHA1 Message Date
zeekay 0934258016 0.7.2 2026-10-16 06:14:09 -07:00
zeekay f385edacda upstream: Dev updates itself from its own release, and the welcome draws the Hanzo mark
hanzoai/codex e7a4d438: the update check reads hanzoai/dev's latest release and
offers the installer that put Dev there (@hanzo/dev by npm, bun or pnpm, the
hanzoai/tap/hanzo-dev formula, hanzo.sh otherwise), and the empty-state
animation draws the Hanzo mark. 6fd3f345: the fork's doctor, daemon and composer
snapshots say Dev. install-context now reads its npm marker from `hanzo`, which
is the lock's one new edge.
2026-10-16 06:14:09 -07:00
zeekay 7b5241a38f 0.7.1 2026-10-15 12:06:05 -07:00
zeekay ad468d97af upstream: the fork stands alone; Dev fills its two hooks
hanzoai/codex names nothing outside its tree now (d1d710452): Dev's names,
defaults, model catalog, `/model <name>` match, controller interface and
version live in its `hanzo` crate, and Dev's crates depend on that, never
the reverse. hanzo-loop moves there whole; hanzo-tui keeps only the Hanzo
account; hanzo-config reads API_BASE, DEFAULT_MODEL and is_hanzo from it.

hanzo-dev's main registers what Dev adds before anything starts:
`codex_app_server::register(hanzo_kai::install)` puts Kai on every thread,
and `codex_tui::register(Account { login, logout, show })` puts the Hanzo
CLI's sign-in behind /login, /logout, /auth and /status. launch.rs holds
that /login is offered, which it is only when an account is registered.
make test-upstream runs locked against the fork's own lock.
2026-10-15 10:03:29 -07:00
zeekay 0e628dc574 0.7.0
The version, by hand: the root Cargo.toml's [workspace.package] (which
hanzo-dev alone takes), npm/package.json and its platform packages, and
the lock. The changelog says what 0.7.0 carries: openai/codex at
3ee47c105 through hanzoai/codex, the delta as commits there, Kai's kept
calls and repaired answers, and versions assigned by hand.
2026-10-15 07:37:45 -07:00
zeekay 8cd3a7d268 upstream: hanzoai/codex at 3ee47c105, the delta as commits; the build-time edits go
upstream/codex is now hanzoai/codex, whose main is openai/codex with
Hanzo's commits on it, and dev builds that checkout as committed: no
`make prepare`, nothing rewritten, `git -C upstream/codex status` empty
after a build and a test run. A bump is `git merge upstream/main` on the
fork's main, with conflicts in git, then the gitlink here.

openai/codex moves from 11da6b9e to 3ee47c105 (288 commits). Of the 106
anchored edits one had lost its ground, the --sandbox-state-json help that
upstream reworded, and was re-anchored before the delta became commits on
the fork: hanzo (Dev's crates in its workspace), tui, cli, config, core,
words, brand (the name rule's 227 literals) and version (the version
rule's 126 reads). The edit that set upstream's workspace version to
0.7.0-dev.1 is dropped: no upstream code reads its own version any more.
None of the anchors touched the zsh fork, shell-escalation or gateway_auth
code upstream removed or renamed, and the Hanzo crates built against the
moved APIs unchanged.

The version: hanzo-version moves into the fork, hanzo-dev hands it its own
CARGO_PKG_VERSION at startup, and DEV_VERSION is gone. The root
[workspace.package] version is the release's, and release.yml holds the
tag to it as well as to npm/package.json. Dev's libraries stay 0.0.0,
since upstream crates depend on them, so a release still recompiles
hanzo-dev alone. cli.rs fails on any upstream read of its own version.

Gone: patches/ (upstream.json, brand.json, and the Bazel patches only the
root MODULE.bazel names, which no build here runs), crates/hanzo-upstream
and crates/hanzo-version. The V8 fetch for `make test-upstream` is
scripts/v8.sh; `make bump` prints the merge steps; `make reset` goes. The
root Cargo.toml mirrors the fork's workspace dependencies: shell-escalation
and mxc-sdk out, the split mxc crates, gix 0.89, rmcp 3.5.1 and rustls
0.23.46 in.
2026-10-15 07:16:51 -07:00
zeekay 148ab1636d chore: update Cargo.lock 2026-10-14 18:47:25 -07:00
zeekayandHanzo Dev 5d8652d06d fix(dev): review and memory run on models the provider serves
On api.hanzo.ai, automatic approval review and memory extraction and
consolidation ask for enso-auto, not OpenAI's ids. Off OpenAI, the reviewer
counts a model as served only when the catalog lists it: the bundled OpenAI
entries ride along unlisted for lookups, so codex-auto-review looked served on
every provider and a LAN engine was reviewed by a model it does not have. Now
it falls back to the model the run is on.

Co-authored-by: Hanzo Dev <[email protected]>
2026-10-09 17:06:36 -07:00
zeekay 84a1d72fa6 fix(release): the version reaches the binary crate alone, so a release reuses every crate beneath it 2026-10-09 05:41:34 -07:00
zeekay b4ea5a9324 fix(dev): a bare dev starts in-process, reads only .hanzo, and defaults to Hanzo
Claude-Session: https://claude.ai/code/session_01LCxkTkYTJrFqZ27vDSsn6Y
2026-10-08 11:36:40 -07:00
zeekay 63a0bb114d feat(dev): Enso by default, /login /auth /model <name>, Dev in every string, codex 11da6b9 2026-10-07 16:04:54 -07:00
zeekay 2cdddb0b00 refactor: the wasm loop, its Go host and wasm2go move to hanzo-inc/dev
Claude-Session: https://claude.ai/code/session_01SVaQNFaAjhDxthpxasGah5
2026-10-07 13:49:35 -07:00
zeekay 3e1815afbe fix(ci): lock models-manager's hanzo-config edge, rebuild dev.wasm to match, build by default
Claude-Session: https://claude.ai/code/session_01SVaQNFaAjhDxthpxasGah5
2026-10-07 13:21:38 -07:00
zeekay 82cf6d3b4c chore: lockfile update for codex-exec 2026-10-07 11:41:47 -07:00
zeekay b1b267bb92 fix: adapt hanzo-kai, upstream patches, and token auth to codex 0e15206 2026-10-07 11:34:40 -07:00
zeekay e98ed461ae chore: sync upstream to codex 0e15206 and code 41f66ca
Move both submodules to current main and bring the owned delta with them.

- patches: the session title is one literal in codex_title now, so it is
  anchored there and the status-card edit, which that title replaced, goes;
  get_tooltip takes the keymap; the cyber-access flag names a provider in
  its help; mcp_login joins the modules the library publishes.
- Cargo.toml: workspace dependencies, profiles and patches track upstream's,
  as they did at the last pin, and Cargo.lock follows.
- tests: the pty spawn takes ChildFds; the feature round trip asks for an
  experimental feature instead of naming one upstream has since deprecated.

Claude-Session: https://claude.ai/code/session_01SVaQNFaAjhDxthpxasGah5
2026-10-07 11:33:56 -07:00
zeekayandHanzo Dev 2a4577776b The model manager reads the Hanzo catalog, recorded in the lock
Co-authored-by: Hanzo Dev <[email protected]>
2026-10-07 10:49:22 -07:00
zeekay a7126cbd19 Kai reaches Dev over the Decisions API, so Dev builds and installs from public sources alone.
hanzo-kai linked hanzoai/decision's control and program crates by git.
That repository is private: the public build, CI, and every cargo install
of dev failed to fetch it. Kai is now a client of POST /v1/decisions at
api.hanzo.ai, signed with the Hanzo credential Dev already sends; nothing
of hanzoai/decision is linked, .cargo/config.toml goes, and Cargo.lock
loses 89 packages and every private source.

The programs Dev asks (tools.select, router.model, reasoning.budget,
context.select, agent.command-risk, agent.progress, agent.complete, and
the fix flow's fix.pick and fix.next) ship in crates/hanzo-kai/programs
as typed questions with their thresholds, verdict rules and calibration
pins. The gate that reads the answers is Dev's own: a noul holds at its
threshold, a choice or score is accepted at its certainty, a verdict
rule joins the policy on allow < ask < deny only when enforced, and an
answer under another calibration runs in shadow.

When Kai does not answer (refused, timed out, 401, 404, 5xx, or no
state of the decision answered) the decision fails at once and Kai is
down for 60 s: no request is made in that window, the loop does exactly
what it does without Kai, one line goes to the log and no trace line is
written. Only a decision asked after the failure brings Kai back. A
decision's states are asked in parallel; tier and budget together. The
tool shortlist is decided again when the tools on offer change, since an
MCP server that finishes starting mid-turn adds its tools.

dev flow is now dev flow fix, a fixed pipeline rather than a Decision
Program run by the private executor: retrieval, Kai's pick, Zen's diff,
the tests, Kai's next. --control rule, or Kai not answering, leaves the
tests and the budget to decide, and the report says so once. An attempt
whose patch no longer reverses ends the flow instead of retrying over it.

Tests serve the Decisions API and chat completions from wiremock: Kai
on (tools shortlisted, tier and effort hinted, verdict tightened, one
trace line per decision with its distributions), Kai answering 404,
Kai unreachable, Kai answering with a page that is not the API, tools
arriving mid-turn, and an answer under another calibration.

Claude-Session: https://claude.ai/code/session_018Gt5TvrE2rxXuZikWSauv3
2026-09-27 03:57:24 -07:00
zeekay ff64e7d729 Kai decides in the dev loop, and dev flow runs Decision Programs whose steps are tools, Kai or Zen.
hanzo-loop is the contract the loop applies: a tool shortlist per step, a
command verdict joined with the policy on allow < ask < deny, and routing
hints on the turn metadata. hanzo-kai links hanzoai/decision's control and
program at ec8207d: one controller per thread answers those three through
seven anchored upstream edits, and extension contributors feed it context,
progress and completion. kai.toml turns it on, every operation in shadow by
default. Each decision is one trace line in the shape Enso's control writes.

dev flow runs a Decision Program over the repository. The shipped fix flow
retrieves candidate files, Kai picks one, Zen writes a diff, the tests run,
and Kai says done, retry or escalate within what the tests and the budget
permit. go/dev.wasm is rebuilt because Cargo.toml, Cargo.lock and the
Makefile are among its recorded inputs.

Claude-Session: https://claude.ai/code/session_018Gt5TvrE2rxXuZikWSauv3
2026-09-26 12:59:11 -07:00
zeekayandHanzo Dev b7021cb588 feat(dev): the loop as a state machine the host can drive
protocol carries the events and the ten actions, and every action carries
the id its dispatch and completion are recorded under. encode and decode
are the only two functions that know the byte format, so ZAP takes over
from serde_json without moving a type or a symbol.

core is a Session with step, snapshot and restore, and no effects at all:
no filesystem, no process, no socket, no runtime. codex-core is not
separable as it stands — tokio, an HTTP client, a rollout store, a pty —
so the model-request and tool-result loop is driven here, and the module
doc names what stays coupled upstream. An observation is accepted only
while its id is outstanding, so a replayed result runs nothing twice.

ffi is the C ABI: seven symbols, generational handles so a stale one is
refused rather than resolving to the next session, catch_unwind on every
entry point so a panic poisons one session instead of aborting the
process, and dev.h written beside it. A C program exercises the archive.

protocol and core build for wasm32-wasip1; make wasm is the check.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-18 13:26:58 -07:00
zeekayandHanzo Dev 365e2813cf feat: dev login asks who you are, and logout clears both sides
`dev login` opened a browser for ChatGPT and had no way to reach the account
the tool actually runs on. It now offers the four credentials that exist —
Hanzo account, ChatGPT account, or a pasted key for either — with Hanzo first
and selected, because Hanzo is the provider the default config names.

A pasted key lands in the profile's own file, written through a temporary file
so a failed write cannot truncate a working credential, and readable only by
its owner. It is separate from auth.json, which the Hanzo tools share.

Logout was the defect worth the most here: `run_logout` exits the process, so
every statement after it was unreachable. On the default provider the Hanzo
credential was never cleared at all, and the command still printed success —
a logout that left the account readable. The Hanzo side is cleared first now,
on every path, and a failure on one side no longer stops the other.

Activating the Hanzo provider also writes the provider table when the profile
lacks it, so switching to Hanzo in an older profile no longer names a provider
that is not defined.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-08 00:29:28 -07:00
zeekay db924855a0 feat: own the front door, consume upstream as submodules
Replaces the Rust tree. `code-rs/` was a fork of just-every/code carrying
its own copy of everything; `vendor/` held 219 MB of upstream snapshots
beside it. Both are gone.

In their place: Hanzo writes the command surface, upstream keeps the
engines. `crates/hanzo-dev/src/main.rs` is a real file that dispatches
into libraries — codex_tui::run_main, codex_exec::run_main, and the rest
— rather than an include! of upstream's 5156-line binary main. Owning the
front door is what makes a single unified command surface expressible.

Upstream arrives as submodules at upstream/codex and upstream/code, both
at latest. The gitlink is the pin, so no lockfile of hashes sits beside
it and a bump is a two-line diff instead of forty-five thousand. Crates
are consumed by ordinary path dependency; nothing is copied.

The whole Hanzo delta on upstream is sixteen anchored substitutions in
patches/codex.json, applied in place by `make prepare` and visible in one
`git -C upstream/codex status`. Each carries an exact match count, so
upstream moving the ground under one stops preparation and names the file
rather than branding the wrong line. Two are upstreamable: they publish
mcp_cmd, plugin_cmd and doctor from upstream's library instead of burying
them in its binary.

`dev` covers exec, login, logout, serve, resume, fork, review, agents,
queue, archive, unarchive, delete, cloud, mcp, plugin, doctor, features,
sandbox and completion. Auto Drive and the browser bridge are not ported
yet; migration/STATUS.md records that, and the defects the v1 patch was
already carrying, so they are fixed as features are ported rather than
copied across.

Releases build from the root after `make prepare`, with submodules
checked out. Scripts that existed only to manage a fork-diff — the
upstream-merge set and the codex path-dep check — go with the fork.
2026-09-07 18:51:26 -07:00