Repository navigation
Releases: Hamertingo/hz
Release list
v0.20.16
Fixed
- Delegated work comes back. Every subagent a session handed work to failed
before it started, withcontextWindow from task-parent-session requires a catalog physical limit: a child inherits its parent's window, so nothing
needed to state one for it, and asking for one failed the delegation. This is
the "subagents come back with nothing" report. - A goal's elapsed time counts from the goal. It restarted whenever you
switched away from a session and back, because it counted from the redraw
rather than from the goal. - A bundled app writes a log. Launched from Finder, the agent's own account
of a failure went to a descriptor nothing read, so a bundle that failed had
nothing to open. - A session's first five lines are no longer dropped. The agent announces its
commands a millisecond behind the session opening, and the app filed that
answer only after applying the session's settings — about 240ms against a
200ms window. - Session titles exist. The title command passed
--output-formatto the
wrong subcommand, so it printed its usage and exited: no session had ever been
titled. - A file link in a message opens the file. A relative path is resolved
against the session's workspace as well as the project root, with a
unique-suffix fallback, instead of one base that is right only sometimes. - An exec run that was cut off keeps what it found, instead of returning a
status with no output at all.
Added
- A delegated run has a ceiling that delivers rather than kills. It is held
to 200 model requests, told when it crosses, and stopped at 1.5× — and a
stopped run reports what it found. A run that will not wrap up is ended, and
what it committed is still its answer. - A child cannot end without producing something. A run that finishes
silently is asked once, in the same conversation whose context it still holds,
and the result saysexit: reportedorexit: silent— so "produced nothing"
is no longer indistinguishable from "still going". A silent exit names both
ways to get the rest. - Export a session from its context menu: the transcript as Markdown, or its
event log as JSON. - The sidebar says more with less — counts in the numeral face, a line for
the sessions waiting on you, and the agent's own face on a session that is
working, where an orb used to be.
What's Changed
- fix(models): what a model sees, the blocks that said otherwise, and the effort it takes by @Hamertingo in #40
- fix(agent): a task child inherits its parent's window, and ends through a contract by @Hamertingo in #41
- feat(agent): a delegated run is held to a request budget that stops and delivers by @Hamertingo in #42
- fix(agent): an exec run that stopped short keeps what it found by @Hamertingo in #43
- fix(desktop): three things the app lost silently, and a Fail that can print by @Hamertingo in #44
- fix(desktop): a goal's elapsed time counts from the goal, not from the redraw by @Hamertingo in #47
- docs(desktop): what is worth building next, and what reading the code changed by @Hamertingo in #48
- feat(desktop): a path the agent names, and one the reader picks by @Hamertingo in #45
- feat(desktop): the sidebar's numbers, and the face that says a session is going by @Hamertingo in #46
Full Changelog: v0.20.15...v0.20.16
v0.20.15
The same content as 0.20.14, with the Windows installer that release shipped
without. 0.20.14 published its macOS assets and then failed in the step that
uploads the NSIS installer: the glob that names the version was written
*0.20.14-setup.exe, while tauri writes Hyze Code_0.20.14_x64-setup.exe — the
architecture sits between the version and -setup, so the pattern matched nothing
and the guard fired on a bundle that was complete. The pattern names that
separator now, which still leaves a stale 0.20.8 file out.
That failure also held the updater manifest. The job that writes
stable.json declares both builds as its needs, so a red Windows job skipped it —
and 0.20.14 sat published with nobody offered it. It now runs whatever a platform
build did: a missing Windows fragment was already an ordinary state to that step,
and the alternative is one platform's build failure deciding when another
platform's users hear about a release.
Full Changelog: v0.20.14...v0.20.15
v0.20.14
Added
-
A Usage page — ⌘⇧U, or the row in the sidebar. What the agent has spent,
read back out of each session's log: the period's total and how it splits
between input, output, reasoning and cache, a day-by-day chart, the models with
the gateway each one came through, and the newest records. A period row and a
gateway row narrow all of it, and the gateway is read from the model's own wire
ref —command-codeandopencode-goserving the same model name are two rows,
not one. Nothing on it is a counter this app keeps: it is the agent's own
accounting, so a session deleted from~/.hztakes its rows with it. -
A goal the agent owns. The runtime's own objective object — its budget, its
turns, its status — drawn in the composer's row, with a receipt in the
transcript when the work lands. The objective goes out through the composer's
own path, so the reader's words and the agent's work arrive as an ordinary turn
and the runtime does not redo it. -
A retry is visible. The harness now says when it is re-asking a model, and
the row and the working indicator built for it finally have something to draw. -
A new identity. Four cuts of one artwork — tiled, plain, flat, mono —
replace the black cat on the dock and installer icons, the composer's
watermark, and the site's wordmark, favicon and OG card.
Changed
-
One agent process serves every session in a project. A second session in a
repo opens a conversation on the child that is already running instead of
paying the boot again — measured across five sessions, −73% time and −77%
memory — and the process count stops growing with the number of chats.
Stopping a session closes its conversation; the child goes when the last one
does. The routing is the whole of what makes this safe, and the plan note
that specified it required the app itself as the instrument, so that is how it
was checked: two sessions in one project, a prompt in each, each answer landing
in its own transcript — then the shared child killed with-9, after which
both sessions resumed on a fresh one. -
HZ_SESSION_IDtravels with the turn rather than with the process. A child
serving several sessions has one environment and could not name five sessions
with it, which is whathz issue linkwith no id defaults to. The agent exports
the id of the session a tool child belongs to, and the app resolves either
spelling — its own uuid or the agent's id — through one funnel, so the CLI and
the skill did not change.
Fixed
- A weekly usage limit is classified as one. The provider's own words
("you've reached your weekly usage limit for your plan") matched none of the
classifier's patterns, so the request was retried against a limit with hours to
go. - The installer attached to a release is that version's. The bundle directory
sits inside the cachedtarget/, so an older version's installer was still
there and a glob uploaded it beside the right one — 0.20.8's 13MB setup was
attached to 0.20.9, 0.20.11 and 0.20.12 alike, and a reader picking the wrong
row installed a build from three releases ago. - The slow-read line floats on the float veil. It wore
--card, which under
vibrancy is a 5.5% white veil with no blur, so session titles read straight
through its own words. It also moves to the top of the conversation column,
where it stops covering the sidebar it was never about. - A
#7the repository knows is a chip. An agent that has just opened a pull
request says so in prose, and the number is now pressable — opening the PR pane
in the app rather than a browser. A number nothing holds stays the words it was
written as. - A session's slash commands survive a restart. The agent publishes them when
a session opens, so a reopened session had no child to have published anything
and the menu did not open at all. The last list is kept per session now. - The wait a
/compacttakes is drawn. The wire says nothing about a
compaction, so the indicator is derived from the prompt this app sent: the
newest prompt names the command and the turn is still open. - A prompt with nothing in it is never sent, and the composer's row keeps its
three nodes in place. - A project attached at
/has a name, and a session's project is resolved
from the main worktree rather than from the tree the caller stood in — which is
what made a session created inside a linked worktree read a directory that does
not exist. - macOS 12 is the floor the browser already required. Three releases failed on
the universal build withUndefined symbols: ___isPlatformVersionAtLeast,
because the CEF objects are built for 12 while the app linked for 11 — and the
clang runtime the ggml objects ask for is linked explicitly now. - Windows stages the agent the way macOS does.
What's Changed
- fix(paths): name the root instead of nothing by @Hamertingo in #31
- fix(agent): apply picks before a prompt is queued by @Hamertingo in #32
- feat(agent): show the wait a compaction takes by @Hamertingo in #33
- feat(chat): open the pull request a message names by @Hamertingo in #34
- feat(composer): keep the command list a session was sent by @Hamertingo in #35
- feat(agent): give a session a goal the agent owns by @Hamertingo in #36
- feat(brand): bring the new identity to main by @Hamertingo in #37
- fix(ui): draw the slow-read line on the float veil by @Hamertingo in #38
- fix(release): publish this version's installer, not a stale one by @Hamertingo in #39
Full Changelog: v0.20.13...v0.20.14
v0.20.12
Fixed
- The Windows installer stages what the macOS one stages. It was extracting
32,000 files and 524MB —node_modules\json-schema…under NSIS's progress bar
— because the two launchers were two copies of one staging rule and only the
shell script had been fixed. The rule lives in one script both call now, and
the tree it produces is 1,286 files and 89MB. 0.20.11 installs correctly and
slowly; this one installs correctly.
What's Changed
- Stage the Windows agent the same way the macOS one is staged by @Hamertingo in #26
- Release 0.20.12 by @Hamertingo in #27
- Give 0.20.12 the section the release reads by @Hamertingo in #28
Full Changelog: v0.20.11...v0.20.12
v0.20.11
Changed
-
Windows draws its own window. The system title bar is gone
(decorations: false, in atauri.windows.conf.jsonoverlay so nothing else
moves), the corners are rounded by CSS from the app's own radius, and the three
window controls are the app's — which is not decoration: with no system chrome
they are the only way to minimise, maximise or close. Every drag region
reserves their width. The default menu bar Tauri draws in-window goes with it.
This shipped as 0.20.10, whose release never published. -
The agent's boot is cached, and a quarter to a half of it is gone.
initializewas 1.6s cold and 2.0–2.6s on repeated children, all of it V8
parsing the bundle.NODE_COMPILE_CACHEwrites nothing for this tree; the API
that works runs as a--importpreload, and it is only written on a clean
exit — which is why an earlier measurement of this found zero bytes. Measured
through the launcher the bundle ships: 1.59s → 0.82s, and 1.34s → 0.96s on
a repeat. -
A quarter off per-turn work. One lock per session instead of one global map
lock; each agent line parsed once, with usage updates held for the frame; the
transcript loads its newest turns first and pages backwards; the sidebar, split
view and panels are memoized against per-delta renders; dialogs, pages and pane
bodies load as chunks (2,436 kB → 2,268 kB); the release profile gets thin LTO,
one codegen unit and strip, with devtools dev-only.
Fixed
-
The macOS build links again, and the floor is honest. The app declared
macOS 11 while the CEF build it ships is built for 12, so the linker asked for
___isPlatformVersionAtLeastand found nothing to provide it — three releases
in a row failed onaarch64-apple-universalwithUndefined symbols. The
deployment target is now 12.0, which is what the browser has been requiring
anyway: an app that cannot start on 11 should not say it can. -
A model's window is the model's, not the gateway's guess. A reseller
servingdeepseek-v4.1-flashunder a provider id of its own had no catalog
entry, so a session compacted at 200k while the model runs at a million — and
the settings row drew200k defaultbecause the window is only ever stated on
a usage update, which needs a session already running the model. The agent now
states it on the model itself (ACP_meta), the app reads it ontoModel, and
a stated figure also overrides what the gateway claims when a model ref is
stamped. -
A model's name is decoded. A gateway that names its catalog
publisher/modelreaches the wire asdeepseek%2Fdeepseek-v4.1, and the name
drew with the escape in it — worse, the brand table then keyed off no vendor at
all. The split still happens on the wire's own separator, which has its own
test: decoding first would hand the model a name that is the provider's tail. -
No more console windows flashing on Windows. A console program started by
an app that has no console gets a new console allocated, and that console is a
window for as long as the child runs — sogit,ghand the agent each
flashed one, and attaching a project was a screenful.
What's Changed
- Stop the Windows gate from running for a React-only change by @Hamertingo in #15
- Keep the console trait import inside the function that uses it by @Hamertingo in #16
- Perfil de release com thin LTO + 1 codegen unit + strip, e devtools só by @Hamertingo in #9
- Cada linha do agente parseada uma vez (o demux do prompt reusa o `Valu by @Hamertingo in #10
- Decode the escapes a model's name arrives with by @Hamertingo in #17
- Know the window of a gateway model the catalog has never heard of by @Hamertingo in #18
- Apply a stated window where the provider's own would reach a ref by @Hamertingo in #19
- Carry a model's window from the agent to the screen that draws it by @Hamertingo in #20
- O lock do mapa guarda só o formato do mapa; cada sessão tem lock própr by @Hamertingo in #11
- Seleção carrega as 400 turns mais novas e pagina para trás no scroll; by @Hamertingo in #12
- Dialogs, páginas e painéis em chunks sob demanda. by @Hamertingo in #14
- Cache the compile of the bundle the agent parses on every boot by @Hamertingo in #21
- Release 0.20.11 by @Hamertingo in #22
- Write down what one child serving many sessions would take by @Hamertingo in #23
- Link for the macOS version the browser already requires by @Hamertingo in #24
- Link clang's runtime, which the ggml objects ask for by @Hamertingo in #25
Full Changelog: v0.20.10...v0.20.11
v0.20.9
Changed
- The bundle carries the agent, not its build tree. Staging ran
pnpm install --prodinside the copy, which resolved every dependency of
every workspace package: 32,077 files and 524MB, where the shipped CLI runs
dist/— 771 files that already have every JavaScript dependency inlined. What
a bundle cannot carry is a native module, so the stage now copies exactly the
packages esbuild markedexternal, read off the build's own metafile. The tree
is 1,289 files and 205MB, and that number is not about disk: NSIS extracts
file by file, so installing was minutes ofExtract: agent\app\node_modules\@smithy\core\…and is now seconds. Verified by
running the staged agent, not by trusting the copy —initializeand
session/newboth answered from the trimmed tree.
Fixed
- The installer carries the app's icon.
bundle.windowswas empty, so NSIS
drew its own defaults while installing — the title bar, the Add/Remove Programs
entry and the uninstaller showed Tauri's mark rather than this app's.
bundle.iconhad always covered the installed app; nothing covered the
installer. - The Windows updater entry is written. The
jqthat builds it used
windows-x86_64as a bare object key, which jq cannot parse — the step failed
with a compiler error and the release published macOS alone. It never ran
before: the artifact guard above it failed first, every time. - No more console windows flashing on Windows. A console program started by
an app that has no console of its own — which every GUI app hasn't — gets a
new console allocated, and that console is a window for as long as the child
runs.git,ghand the agent are all console programs, so attaching a project
flashed a screenful of windows titledhz-agent. Every spawn in the app now asks
forCREATE_NO_WINDOW, through one trait inproc.rs; a newCommand::newthat
forgets it is a black window on somebody's screen. Nothing to do elsewhere — a
unix child has no console to be given. - Staging refuses a runtime it cannot ship. The node copied beside the
launcher was copied without being run, andbetter-sqlite3is compiled for one
ABI — so a Homebrew node (a thin binary plus dylibs at absolute paths) or a
module built under a different major produced a bundle whose agent never
answers. Both are checked now, with the cure in the message, because the
failure they prevent is an app that opens and a session that does nothing.
Fixed
What's Changed
- Install in seconds: stage the agent's bundle, not its build tree by @Hamertingo in #5
- Stop every spawned child from opening a console on Windows by @Hamertingo in #6
- Make the console trait import survive a cfg, and the node copy readable by @Hamertingo in #7
Full Changelog: v0.20.8...v0.20.9
v0.20.8
Fixed
- The Windows release publishes. 0.20.7 came out for macOS alone: the job
that uploads the installer expected a*.nsis.zipbeside the setup.exe, which
is the layout Tauri v1 produced — this bundle is v2, where the setup.exe
is the updater artifact and carries its own signature. The guard failed a
bundle that was complete, and the manifest job never ran. Nothing about the
app changed here; the tag exists so the release could be cut again without
moving one that had already been pushed.
What's Changed
- Say what this app is, and how to get it by @Hamertingo in #2
- Correct what the front page said that the tree no longer does by @Hamertingo in #3
- Look for the Windows updater artifact Tauri v2 actually writes by @Hamertingo in #4
Full Changelog: v0.20.7...v0.20.8
v0.20.7
Added
- hz runs on Windows. An installer, and the agent staged for that platform
beside the one macOS already ships — so the app is still one download:
configure a provider, pick a model, work.hzin a terminal reaches the app
there too, over a named pipe rather than a socket, so an agent inside a
session can still create and message sessions.
Changed
- The release manifest names both platforms. An installed copy on either one
updates itself from the same channel, and the two entries are merged rather
than one overwriting the other.
Not there yet
- The in-app browser is macOS only, which it always was. A Windows build has
no Browser tab — the CEF bindings are not compiled there. - "Open in app" and the terminal opener are macOS only. Windows is told so,
with the path to copy, rather than handed a button that does nothing.
What's Changed
- Port hz to Windows by @Hamertingo in #1
New Contributors
- @Hamertingo made their first contribution in #1
Full Changelog: v0.20.6...v0.20.7
v0.20.6
Added
- The PR tab says how to turn pull requests on. Without the GitHub
CLI the tab simply vanished, so nothing said that one install puts
pull requests on screen. It now stays, draws the command to run with
a copy button, and a terminal to paste it into. - Dray can ask you a question in the app. A short survey card may
appear for installs with usage reporting on; turning reporting off in
Settings turns it off too.
Full Changelog: https://github.com/Hamertingo/hz/commits/v0.20.6