Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
595 commits
Select commit Hold shift + click to select a range
782dca8
test(web): pin the project review prompt dialog and its menu item (#293)
mubeda Nov 11, 2026
bf9cdb2
feat(web): edit the project review prompt from the Source Control rev…
mubeda Nov 11, 2026
04e1c28
test(web): pin the Code review group in Settings, Agents (#293)
mubeda Nov 11, 2026
4a221ff
feat(web): add the Code review group to Settings, Agents (#293)
mubeda Nov 11, 2026
06adb1f
fix(web): name review findings only when a review has a plan, and an …
mubeda Nov 11, 2026
92ab12f
docs(plan): log the ruling to fix follow-ups here and push when tested
mubeda Nov 11, 2026
022b7df
docs(plan): log the review button's web slice and its review
mubeda Nov 11, 2026
d9d607a
test(web): Files Add as project opens Main on the Default Agent (#347)
mubeda Nov 11, 2026
98ad0f8
fix(web): open a project added from Files on the Default Agent (#347)
mubeda Nov 11, 2026
d0ddf09
test(web): an unavailable chat provider is explained and blocks Send …
mubeda Nov 11, 2026
6ac3b76
fix(web): explain a chat's unavailable provider and refuse Send (#347)
mubeda Nov 11, 2026
648d93d
docs: qualify account switching and describe an unavailable chat prov…
mubeda Nov 11, 2026
31a1c4e
test(web): stub the Default Agent in the real-tree Files test (#347)
mubeda Nov 11, 2026
a250272
test(terminal): make the scale-change test depend on fit, with owner …
mubeda Nov 11, 2026
da7bc99
test(terminal): reproduce a failed final resize that is never retried…
mubeda Nov 11, 2026
7f1dc12
fix(terminal): retry a failed final resize a bounded number of times …
mubeda Nov 11, 2026
9aebb84
test(terminal): pin that a height shrink while hidden reaches the PTY…
mubeda Nov 11, 2026
34f3200
docs(terminal): correct zero-area attach wording and describe resize …
mubeda Nov 11, 2026
dd82bfa
test(web): refuse C1 control characters in a review terminal prompt (…
mubeda Nov 11, 2026
3d1c8ca
fix(web): refuse C1 control characters in a review terminal prompt (#…
mubeda Nov 11, 2026
35284f9
test(web): pin that review settings send nothing on a server without …
mubeda Nov 11, 2026
49f4a9a
fix(web): send no review settings to a server without code reviews (#…
mubeda Nov 11, 2026
215fe2e
test(web): pin that a review's findings raise no Plan Ready (#293)
mubeda Nov 11, 2026
6166b4b
fix(web): raise no Plan Ready for a code review's findings (#293)
mubeda Nov 11, 2026
54187b6
test(web): pin one terminal review per double click (#293)
mubeda Nov 11, 2026
3aa1ede
fix(web): open one terminal review per host until the open settles (#…
mubeda Nov 11, 2026
8a41d39
docs(plan): log the confirmed decisions and the integrated follow-ups
mubeda Nov 11, 2026
b83b8a3
test(desktop): a seeded footer invariant loop for AI terminals (#348)
mubeda Nov 11, 2026
64eac84
docs(plan): log the allowlist lab run and the #348 reproduction attempts
mubeda Nov 12, 2026
0f48118
fix(desktop): root the AppImage GStreamer hook at its own AppDir
mubeda Nov 12, 2026
cdfd693
docs: match the AppImage notices to the libraries the lab found bundled
mubeda Nov 12, 2026
cb0c287
test(desktop): fail the footer loop only on a violation that lasts (#…
mubeda Nov 12, 2026
a1d3b28
test(terminal): reproduce stale and duplicate events from overlapping…
mubeda Nov 12, 2026
6ae686c
fix(terminal): apply each terminal sequence once across attach stream…
mubeda Nov 12, 2026
18b4e93
test(terminal): reproduce silent claim results that leave a stale siz…
mubeda Nov 12, 2026
1686a7c
fix(terminal): settle silent claims and re-measure on typing (#348)
mubeda Nov 12, 2026
ff0525e
test(terminal): cover an AI terminal shrinking when its Activity pane…
mubeda Nov 12, 2026
c3c9148
style(terminal): format #348 tests
mubeda Nov 12, 2026
25a2936
test(terminal): reproduce early claim settlement and the exited-snaps…
mubeda Nov 12, 2026
7587463
fix(terminal): settle a claim after its echo can arrive and keep exit…
mubeda Nov 12, 2026
512e6a1
test(server): list the worktree creation record methods in the reposi…
mubeda Nov 11, 2026
79dfbe5
feat(diagnostics): add host metrics statistics, chart tiers and the v…
mubeda Nov 11, 2026
98c9af4
feat(diagnostics): add the host metrics collector, its disk workers a…
mubeda Nov 11, 2026
7d1a0aa
feat(diagnostics): read the host through sysinfo without a process sc…
mubeda Nov 12, 2026
db0bfc3
feat(server): stream host metrics to an orchestration:read client (#292)
mubeda Nov 12, 2026
ec4e88e
test(diagnostics): measure the host collector's cost and record the p…
mubeda Nov 12, 2026
e55f210
feat(server): start the host collector with the server and stop it in…
mubeda Nov 12, 2026
8b38829
fix(diagnostics): start the host collector only once the runtime exis…
mubeda Nov 12, 2026
e436ee2
style(contracts): hoist the host metrics event codecs in their test (…
mubeda Nov 12, 2026
78f19b9
docs(plan): log the host metrics server slice and the #348 protocol work
mubeda Nov 12, 2026
1e5202c
docs(plan): log the ruling on two windows showing one terminal
mubeda Nov 12, 2026
8e97761
test(terminal): model two windows on two machines sharing one termina…
mubeda Nov 12, 2026
3c60467
test(terminal): specify scaled mirrors and unattended windows (#348)
mubeda Nov 12, 2026
71dba1c
fix(terminal): scale a mirror to show the whole grid and keep unatten…
mubeda Nov 12, 2026
24bdf92
docs(terminal): describe scaled mirrors and unattended windows (#348)
mubeda Nov 12, 2026
6a2f8e8
test(terminal): keep a scaled mirror's pointer input away from xterm'…
mubeda Nov 12, 2026
f62ab06
fix(terminal): route a scaled mirror's pointer input to its mount and…
mubeda Nov 12, 2026
99fb62d
test(web): cover the host metrics view and the dashboard's states (#292)
mubeda Nov 12, 2026
81e1ac5
feat(web): subscribe to host metrics and present the dashboard's stat…
mubeda Nov 12, 2026
d0474d7
test(web): cover the Host dashboard sheet's states and stream gating …
mubeda Nov 12, 2026
539e5b4
feat(web): add the Host dashboard sheet and its charts (#292)
mubeda Nov 12, 2026
2e867fb
test(web): cover the three Host dashboard entry points (#292)
mubeda Nov 12, 2026
e89ec6a
feat(web): open the Host dashboard from the environment menu, server …
mubeda Nov 12, 2026
20d50e9
fix(web): keep the Host dashboard's bars, skeletons and stale age ste…
mubeda Nov 12, 2026
0a3a840
test(web): cover the statistics start, server ordering and sample age…
mubeda Nov 12, 2026
0b6ffd8
fix(web): start host statistics from the first sample and order sampl…
mubeda Nov 12, 2026
7111f30
test(web): require keyboard access and cheap updates in the host metr…
mubeda Nov 12, 2026
c5111a0
fix(web): make the host metric charts one keyboard stop with arrow-ke…
mubeda Nov 12, 2026
85c187d
test(web): prove the Host dashboard stream closes on close, hide and …
mubeda Nov 12, 2026
75f15e3
fix(web): make theme Undo all-or-nothing when the mode write fails (#…
mubeda Nov 12, 2026
1ba7d67
fix(web): keep focus when a theme Delete fails after removing the row…
mubeda Nov 12, 2026
7840691
fix(web): move focus to the next row when a theme Delete half-fails (…
mubeda Nov 12, 2026
4cce478
test(web): Keybindings page renders the shipped defaults without dupl…
mubeda Nov 12, 2026
02cda5b
fix(web): Keybindings page: one keycap for the + key, and a stacked t…
mubeda Nov 12, 2026
0a1f72c
test(desktop): footer invariant spec: skip zero-width mounts, tolerat…
mubeda Nov 12, 2026
fc687c8
test(web): a Sheet takes a native-preview occlusion lease while open …
mubeda Nov 12, 2026
466d1fb
fix(web): hide a macOS native preview while any Sheet is open (#292)
mubeda Nov 12, 2026
4509b9f
test(desktop): e2e harness recovers from a dead webview before a spec
mubeda Nov 12, 2026
c34af56
fix(desktop): relaunch the e2e app once when a spec starts on a dead …
mubeda Nov 12, 2026
88b0c00
test(web): pin the Review changes shortcut, a built-in Mod+Alt+Shift+…
mubeda Nov 12, 2026
26a3893
feat(web): start a code review with Mod+Alt+Shift+R (#293)
mubeda Nov 12, 2026
026d00a
test(web): pin one-off reviewers in the review menu (#293)
mubeda Nov 12, 2026
932240d
feat(web): pick a one-off reviewer from the review menu (#293)
mubeda Nov 12, 2026
426c405
test(web): pin the review scope in the Review changes tooltip (#293)
mubeda Nov 12, 2026
d9596f3
feat(web): name the review scope and base in the Review changes toolt…
mubeda Nov 12, 2026
a5d9676
test(web): pin one-off review instructions in the chat and terminal p…
mubeda Nov 12, 2026
a6f105e
feat(web): review with one-off instructions from the review menu (#293)
mubeda Nov 12, 2026
dc1b48d
test(desktop): add a packaged Source Control review spec (#293)
mubeda Nov 12, 2026
287c1d4
docs: describe Review changes, its settings, shortcut and packaged ch…
mubeda Nov 12, 2026
4e8e601
chore(contracts): regenerate the RPC wire manifest for sourceControl.…
mubeda Nov 12, 2026
fe8be4f
test(web): mock shouldStartCodeReview in the ChatView keydown tests (…
mubeda Nov 12, 2026
f80dac7
test(web): pin a disabled one-off reviewer's own reason in the review…
mubeda Nov 12, 2026
f959857
fix(web): name a disabled one-off reviewer's own reason in the review…
mubeda Nov 12, 2026
6ba9238
test(desktop): pin the Claude fixture's review plan reply (#293)
mubeda Nov 12, 2026
0c68c58
feat(terminal): answer resizes with the held size and acknowledge the…
mubeda Nov 12, 2026
569650c
fix(terminal): order shared transcript state by server generation (#348)
mubeda Nov 12, 2026
dc3c72c
fix(terminal): apply a claim's size only from its ordered acknowledge…
mubeda Nov 12, 2026
22216e1
fix(terminal): give the size back to the window last used when it ret…
mubeda Nov 12, 2026
1da8b5a
docs(terminal): describe authoritative resize answers and generations…
mubeda Nov 12, 2026
cd64a95
test(terminal): type the write probe and format the size-ownership do…
mubeda Nov 12, 2026
e2567d1
docs(plan): log the integrations, reviews and the real-pair reproduction
mubeda Nov 12, 2026
96d9afd
test(terminal): keep a closed process closed against a delayed resync…
mubeda Nov 12, 2026
781adcb
fix(terminal): fence a closed process against its delayed snapshots (…
mubeda Nov 12, 2026
e41b1ae
test(terminal): repair a claim whose acknowledgement only a resync ca…
mubeda Nov 12, 2026
26da393
fix(terminal): deliver a resync's size even when its transcript is a …
mubeda Nov 12, 2026
c3fb1e2
test(terminal): render merged output after the size published before …
mubeda Nov 12, 2026
185977f
fix(terminal): let a claimed stream order rendering ahead of one with…
mubeda Nov 12, 2026
d7ced19
test(terminal): send one claim and repair rows against an older serve…
mubeda Nov 12, 2026
1763a1f
fix(terminal): stop waiting for acknowledgements an older server neve…
mubeda Nov 12, 2026
a13f7aa
docs(terminal): describe resync sizes, closed fences and older-server…
mubeda Nov 12, 2026
b14d76b
test(terminal): show the notice again when an older server ignores a …
mubeda Nov 12, 2026
6c21fa2
fix(terminal): settle a takeover an older server ignored with one rea…
mubeda Nov 12, 2026
b3512ad
test(terminal): prove observed review launches keep the prompt after …
mubeda Nov 12, 2026
aed015b
fix(terminal): insert observer options before a review's end of optio…
mubeda Nov 12, 2026
7296a5e
test(terminal): open observed reviews through the terminal manager (#…
mubeda Nov 12, 2026
5f04e3b
test(review): reject control characters in stored review prompts on w…
mubeda Nov 12, 2026
948859b
fix(review): reject control characters in stored review prompts (#293)
mubeda Nov 12, 2026
448ae69
test(host-metrics): reproduce the collector review findings (#292)
mubeda Nov 12, 2026
3e98d59
fix(host-metrics): fail a panicking disk call's job and keep its work…
mubeda Nov 12, 2026
ef6a290
fix(host-metrics): weight merged chart buckets by their observed time…
mubeda Nov 12, 2026
75ae367
fix(host-metrics): badge a merged volume read-only only when every me…
mubeda Nov 12, 2026
6c9cbf1
fix(host-metrics): tell a failed Unix capacity read from a successful…
mubeda Nov 12, 2026
9128531
fix(host-metrics): order readings by sequence, report a hung listing,…
mubeda Nov 12, 2026
84801e3
docs(host-metrics): describe the chart clock, the listing state and t…
mubeda Nov 12, 2026
8ad44a8
test(auth): register the host metrics stream in the scope test's regi…
mubeda Nov 12, 2026
05ecd4f
fix(contracts): declare the new host metrics fields as optional keys …
mubeda Nov 12, 2026
672ebf7
feat(web): say when the host volume list is not answering (#292)
mubeda Nov 12, 2026
f70bdec
fix(client-runtime): place live host chart points on the server's cha…
mubeda Nov 12, 2026
fad3c33
fix(web): hide the macOS native preview under dialogs and alert dialogs
mubeda Nov 12, 2026
4b71198
fix(web): keep the review instructions when the launch refuses them (…
mubeda Nov 12, 2026
874707a
test(terminal): pin the resize answer each client version decodes (#348)
mubeda Nov 12, 2026
47b74a0
fix(terminal): answer a resize's outcome only to a caller that reads …
mubeda Nov 12, 2026
32d915a
test(terminal): count only a user's input as use of a window (#348)
mubeda Nov 12, 2026
041064e
fix(terminal): tell a user's input from the terminal's own replies (#…
mubeda Nov 12, 2026
f6471a9
fix(terminal): retry a refused PTY size and publish the size it kept …
mubeda Nov 12, 2026
719dfdb
test(terminal): pin that a click takes the size back after the host t…
mubeda Nov 12, 2026
eea5c2b
test(contracts): compile the mixed-version decoders once (#348)
mubeda Nov 12, 2026
7f54ec5
test(terminal): pin the acknowledgement an older caller does not get,…
mubeda Nov 12, 2026
ab84630
docs(terminal): describe an unchanged answer carrying the size a PTY …
mubeda Nov 12, 2026
3b59846
test(terminal): read the structured resize answer in the RPC integrat…
mubeda Nov 12, 2026
97b2c0f
docs(plan): add amendments A13 (#347) and A14 (#348) and log the size…
mubeda Nov 12, 2026
9e01ea9
test(desktop): footer invariant spec: wait for the Activity dock, ski…
mubeda Nov 12, 2026
cc650a2
test(desktop): footer invariant spec: measure xterm 6's scroll positi…
mubeda Nov 12, 2026
164fb29
test(desktop): expect the split default spec list in the wdio config …
mubeda Nov 12, 2026
c351f7b
test(terminal): align the two-window fake with the server's hand-over…
mubeda Nov 12, 2026
a1294d6
fix(terminal): wait for use of a handed-over un-owned size and keep a…
mubeda Nov 12, 2026
5f2ac2a
chore(contracts): regenerate fixtures and the RPC wire manifest on th…
mubeda Nov 12, 2026
6c402db
test(contracts): a resolved rule with an unknown command does not fai…
mubeda Nov 12, 2026
1061f02
fix(contracts): drop resolved keybindings that name an unknown comman…
mubeda Nov 12, 2026
4ffbd37
test(git): read the fake gh markers before recording the lookup
mubeda Nov 12, 2026
038737c
test(contracts): the host metrics sample fixture carries chartAt (#292)
mubeda Nov 12, 2026
0b4897a
fix(server): send the reading's chart time as chartAt (#292)
mubeda Nov 12, 2026
002e2ec
fix(server): publish an unsupported driver's instance before its sett…
mubeda Nov 12, 2026
ed8f478
test(host-metrics): hidden volumes are listed with their reason (#292)
mubeda Nov 12, 2026
01c2ba7
feat(host-metrics): disclose the volumes the filter hid (#292)
mubeda Nov 12, 2026
00a89f0
test(contracts): host snapshots carry hidden volumes, and decode with…
mubeda Nov 12, 2026
440ecb8
feat(mcp): host_metrics tool over a server.getHostMetrics snapshot (#…
mubeda Nov 12, 2026
20e5a18
test(host-metrics): each volume has statistics since start (#292)
mubeda Nov 12, 2026
9c81041
feat(host-metrics): per-volume used percent since start (#292)
mubeda Nov 12, 2026
e63d3d6
style: format the batch and hoist the keybinding test decoders (#292,…
mubeda Nov 12, 2026
4f4abf5
fix(host-metrics): never lstat a network mount point while listing (#…
mubeda Nov 12, 2026
5a196a5
docs(plan): log lanes W9, T4w and S2, close 12.15 and 12.16, name the…
mubeda Nov 12, 2026
b4a116a
fix(web): block Send for a bound provider the server reports unavaila…
mubeda Nov 12, 2026
fde55ef
fix(terminal): prune departed size claims on every release (#348)
mubeda Nov 12, 2026
53e16c6
fix(terminal): publish the PTY's own size when a resize runs out of r…
mubeda Nov 12, 2026
06a7d99
fix(terminal): wait for a dying root when its group kill is refused (…
mubeda Nov 12, 2026
c700c3a
fix(terminal): keep the attached owner across a restart (#348)
mubeda Nov 12, 2026
477980b
fix(terminal): leave a handed-over size un-owned until used, with one…
mubeda Nov 12, 2026
7b33c62
fix(contracts): decode a later resize outcome or volume state lenient…
mubeda Nov 12, 2026
43b9673
style: format the replier helper and the size table row (#348)
mubeda Nov 12, 2026
5afdbdb
docs(plan): R113 states the un-owned hand-over, the named replier and…
mubeda Nov 12, 2026
81190a5
test(terminal): follow the manager's hand-over rules in the panel tes…
mubeda Nov 12, 2026
31e3c1f
docs: record that a suppressed query is lost when its replier leaves …
mubeda Nov 12, 2026
4297873
docs(terminal): correct the restart comment and the un-owned scenario…
mubeda Nov 12, 2026
2dc9ffe
fix(host-metrics): weigh a volume read by the rate it was admitted at…
mubeda Nov 12, 2026
d55c2f6
test(host-metrics): prove the listing never stats a network mount poi…
mubeda Nov 12, 2026
c98544d
fix(host-metrics): disclose macOS network volumes as hidden (#292)
mubeda Nov 12, 2026
b1948d7
test(vcs): read the fake gh slow marker before recording the lookup (…
mubeda Nov 12, 2026
cb70357
test(terminal): a click or Fit on a scaled mirror must leave the term…
mubeda Nov 12, 2026
a130d43
fix(terminal): keep a scaled mirror's terminal focused after a click …
mubeda Nov 12, 2026
09b5e7d
test(terminal): pin focus after a Fit claim the server refuses (#348)
mubeda Nov 12, 2026
036f2c1
test(terminal): a readback outside the wire bounds is not published (…
mubeda Nov 12, 2026
51bb260
fix(terminal): publish a PTY readback only inside the wire bounds (#348)
mubeda Nov 12, 2026
c33d726
test(terminal): an owner leaving before a restart registers does not …
mubeda Nov 12, 2026
b4effd3
fix(terminal): register a restarted session before keeping its size o…
mubeda Nov 12, 2026
fbb31b8
test(terminal): a refused close gives up quickly on a running root (#…
mubeda Nov 12, 2026
05ab0b3
fix(terminal): cap a refused close's wait for the root at 250 ms (#348)
mubeda Nov 12, 2026
4a6e31f
test(host-metrics): the macOS mount merge skips automount maps (#292)
mubeda Nov 12, 2026
9571862
fix(host-metrics): skip automount maps in the macOS mount merge (#292)
mubeda Nov 12, 2026
886a4e8
style(terminal): rustfmt the readback bound (#348)
mubeda Nov 12, 2026
374a9db
docs(terminal): a readback outside the wire bounds is not published (…
mubeda Nov 12, 2026
6b4eeda
docs: describe the Host dashboard and list it in the changelog (#292)
mubeda Nov 12, 2026
b3c8446
docs(terminal): a claim settles by its acknowledgement, not a timer (…
mubeda Nov 12, 2026
66e4d6c
docs(plan): log lanes S3 to S5, W10, W11, D1, the reviews and the han…
mubeda Nov 12, 2026
d141b41
docs(plan): rename a lane label the identity guard rejects
mubeda Nov 12, 2026
67d3a39
test(host-metrics): compare the native source with the OS tools (#292)
mubeda Nov 12, 2026
85e993e
test(desktop): packaged end-to-end test of the local Host dashboard (…
mubeda Nov 12, 2026
86b6d91
test(desktop): check the Host dashboard's hidden volumes in the same …
mubeda Nov 12, 2026
bc22ed7
docs(host-metrics): record the Linux cost run, the OS tools check and…
mubeda Nov 12, 2026
c26ec1a
test(desktop): recognise WebKitGTK's dead-webview error in the e2e re…
mubeda Nov 12, 2026
58a8737
docs(testing): say when the packaged e2e harness relaunches a dead we…
mubeda Nov 12, 2026
f9ce36d
docs: correct the relaunch note and the Linux run's tree identity (#292)
mubeda Nov 12, 2026
254da02
fix(git): allow the large clone reservation variant on Windows (#341)
mubeda Nov 12, 2026
68354c3
fix(process): escape a batch argument's % once (#293)
mubeda Nov 12, 2026
bb29156
fix(server): hide Linux system mounts and the AppImage's own image fr…
mubeda Nov 12, 2026
d4b3f32
docs(testing): name lsof for the Linux packaged e2e relaunch (#292)
mubeda Nov 12, 2026
5dbd8c9
test(terminal): pin following the output across a paused renderer (#348)
mubeda Nov 12, 2026
096a923
fix(terminal): keep a followed view at the bottom across a paused ren…
mubeda Nov 12, 2026
d111673
test(terminal): pin automatic size claims to a settled mount (#348)
mubeda Nov 12, 2026
bedf706
fix(terminal): send automatic size claims only from a settled mount (…
mubeda Nov 12, 2026
81eaffa
docs(terminal): say a scaled terminal's scroll bar takes the size (#348)
mubeda Nov 12, 2026
7ae6e64
fix(terminal): reach the bottom when xterm's scroll area keeps the pa…
mubeda Nov 12, 2026
b168bc2
docs(testing): describe the packaged hidden-terminal follow spec (#348)
mubeda Nov 12, 2026
cb90f77
fix(host-metrics): never hide / as the running app image (#292)
mubeda Nov 12, 2026
5a2f92b
test(host-metrics): pin every hidden reason's wire string (#292)
mubeda Nov 12, 2026
5293937
feat(host-metrics): disclose unlisted Windows network drives as hidde…
mubeda Nov 12, 2026
759c8e8
test(turn-delivery): wait the hold limit plus the cancel grace for a …
mubeda Nov 12, 2026
60bdc90
test(terminal): pin the follow repair against a stale scroll area and…
mubeda Nov 12, 2026
a77b9da
fix(terminal): sync xterm's stale scroll area before the follow repai…
mubeda Nov 12, 2026
8131a30
test(terminal): pin the settle from the first measurement and a bound…
mubeda Nov 12, 2026
0ff0099
fix(terminal): settle automatic claims from the mount's first measure…
mubeda Nov 12, 2026
88a264a
test(terminal): fail the packaged follow checks when xterm's scroll b…
mubeda Nov 12, 2026
d29cd59
test(desktop): accept the System mount label in the Host dashboard sp…
mubeda Nov 12, 2026
9a20444
test(terminal): pin that the follow repair leaves the program's termi…
mubeda Nov 12, 2026
a643188
fix(terminal): sync xterm's scroll area without resizing the program'…
mubeda Nov 12, 2026
fb85172
test(terminal): pin that the maximum wait never claims the sizing min…
mubeda Nov 12, 2026
55976e5
fix(terminal): never claim the sizing minimum at the settle's maximum…
mubeda Nov 12, 2026
7fa90f5
test(terminal): drop the packaged hidden-follow spec, which passed on…
mubeda Nov 12, 2026
efe0b0e
test(host-metrics): an ordinary FUSE volume holding the executable st…
mubeda Nov 12, 2026
20121ff
fix(host-metrics): hide only the AppImage's own image, not any read-o…
mubeda Nov 12, 2026
28d4118
feat(review): turn on terminal reviews on Windows (#293)
mubeda Nov 12, 2026
db1c260
test(terminal): run the exhausted-resize read-back tests on Windows (…
mubeda Nov 12, 2026
7b997c3
fix(files): allow blob: frames for the PDF preview
mubeda Nov 12, 2026
14bc007
test(git): ignore the readiness fence's own directory events on Windows
mubeda Nov 12, 2026
f7e1bc5
test(terminal): pin a resume signal for Claude terminals after a loss…
mubeda Nov 12, 2026
0372080
fix(terminal): ask a Claude terminal to repaint after a lossy attach …
mubeda Nov 12, 2026
557b89b
docs(plan): log the three #348 causes, the owner's decisions and the …
mubeda Nov 12, 2026
281dd55
test: expect blob: in the served frame-src, and pin the private xterm…
mubeda Nov 12, 2026
1ac857b
test(desktop): give the footer invariant spec room for its setup on a…
mubeda Nov 12, 2026
fb69c52
docs(plan): record the final round on three systems and the real pair…
mubeda Nov 12, 2026
1763cc0
docs(plan): close the delivered tasks of phases 8, 11 and 12
mubeda Nov 12, 2026
dcf2d0c
fix(web): banner and size notice wording from the React and UI review…
mubeda Nov 12, 2026
9c57548
fix(web): list the banner's setup flag in its memo dependencies (#347)
mubeda Nov 12, 2026
e2c3eb7
test(files): a relative image in rendered Markdown loads from the wor…
mubeda Nov 12, 2026
0bd7ca5
fix(files): load relative images in rendered Markdown from the worksp…
mubeda Nov 12, 2026
d5514d2
test(files): rendered Markdown images refuse page-relative URLs and s…
mubeda Nov 12, 2026
25f4dc0
fix(files): refuse page-relative image URLs and retry a reissued imag…
mubeda Nov 12, 2026
e7a6769
test(git): a forced write must keep a lock another Git took (#341)
mubeda Nov 12, 2026
b4ef527
fix(git): remove index.lock only if the killed Git still held it open…
mubeda Nov 12, 2026
a5201be
docs(plan): amend R16 for lock ownership and log the pull request, it…
mubeda Nov 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
63 changes: 62 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,10 @@ jobs:
libayatana-appindicator3-dev \
librsvg2-dev \
xdg-utils \
patchelf
patchelf \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
gstreamer1.0-alsa

- name: Verify toolchain versions
run: |
Expand Down Expand Up @@ -411,10 +414,68 @@ jobs:
if: matrix.platform == 'win'
run: node scripts/run-msvc.mjs cargo test -p bibcode-server --test git_system_config -j 2

# #341 was reported on Windows: background Git must not lock the index there either.
- name: Run background Git index lock tests (Windows)
if: matrix.platform == 'win'
run: node scripts/run-msvc.mjs cargo test -p bibcode-server --lib -j 2 -- background_status_ git_stop_ index_lock_cleanup_

# #293: a review prompt reaches node through an npm-style .cmd shim with every class intact.
- name: Run review prompt argument tests (Windows)
if: matrix.platform == 'win'
run: node scripts/run-msvc.mjs cargo test -p bibcode-server --test windows_terminal_shims -j 2 -- review_prompt_shim_

- name: Run Git system configuration tests (macOS)
if: matrix.platform == 'mac'
run: cargo test -p bibcode-server --test git_system_config -j 2

- name: Run background Git index lock tests (macOS)
if: matrix.platform == 'mac'
run: cargo test -p bibcode-server --lib -j 2 -- background_status_ git_stop_ index_lock_cleanup_

# #292: the host collector, its exit with a disk read held, and its runtime start and
# quiesce. Each command fails the step when its filter matches no test.
- name: Run host metrics tests (Windows)
if: matrix.platform == 'win'
shell: bash
run: |
counted() {
local expected="$1"; shift
local log; log="$(mktemp)"
"$@" 2>&1 | tee "$log"
local passed
passed="$(sed -n 's/^test result: ok\. \([0-9]*\) passed.*/\1/p' "$log" | awk '{ total += $1 } END { print total + 0 }')"
if [ "$expected" = exactly-one ] && [ "$passed" -ne 1 ]; then
echo "::error::expected exactly 1 passed test, got $passed"; exit 1
fi
if [ "$passed" -lt 1 ]; then
echo "::error::the filter matched no test"; exit 1
fi
}
counted at-least-one node scripts/run-msvc.mjs cargo test -p bibcode-server --lib -j 2 -- host_metrics::
counted exactly-one node scripts/run-msvc.mjs cargo test -p bibcode-server --test host_metrics_exit -j 2 -- --exact a_held_disk_read_does_not_block_exit
counted exactly-one node scripts/run-msvc.mjs cargo test -p bibcode-server --lib -j 2 -- --exact production::runtime::tests::host_metrics_start_with_the_runtime_and_stop_in_quiesce

- name: Run host metrics tests (macOS)
if: matrix.platform == 'mac'
shell: bash
run: |
counted() {
local expected="$1"; shift
local log; log="$(mktemp)"
"$@" 2>&1 | tee "$log"
local passed
passed="$(sed -n 's/^test result: ok\. \([0-9]*\) passed.*/\1/p' "$log" | awk '{ total += $1 } END { print total + 0 }')"
if [ "$expected" = exactly-one ] && [ "$passed" -ne 1 ]; then
echo "::error::expected exactly 1 passed test, got $passed"; exit 1
fi
if [ "$passed" -lt 1 ]; then
echo "::error::the filter matched no test"; exit 1
fi
}
counted at-least-one cargo test -p bibcode-server --lib -j 2 -- host_metrics::
counted exactly-one cargo test -p bibcode-server --test host_metrics_exit -j 2 -- --exact a_held_disk_read_does_not_block_exit
counted exactly-one cargo test -p bibcode-server --lib -j 2 -- --exact production::runtime::tests::host_metrics_start_with_the_runtime_and_stop_in_quiesce

# build-desktop-artifact.ts --symbols runs dump_syms on the unstripped binary. Rust Cache
# keeps ~/.cargo/bin, so a restored runner skips the compile.
- name: Install dump_syms
Expand Down
24 changes: 23 additions & 1 deletion .github/workflows/desktop-ui-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,12 @@ jobs:
librsvg2-dev \
xdg-utils \
patchelf \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
gstreamer1.0-alsa \
xvfb \
xdotool
xdotool \
lsof

- name: Install frozen dependencies
run: vp install --frozen-lockfile
Expand Down Expand Up @@ -139,6 +143,24 @@ jobs:
exit 1
fi

# Audio in Files needs the bundled GStreamer core to find its own plugins: exactly the
# wrapper's allowlist, nothing else, plus the scanner and the AppRun hook.
for required in \
usr/lib/gstreamer1.0/gstreamer-1.0/gst-plugin-scanner \
apprun-hooks/linuxdeploy-plugin-gstreamer.sh; do
if [[ ! -f "$extract_directory/squashfs-root/$required" ]]; then
printf 'Linux AppImage is missing GStreamer file: %s\n' "$required" >&2
exit 1
fi
done
expected_plugins="$(bash scripts/tauri/linuxdeploy-plugin-gstreamer.sh --list-plugins | LC_ALL=C sort)"
bundled_plugins="$(ls -1 "$extract_directory/squashfs-root/usr/lib/gstreamer-1.0" | LC_ALL=C sort)"
if [[ "$bundled_plugins" != "$expected_plugins" ]]; then
printf 'Linux AppImage GStreamer plugins differ from the allowlist:\n' >&2
diff <(printf '%s\n' "$expected_plugins") <(printf '%s\n' "$bundled_plugins") >&2 || true
exit 1
fi

- name: Install macOS application from DMG build
if: matrix.platform == 'mac'
shell: bash
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/desktop-upgrade-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,9 @@ jobs:
s''udo apt-get install -y \
build-essential curl wget file libxdo-dev libssl-dev \
libgtk-3-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev \
librsvg2-dev xdg-utils patchelf xvfb xdotool
librsvg2-dev xdg-utils patchelf xvfb xdotool \
gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
gstreamer1.0-alsa

- name: Install frozen dependencies
run: vp install --frozen-lockfile
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,10 @@ jobs:
libayatana-appindicator3-dev \
librsvg2-dev \
xdg-utils \
patchelf
patchelf \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
gstreamer1.0-alsa

- name: Verify stable updater signing configuration
if: needs.preflight.outputs.is_update_candidate == 'true'
Expand Down
50 changes: 50 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,55 @@
# Changelog

## Unreleased

### Diagnostics

- Each environment has a Host dashboard (the environment card's menu, Settings > Remote Servers, and the status bar's Resource Manager) with its host's CPU, memory and volumes, live and since the server started. It lists the volumes it hides and why, shows per-volume statistics, never reads network volumes, and says when the volume list is not answering. Agents can read the same figures with the `host_metrics` MCP tool. (#292)

### Pipelines

- Stage, layer and Jobs headers in the pipeline detail view now read as group labels on their own strip, apart from the job rows below them, in the wide and the stacked layout; each is still one heading with its status, name and job count. (#340)

### Git

- A push that fails for missing credentials on a remote server now says that Git ran on that server, names it, and tells you to run `git push` in a terminal there; Source Control and the Git Manager show the same guidance. (#343)
- Background status reads no longer take Git's index lock, so your own `git add` or `git commit` in a terminal no longer fails with "index.lock: File exists" while BiBCode is open. On Linux and macOS BiBCode asks Git to stop before it forces it; on Windows it forces it as before. Either way it then removes an `index.lock` that its own stopped process left and that nothing else is using, including when it quits. (#341)
- Local status for a worktree is delivered while a stacked action or a Git Manager push, publish, force push or remote branch delete waits on the network. Writes stay one at a time; pull and fetch still wait. (#345)
- The profiler warns about a leftover worktree folder only when it shows worktree evidence, one finding per folder, and the warning ends when the folder is gone. BiBCode records the worktrees it creates, so folders that were never worktrees no longer warn every ten minutes. (#344)
- Create worktree starts fresh every time it opens, after a creation or a close: the last Name, Create From, mode, base override, Advanced, Create more and agent pick no longer come back. Input stays while the dialog is open, and Create more still keeps the project, mode, agent and base override for its batch. (#346)
- Source Control has a **Review changes** button that starts a code review of your branch and its uncommitted changes in a chat panel beside the thread or in an AI Terminal. A Claude review starts in Claude's plan mode, a Codex review runs in Codex's read-only sandbox, other chat agents ask before edits or are only told not to edit, and Settings → Agents and the button's tooltip say which applies. A review's findings offer no Implement. The review prompt can be set per user in Settings → Agents and per project from the button's menu, which also starts a review once with another agent or with added instructions. Mod+Alt+Shift+R starts a review from the keyboard. On Windows, a terminal review gets the prompt with its line breaks as spaces. (#293)

### Chats

- A new worktree's or project's chat lists only its own provider's models in the composer, before the first message too; to use another provider, add a chat panel from the chat header `+`. A new chat that has not been sent still lists every ready provider. A chat whose provider is disabled or removed now says so above the composer and keeps Send unavailable, and **Add as project** in Files opens the new Main on your Default Agent instead of Codex. (#347)

### Files

- Markdown opens editable in rendered view, with a formatting group in the Files toolbar (paragraph, headings 1 to 5, bold, italic, strikethrough, bullet, numbered and task lists, block quote, a link dialog, Insert image next to the file, collapsible section). Undo and Redo work in both views and a save changes only what you edited; frontmatter and constructs the editor cannot represent stay as written or read-only. (#342)
- Images a Markdown file links by a relative path show in the editable rendered view, read from the project relative to the file, in the desktop app, the browser and remote environments; an inserted image shows at once, and a path outside the project is not read. (#345)
- Ticking a task checkbox in a read-only Markdown or `.mdx` file keeps the file's source Undo history. (#342)
- Mermaid diagrams in an editable rendered Markdown file are drawn again, as one block that is not edited in place; the file's source is kept as written. (#342)
- The Linux AppImage now carries its own GStreamer plugins for the audio Files previews in WAV, MP3, Ogg, WebM and FLAC files, instead of relying on the system's plugins, which its bundled GStreamer cannot load on newer distributions. M4A is not covered: its AAC decoder is not bundled.
- A PDF preview in the Files panel is no longer blocked by the page's content security policy in Chromium-based webviews and browsers: the Windows desktop app, and browser mode in Chrome or Edge.

### Appearance

- Settings > Appearance lists six built-in themes (Tokyo Night, Matrix Dark, Matrix Light, Verdant Light and the existing Light and Dark) and lets you duplicate, edit with a live preview, import, export and delete custom themes, with contrast warnings. New terminal sessions and the pipeline job log can follow the theme's terminal colors, and a theme can also set scrollbars, focus rings, control shadows and selected rows. (#290)
- Clicking a theme row applies it and, when the theme's base differs from the mode on screen, switches the mode with an Undo that restores the previous mode and theme. (#290)
- The left panel draws its repository, environment, primary checkout, worktree and chat rows as five visually distinct levels in every built-in theme, and a theme can style each level. (#290)
- On the desktop app, exporting a theme or plan opens the native Save dialog, and closing, quitting, restarting or installing an update with unsaved Files edits asks first with Save all, Discard and Cancel. (#290, #342)

### Terminals

- When you return to a Claude AI Terminal on a macOS or Linux server after it printed more than BiBCode keeps for a redraw (1 MiB or 5,000 lines, or 512 KiB in the client), BiBCode asks Claude to redraw its screen, the way it does when resumed, so characters missing from the replay come back. This is a best-effort repaint for Claude terminals BiBCode starts, not a rebuild of the terminal's state; other programs and Windows servers still need a panel resize, and a Claude session you suspended in that terminal resumes. (#348)
- A terminal that kept an old row count, so an AI CLI lost its bottom lines or footer until you changed the panel's width, now corrects itself: the server confirms each size in order with the output, a size it did not apply never resizes the view, and a window whose connection dropped gets the terminal's size back when it reconnects, unless someone typed in the other window meanwhile. (#348)
- A terminal laid out with no width or height, such as a center terminal behind a maximized right panel, keeps its size instead of resizing its program to 2 columns or 1 row. (#348)
- A terminal refits when the display scale changes, for example after moving the window to another display, so a bottom row clipped by the new scale's row height no longer stays cut off until a panel is resized. (#348)
- When resizing a terminal's program fails, BiBCode retries it a few times, so the program no longer keeps its old size, with its bottom rows cut off, until the next panel resize or keypress. (#348)
- Opening, collapsing or dragging a panel no longer resizes its terminal's program to 2 or 5 columns on the way: a terminal takes a new size once its panel holds still for a moment, and a small panel that holds still still sizes it. (#348)
- A terminal that was off-screen or hidden while its program kept printing after its rows shrank comes back showing its last lines and footer, instead of a view stuck rows above them until you changed a panel's size; a terminal you had scrolled up to read stays where you left it. (#348)
- When two windows, for example on two machines, show the same terminal, the window you last used sizes it and the other one shows the whole terminal scaled down to fit instead of cutting off its bottom rows; a window nobody is clicking or typing in, such as an idle server host window, no longer takes the size back when it regains focus, where its web view reports recent input. A click or **Fit to this window** that takes the size leaves the terminal focused, so the first keys you type reach the program. (#348)

## [v0.15.3] - 2026-11-08

BiBCode v0.15.3 guards checkpoint restores in shared checkouts, offers Git Credential Manager sign-in on the desktop, keeps named MCP clients across runs, reworks the Pipelines and Files views, loads pipelines for self-hosted GitLab on any port, and hardens load-sensitive tests and secret scanning. This release includes PR #337 since v0.15.2.
Expand Down
5 changes: 4 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,10 @@ serde_json = "1"
sha2 = "0.11.0"
snow = "0.10"
socket2 = "0.6.5"
sysinfo = "0.39.6"
# Network and tmpfs mounts are listed so the host collector's own filter can hide and disclose
# them (R81); listing makes no `statvfs` call. On macOS sysinfo still skips network volumes, so
# the collector adds them from `getfsstat(MNT_NOWAIT)`.
sysinfo = { version = "0.39.6", features = ["linux-netdevs", "linux-tmpfs"] }
subtle = "2.6.1"
bibcode-server = { path = "apps/server" }
tauri = { version = "~2.11.6", features = ["unstable", "devtools", "image-png"] }
Expand Down
2 changes: 1 addition & 1 deletion UI.md
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ Optimize for user control, predictability, and task completion. Every surprise,
### Typography

- The smallest text in the app is `text-xs` (12px). Never write `text-[9px]`, `text-[10px]`, `text-[11px]`, or another arbitrary size below it; badges, key hints, counts, and timestamps use `text-xs`.
- Navigation rows are 13px medium and thread titles 13px regular, both on `text-foreground/80`; project titles are 13px medium on `text-foreground/90`.
- Navigation rows are 13px medium on `text-foreground/80`; project titles are 13px medium on `text-foreground/90`. Sidebar chat rows are 12px regular on `sidebar-chat-foreground`, so a chat reads as lighter than the checkout or worktree it belongs to; an unread chat is drawn at `foreground`.
- `text-muted-foreground` is already the secondary color. Do not alpha-reduce it further for text (`text-muted-foreground/70` and similar); badges, subtitles, timestamps, and empty states use the solid token. Alpha is fine on icon tints.
- Do not add global letter-spacing to body text; under hinted rendering the fractional advances become uneven letter gaps.
- A new scrollable reading surface must mark its content wrapper with `data-text-surface`, or its text renders grayscale on Linux (see the architecture overview, Linux webview text rendering).
Expand Down
Loading
Loading