The empty Chat's composer, its + menu, dictation, voice mode, the row
under the frame (model, effort, mode) and the starters draw their words
through @hanzo/i18n's t; a starter's prompt is sent in the words pressed.
Right to left, the panel stands at the line's start and its grip turns.
@hanzo/i18n is a peer, so the host's provider is the one asked.
The host's default agents, its personas and the platform's presets are one
gallery with search and categories. Use makes one agent of the org's own from
one template under the first free name (Einstein, then Einstein-2), with its
face, and opens its profile; nothing is added in bulk, so a new org has none.
Start from scratch, Clone yourself and Create from a person make one too.
Each row carries a typed act and pressing it does it at once: open opens
the item it names (a conversation, a run, an issue, a creation), send
starts a chat with its prompt, task starts a Dev run, schedule makes the
scheduled task and shows it. The model names one of the four; a row it
cannot bind (an open of an item the activity does not hold, an act with
no prompt, a time `every` cannot read) is dropped, never repaired. The
whole row is the one target, its title one short action, its × kept.
hand and taken carry a send or a task to the product that does it,
through same-tab session storage, so an address never carries one.
book makes a schedule row's task.
The composer rests at two rows, a line of text and the tools, and grows
with the text; the dictation chevron shows only while the mic is reached
for.
The button drew a sidebar glyph and the word Panel. The app's sidebar
toggle is the window's, at its top-left, and the same glyph again at the
header's right end read as one control drawn twice. It is now a 32px icon
among the header's icons, TableOfContents, lit while the panel is open.
Its name, its keys and its slot are unchanged.
Dev now draws what Chat draws, from one set of parts that @hanzo/rooms
imports from here:
- mind.ts: the model and effort are one choice kept in the browser
(hanzo.mind) and read by New, a run's follow-up, a project's chat and
Settings -> Code; the catalog (GET /v1/models) is read once per
platform, and a read refused (429 once the quota is spent) shows the
last list this browser kept, with a note, else Enso alone and the
reason in a reader's words. Enso at Medium by default; a premium pick
holds for its screen only. A run always names its model, Enso as
enso-auto: one that names none takes the person's saved coding default.
- prompt.tsx: the composer (attach, the surface's tools, the model and
effort chip, dictation, send), as wide as the text above it, on
@hanzo/ui's Composer, with @hanzo/voice for dictation.
- reply.tsx: Copy, Listen and Open under every answer; an answer's fenced
block opens in the side panel rendered from its own bytes.
- panel.tsx and tabs.ts: the side panel as tabs (Preview, Artifacts,
Files, Diff, Terminal; Desktop, Environment and pages from +), opened
and shut from the header's Panel button or Ctrl/Cmd+., reordered by
drag or Ctrl+Shift+Arrow, kept as left; a sheet on a phone that starts
closed. The toggle is a mark below lg and while open, and below lg an
open panel's own close stands in for it, so a tablet's run header keeps
its title.
- prose.tsx and the transcript read at Chat's sizes and measure; a failed
run ends on @hanzo/ui's Failure.
The e2e suite follows: a desk helper for the tabs, the labels and keys of
the new composer and panel, and prompt.spec.ts and panel.spec.ts at 1440
and 390.
href writes a route as the path a host shows (hanzo.ai/dev/<href>): ''
New, /run/<id>, /projects/<org>/<repo> a repository, /projects/<slug> a
site, /machines and /environments in the rail's words, every other place
its path without `-/`. parse reads one back, and route still decides what
is an address, so a path that names nothing is New. PLACES lists every
address with no record in it, for a host that writes a page per address.
@hanzo/build/route exports the module alone, with no React, for server
code and for pages that must not carry the builder.
label() names a plan by family with its rung as a small tag (max-20x
reads Max, 20x), never a raw slug or an id. useStanding reads the tier,
the limits, the free allowance and the balance once; Meter draws it at
the top of every account menu: a plan's session, day and month as
shares, Free's allowance left today, the balance only with no plan.
Usage is the plan's windows and each class's share, plus the switch
"Use credits when my plan's allowance runs out" (PUT /v1/ai/limits).
Billing holds Credits: prepaid, granted, grants, top-up, auto-reload
(GET/PUT /v1/billing/recharge), spend and its monthly limit. Plan,
Credits and the pure @hanzo/build/plan are exported for other hosts.
Projects is the org's repositories on the forge (GET /v1/git/repos): name,
org, default branch and when it moved, newest first, with a search, Link a
GitHub repo (Sync) and Create from template. The boards it listed before stay
in Issues' project column; Codebase is gone from More, being this same list.
A repository opens its workspace at <org>/<repo> (route kind `repo`): its
runs, an ask on it, Files and Code on it, the site built from it or named as
it is when there is one, Publish as a new site when there is not, and a
switcher over the org's repositories. A repository the forge does not hold,
or one of another org, says so. Files says what the forge answered when the
repository has nothing at the ref.
A run names a project: New with none chosen opens the picker and sends
nothing, so no project is made up from an ask's words.
The chat column's ask is a field inside the column, not a pane of its own:
flush with its foot, on the chips' edges, one gutter to the work; its first
line is level with the preview's toolbar. A workspace too narrow for both
(a tablet beside the host's column) shows the work, and the chat when asked.
On a phone the views lead with Chat and Publish is a glyph.
Claude-Session: https://claude.ai/code/session_01SCPMGSQsLNF2YtHFL4bwyp
/v1/account/keys now creates a new key on every POST and revokes one
key by id. The settings page lists every key, creates a secret or a
publishable key with a name and a limit, and revokes a key from its own
row; a revoked key stays listed. 0.2.51
- Billing & Cards: Add card primary action with billing address form, cardholder name, postal code, default card selection, and direct processor validation.
- Machines: Telemetry cards, hardware specs (CPU, RAM, GPU), connection commands with daemon options, and fixed state duplicate badge.
- Forge (Codebases, Projects, Issues): Actionable empty states with Create, Sync, and Templates; interactive repository filters; New repository form reset on dialog close.
- Customizations: Clear contrast for example placeholder text across agents, plugins, and skills forms.
Co-authored-by: Hanzo Dev <[email protected]>
IAM files a founder's membership as role `owner`, and the builder read only
`admin`, so an owner was handed the member's read-only Billing: no Add card,
no Remove. Owner and admin both administer an org now, as IAM itself reads it.
Co-authored-by: Hanzo Dev <[email protected]>
The place picker reads a machine's status the way Machines does (machines.ts
`state`), so a hand-registered machine that has not beaten reads "not seen yet"
and is not offered for a run, which the platform would refuse at dispatch. A
re-read on the beat that fails says so under the list instead of replacing it.
Co-authored-by: Hanzo Dev <[email protected]>
The Name field showed "workshop" as its placeholder, which read as a filled-in
value: a person who left it, picked a kind and typed a hostname got "A machine
needs a name" with no request sent. Both fields now carry no sample text. A
machine left unnamed takes its hostname, the name hanzo link gives it, and one
with neither says "A machine needs a name or a hostname".
The platform reports a hand-registered machine as online until a heartbeat
arrives, so the list draws online, and the green dot, only once one has; before
that it reads "not seen yet". The list is read again every 30 seconds, the
agent's beat, so a machine linked elsewhere appears and one that beats comes
online without a reload.
Co-authored-by: Hanzo Dev <[email protected]>
The project's latest deployment says when a build began and why it failed. A
copy still building ten minutes on reads "Publishing is taking too long" with
how long it has run; a failed one reads its deployment's reason. Both offer
Publish again, which builds the project's repository at its branch through
POST /v1/platform/apps, and a refusal shows the platform's own sentence.
Co-authored-by: Hanzo Dev <[email protected]>