89 Commits
Author SHA1 Message Date
zeekay 63ded9f0d8 i18n: the composer speaks the reader's language
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.
2026-10-22 15:15:03 -07:00
zeekay acce522fe9 @hanzo/build 0.2.80: Browse is every agent to start from, and Use makes your own
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.
2026-10-22 01:14:16 -07:00
zeekay e672672bc0 @hanzo/build 0.2.79: a suggestion does what it says
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.
2026-10-20 22:26:12 -07:00
zeekay cd4414c987 composer: a model row names its model and says Paused when the plan's usage has paused it, still picked; @hanzo/build 0.2.78 2026-10-20 21:45:40 -07:00
zeekay 83a167e331 design systems are CSS custom properties, the form Studio's renderer takes, so a deck made with one renders; @hanzo/build 0.2.77 2026-10-20 21:20:54 -07:00
zeekay afe2e81fb5 Library and Scheduled tasks for a host's sidebar: Upload and the kinds (the kind in the address, -/artifacts/<kind>), New task and the person's tasks; @hanzo/build 0.2.76 2026-10-20 21:13:36 -07:00
zeekay 4665c86fbf reply: a fenced block named both ways (html otter.html) is named by its file; @hanzo/build 0.2.75 2026-10-20 20:48:19 -07:00
zeekay 15c2be89d0 plugins: the design system a plugin made reaches the host, so it is attached and the maker turns off; @hanzo/build 0.2.74 2026-10-20 19:36:56 -07:00
zeekay 30cff69669 Dev's own places, Settings' sections and Customize's tabs for a host's sidebar; Customize opens on Agents, each agent a profile page, and Add default agents makes the host's cast; @hanzo/build 0.2.73 2026-10-20 16:56:59 -07:00
zeekay b998eedd36 summary: the test's icon mock names the lead's mark; @hanzo/build 0.2.72 2026-10-20 16:29:09 -07:00
zeekay b640a93b07 summary: the Outputs and Sources panel on the kit menu's rows, Create file or site a row like the rest, 8px clear of its mark; @hanzo/build 0.2.71 2026-10-20 16:28:49 -07:00
zeekay 8b9cf652ee composer: Manual asks before a plugin or a run, Chat offers Auto and Manual and Dev adds Plan; three suggestions always; one Gutter for every pane edge; Dev opens on Build what's next; @hanzo/build 0.2.70 2026-10-20 16:25:49 -07:00
zeekay 626ff36639 design systems: made by chat, kept as Studio brands, attached from + › Design system; an attached one is said to the model and drives decks; @hanzo/build 0.2.69 2026-10-20 16:00:18 -07:00
zeekay b68a9f5156 gear: a skill or plugin stays with the conversation it was picked in; only Research, Memory and the mode carry to the next; @hanzo/build 0.2.68 2026-10-20 15:15:33 -07:00
zeekay dc54872467 @ and /: the list reads from the left; @hanzo/build 0.2.67 2026-10-20 14:52:21 -07:00
zeekay 5cb0a82608 menus: a press on a shelf opens it, never shuts it; a plugin's own answer is the answer; @hanzo/build 0.2.66 2026-10-20 14:26:47 -07:00
zeekay aeafe70de3 menus: a shelf is drawn only while open and takes the pointer — a closed one lay under the menu and caught its clicks; @hanzo/build 0.2.65 2026-10-20 13:58:25 -07:00
zeekay c7b8205eae composer: the plugins — + › Plugins and @ — ride every message in Chat and Dev; @hanzo/build 0.2.64 2026-10-20 13:21:51 -07:00
zeekay 58c2e7dc39 composer: the model list scrolls and opens on its first forty; a phone's controls are a finger wide; dictation opens the microphone chosen (voice 0.1.19); @hanzo/build 0.2.63 2026-10-20 13:05:13 -07:00
zeekay 67d45364b9 composer: the row under the frame keeps the frame's width; the round's ink is the accent's; Chat's dictation names its language; @hanzo/build 0.2.62 2026-10-20 12:43:38 -07:00
zeekay 143dc558d0 @hanzo/build 0.2.61 2026-10-20 11:55:21 -07:00
zeekay f30d8abbd8 @hanzo/build 0.2.60 2026-10-17 08:49:18 -07:00
zeekay 9285e6ea6b @hanzo/build 0.2.59 2026-10-17 04:14:06 -07:00
zeekay d8082f9259 @hanzo/build 0.2.58 2026-10-17 04:10:01 -07:00
zeekay 14660f43f6 @hanzo/build 0.2.57 2026-10-16 18:28:44 -07:00
zeekay 77372252ed @hanzo/build 0.2.56 2026-10-16 13:43:00 -07:00
zeekay f02c32f0ec @hanzo/build 0.2.55 2026-10-16 12:44:06 -07:00
zeekay 7eda848bf5 panel: the header's Panel button is an icon, the outline's mark; 0.2.54
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.
2026-10-16 10:09:45 -07:00
zeekay ca8235cd1c @hanzo/build 0.2.53 2026-10-10 10:01:33 -07:00
zeekay c61c243a9d one composer, one model and effort, one side panel for Dev, ready for Chat
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.
2026-10-10 10:01:33 -07:00
zeekay bfe222d3f5 route: a builder address is also a real path under the host's mount
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.
2026-10-10 10:01:33 -07:00
zeekay 9f1db22850 plan: the account menu leads with the plan, credits live in Billing
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.
2026-10-10 10:01:33 -07:00
zeekay 95876d98e7 A project is a repository: Projects lists the forge's, one opens at <org>/<repo>; 0.2.52
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
2026-10-08 13:03:11 -07:00
zeekay 266f5203d7 keys: as many API keys as you need, each revoked on its own
/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
2026-10-04 21:31:49 -07:00
zeekay a3c6f1fc6f feat(new): the repository picker offers the org's GitHub repositories, and a run on one works on GitHub; 0.2.50 2026-10-04 16:49:20 -07:00
zooqueenandHanzo Dev c747ee811c Connect card, billing, machines, codebases, projects, and issues controls to backend; @hanzo/build 0.2.49
- 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]>
2026-10-04 13:55:14 -07:00
zooqueenandHanzo Dev 1fce0d8221 Payment with no card on file leads with Add card as the page's primary control; @hanzo/build 0.2.48
Co-authored-by: Hanzo Dev <[email protected]>
2026-10-04 10:46:33 -07:00
zooqueenandHanzo Dev 49ffa5fbec A card the processor refused, or one typed wrong, says so in red as an alert under the field; @hanzo/build 0.2.47
Co-authored-by: Hanzo Dev <[email protected]>
2026-10-04 10:37:37 -07:00
zooqueenandHanzo Dev 871125c8eb An org's owner adds and removes its cards, and Payment with no card on file leads with Add card; a saved card or a removal says so in a toast, and adding one charges nothing; @hanzo/build 0.2.46
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]>
2026-10-04 10:30:03 -07:00
zooqueenandHanzo Dev 9d0ea7c117 Automations post to the organization's X, LinkedIn and Facebook accounts, reviewed first or as written, and each run shows the post and where it went; Integrations connects the social accounts and says what one not set up needs; a run refused for want of a plan offers the plans; @hanzo/build 0.2.45
Co-authored-by: Hanzo Dev <[email protected]>
2026-10-04 10:15:28 -07:00
zooqueenandHanzo Dev a9f3024ec3 Settings drops the group label under its own heading; 0.2.44.
Co-authored-by: Hanzo Dev <[email protected]>
2026-10-04 09:36:45 -07:00
zooqueenandHanzo Dev 89b51d1800 A new automation asks for its name, then its instructions, before it saves or switches on; Save sits in a bar that stays in view and says what is unsaved; starters fill a new one; a run refused for want of credit says so; @hanzo/build 0.2.43
Co-authored-by: Hanzo Dev <[email protected]>
2026-10-04 08:59:17 -07:00
zeekay 989a1d03c9 feat(models): every model the catalog lists, through @hanzo/ui ModelPicker; Enso by default, a premium pick held for the run it starts; @hanzo/build 0.2.42 2026-10-04 01:21:45 -07:00
zooqueenandHanzo Dev e110c27c4a Automations open, edit, switch, run and show their runs on /v1/auto/automations; a row opens its editor and New goes straight to it; @hanzo/build 0.2.41
Co-authored-by: Hanzo Dev <[email protected]>
2026-10-04 00:40:25 -07:00
zooqueenandHanzo Dev 230cf0e6c4 A machine nothing has reached is not offered as a place to run, and a failed re-read of Machines keeps the rows; @hanzo/build 0.2.40
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]>
2026-10-03 23:43:57 -07:00
zooqueenandHanzo Dev 50b6ae43d7 Register a machine reads only what is typed, names an unnamed one after its hostname, and lists it as not seen yet until it beats; @hanzo/build 0.2.39
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]>
2026-10-03 23:37:23 -07:00
zooqueenandHanzo Dev ed5cd70ee6 A starter's picture is whole: its frame has the capture's own 16:10 shape and the page's top edge; @hanzo/build 0.2.38
Co-authored-by: Hanzo Dev <[email protected]>
2026-10-03 23:24:02 -07:00
zooqueenandHanzo Dev b2f448d1c4 A cleaned return keeps the page's own query exactly as written; @hanzo/build 0.2.37
Co-authored-by: Hanzo Dev <[email protected]>
2026-10-02 14:46:53 -07:00
zooqueenandHanzo Dev 2157f0e9d4 A build that failed or has run ten minutes says so in the preview and offers Publish again; @hanzo/build 0.2.36
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]>
2026-10-02 13:41:53 -07:00
zooqueenandHanzo Dev 0f2beeae49 Integrations names itself as the return for GitHub and Slack connects and finishes what the return carries; @hanzo/build 0.2.35
Co-authored-by: Hanzo Dev <[email protected]>
2026-10-02 13:07:09 -07:00