v0.10.0 — one type scale, one icon set, Workers that answer each other#52
Merged
ojowwalker77 merged 4 commits intoJul 22, 2026
Conversation
An inbox request used to create a Task on the receiving Worker and stop there: no session started, no reply path, and nothing told the sender its answer had arrived. Every cross-repository question needed someone to notice the Task and hand-carry the result back. A delegation Task is now the channel, bound at both ends. inbox_send records the Thread that asked; the responder end is the Task's canonical Thread, which migration 063 already made unique per Task, so no second column stores a fact the schema has. WorkerInboxReactor watches for delegation Tasks, spawns a Thread on the receiving Worker, and starts a turn carrying the request. The model comes from that Worker's default and falls back to the requester's; the runtime mode is inherited rather than forced to approval-gated, since a session waiting on a click is what this exists to avoid. Command ids derive from the Task id, so a retry after a partial failure replays instead of spawning a duplicate Thread, and startup sweeps for requests that landed while the server was down. inbox_reply routes a message to the Thread at the other end, so the requester resumes on its own. Either side may keep talking; close: true ends the channel and records the answer. A Thread that is not on the channel is refused, so a Worker cannot push into a conversation it is not part of. requesterThreadId is optional with a null default in the persisted task.created payload. Requiring it would fail to decode every event written before this change and take the server down on startup.
Collapse the type scale to four sizes, the ink hierarchy to three greys, and the radius ladder to nav/card/pill. Move the UI face from bundled Inter to system SF Pro with one inherited -0.15px tracking, remapping the tracking utilities to the same value so no call site can drift off it. Remove transparency end to end: the glass and vibrancy surfaces, the backdrop-filter call sites and their indirection vars, the transparency setting those left as a dead control, and the macOS window vibrancy material the renderer no longer paints under. Bind the UI glyphs to Heroicons instead of thirteen mixed react-icons sub-sets, and route the six files that imported icons directly through lib/icons.tsx — that bypass is how the sets drifted apart in the first place. react-icons stays for brand marks only, which Heroicons does not ship. Heroicons declares no intrinsic size, so the adapter pins 24 the way the icons it replaces did, leaving size-* classes to win. Drop the second in-flight indicator. working-header is now the only one and covers what the orb handled, reading plain "Working" when the turn's start time is not yet known. Project scripts run again. runProjectScript was gutted to a hard error when the terminal was removed; it now goes through the server-owned managed process the sidebar run button already used, so scripts run headlessly and survive reconnects. Both call sites share projectRunLauncher rather than duplicating the launch and optimistic update. Worktree setup scripts are one-shot, so ProjectRunDevServerInput gains a flag that closes the shell when the command returns and lets the existing reaper clear it.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Minor release. Three strands, each removing a way the app could do the same thing two ways.
Clean UI blueprint
Type collapses to four sizes, ink to three greys, radius to nav/card/pill. The UI face moves from bundled Inter to system SF Pro on one inherited
-0.15pxtracking, with thetracking-*utilities remapped to that same value so no call site can drift off it.Transparency is gone end to end: glass and vibrancy surfaces, the
backdrop-filtercall sites and their indirection vars, the transparency setting those left as a dead control, and the macOS window vibrancy material the renderer no longer paints under.One icon system
UI glyphs bind to Heroicons instead of thirteen mixed
react-iconssub-sets. The six files that imported icons directly now route throughlib/icons.tsx— that bypass is how the sets drifted apart in the first place.react-iconsstays for brand marks only, which Heroicons does not ship.Heroicons declare no intrinsic size, so the adapter pins 24 the way the icons it replaces did, leaving
size-*classes to win. Three glyphs have no Heroicons equivalent and take the nearest fit (brain →CpuChipIcon, text-wrap →ArrowUturnDownIcon, split-pane →ViewColumnsIcon/Bars2Icon); git branch, merge, pull-request, robot and worktree still come from the Central set.The duplicate in-flight indicator is gone.
working-headeris now the only one and covers what the orb handled, reading plain "Working" when the turn's start time is not yet known. Drops thethinking-orbsdependency.Project actions work again
runProjectScriptwas gutted to a hard error when the terminal was removed — "Run Dev Desktop" could not run. It now goes through the server-owned managed process the sidebar run button already used, so scripts run headlessly, survive reconnects, and stay stoppable. Both call sites shareprojectRunLauncherrather than duplicating the launch and optimistic update.Worktree setup scripts are one-shot, so
ProjectRunDevServerInputgains a flag that closes the shell when the command returns and lets the existing reaper clear it — otherwise a finishedbun installwould sit in the registry as a live process forever.Workers answer each other
An inbox request used to create a Task on the receiving Worker and stop there: no session, no reply path, nothing telling the sender its answer arrived. Every cross-repository question needed a human to notice the Task and hand-carry the result back.
A delegation Task is now the channel, bound at both ends.
inbox_sendrecords the Thread that asked; the responder end is the Task's canonical Thread, which migration 063 already made unique per Task, so no second column stores a fact the schema has.WorkerInboxReactorwatches for delegation Tasks, spawns a Thread on the receiving Worker, and starts a turn carrying the request. Model comes from that Worker's default, falling back to the requester's; runtime mode is inherited rather than forced to approval-gated, since a session waiting on a click is what this exists to avoid. Command ids derive from the Task id, so a retry after a partial failure replays instead of spawning a duplicate Thread, and startup sweeps for requests that landed while the server was down.inbox_replyroutes a message to the Thread at the other end, so the requester resumes on its own. Either side may keep talking;close: trueends the channel and records the answer. A Thread not on the channel is refused, so a Worker cannot push into a conversation it is not part of.Migration
064_TaskRequesterThreadadds a nullablerequester_thread_idtoprojection_tasks.requesterThreadIdis optional with a null default in the persistedtask.createdpayload. Requiring it would fail to decode every event written before this change and take the server down on startup — the test suite caught exactly that.Verification
bun fmt,bun lint(exit 0, 262 warnings — unchanged baseline),bun typecheck(8/8), server 1673 tests, web 1833 tests. All run after rebasing ontomainat v0.9.10.Note: the web suite is green run directly; under
bun run testturbo's parallel scheduling times out three files (ChatMarkdown,Sidebar.import,MessagesTimeline) that pass in isolation. Pre-existing contention flake, not from this branch.Not verified
Two real Workers exchanging a live request has not been watched end to end. Unit tests cover routing, side detection, idempotent selection and the prompts, but the reactor's dispatch path only runs against a real server.