Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
bf92bc9
build(gui): take the ps-blitz 0.4 engine
Sep 6, 2026
af2904c
build(gui): release 0.8.51 with the fixed engine
Sep 6, 2026
aa5ba1c
build(gui): pin the engine at the minor, not the patch
Sep 6, 2026
9a6b96e
feat(gui): take @pathscale/ui 4.0.0
Sep 7, 2026
5676bff
fix(deps): pin @pathscale/ui to ^3.1.0
Sep 7, 2026
6526342
build(gui): pin Solid instead of following its `next` tag
Sep 7, 2026
e38a4aa
feat(gui): finish the UI 3.2 migration
Sep 12, 2026
0998c0e
fix(frontend): keep Solid runtime packages compatible
Sep 12, 2026
0910127
fix(gui): close native UI outcome gaps
Sep 12, 2026
6b83fab
build(gui): take UI 3.2.3
Sep 13, 2026
c75784f
refactor(gui): take lifecycle control from the protocol
Sep 13, 2026
df31c8f
build(store): move AgencyZero to WorkTable 1.9
Sep 13, 2026
962bc8d
refactor(runtime): move headless storage work to Nagoya
Sep 13, 2026
edf6039
feat(store): migrate v2 profiles on first beta load
Sep 13, 2026
f4535d6
docs: keep repository tooling off Node
Sep 13, 2026
8a20e95
Make migrated v3 stores durable before promotion
Sep 13, 2026
a27cd01
Adopt the WorkTable 1.10 mutation API
Sep 13, 2026
ebf03cd
feat(gui): drive Grok as a project agent
Sep 14, 2026
bfcdf95
test(gui): cover the macOS PATH candidates and price key shadowing
Sep 14, 2026
4c90690
test(qa): store the QA profile fixture in WorkTable page format v3
Sep 14, 2026
f84bc23
test(frontend): expect Grok in the catalogue and the prompt list
Sep 14, 2026
2631fcd
fix(gui): resume after compaction only when the app started it
Sep 14, 2026
99dbc5a
ci: check out the sibling repositories the path deps point at
Sep 14, 2026
03e5178
ci: check formatting for this repository's crates only
Sep 14, 2026
b90775d
fix(frontend): stop splitting ordinary words, and clip the composer c…
Sep 15, 2026
56a2536
fix(frontend): restore an explicit prompt height after the shrink reset
Sep 15, 2026
1704b50
ci: give the complete behavior audit room for the suite it now runs
Sep 15, 2026
312d753
build(store): take the published WorkTable 1.10.0-beta1
Sep 16, 2026
4781af5
build(agents): take the published agent-abstraction 0.4.21
Sep 16, 2026
53cef7d
refactor(runtime): take Tokio out of the leaf crates entirely
Sep 17, 2026
2875d9d
refactor(run): make stop and failure facts, not messages on a queue
Sep 17, 2026
5e677e7
refactor(run): bound the worker queues to the depth they can reach
Sep 17, 2026
bf02bd2
refactor(runtime): give az its own pool instead of tokio's global one
Sep 17, 2026
8ec4bf6
refactor(run): flow injected messages forward as Arc, off tokio time …
Sep 17, 2026
4cdc2b9
refactor(run): give the run's three stop facts one wake, not three arms
Sep 17, 2026
893541b
refactor(run): send the liveness ping without a worker or a queue
Sep 17, 2026
87f4bf5
refactor(run): send the cliff steers without a worker or a queue
Sep 17, 2026
98e934d
refactor(items): take join! from futures rather than tokio
Sep 17, 2026
7dfb9d9
refactor(run): the idle window belongs to the receive, not beside it
Sep 17, 2026
ee517fa
fix(run): a provider error must fit the row it is written to
Sep 17, 2026
539e97a
refactor(run): the approval deadline and the run registry leave tokio
Sep 17, 2026
e4d3d06
fix(settings): a language change must not hide a searched section
Sep 17, 2026
04b7024
refactor(run): one injection path for both of the loop's waits
Sep 17, 2026
2454eae
test(settings): pin the section that vanished mid-reindex
Sep 17, 2026
f102d4f
test(run): drive the write that lost the turn, against a real store
Sep 17, 2026
a966b32
docs: the QA descriptor is a socket, not just a file ps-qa reads
Sep 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,15 @@ jobs:
- name: Build the AgencyProxy sidecar
run: scripts/stage-agency-proxy-sidecar.sh

- run: cargo fmt --all --check
- name: Build the WorkTable v2 migration reader
run: scripts/stage-wt-v2-reader-sidecar.sh

# Named per workspace member rather than `--all`, which reaches into any
# path dependency and reports another repository's formatting as this
# job's failure. Nothing is taken by path from outside the workspace
# today, but a local `[patch]` or a temporary override reintroduces that
# the moment someone adds one, and the failure reads as ours.
- run: cargo fmt --check -p az-gui -p az-core -p az-mcp-proxy -p wt-migrate -p agency-tools
# Blitz is currently a macOS preview runtime. Enabling every feature on
# this Linux runner asks it to implement Tauri's GTK-only runtime traits,
# which is separate portability work rather than Linux CI for AgencyZero.
Expand Down
15 changes: 14 additions & 1 deletion .github/workflows/qa-panel.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ jobs:
- name: Stage the agency-proxy sidecar
run: scripts/stage-agency-proxy-sidecar.sh

- name: Stage the WorkTable v2 migration reader
run: scripts/stage-wt-v2-reader-sidecar.sh

# blitz-inspector, NOT blitz-runtime: a blitz-runtime build answers every
# inspector call with diagnosticsUnavailable, so the run would fail with
# every check unable to see anything rather than with a real verdict.
Expand Down Expand Up @@ -203,7 +206,17 @@ jobs:
id: full
if: ${{ github.event_name == 'pull_request' || (github.event_name == 'workflow_dispatch' && inputs.group == '' && inputs.suite != 'focused') }}
continue-on-error: true
timeout-minutes: 3
# All 312 checks, one process, on a shared runner. This was 3, which
# the suite outgrew rather than regressed into: the run that tripped it
# reported `passed: 312, failed: 0` and every contrast audit clean, then
# the step timeout killed it at 3m00s. The previous green run finished
# in 2m33s, so the margin was 27s and one more group spent it.
#
# A step timeout is not the per-check budget. `QA_TIMEOUT_SCALE` still
# governs whether an individual outcome is allowed to be slow; this
# only bounds the wall clock of the whole sweep, so raising it does not
# weaken a single assertion.
timeout-minutes: 6
env:
QA_GROUPS: ''
QA_TIMEOUT_SCALE: 2
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/release-experimental.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,9 @@ jobs:
- name: Build the AgencyProxy sidecar
run: scripts/stage-agency-proxy-sidecar.sh

- name: Build the WorkTable v2 migration reader
run: scripts/stage-wt-v2-reader-sidecar.sh

- name: Build experimental bundle
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,9 @@ jobs:
- name: Build the AgencyProxy sidecar
run: scripts/stage-agency-proxy-sidecar.sh

- name: Build the WorkTable v2 migration reader
run: scripts/stage-wt-v2-reader-sidecar.sh

# Ad-hoc signed, and nothing here decides that: `signingIdentity: "-"` in
# tauri.conf.json does. Notarization needs a current Apple Developer
# Program membership and ours has lapsed.
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
# Built by apps/gui/frontend (rsbuild -> ../dist), served by Tauri.
/apps/gui/dist
/apps/gui/binaries/agency-proxy-*
/apps/gui/binaries/agencyzero-wt-v2-reader-*
/crates/wt-migrate/v2-reader/Cargo.lock
node_modules
/output/pdf/
/docs/agencyzero-overview.md
Expand Down
9 changes: 9 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ hardens into procedure moves here; the reasoning stays in memory.

Run what you build before calling it done. **If you can't run it, say so.**

- **Do not introduce Node.js, npm, npx, pnpm, Yarn or Deno.** The existing
frontend uses Bun; keep its install and script paths on Bun. New repository
tooling and harnesses are Rust binaries or plain shell around repository
binaries, not JavaScript runtime scripts.

- Compare against the base branch: a pre-existing failure is not yours, and saying so
requires checking.
- A suspiciously fast build was cached. Force a rebuild when the rebuild is the point.
Expand Down Expand Up @@ -109,6 +114,10 @@ paraphrases were how the old checkbox contract created near-duplicates. Full con
mock (`bun run dev`, port 3010) and is drivable by roles and labels:
[`docs/ui-verification.md`](docs/ui-verification.md). Otherwise build, test, and ask the
owner to look.
- **Native OS file dialogs are outside the control tree.** If a flow needs a
real folder or file pick, ask the owner to operate the panel, then inspect
the in-app result. Typed-path checks are a different control. Guide:
[`docs/debugging.md`](docs/debugging.md#native-os-file-dialogs).
- **Never touch the running System instance**, its process, files or data directory. The
store is single-writer. Use the Dev instance (`tauri.dev.conf.json`).
**Check before you decide it is closed, and check by the right name.** The binary is
Expand Down
5 changes: 3 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ members = [
"crates/wt-migrate",
"crates/agency-tools",
]
exclude = ["crates/wt-migrate/v2-reader"]

[workspace.package]
version = "0.8.50"
version = "0.8.64"
edition = "2024"
publish = false

Expand All @@ -26,7 +27,7 @@ agency-proxy-protocol = "^0.1.8"
# The GUI and both storage tools compile the same schema against one resolved
# WorkTable package. A workspace dependency prevents their compatible ranges
# from drifting into separate copies without freezing the selected patch.
worktable = "^1.0.0-beta"
worktable = "1.10.0-beta1"

# Heavy deps are declared per-crate on purpose: only apps/gui pulls in the
# Tauri stack, so agent/proxy builds never trigger a webview toolchain build.
Expand Down
32 changes: 19 additions & 13 deletions apps/gui/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ experimental = ["dep:agent-experimental"]
# workspace both already take tauri this way, and neither needs that flag.
webview-runtime = ["tauri/wry"]
blitz-runtime = [
"dep:blitz-control-protocol",
"dep:blitz-dom",
"dep:blitz-script",
"dep:brotli",
Expand Down Expand Up @@ -63,7 +64,7 @@ tauri-build = { version = "2", features = [] }
[dependencies]
# Carries the store forward when a column changes; see crates/wt-migrate.
wt-migrate = { path = "../../crates/wt-migrate" }
agent-abstraction = "0.4.19"
agent-abstraction = "0.4.21"
agency-proxy-client.workspace = true
agency-proxy-protocol.workspace = true
agent-experimental = { version = "^0.1.3", default-features = false, optional = true }
Expand All @@ -80,18 +81,23 @@ az-core.workspace = true
worktable.workspace = true
# The `worktable!` macro emits code that names these by bare path rather than
# through a re-export, so a consumer of the macro has to declare them too.
# Versions match worktable 1.0 beta's own, since a mismatch produces errors that name
# Versions match WorkTable 1.9's own, since a mismatch produces errors that name
# the wrong crate.
eyre = "0.6"
rkyv = { version = "0.8.9", features = ["uuid-1"] }
derive_more = { version = "2.0.1", features = ["from", "error", "display", "debug", "into"] }
futures = "0.3"
nagoya = "^0.1"
backon = { version = "1.6.0", default-features = false }
libc = "0.2"
dirs = "6"
uuid = "1"
chrono = { version = "0.4", default-features = false, features = ["clock", "serde", "std"] }
tokio = { version = "1", features = ["process", "rt-multi-thread", "time"] }
# Tauri owns the live GUI runtime and exposes Tokio-native tasks. AgencyProxy's
# Unix sockets plus git/gh child processes also require Tokio's concrete I/O
# types, so this compatibility boundary remains direct and declares every API
# this crate calls instead of borrowing transitive features.
tokio = { version = "1", features = ["fs", "io-util", "net", "process", "rt-multi-thread", "signal", "sync", "time"] }
# Default features are off; see `webview-runtime` for why.
tauri = { version = "2", default-features = false, features = ["macos-private-api", "compression"] }
# `macos-private-api` must match the `tauri` dependency above. Tauri's
Expand All @@ -101,7 +107,8 @@ tauri = { version = "2", default-features = false, features = ["macos-private-ap
# 0.1.0 the runtime's own feature forwards to `tauri` and `tauri-runtime`, so
# naming it here agrees with that rather than being the only thing holding the
# two sides together.
tauri-runtime-blitz = { version = "^0.3", optional = true, features = ["macos-private-api"] }
tauri-runtime-blitz = { version = "^0.4", optional = true, features = ["macos-private-api"] }
blitz-control-protocol = { version = "^0.5", optional = true }
#
# The engine by version, not by branch. Same move `chuzz` made, for the same
# reasons its manifest records.
Expand All @@ -114,15 +121,14 @@ tauri-runtime-blitz = { version = "^0.3", optional = true, features = ["macos-pr
# resolved anyrender from crates.io at 0.12.0, and the build stopped at
# "failed to select a version".
#
# A caret is what was meant. `cargo update` moves it, `Cargo.lock` records what
# was resolved, and anything else asking for the same range gets the same crate
# rather than a second copy of the engine - which is the failure that reads as
# `expected ScriptDocument, found ScriptDocument` with both types naming one
# file. Working against a local checkout stays possible through the `[patch]`
# entries in `.cargo/config.toml`, so the default exercises what a release
# actually resolves.
blitz-dom = { package = "ps-blitz-dom", version = "^0.3", features = ["system-fonts", "parallel-construct"], optional = true }
blitz-script = { package = "ps-blitz-script", version = "^0.3", features = ["system-fonts"], optional = true }
# A caret is what was meant. Every lockless build resolves the compatible family
# afresh, and anything else asking for the same range gets the same crate rather
# than a second copy of the engine. Two incompatible families produce the failure
# that reads as `expected ScriptDocument, found ScriptDocument` with both types
# naming one file. Local renderer work uses `.cargo/local-renderer.toml` through
# `scripts/local-renderer.sh`, so the default exercises the published graph.
blitz-dom = { package = "ps-blitz-dom", version = "^0.4", features = ["system-fonts", "parallel-construct"], optional = true }
blitz-script = { package = "ps-blitz-script", version = "^0.4", features = ["system-fonts"], optional = true }
brotli = { version = "8.0.4", default-features = false, features = ["std"], optional = true }
url = { version = "2.5.8", optional = true }
tauri-plugin-updater = "2"
Expand Down
4 changes: 4 additions & 0 deletions apps/gui/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,10 @@ fn strip_unused_frameworks() {
}

fn main() {
println!(
"cargo:rustc-env=AZ_BUILD_TARGET={}",
std::env::var("TARGET").expect("Cargo supplies TARGET")
);
strip_unused_frameworks();
stamp_build();
if std::env::var_os("CARGO_FEATURE_BLITZ_RUNTIME").is_some() {
Expand Down
9 changes: 5 additions & 4 deletions apps/gui/frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"type": "module",
"private": true,
"overrides": {
"@solidjs/signals": "2.0.0-rc.4",
"babel-preset-solid": "^2.0.0-rc.0"
},
"scripts": {
Expand All @@ -23,14 +24,14 @@
},
"license": "MIT",
"dependencies": {
"@pathscale/ui": "^2.11.6",
"@solidjs/web": "next",
"@pathscale/ui": "^3.2.3",
"@solidjs/web": "2.0.0-rc.4",
"@tauri-apps/api": "^2.1.1",
"clsx": "^2.1.1",
"popmotion": "^11.0.5",
"promptsyntax": "^0.1.0",
"solid-js": "next",
"solid-layouts": "^0.2.1",
"solid-js": "2.0.0-rc.4",
"solid-layouts": "^0.2.4",
"tailwind-merge": "^3.6.0"
},
"devDependencies": {
Expand Down
35 changes: 35 additions & 0 deletions apps/gui/frontend/src/api/fixtures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,23 @@ export const AGENT_STATUS: AgentStatus[] = [
},
checkedAt: ago(2 * 60_000),
},
{
agent: "grok",
state: "connected",
version: "1.0.30",
minVersion: "1.0.30",
caps: ["fork", "thread id"],
capabilities: {
session: true,
fork: true,
events: true,
nativeSystem: true,
commands: true,
liveFollowUp: true,
approvals: true,
},
checkedAt: ago(2 * 60_000),
},
];

/**
Expand Down Expand Up @@ -488,6 +505,23 @@ export const MODEL_CATALOGUE: AgentModels[] = [
pinned("gpt-5.4-mini", "GPT-5.4-Mini", "Small, fast, cost-efficient model.", TO_XHIGH),
],
},
{
agent: "grok",
source: "cli",
checked: "2026-09-13",
against: "grok 1.0.30",
discovered: false,
models: [
pinned(
"grok-4.6",
"Grok 4.6",
"Default Grok Build model",
["minimal", "low", "medium", "high", "xhigh"],
true,
),
pinned("grok-4.5", "Grok 4.5", "", ["minimal", "low", "medium", "high", "xhigh"]),
],
},
{
agent: "copilot",
source: "picker",
Expand Down Expand Up @@ -591,6 +625,7 @@ export const SETTINGS: GlobalSettings = {
default: "gpt-5.6-sol",
},
copilot: { enabled: ["auto"], default: "auto" },
grok: { enabled: ["grok-4.6", "grok-4.5"], default: "grok-4.6" },
},
defaultPermission: "read_only",
defaultEffort: "high",
Expand Down
4 changes: 2 additions & 2 deletions apps/gui/frontend/src/api/mock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ function deepMerge<T>(target: T, patch: DeepPartial<T>): T {
return out;
}

const MODERATOR_AGENTS = ["claude", "codex", "copilot"] as const;
const MODERATOR_AGENTS = ["claude", "codex", "copilot", "grok"] as const;

/** Mirror Rust's backwards-compatible moderator model normalization. */
function normalizeModeratorModel(settings: GlobalSettings): string {
Expand Down Expand Up @@ -900,7 +900,7 @@ export function createMockApi(): AgencyZeroApi {
*/
listQuota: () =>
settle({
agents: (["claude", "codex", "copilot"] as const).map((agent) => ({
agents: (["claude", "codex", "copilot", "grok"] as const).map((agent) => ({
agent,
supported: false,
windows: [],
Expand Down
6 changes: 5 additions & 1 deletion apps/gui/frontend/src/components/PillMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,11 @@ export function PillMenu<T extends string>(props: PillMenuProps<T>): JSX.Element
<Dropdown.Menu
id={`${props.id}--menu`}
align="start"
class="min-w-[190px] rounded-xl border border-az-hairline bg-base-100 p-1 shadow-[0_18px_40px_rgba(0,0,0,.5)]"
// The native retained renderer appended another shadow paint whenever
// pointer feedback invalidated this hoisted fixed subtree. The menu
// grew darker on every visit even though its DOM stayed flat. Its
// opaque fill and border already separate it from the composer.
class="min-w-[190px] rounded-xl border border-az-hairline bg-base-100 p-1"
>
<For each={props.options}>
{(option) => (
Expand Down
12 changes: 6 additions & 6 deletions apps/gui/frontend/src/features/analytics/AnalyticsTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ import { createMemo, createSignal, For, onSettled, Show } from "solid-js";
import { Button } from "~/components/Button";
import { Icon } from "~/components/Icon";
import { duration } from "~/lib/format";
import { AGENT_LABELS } from "~/lib/labels";
import { whileMounted } from "~/lib/live";
import { tx } from "~/stores/i18n";
import { useWorkspace } from "~/stores/workspace";
import type {
Agent,
UsageAgentValue,
UsageAnalytics,
UsageDay,
Expand Down Expand Up @@ -237,11 +239,7 @@ function AgentValue(props: { agents: UsageAgentValue[] }): JSX.Element {
<div class="rounded-lg border border-az-hairline px-3 py-2.5">
<div class="flex items-baseline justify-between gap-2">
<span class="font-semibold text-az-strong text-ui-label">
{agent.agent === "codex"
? "Codex"
: agent.agent === "claude"
? "Claude"
: agent.agent}
{AGENT_LABELS[agent.agent as Agent] ?? agent.agent}
</span>
<span class="font-mono text-primary text-ui-label">
{agent.costPerCompletedItem === null
Expand Down Expand Up @@ -283,7 +281,9 @@ function SessionBreakdown(props: { sessions: UsageSession[] }): JSX.Element {
<div class="rounded-lg border border-az-hairline px-3 py-2.5">
<div class="flex items-baseline gap-2 text-ui-detail">
<span class="min-w-0 flex-1 truncate text-az-strong">{session.projectName}</span>
<span class="font-mono text-az-muted text-ui-caption-sm">{session.agent}</span>
<span class="font-mono text-az-muted text-ui-caption-sm">
{AGENT_LABELS[session.agent as Agent] ?? session.agent}
</span>
<span class="font-mono text-az-title text-ui-caption">
{dollars(session.costUsd)}
</span>
Expand Down
Loading
Loading