Skip to content

v1.0.273

Choose a tag to compare

@github-actions github-actions released this 09 Sep 13:41
· 145 commits to main since this release

✨ New: A diff opens beside the chat that produced it

Clicking "all file changes" used to swipe the Explorer into view and draw the diff over the FileBrowser — taking away the one thing you actually want next to a diff, which is the turn that wrote it. The diff is now a column inside the agent panel, sharing the row with the chat panes. Same viewer, one home instead of two.

A diff column and a second chat pane are the same right half of the panel, so they are mutually exclusive — but only by derivation, never by mutation. Opening a diff hides a split you built rather than destroying it, and closing the diff gives back the exact split that was there. On narrow screens the column can take the full panel width; the panes stay put underneath rather than being squeezed to nothing.

✨ New: Two chat panes, and they survive a reload

The agent panel splits into two panes with independent sessions. The layout is now persisted per project, so a refresh no longer silently collapses you back to a single pane — and a session closed in another browser tab leaves that pane blank instead of collapsing the split behind your back.

One composer serves both panes: the focused chat portals its input into a shared slot below them, so neither pane spends column height on it.

✨ New: Send a message to the other pane

In side-by-side mode, a message's hover row gains a fourth control between the excerpt scissors and the timestamp. It forwards that message's text to the other column and starts a run there immediately. The arrow points at the neighbour, so the button reads as a direction.

It sends the same plain text the copy button beside it would give you — no "forwarded from…" framing, since the receiving model reads framing as instructions — and it does not steal focus, because both panes are already on screen.

✨ New: The user-message list is the whole transcript now

The jump-to-message modal listed whatever the chat happened to have paged in (10 turns), so it was silently incomplete and clicking anything above that window did nothing. On one real session it showed 13 of 52 turns.

It is now served from disk: every human turn in the transcript, searchable, and selecting an unloaded row widens the chat window first so the jump actually lands. Timestamps show up for persisted rows (they were blank for everything but the current turn), and the jump highlight no longer flashes a white band around the bubble on the dark theme.

✨ New: Lean 4

.lean files were degrading quietly on four surfaces at once — no syntax highlighting, a generic grey file icon, line-level instead of block-level diffs, and no presence in the project graph at all. All four are fixed, including a ∀ file icon and theorem-level block diffs, which on a proof repo is the whole question you're asking a diff.

Validated against a 60,598-file formalization repo: 434/500 exact-name matches, zero mismatches, zero overlapping spans across 76,891 lines. Symbols only — import and call edges are deliberately not scraped, because Lean resolves lemmas by elaboration and a best-effort guess would render mostly-wrong edges as fact.

🐛 Fix: Large repos stop OOM-killing the server

Opening a very large repo could take the whole process down about four minutes after the first query — post-build analytics is fire-and-forget, and on an 809K-symbol index PageRank and the tf-idf pass peaked at 10 GB over an 8 GB heap, with 82 seconds of that synchronous and the event loop dead throughout.

Three bounds fix it. The file cap goes from 15,000 to 100,000 (git ls-files is alphabetical, so the old budget was exhausted inside the first directory and search returned zero hits for everything later in the alphabet — which reads as a broken feature, not as a cap). Analytics is skipped above 200K symbols, reporting a distinct reason so consumers stop retrying for a result that will never arrive. And the index cache is now LRU with a 1M-symbol budget, sized by bytes rather than entry count, instead of keeping every project you ever opened resident forever.

🐛 Fix: One node shape across the projectGraph API

/api/projectGraph spoke three vocabularies for the same concepts, so a parser written against one endpoint read undefined against another — the right number of rows, every field empty. Search now returns the canonical node with a real line range instead of the Cmd+K palette shape, callees calls its focal symbol target like its siblings, and co-edit rows agree on filePath. Co-edit history also gains a probability, so callers stop comparing a raw count against a ratio threshold.

🌐 Site: Crawlability, a real /docs index, and consistent naming

robots.txt was disallowing /_next/, hiding the CSS and JS Googlebot renders the page with. Every page shipped <html lang="und">, including the Chinese ones. 58 of 86 sitemap URLs carried no lastmod. The favicon and manifest 404'd. All fixed, with sitemap dates derived from real content — post dates, release dates, and the last commit that touched each docs file, recorded at author time rather than computed on CI, where a fresh clone would claim the entire site changed on every deploy.

/docs was a bare redirect stub, which under a static export compiles to Next's client-side error shell: 23 KB of HTML with no <h1>, no prose, and no lang — at a URL the homepage links to directly. It is now a real index page, with a card per docs page whose blurb is extracted from that page's own opening paragraph, putting all 26 docs pages one hop from the homepage.

The site also now says OpenCockpit on first mention throughout — docs openings, blog titles and descriptions, homepage copy — rather than the generic noun.

📦 Misc

Chat's prose surfaces finally have a typographic contract: a bounded reading measure, leading and scale shared by chat turns, the Explorer preview, review pages, the skills modal and the diff modal. User bubbles get a brand-teal border so their edge reads as a boundary on the dark theme. The website has a lint setup of its own instead of relying on next lint, which Next 16 removed.