Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
136 commits
Select commit Hold shift + click to select a range
4da5006
docs(plan): triage, spec and draft plan for open issues #348 and #350…
mubeda Nov 13, 2026
c0f9aa4
docs(plan): rework the issue-batch plan after its first Codex review
mubeda Nov 13, 2026
45fdc32
docs(plan): approve the issue-batch plan after its second Codex review
mubeda Nov 13, 2026
aef9efd
feat(browser): let an occlusion lease carry a rectangle (#358)
mubeda Nov 13, 2026
3170c88
fix(files): hold a Files source registered during a remote update ins…
mubeda Nov 13, 2026
adfc606
fix(ui): hide a macOS native preview only under an open popup that ov…
mubeda Nov 13, 2026
4ff7c12
fix(web): re-measure and repaint the terminal when a font finishes lo…
mubeda Nov 13, 2026
a74aace
fix(files): restore the update install block after a reload and tell …
mubeda Nov 13, 2026
9a0ee01
fix(web): repaint a terminal created after host config once its font …
mubeda Nov 13, 2026
1a69e3e
test(e2e): probe for a dead webview before every test under one recov…
mubeda Nov 13, 2026
97a15d1
test(web): a same-size return of the terminal mount repaints (#348)
mubeda Nov 13, 2026
d8794e2
fix(chat): reopen the model picker with an empty search (#358)
mubeda Nov 13, 2026
095786c
fix(files): give the installing dialog a Check again button and close…
mubeda Nov 13, 2026
da47502
test(desktop): fail when a desktop event name exists on one side of t…
mubeda Nov 13, 2026
1d5beda
feat(web): keep a content-free development record of terminal size de…
mubeda Nov 13, 2026
004e5e7
test(files): prove the remote-update toast action stays reachable ove…
mubeda Nov 13, 2026
c1d2a3b
fix(web): say the server kept this size when Fit to this window sends…
mubeda Nov 13, 2026
1088340
fix(files): load relative images in the read-only Markdown view from …
mubeda Nov 13, 2026
5421195
test(files): type the update-state test bridges for the typecheck (#357)
mubeda Nov 13, 2026
b1aae06
fix(files): keep the block through a completed install and settle a p…
mubeda Nov 13, 2026
f341022
fix(files): say what Check again found when the install still runs or…
mubeda Nov 13, 2026
7fb3b7f
docs(plan): hold the pull request for #350 and log round 1 progress
mubeda Nov 13, 2026
6610bdc
Merge branch 'worktree-agent-ab1c751ad95f64d01' into claude/open-issu…
mubeda Nov 13, 2026
07aeb97
Merge branch 'worktree-agent-ab612f2cccc2f1992' into claude/open-issu…
mubeda Nov 13, 2026
49e0690
perf(web): skip the Host dashboard values view on a clock tick alone …
mubeda Nov 13, 2026
f343070
docs(plan): keep the #350 design only in its own folder
mubeda Nov 13, 2026
4229748
fix(host-metrics): hide every read-only AppImage mount under .mount_ …
mubeda Nov 13, 2026
8ca8f4a
fix(auth): log refused pairing offers and credentials at warn with a …
mubeda Nov 13, 2026
4c08801
test(worktree): wait on the drain and the removal instead of a 2 s bo…
mubeda Nov 13, 2026
8f7e22d
fix(profiler): reap a creation record only when its parent directory …
mubeda Nov 13, 2026
cd198a5
docs(profiler): record the creation-record and pointer-file limits in…
mubeda Nov 13, 2026
08f0fe4
feat(terminal): gate the size hand-over on a dedicated terminalSizeHa…
mubeda Nov 13, 2026
150d946
fix(web): retry WebGL in a new terminal and name the fallback cause (…
mubeda Nov 13, 2026
3b4f13e
docs(git): record the pull and hook limits of the index-lock cleanup …
mubeda Nov 13, 2026
a862076
fix(git): anchor the sign-in refusal to Git's fatal line (#354)
mubeda Nov 13, 2026
dd768e7
fix(source-control): end pull-request lookups at quiesce (#355)
mubeda Nov 13, 2026
65db45a
test(web): a font-metrics change then a dock change must claim only t…
mubeda Nov 13, 2026
6b1e923
fix(web): a late font's new cell waits for the mount to settle before…
mubeda Nov 13, 2026
e18ebd5
test(web): the grid stays within its mount before the first snapshot …
mubeda Nov 13, 2026
1388c3a
docs(plan): #350 design revision 3 and its second review
mubeda Nov 13, 2026
e644d61
feat(web): count terminal columns by Unicode 11 (#353)
mubeda Nov 13, 2026
69a32b4
Merge branch 'worktree-agent-a2e47a207bb7a53c2' into claude/open-issu…
mubeda Nov 13, 2026
972442a
test(web): reproduce the live follow that reveals an anchored turn's …
mubeda Nov 13, 2026
707d9cb
fix(web): keep the reader's place after a scroll away from the end th…
mubeda Nov 13, 2026
6df3135
fix(source-control): remember a failed lookup and expire a stale pull…
mubeda Nov 13, 2026
1698f35
docs(plan): #350 design revision 4 after its third review
mubeda Nov 13, 2026
376d000
fix(worktree): delete a creation record by the id read at creation or…
mubeda Nov 13, 2026
520ad26
Merge branch 'worktree-agent-ada62af1dec515474' into claude/open-issu…
mubeda Nov 13, 2026
4930b0e
fix(web): a pixel-ratio change and the bundled font load wait for the…
mubeda Nov 13, 2026
33bb847
Merge branch 'worktree-agent-ada62af1dec515474' into claude/open-issu…
mubeda Nov 13, 2026
5965009
fix(worktree): audit both creation-rollback arms as create-rollback o…
mubeda Nov 13, 2026
e51fb5c
fix(source-control): look up again after a status-neutral change outd…
mubeda Nov 13, 2026
c1f9ac3
Merge branch 'worktree-agent-aa5a89f7f15e74537' into claude/open-issu…
mubeda Nov 13, 2026
71a716d
docs(plan): log round 1 results for phases 1, 2, 4, 5 and 7
mubeda Nov 13, 2026
3652e04
Merge branch 'worktree-agent-aa34278f5ec19699e' into claude/open-issu…
mubeda Nov 13, 2026
d6f1ab2
test(source-control): prove quiesce ends a stalled Bitbucket lookup a…
mubeda Nov 13, 2026
746ae2f
Merge branch 'worktree-agent-aa5a89f7f15e74537' into claude/open-issu…
mubeda Nov 13, 2026
0a0d9db
docs(profiler): list the quiesce steps and the create-rollback remova…
mubeda Nov 13, 2026
4f186dc
docs: document the #348 to #358 batch in the architecture overview, v…
mubeda Nov 13, 2026
1a54088
chore(deps): account for @xterm/addon-unicode11 in the dependency led…
mubeda Nov 13, 2026
e0e6f26
chore(deps): count the new addon in the ledger's closure summary (#353)
mubeda Nov 13, 2026
9953c3a
docs(plan): format the plan folders and repoint two evidence lines
mubeda Nov 13, 2026
b75e492
docs(plan): #350 design revision 5 with the engine and budgets from t…
mubeda Nov 13, 2026
99f891f
docs(plan): close #350 as not planned and keep its design and evidence
mubeda Nov 13, 2026
c7080c1
test(e2e): drop failure evidence from a dead webview and probe a rela…
mubeda Nov 13, 2026
e7e2bfa
docs(plan): log the gates, lab runs and the branch review
mubeda Nov 13, 2026
e96a039
test(e2e): start no recovery step once the deadline is spent (#353)
mubeda Nov 13, 2026
b12be12
Merge branch 'worktree-agent-a2e47a207bb7a53c2' into claude/open-issu…
mubeda Nov 13, 2026
ad09141
fix(web): keep the ticking uptime out of the memoized Host dashboard …
mubeda Nov 13, 2026
631ff4c
fix(desktop): hold Manage devices on the remote-update notice while t…
mubeda Nov 13, 2026
649c907
Merge branch 'worktree-agent-ab1c751ad95f64d01' into claude/open-issu…
mubeda Nov 13, 2026
1e9a149
docs(plan): amend R39 to what was built and log the branch review fixes
mubeda Nov 13, 2026
5141f76
fix(desktop): re-enable Manage devices when the requester clears befo…
mubeda Nov 13, 2026
6bef65e
Merge branch 'worktree-agent-ab1c751ad95f64d01' into claude/open-issu…
mubeda Nov 13, 2026
ad92055
docs(plan): log the lab retest, the fix review and the final gates
mubeda Nov 13, 2026
5c23b38
docs(plan): add issue #360 as Phase 10
mubeda Nov 13, 2026
17dee42
test(web): a closed branch picker hits the update-depth limit on a re…
mubeda Nov 13, 2026
71f4a08
docs(plan): add the caught-render-error profiler event to #360 as Tas…
mubeda Nov 13, 2026
5f1ec57
fix(web): keep a hidden list's row sizes when it measures 0 by 0 (#360)
mubeda Nov 13, 2026
e9b47dd
test(web): import node:module as a namespace in the hidden-list test …
mubeda Nov 13, 2026
5295380
fix(web): render the branch list only while its picker is open (#360)
mubeda Nov 13, 2026
04ce49f
test(web): choosing a branch and fetching sends one checkout and one …
mubeda Nov 13, 2026
e59c98e
Merge branch 'worktree-agent-ad9221cc72fac513d' into claude/open-issu…
mubeda Nov 13, 2026
f4fdcc3
test(web): a closed model picker survives a model list whose keys cha…
mubeda Nov 13, 2026
e8bf9ce
fix(web): keep the branch rows until the picker has finished closing …
mubeda Nov 13, 2026
e7b4d9f
docs(architecture): describe the list patch's hidden-list guards (#360)
mubeda Nov 13, 2026
9c369ef
Merge branch 'worktree-agent-ad9221cc72fac513d' into claude/open-issu…
mubeda Nov 13, 2026
d440097
feat(profiler): record render errors the error screen caught (#360)
mubeda Nov 13, 2026
c17ef82
Merge branch 'worktree-agent-a2cc3198745244c77' into claude/open-issu…
mubeda Nov 13, 2026
7257047
fix(profiler): send a caught render error at once, and on pagehide (#…
mubeda Nov 13, 2026
3fe7b93
docs: changelog entries for #360 and #357, and the plan log for Phase 10
mubeda Nov 13, 2026
50ba262
docs(plan): add issue #361 as Phase 11
mubeda Nov 13, 2026
b9517bc
test(remote): list private addresses that enabling remote access make…
mubeda Nov 13, 2026
5f00a22
docs(plan): log the Windows firewall probe for #361
mubeda Nov 13, 2026
7b92200
fix(remote): offer each private address while local-only and widen be…
mubeda Nov 13, 2026
4f10cf8
Merge branch 'worktree-agent-a2637dac251933869' into claude/open-issu…
mubeda Nov 13, 2026
61ae69a
fix(profiler): closed fields and per-environment delivery for render …
mubeda Nov 13, 2026
6e93fcf
Merge branch 'worktree-agent-a2cc3198745244c77' into claude/open-issu…
mubeda Nov 13, 2026
21d4ace
docs(plan): amend R51 to the built rules and log Phase 10 and 11 prog…
mubeda Nov 13, 2026
20c88c5
docs(plan): record the owner's choice of the Windows permission promp…
mubeda Nov 13, 2026
b49d921
fix(remote): ask Windows for administrator permission to open the fir…
mubeda Nov 13, 2026
c65bb75
fix(remote): explain a refused firewall change, offer Retry, and keep…
mubeda Nov 13, 2026
598b689
docs(remote): document the Windows elevation prompt, reason tokens an…
mubeda Nov 13, 2026
342994a
fix(remote): trust a newly added rule on read-back and explain a refu…
mubeda Nov 13, 2026
e51f0b0
Merge branch 'worktree-agent-a2637dac251933869' into claude/open-issu…
mubeda Nov 13, 2026
965e729
fix(profiler): keep held-back measurements and settle render errors o…
mubeda Nov 13, 2026
7e30d15
fix(remote): elevate the system netsh directly, prompt before the exp…
mubeda Nov 13, 2026
e9100d7
Merge branch 'worktree-agent-a2637dac251933869' into claude/open-issu…
mubeda Nov 13, 2026
bde5b38
docs(plan): amend R53 and R54 to the built elevation flow and log the…
mubeda Nov 13, 2026
46955bb
fix(profiler): make the authorization refusal an explicit render-erro…
mubeda Nov 13, 2026
271eaf7
docs(plan): remove Tailscale Serve management as Task 11.4 (#361)
mubeda Nov 13, 2026
2931bab
docs(plan): record the owner's confirmation for Task 11.4
mubeda Nov 13, 2026
329877d
fix(remote): one rule identity across a widen, prompt ownership until…
mubeda Nov 13, 2026
bd9e031
Merge commit '329877d23' into claude/open-issues-pr-dc3c33
mubeda Nov 13, 2026
4d57a63
docs(plan): log the #361 final-pass fixes and amend R54
mubeda Nov 13, 2026
1c594f6
fix(remote): stop managing Tailscale Serve and only read Tailscale (#…
mubeda Nov 13, 2026
b96edc3
fix(remote): drop the Tailscale Serve fields from the visual fixtures…
mubeda Nov 13, 2026
94584aa
Merge branch 'worktree-agent-a2637dac251933869' into claude/open-issu…
mubeda Nov 13, 2026
db5673a
docs: changelog entries for #361 and the plan log for Task 11.4
mubeda Nov 13, 2026
066be60
fix(remote): compare the observed rule identity, honour a Tailscale H…
mubeda Nov 13, 2026
d541697
docs(remote): keep the persistence sentence on one line for the archi…
mubeda Nov 13, 2026
1f99bee
fix(auth): write timestamps at a fixed millisecond width so text orde…
mubeda Nov 13, 2026
701aea3
docs: changelog entry for #362 and the plan log for the expiry diagnosis
mubeda Nov 13, 2026
64d95a9
test(profiler): name each removal-failed finding when a count asserti…
mubeda Nov 13, 2026
15ef6aa
test(profiler): interrupt the removal inside its drain, not after a 1…
mubeda Nov 13, 2026
d60f980
docs(plan): log the macOS gates, the Windows runs so far and the audi…
mubeda Nov 13, 2026
66442ac
test(pull-requests): move the paused clock only while no forge CLI runs
mubeda Nov 13, 2026
680a787
docs(plan): log the Windows results, the poller test fix and the fina…
mubeda Nov 13, 2026
a4ced09
fix(persistence): write every SQL-compared timestamp at one fixed mil…
mubeda Nov 13, 2026
39dd5d8
Merge remote-tracking branch 'origin/main' into claude/open-issues-pr…
mubeda Nov 13, 2026
b92a3eb
fix(persistence): keep nanoseconds in the fixed-width stored timestam…
mubeda Nov 13, 2026
1724fac
docs(plan): log the timestamp reviews, the merge of main and the fina…
mubeda Nov 14, 2026
54febad
fix(firewall): reuse a present rule only when the rule store shows it…
mubeda Nov 14, 2026
a38c746
fix(orchestration): store client and imported timestamps in the serve…
mubeda Nov 14, 2026
7a98021
fix(orchestration): re-write only a command's own timestamp fields (#…
mubeda Nov 14, 2026
268b3a2
docs(plan): log issue 366 and the firewall review fix
mubeda Nov 14, 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
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
### 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)
- The Host dashboard on Linux no longer lists another running BiBCode AppImage's mount, or one a killed instance left behind, as a full read-only volume. (#353)
- A refused pairing offer or pairing credential is now logged as a warning with a fixed reason, so a pairing that fails shows in the server log; the log never holds the offered link or the credential. (#358)
- An expired pairing link, pairing offer or session is refused from the moment it expires. Before, one whose expiry fell on a whole second could still be accepted for up to a second, because expiry times were compared as text. The same text form could delete a signed-in device's refresh token up to a second early. The server now writes every stored timestamp at one fixed width, and re-writes the timestamps a client sends or a session import carries in that form before storing them. (#362, #366)
- With the Profiler on, an error that the "Something went wrong" screen catches is recorded as a `client.render-error` event and grouped in one finding. It holds the error's type, React's error number, component names and the route pattern, never the error's message. (#360)

### Pipelines

Expand All @@ -18,10 +22,16 @@
- 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)
- Sign-in guidance after a failed fetch or push now appears only when Git's own `fatal:` line says it could not read a username, so a commit message or hook output that contains those words no longer triggers it. (#354)
- A pull request that the forge CLI could not look up is no longer asked for again at once on every status change: a failed lookup waits 5 seconds, and a pull request shown for a branch disappears when the lookups keep failing and the last answer is more than 5 minutes old. A status-neutral local change no longer leaves an outdated answer in place, and a lookup that is running when BiBCode quits ends with it. (#355)
- A worktree recreated at the path of a removed one keeps its own creation record, and a record on a volume that is not mounted is no longer deleted by the profiler's worktree audit. A failed worktree creation that is rolled back is now visible to the profiler. (#356)

### 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)
- Expanding a reasoning row in the chat no longer scrolls the list to its end on Windows. (#351)
- The app no longer falls to the "Something went wrong" screen (React error 185) when a closed branch picker in Git Manager, or a closed model picker, receives a new list, as happened after a branch switch and a fetch in a repository with thousands of branches. (#360)
- The model picker opens with an empty search every time, instead of the text from the last time it was open. (#358)

### Files

Expand All @@ -31,13 +41,20 @@
- 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.
- A read-only rendered Markdown file (large files, and files the editor cannot change safely) now loads its relative images from the project, as the editable view does. (#358)
- After you allow an update to install, the Files block survives a reload of the window and covers a Files source opened during the install, and the "Installing an update" dialog has **Check again**, which asks the desktop whether the install is still running. (#357)
- While an update you allowed is installing, the remote-update notice's **Manage devices** action is switched off and says it is available when the update finishes, instead of opening Settings underneath the dialog. (#357)
- **Share this host** lists this computer's private addresses (local network, VPN or overlay, and Tailscale) while remote access is still local-only, each marked as enabling remote access; choosing one turns remote access on and makes the code for that address. Before, only "Automatic (LAN)" was offered. (#361)
- On Windows, when BiBCode has no administrator rights and needs its firewall rule, it now asks through the Windows permission prompt when you generate a code, and if you decline it says what is missing and offers **Retry**, instead of failing with a raw error. Without administrator rights BiBCode cannot remove that rule later: turning sharing off returns the server to local-only and may leave the rule in place. A rule that was disabled or changed to block is replaced instead of reused. (#361)
- BiBCode no longer manages Tailscale Serve: the Tailscale HTTPS switch is gone, BiBCode only reads Tailscale addresses, and a Serve address you set up yourself is listed when it answers. (#361)

### 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)
- On the macOS desktop app, a menu, popover, select or combobox opened over a native browser preview is drawn above it, and the preview is hidden only where the popup covers it. (#358)

### Terminals

Expand All @@ -49,6 +66,11 @@
- 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)
- A terminal repaints and refits after a font loads late, and one created after the server's settings arrived no longer keeps a stale picture until a panel is resized. (#348)
- Every terminal counts an emoji as two columns, as programs such as the Claude CLI assume, so their lines no longer drift. (#353)
- **Fit to this window** now says when the server already holds the size, and a terminal no longer shows a transient size change of a few rows right after you return to it. (#353)
- A new terminal tries the WebGL renderer again after an earlier terminal fell back to the standard one. (#353)
- A client uses the typed-last size hand-over only with a server that says it has it, so a client and a server of different versions keep working. (#358)

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

Expand Down
Loading
Loading