Repository navigation
Commit e7df22a
Desktop overhaul: workspace tabs, settings, queued prompts, and resume after restart (#98)
* chore
* tweaks
* fix(web): unify desktop shell surfaces and tab alignment
* fix(web): refine themes and split session surfaces
* fix(web): soften frame drag indicators with theme shadows
* feat(web): add themed startup splash
Show the logo in the saved theme until the first route loads, turn it into
a reload prompt if the app fails to load, and keep the desktop window hidden
until its first paint.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(web): add New session button to sidebar
Starts on the start page in the current session's project; drops the model line from session rows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* ui: tweaks
* wip: tweaks
* wip: tweaks
* feat(web): close workspace tabs and drop workspace icons
- Workspace tabs show a close button on hover; closing deletes the
workspace without a confirm and moves to a neighbouring tab.
- Tabs always show the window icon; the workspace icon, its settings
picker and the stored column are removed.
- Session frames show the project's badge, as in the sessions sidebar;
frame icons accept an element as well as a Lucide icon.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(web): integrate settings with desktop shell
* feat(web): scroll the providers list and detail on their own
Side by side, the providers card keeps a fixed height and each pane
scrolls inside it; stacked, the page scrolls as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: use gpt-6-luna instead of the deprecated gpt-5.5
gpt-5.5 is out of the live OpenAI model list, its thinking-levels
artifact and every stubbed test. The thinking wire test gives its
gpt-6-luna model the catalog's thinking map, since GPT-6 takes no
minimal effort.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(harness): list, cancel and update queued prompts
Prompts admitted but not yet promoted can now be read, withdrawn and
changed before the agent takes them in:
- session.queue lists them, both lanes, in admission order.
- session.cancel withdraws one through a durable session.prompt.cancelled
event. The row is kept and marked cancelled_seq, so a promotion already
in flight loses rather than appending it; a cancelled id may be sent
again.
- session.update moves one to the other lane or rewrites it in place
through session.prompt.updated, carrying only the changed fields.
Moving to the steer lane wakes the session, so a prompt left by a stop
runs now.
A promotion that finds its prompt changed, cancelled or re-admitted since
selection steps back instead of failing the drain, and a turn started for
a prompt that was cancelled before promotion makes no provider request.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(web): show queued steers and follow-ups above the session composer
A strip tucked behind the composer lists the prompts waiting to join the
conversation, while the agent works and after a stop or failure leaves
them parked. Past three it shows a count; past four it scrolls. Each row
can steer now (or send now while idle), move to the follow-up lane, be
edited in place, go back to the composer, or be removed.
The transcript stays at its end as the strip grows or shrinks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(harness): resume unfinished runs after a restart
Like Pi, work cut off by a crash or a shutdown resumes when the server
starts again. The session table records a run as unfinished (execution:
running, or closed after a shutdown) and counts the restarts a crash
causes; a committed turn starts the count over.
- Control marks a session running before every wake, so an accepted
prompt survives a crash before its run starts.
- A run's end clears the mark: a finished run unless prompts are still
pending, a user stop unless a prompt came after it. A shutdown leaves
it closed.
- At startup the codework server claims each marked session atomically,
counting a restart for a crash, and resumes it. At five restarts the
session is parked instead; session.info reports it, and its next
prompt runs it again. A recovered run does nothing if a stop cleared
the mark meanwhile, and answers the reply it was cut off in before a
queued follow-up goes in.
- Ctrl+C on a local `codework run` is a user stop, so it is not resumed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test(aikit): type the deferred tools fixture as provider function tools
With @types/json-schema reachable, the provider's JSONSchema7 is no longer
any, and the inferred `type: string` schemas stop matching.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: lint the web app's Tailwind classes
@shadcn/lint's no-unknown-classes and no-raw-colors gate vp check for
apps/web, outside shadcn's components/ui. `vp run lint:tailwind` adds
no-arbitrary-values, no-restyle, require-static-classes and Tailwind's
canonical class names (eslint-plugin-better-tailwindcss) until each is
clean enough to join them.
Classes rewritten to their canonical names; the generated CSS is the same.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(web): use a text scale and theme radii instead of arbitrary values
Like t3code, sizes below Tailwind's xs are theme tokens (text-2xs, 3xs,
4xs, with their line heights); 12px and 14px text uses text-xs and
text-sm, 13px moves up to text-sm and 15px headings to text-base. Exact
radii become rounded-sm/md/lg/2xl; the title bar's nested radii move to
xl/lg/md and stay concentric. One-off shadows, gradients, the queue fade
and inline code size are allow-listed in no-arbitrary-values.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor(web): share one prompt composer for new sessions and replies
PromptComposer, ComposerHeader and ComposerSubmit give the start page's
New Session box and a session's Reply box the same surface, header and
submit button, instead of each building its own.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(web): one-line workspace tabs titled by the focused widget
A widget's setTab now takes one string, such as "Project / Title", and
the tab shortens it at its end to fit; the full text is in its tooltip.
The session sets its project and title, so the tab names both again. A
frame moved to a new workspace still names it for its project.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(web): keep each workspace tab's title across restarts
A workspace stores what its tab last read (a new nullable tab column),
saved through workspaces.update when its focused frame sets a new one.
After a restart, a workspace not opened yet shows that title instead of
only its name, until its frame sets a fresh one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test(aikit): expect modelgen to leave out an empty Codex provider
modelgen omits providers with no models, so a snapshot without OpenAI
entries has no openai-codex entry at all rather than an empty one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: note unreleased harness, cli and aikit changes
Queued-prompt list, cancel and update, resume after restart, the
local Ctrl+C stop, and modelgen leaving out empty providers. Also
restores the Unreleased heading the format note had swallowed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: keep reference projects out of code comments
Comments say what the code does and why, without naming the projects
it was compared against.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore(tui): restore its comments as they were
The previous commit's comment rewording was meant for the TypeScript
packages only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>1 parent 2ad5fdc commit e7df22a
96 files changed
Lines changed: 3735 additions & 848 deletions
File tree
- apps
- contract/src
- desktop/src
- server
- src
- test
- __artifacts__
- web
- src
- components
- ui
- landing
- routes
- settings
- servers
- shell
- widgets/session
- wm
- widget/src
- view
- packages
- aikit
- src
- llm
- utils
- test
- e2e
- __artifacts__
- provider
- utils
- codework
- src
- cli/cmd/handlers
- server
- test
- harness
- src
- db
- effect
- event
- plugin/builtin/tool
- runner
- session
- input
- test
- fixtures
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
8 | 10 | | |
9 | 11 | | |
10 | 12 | | |
11 | 13 | | |
12 | 14 | | |
13 | 15 | | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
14 | 60 | | |
15 | 61 | | |
16 | 62 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
46 | 46 | | |
47 | 47 | | |
48 | 48 | | |
49 | | - | |
50 | | - | |
51 | 49 | | |
52 | 50 | | |
53 | 51 | | |
54 | 52 | | |
55 | 53 | | |
| 54 | + | |
| 55 | + | |
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
61 | | - | |
62 | 61 | | |
63 | 62 | | |
64 | 63 | | |
65 | 64 | | |
66 | 65 | | |
67 | | - | |
68 | 66 | | |
69 | 67 | | |
| 68 | + | |
70 | 69 | | |
71 | 70 | | |
72 | 71 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
124 | 124 | | |
125 | 125 | | |
126 | 126 | | |
| 127 | + | |
| 128 | + | |
127 | 129 | | |
128 | 130 | | |
129 | 131 | | |
130 | 132 | | |
131 | 133 | | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
132 | 137 | | |
133 | 138 | | |
134 | 139 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
109 | 109 | | |
110 | 110 | | |
111 | 111 | | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
112 | 122 | | |
113 | 123 | | |
114 | 124 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
22 | | - | |
23 | | - | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
24 | 24 | | |
25 | | - | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
26 | 32 | | |
27 | 33 | | |
28 | 34 | | |
| |||
49 | 55 | | |
50 | 56 | | |
51 | 57 | | |
52 | | - | |
53 | 58 | | |
54 | 59 | | |
55 | 60 | | |
| |||
64 | 69 | | |
65 | 70 | | |
66 | 71 | | |
67 | | - | |
68 | 72 | | |
69 | 73 | | |
70 | 74 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
13 | 12 | | |
14 | 13 | | |
15 | 14 | | |
| |||
147 | 146 | | |
148 | 147 | | |
149 | 148 | | |
150 | | - | |
| 149 | + | |
| 150 | + | |
151 | 151 | | |
152 | 152 | | |
153 | 153 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
60 | 60 | | |
61 | 61 | | |
62 | 62 | | |
63 | | - | |
| 63 | + | |
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
| |||
93 | 93 | | |
94 | 94 | | |
95 | 95 | | |
96 | | - | |
97 | | - | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
98 | 100 | | |
99 | 101 | | |
100 | 102 | | |
| |||
121 | 123 | | |
122 | 124 | | |
123 | 125 | | |
124 | | - | |
| 126 | + | |
125 | 127 | | |
126 | 128 | | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
127 | 136 | | |
128 | 137 | | |
129 | 138 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
13 | 62 | | |
14 | 63 | | |
15 | | - | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
16 | 70 | | |
17 | 71 | | |
18 | 72 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
3 | | - | |
4 | | - | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
59 | | - | |
| 59 | + | |
60 | 60 | | |
61 | 61 | | |
62 | 62 | | |
| |||
0 commit comments