| feat(ask-user-question): redesign the questionnaire card — stable height, notes and Other in place, rich previews, Discuss, receipt (#1192) * fix(ask-user-question): make every questionnaire control reachable by keyboard in WebKit * feat(pi-ask-user-question): add question previews, opt-in file previews, discuss-first answers and one-option confirmations * feat(extensions): add per-extension settings and share the workspace file check through the session seam * refactor(resource-renderers): share the framed file preview and add compact chrome for embedded frames * feat(ask-user-question): drive file previews from the rich-preview setting and teach the Discuss and preview conventions * refactor(ask-user-question): stack question pages at a stable height with in-place note slots and a real Other field * feat(ask-user-question): add question previews, a fixed preview pane and a per-question Discuss mark to the card * feat(ask-user-question): replace the answered record with a foldable question → answer receipt * test(ask-user-question): cover stable paging, growing fields, previews, Discuss, the receipt and the rich-preview switch in Chromium and WebKit * docs(specs): note the plan page's preview scope and the WKWebView tab-stop gap * fix(ask-user-question): keep Discuss across reconnects, let the Other checkbox cancel it, and make previews keyboard-scrollable * test(ask-user-question): click Submit only once the page-change reveal has settled * feat(ask-user-question): Enter picks, Space adds a note, d discusses and the platform chord submits in the card * feat(pi-ask-user-question): match the card's keys in the terminal — Enter picks, Space notes, Next and Submit rows, Ctrl+Enter sends * docs(ask-user-question): describe the explicit-selection keyboard model in the specs and live spec * chore(locales): restore package.json and tsconfig.json that a catalog edit rewrote * docs(web): note that the platform modifier now comes from @thinkrail/ui/keyboard * Document extension settings in the contracts, settings, host, store, transport and chat specs, move them to protocol v104 after the GitHub star ask took v103, and narrow stored setting flags with a type guard instead of a cast. * Gate Discuss on a shared ASK_DISCUSS_PROTOCOL_VERSION (v104) so a v103 host, whose formatter would report an empty discuss as no answer, never shows the toggle. * ci(e2e): fail over a stalled apt mirror when installing WebKit's system libraries * fix(server): load extensions with the setting snapshot the loader records, so a change and revert mid-reload never leaves a stale tool schema current * ci(e2e): cap each WebKit dependency install attempt so a trickling apt mirror retries instead of exhausting the wait * ci(e2e): install WebKit's missing libraries without Playwright's font group, whose mirror download stalled past the wait * Move extension settings and Discuss to protocol v105 after background workspace creation took v104 * test(e2e): assert the plan-page answer by its lasting receipt, not the transient sent state the card can leave before WebKit sees it --------- Co-authored-by: OLavrik <Olya_lavrik@inbox.ru> Co-authored-by: rsolmano <rinat.suleimanov@jetbrains.com> | 16 hours ago |
| feat(ask-user-question): redesign the questionnaire card — stable height, notes and Other in place, rich previews, Discuss, receipt (#1192) * fix(ask-user-question): make every questionnaire control reachable by keyboard in WebKit * feat(pi-ask-user-question): add question previews, opt-in file previews, discuss-first answers and one-option confirmations * feat(extensions): add per-extension settings and share the workspace file check through the session seam * refactor(resource-renderers): share the framed file preview and add compact chrome for embedded frames * feat(ask-user-question): drive file previews from the rich-preview setting and teach the Discuss and preview conventions * refactor(ask-user-question): stack question pages at a stable height with in-place note slots and a real Other field * feat(ask-user-question): add question previews, a fixed preview pane and a per-question Discuss mark to the card * feat(ask-user-question): replace the answered record with a foldable question → answer receipt * test(ask-user-question): cover stable paging, growing fields, previews, Discuss, the receipt and the rich-preview switch in Chromium and WebKit * docs(specs): note the plan page's preview scope and the WKWebView tab-stop gap * fix(ask-user-question): keep Discuss across reconnects, let the Other checkbox cancel it, and make previews keyboard-scrollable * test(ask-user-question): click Submit only once the page-change reveal has settled * feat(ask-user-question): Enter picks, Space adds a note, d discusses and the platform chord submits in the card * feat(pi-ask-user-question): match the card's keys in the terminal — Enter picks, Space notes, Next and Submit rows, Ctrl+Enter sends * docs(ask-user-question): describe the explicit-selection keyboard model in the specs and live spec * chore(locales): restore package.json and tsconfig.json that a catalog edit rewrote * docs(web): note that the platform modifier now comes from @thinkrail/ui/keyboard * Document extension settings in the contracts, settings, host, store, transport and chat specs, move them to protocol v104 after the GitHub star ask took v103, and narrow stored setting flags with a type guard instead of a cast. * Gate Discuss on a shared ASK_DISCUSS_PROTOCOL_VERSION (v104) so a v103 host, whose formatter would report an empty discuss as no answer, never shows the toggle. * ci(e2e): fail over a stalled apt mirror when installing WebKit's system libraries * fix(server): load extensions with the setting snapshot the loader records, so a change and revert mid-reload never leaves a stale tool schema current * ci(e2e): cap each WebKit dependency install attempt so a trickling apt mirror retries instead of exhausting the wait * ci(e2e): install WebKit's missing libraries without Playwright's font group, whose mirror download stalled past the wait * Move extension settings and Discuss to protocol v105 after background workspace creation took v104 * test(e2e): assert the plan-page answer by its lasting receipt, not the transient sent state the card can leave before WebKit sees it --------- Co-authored-by: OLavrik <Olya_lavrik@inbox.ru> Co-authored-by: rsolmano <rinat.suleimanov@jetbrains.com> | 16 hours ago |
| feat(web): unified model · effort picker with host-kept favorites, connection kinds and vendor glyphs (#614) * feat(contracts): add picker metadata, favorite and recent models at protocol v77 * feat(server): persist favorite models, record recents, and project cost/modality/auth onto the catalog * feat(web): carry favorite/recent models in the store and add a shared model-preferences hook * feat(web): add the unified ModelEffortPicker pill with favorites, recents and nested effort * feat(web): put the model · effort pill in the composer and add the /model command * feat(web): use the model · effort pill with a Default row in the new-workspace dialog * docs(specs): describe the unified model · effort picker and its host-kept favorites * test(e2e): cover the model · effort pill and migrate specs to the single trigger * fix(web): keep the model picker open after a model pick and bind effort to the chosen model * feat(web): restyle the model picker as menu rows with an effort stepper, vendor glyphs and connection icons * fix(picker): close rollback and favorites races, drop guessed defaults and dead code * fix(web): size the model picker popover to the space Radix reports so the search never clips * fix(web): fence the chained effort write behind the latest model pick and switch the dialog to Default synchronously * feat(web): replace the effort stepper with a gradient slider in the model · effort picker The effort control under the model list becomes a slider: a thick rail hiding a cool→warm gradient the handle uncovers, the level word and glyph on the handle, one clickable label per level, a warning caption on the costly tiers and a footer link back to the saved default. A native range input drives drag, click-to-snap, touch and arrow keys. Pill bars take the level's tone so cost reads before the word. E2E screenshots fast-forward CSS animations so a spring mid-flight never lands in a picture. * fix(web): advance the picker's selection fence on effort picks too A direct effort change while a model request was still in flight did not supersede that request's chained level write, so B·high followed by a slide to medium could let B's response re-send high over the newer choice. One pair-selection counter now advances for every model or effort pick, and the chained write (and its failure rollback) fires only while its pick is still the newest. * fix(web): pin the effort slider's end labels to the rail ends Centering every label on its stop pushed half of a long first word ("Minimal" on models without an off level) outside the popover. The first and last labels now align with the rail's ends; the middle ones stay centered on their stops. * fix(web): clamp a session's effort through the host when its model stops offering that level After a catalog refresh a chat could sit on a level its model no longer lists, so the slider's native range snapped to the first stop while the handle, glyph and aria-valuetext still named the removed level. ChatView now asks model.clampThinking and applies the answer — the reconcile the new-workspace dialog already runs, and the clamp pi applies at request time — so the pill and slider show the level pi will actually use. * test(e2e): exercise the effort reset link against a default the test saved itself The step assumed the fixture host already carried a saved defaultEffort, which the desktop lane does not, so it waited for "reset to undefined". The link is now checked after the test's own Set-as-default: absent while the level matches, offered as "reset to high" after a slide to medium, and gone again once clicked. | 1 month ago |
| feat(chat): prompt templates (#110) * feat(chat): prompt templates Reusable prompt templates over pi's own prompt dirs (global + project-scoped .pi/prompts), so they stay pi-CLI-portable. The `/` menu lists them fresh; picking one starts a Tab-through slot session (placeholder fill with group mirroring + gap highlighting). A Templates manager (Settings → Templates) lists/creates/edits/deletes, save-as-template from the history overlay, and a starter-templates offer. Ships 5 starter project templates in .pi/prompts/. Wire: template.* CRUD (protocol v10, on top of search's v9). Stacked on the history-search PR. e2e: 80 no-agent specs green. * fix(templates): symlink containment, server-parsed editor values, zero suppressions (Air review) Three blocking findings from the Air automation review: - Symlink containment: the by-name CRUD path followed an existing symlink, so a checked-out repo's .pi/prompts/linked.md -> <anywhere> could be disclosed by template.get and overwritten by template.save. Every by-name operation now lstat-gates the target (a non-regular entry is not a template: get/ delete report it absent, save refuses loudly), and project-scope writes additionally refuse a symlinked .pi or .pi/prompts directory - the global dir stays exempt for dotfile setups. Documented in the module SPEC as a deliberate divergence from pi's read-only, symlink-following scanner; pinned by seven new regression tests. - Editor metadata fidelity: TemplateEditorDialog populated its form by re-parsing frontmatter in the browser with a bare/double-quoted-only scalar reader, corrupting pi-native single-quoted or block-scalar values on an edit round-trip. Fields now come from the server-parsed TemplateInfo (pi's real YAML parser); templateText.ts keeps only the boundary rule (stripFrontmatter) + writer (assembleTemplate), splitTemplate is gone, and the scalar styles the client now relies on are pinned server-side. - Suppressions: all 28 PR-added biome-ignores are removed via lint-clean forms - literal pi placeholder strings became template literals with \${ escapes, the Field label uses an explicit htmlFor/id pairing (also un-nests the syntax hint from the label), and the two template.list effects moved into a useTemplateList hook whose fetch generation records templatesVersion with the response (honest deps, and a bump now invalidates the displayed list instead of showing stale rows while refetching). * fix(templates): dir-level no-follow gate covers reads; growing a slot marks it filled (Air review round 2) - The project-dir symlink gate now covers every operation, not just writes: a symlinked <cwd>/.pi or <cwd>/.pi/prompts makes the project dir untraversable for list/get too (treated as having no templates, via the single readableProjectDir predicate list and get share), closing the read-side disclosure the write-only gate left open. Writes keep the loud refusal; the global-dir exemption stays. Regression tests cover both symlinked directory levels for list, get, save, and delete. - The composer's grow-at-end slot path now marks the slot filled: previously a first keystroke at an untouched marker's end boundary (ArrowRight collapses the marker selection exactly there) grew the slot with filled: false, so stripUntouchedSlots deleted the marker together with everything typed into it on send. New e2e reproduces the exact gesture and pins that the typed text survives in the sent message. * fix(chat): uncached /-menu template fetch; stale template.get responses never apply (Air review round 3) - The composer's /-menu template list is fetched on every menu-open transition, never cached across opens: prompt files change outside the app too (pi CLI, an editor, a git pull), which no in-app invalidation counter can see - the (workspaceId, templatesVersion) cache served exactly those files stale for the rest of the chat. The server re-reads its dirs per call precisely for this freshness, so the client simply asks on open; ChatView drops its templatesVersion dependency entirely (the Settings panel keeps its own). E2E regression writes a template file straight to disk between two menu opens and asserts it's offered. - onPickTemplate applies its async template.get response only while the pick is still current: newest pick wins (a generation counter - two quick picks can resolve out of order) AND the draft is byte-identical to pick time (a slow response must never clobber what the user typed meanwhile). The decision is templatePick.ts's shouldApplyTemplatePick, pure and unit-tested for the delayed and out-of-order cases. * fix(composer): imperative backdrop scroll sync — no inline style (Air review round 4) The slot-highlight backdrop's scroll sync used a state-tracked translate() inline style — a self-granted exception to the repo's token-utilities-only styling invariant. The textarea's onScroll now copies scrollLeft/scrollTop onto the backdrop's overflow-hidden layer imperatively (a programmatic scroll offset needs no styling at all), and the backdrop's ref callback seeds the offsets at mount so a session starting in an already-scrolled composer never paints a misaligned frame. Also drops the per-scrolled-frame composer re-render the state approach caused. Zero inline styles remain in the PR. * perf(templates): metadata-only list with bounded reads; size-capped by-name path (Air review round 5) template.list synchronously read and parsed every file in full and shipped every body over the wire, though both list consumers (the / menu, the Settings rows) render metadata only - and the round-3 freshness fix made the listing run on every menu open, so one huge checked-in .pi/prompts/*.md would block the shared in-process host per keystroke-adjacent gesture. - The wire splits TemplateInfo (metadata-only, what list returns) from Template (metadata + content, the by-name get/save shape); v16's own description is amended (this PR's unreleased surface, no extra bump). - listTemplates does bounded work per file: the no-follow lstat doubles as a size gate (over MAX_TEMPLATE_BYTES = 1 MiB -> silently skipped, matching what get would refuse) and only an 8 KiB head is read for frontmatter - pi's parser treats a truncated block as no-frontmatter, so oversized frontmatter degrades to no metadata, never an error or a full read. - template.get/save fail loudly over the cap (get: before readFileSync; save: before anything touches disk). - TemplateEditorDialog fetches the body via template.get on edit-open (pinned to the row's exact scope, so a shadowed global template edits the right file), with Save gated until the body lands so an early save can never overwrite the file with an empty body. Regression tests: capped save/get, bounded-head metadata for a just-under-cap file, oversized-frontmatter degradation, and the updated metadata-only list round-trip. * fix(templates): edit dialog adopts template.get's full-parse metadata Review round 6 (jetbrains-air): the round-5 bounded listing means a file whose frontmatter closing fence sits past the 8 KiB scan window legitimately lists with NO description/argument-hint — but the edit dialog seeded its metadata fields from that degraded listing row and wrote them back on Save, so a body-only edit silently deleted the file's real frontmatter. The template.get response (a full-file parse) is now authoritative for every field: its description/argument-hint replace the listing seed alongside the body when the fetch resolves, and all three content inputs are disabled (Save already gated) until then — so the resolve can never clobber mid-fetch typing and an early save can't write the degraded seed back. e2e regression (templates-manage): a 16 KiB-frontmatter template lists degraded, edit-opens with the buried description intact, and survives a body-only edit-save cycle with its on-disk metadata unchanged. * fix(templates): edit saves under template.name verbatim — no trim Review round 7 (jetbrains-air): whitespace-bearing names are server-legal by design (pi derives a template's name from its filename verbatim, so a hand-created 'report .md' lists as 'report '), but the dialog trimmed the name on every save — editing 'report ' wrote a NEW report.md and left the selected file untouched, an edit that looked successful while changing nothing. An edit now saves under template.name verbatim; only a NEW template's typed name is trimmed (deliberate form normalization, so an accidental trailing space can't mint a file that renders identically to its trimmed twin). The Save button's emptiness gate is new-mode-only for the same reason: a whitespace-only hand-created name is a legal edit identity. e2e regression (templates-manage): a hand-created 'report .md' edit-opens under its exact name, a body-only save lands in that same file, and no trimmed twin appears. * fix(chat): mirror template slots only from user-edited slots, not filled defaults (Air review) `${N:-default}` slots were born `filled: true`, and both mirror paths (`mirrorAllGroups` on Send, `stepSlot` on Tab) used `filled` to decide what propagates to a group's siblings. So a template with differing per-occurrence defaults — `${1:-foo} versus ${1:-bar}` (one argument, one group) — inserted as "foo versus bar" but Tab or a direct Send silently rewrote it to "foo versus foo", unlike pi's own expansion (unprovided `${1:-foo}`/`${1:-bar}` yield "foo"/"bar"). Root cause: `filled` conflated two concepts — "has real content" (keep on send + tint) and "the user entered this value" (a mirror source). Split them: `filled` stays a parse-time property (drives `stripUntouchedSlots` + `highlightSegments`), and a new `edited` flag — session runtime state the composer sets on a real edit, never emitted by the parser — is the sole mirror-source gate. An untouched default is filled-but-not-edited, so it stays independent until the user provides the argument by editing one occurrence; a slot mirrored *into* becomes filled but not edited, so it never re-sources. - slotSession.ts: add `edited?`; `mirrorAllGroups` keys on `edited`, not `filled`. - Composer.tsx: `stepSlot` mirrors on `cur.edited`; the onChange fill path sets `edited: true` alongside `filled: true`. - chat/SPEC.md: document the filled/edited split and the differing-defaults rule. - Tests: unit regressions (untouched defaults don't mirror; an edited default does) + e2e Tab/Send regressions against a new `defaults.md` fixture. | 3 months ago |
| feat(ask-user-question): redesign the questionnaire card — stable height, notes and Other in place, rich previews, Discuss, receipt (#1192) * fix(ask-user-question): make every questionnaire control reachable by keyboard in WebKit * feat(pi-ask-user-question): add question previews, opt-in file previews, discuss-first answers and one-option confirmations * feat(extensions): add per-extension settings and share the workspace file check through the session seam * refactor(resource-renderers): share the framed file preview and add compact chrome for embedded frames * feat(ask-user-question): drive file previews from the rich-preview setting and teach the Discuss and preview conventions * refactor(ask-user-question): stack question pages at a stable height with in-place note slots and a real Other field * feat(ask-user-question): add question previews, a fixed preview pane and a per-question Discuss mark to the card * feat(ask-user-question): replace the answered record with a foldable question → answer receipt * test(ask-user-question): cover stable paging, growing fields, previews, Discuss, the receipt and the rich-preview switch in Chromium and WebKit * docs(specs): note the plan page's preview scope and the WKWebView tab-stop gap * fix(ask-user-question): keep Discuss across reconnects, let the Other checkbox cancel it, and make previews keyboard-scrollable * test(ask-user-question): click Submit only once the page-change reveal has settled * feat(ask-user-question): Enter picks, Space adds a note, d discusses and the platform chord submits in the card * feat(pi-ask-user-question): match the card's keys in the terminal — Enter picks, Space notes, Next and Submit rows, Ctrl+Enter sends * docs(ask-user-question): describe the explicit-selection keyboard model in the specs and live spec * chore(locales): restore package.json and tsconfig.json that a catalog edit rewrote * docs(web): note that the platform modifier now comes from @thinkrail/ui/keyboard * Document extension settings in the contracts, settings, host, store, transport and chat specs, move them to protocol v104 after the GitHub star ask took v103, and narrow stored setting flags with a type guard instead of a cast. * Gate Discuss on a shared ASK_DISCUSS_PROTOCOL_VERSION (v104) so a v103 host, whose formatter would report an empty discuss as no answer, never shows the toggle. * ci(e2e): fail over a stalled apt mirror when installing WebKit's system libraries * fix(server): load extensions with the setting snapshot the loader records, so a change and revert mid-reload never leaves a stale tool schema current * ci(e2e): cap each WebKit dependency install attempt so a trickling apt mirror retries instead of exhausting the wait * ci(e2e): install WebKit's missing libraries without Playwright's font group, whose mirror download stalled past the wait * Move extension settings and Discuss to protocol v105 after background workspace creation took v104 * test(e2e): assert the plan-page answer by its lasting receipt, not the transient sent state the card can leave before WebKit sees it --------- Co-authored-by: OLavrik <Olya_lavrik@inbox.ru> Co-authored-by: rsolmano <rinat.suleimanov@jetbrains.com> | 16 hours ago |
| lint(web): reject Object.create(null) outside nullProto (#1067) A Biome GritQL plugin flags `Object.create(null)` in `apps/web/src` except `lib/nullProto.ts`, so new dictionaries keep the value-type check. The three test sites that seeded `removedWorkspaceIds` move to `nullProto`. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 6 days ago |
| [Design] Unify buttons into one system and move the app onto it (#817) * feat(ui): unify buttons into one system and move the app onto it packages/ui Button and IconButton become the single button system: primary, soft-primary, outline, ghost and destructive at S/M/L (20/24/32px; 14/16/20px icons), iconLeft/iconRight, square icon-only buttons whose label is also the shared tooltip, loading (icon-sized spinner, blocks re-triggering) and a persistent selected state. Labels use a new ui.button style (470 weight). Every state is a semantic token: new dangerHover/onDanger palette keys and control-destructive-* roles, a soft-primary hover role that keeps the accent label AA, an offset primary focus outline visible over every fill, ghost focus with its hover fill, pressed identical to hover, disabled never hidden. Ordinary action buttons across apps/web, resource renderers and the visualize extension move onto it (including the new i18n strings from main); panel tool rails wear the ghost M skin without the accent edge bar. Legacy variant/size names are removed and buttonUsage.test.ts rejects them, call-site skins and raw <button> re-skins. IconTooltip no longer opens on programmatic focus and closes before the layer beneath it on Escape. * docs(design-audit): add the button-system catalog and migration record buttons.html renders the production Button/IconButton in all six themes with every state, the app's selections and the real tool rails; verify-buttons.ts checks geometry, focus and contrast; buttons-migration.md records every old-to-new change and each remaining raw button with its reason. * fix(web): show the reason on a disabled remove-group button The empty-group remove IconButton wraps its tooltip trigger, so a disabled button still explains why it cannot remove the group. * docs(web): allow the prompt module's shared Button dependency in its specs * feat(ui): let a loading button spin its own refresh icon in place Button and IconButton gain spinIcon: with loading, the button rotates its own icon instead of swapping in the spinner. The five refresh controls the components loading vocabulary names (GitHub, providers, both model pickers, branch picker) use it, so their RefreshCw keeps spinning in place as specced. * fix(web): move Environment settings onto the shared button system * fix(ui): show tooltips on disabled buttons and replace title with a tooltip prop * fix(ui): raise ghost actions inside hover-filled rows to the elevated surface * fix(ui): give soft-primary a selected look and mark the expanded file chip * feat(ui): add a tone prop so warning and danger actions keep their colour in every state * fix(web): square the composer Stop button at narrow widths and give it a tooltip * refactor(ui): share button data attributes and icon wrappers, and move JSDoc into the spec * fix(ui): cover fieldset-disabled and reduced-motion loading, keep icon focus rings unclipped, lift tooltips above toasts * fix(web): restore rail drop hints and badges, the comment icon's elevation, short queue tooltips, and the Changes picker pair * docs: align the button specs and the migration log with the review fixes * fix(web): move the new Discord link onto the shared button system * docs(web): describe the current button API in the Projects and notification specs * fix(ui): wrap a tooltip trigger only while its button is disabled, and merge buttonVariants compounds * fix(web): keep history-row action hovers and Changes toolbar focus rings visible * fix(web): name the current diff scope on the Changes scope trigger for screen readers * docs(ui): note that IconButton defaults to size m * fix(web): move the custom themes folder actions onto the shared button system * fix(themes): derive dangerHover and onDanger for theme files written before they existed * fix(design-audit): initialize themes through the renamed initializeThemes export * fix(web): keep the Japanese catalog and the button guard in step with main's moved ask card --------- Co-authored-by: Julia.Shilova <Julia.Shilova@MacBook-Pro-5.local> Co-authored-by: danyaberezun <danya.berezun@gmail.com> | 10 days ago |
| feat(ask-user-question): redesign the questionnaire card — stable height, notes and Other in place, rich previews, Discuss, receipt (#1192) * fix(ask-user-question): make every questionnaire control reachable by keyboard in WebKit * feat(pi-ask-user-question): add question previews, opt-in file previews, discuss-first answers and one-option confirmations * feat(extensions): add per-extension settings and share the workspace file check through the session seam * refactor(resource-renderers): share the framed file preview and add compact chrome for embedded frames * feat(ask-user-question): drive file previews from the rich-preview setting and teach the Discuss and preview conventions * refactor(ask-user-question): stack question pages at a stable height with in-place note slots and a real Other field * feat(ask-user-question): add question previews, a fixed preview pane and a per-question Discuss mark to the card * feat(ask-user-question): replace the answered record with a foldable question → answer receipt * test(ask-user-question): cover stable paging, growing fields, previews, Discuss, the receipt and the rich-preview switch in Chromium and WebKit * docs(specs): note the plan page's preview scope and the WKWebView tab-stop gap * fix(ask-user-question): keep Discuss across reconnects, let the Other checkbox cancel it, and make previews keyboard-scrollable * test(ask-user-question): click Submit only once the page-change reveal has settled * feat(ask-user-question): Enter picks, Space adds a note, d discusses and the platform chord submits in the card * feat(pi-ask-user-question): match the card's keys in the terminal — Enter picks, Space notes, Next and Submit rows, Ctrl+Enter sends * docs(ask-user-question): describe the explicit-selection keyboard model in the specs and live spec * chore(locales): restore package.json and tsconfig.json that a catalog edit rewrote * docs(web): note that the platform modifier now comes from @thinkrail/ui/keyboard * Document extension settings in the contracts, settings, host, store, transport and chat specs, move them to protocol v104 after the GitHub star ask took v103, and narrow stored setting flags with a type guard instead of a cast. * Gate Discuss on a shared ASK_DISCUSS_PROTOCOL_VERSION (v104) so a v103 host, whose formatter would report an empty discuss as no answer, never shows the toggle. * ci(e2e): fail over a stalled apt mirror when installing WebKit's system libraries * fix(server): load extensions with the setting snapshot the loader records, so a change and revert mid-reload never leaves a stale tool schema current * ci(e2e): cap each WebKit dependency install attempt so a trickling apt mirror retries instead of exhausting the wait * ci(e2e): install WebKit's missing libraries without Playwright's font group, whose mirror download stalled past the wait * Move extension settings and Discuss to protocol v105 after background workspace creation took v104 * test(e2e): assert the plan-page answer by its lasting receipt, not the transient sent state the card can leave before WebKit sees it --------- Co-authored-by: OLavrik <Olya_lavrik@inbox.ru> Co-authored-by: rsolmano <rinat.suleimanov@jetbrains.com> | 16 hours ago |
| fix(fs): identify SVG by its document root (#1184) Co-authored-by: Rinat S <rinat.suleimanov@jetbrains.com> | 15 hours ago |
| chore(deps): upgrade pi to 1.5.0 (#1160) * chore(deps): upgrade pi to 1.5.0 and re-port the Anthropic SSE framing patch * chore(deps): regenerate bun.lock with Bun 1.4.4 and drop the 1.4.0 pi-ai patch * refactor(extensions): build string enums with TypeBox instead of pi-ai's StringEnum * fix(server): follow pi 1.5.0's openai default, MCP clientRegistration "auto" and manifest semantics * fix(server): rely on pi 1.5.0's rollback of a failed usage append and keep only the torn-line cut * docs(pi-compatibility): record the usage-append leaf restore as removed in pi 1.5 * docs(pi-compatibility): record the pi 1.5.0 re-check and add the pi-visualize changeset * test(server): name pi's current openai default in the cheap-model fallback test * test(server): compare every token counter in the dropped-terminal-write reconciliation test | 4 days ago |
| feat(ask-user-question): redesign the questionnaire card — stable height, notes and Other in place, rich previews, Discuss, receipt (#1192) * fix(ask-user-question): make every questionnaire control reachable by keyboard in WebKit * feat(pi-ask-user-question): add question previews, opt-in file previews, discuss-first answers and one-option confirmations * feat(extensions): add per-extension settings and share the workspace file check through the session seam * refactor(resource-renderers): share the framed file preview and add compact chrome for embedded frames * feat(ask-user-question): drive file previews from the rich-preview setting and teach the Discuss and preview conventions * refactor(ask-user-question): stack question pages at a stable height with in-place note slots and a real Other field * feat(ask-user-question): add question previews, a fixed preview pane and a per-question Discuss mark to the card * feat(ask-user-question): replace the answered record with a foldable question → answer receipt * test(ask-user-question): cover stable paging, growing fields, previews, Discuss, the receipt and the rich-preview switch in Chromium and WebKit * docs(specs): note the plan page's preview scope and the WKWebView tab-stop gap * fix(ask-user-question): keep Discuss across reconnects, let the Other checkbox cancel it, and make previews keyboard-scrollable * test(ask-user-question): click Submit only once the page-change reveal has settled * feat(ask-user-question): Enter picks, Space adds a note, d discusses and the platform chord submits in the card * feat(pi-ask-user-question): match the card's keys in the terminal — Enter picks, Space notes, Next and Submit rows, Ctrl+Enter sends * docs(ask-user-question): describe the explicit-selection keyboard model in the specs and live spec * chore(locales): restore package.json and tsconfig.json that a catalog edit rewrote * docs(web): note that the platform modifier now comes from @thinkrail/ui/keyboard * Document extension settings in the contracts, settings, host, store, transport and chat specs, move them to protocol v104 after the GitHub star ask took v103, and narrow stored setting flags with a type guard instead of a cast. * Gate Discuss on a shared ASK_DISCUSS_PROTOCOL_VERSION (v104) so a v103 host, whose formatter would report an empty discuss as no answer, never shows the toggle. * ci(e2e): fail over a stalled apt mirror when installing WebKit's system libraries * fix(server): load extensions with the setting snapshot the loader records, so a change and revert mid-reload never leaves a stale tool schema current * ci(e2e): cap each WebKit dependency install attempt so a trickling apt mirror retries instead of exhausting the wait * ci(e2e): install WebKit's missing libraries without Playwright's font group, whose mirror download stalled past the wait * Move extension settings and Discuss to protocol v105 after background workspace creation took v104 * test(e2e): assert the plan-page answer by its lasting receipt, not the transient sent state the card can leave before WebKit sees it --------- Co-authored-by: OLavrik <Olya_lavrik@inbox.ru> Co-authored-by: rsolmano <rinat.suleimanov@jetbrains.com> | 16 hours ago |
| feat(ask-user-question): redesign the questionnaire card — stable height, notes and Other in place, rich previews, Discuss, receipt (#1192) * fix(ask-user-question): make every questionnaire control reachable by keyboard in WebKit * feat(pi-ask-user-question): add question previews, opt-in file previews, discuss-first answers and one-option confirmations * feat(extensions): add per-extension settings and share the workspace file check through the session seam * refactor(resource-renderers): share the framed file preview and add compact chrome for embedded frames * feat(ask-user-question): drive file previews from the rich-preview setting and teach the Discuss and preview conventions * refactor(ask-user-question): stack question pages at a stable height with in-place note slots and a real Other field * feat(ask-user-question): add question previews, a fixed preview pane and a per-question Discuss mark to the card * feat(ask-user-question): replace the answered record with a foldable question → answer receipt * test(ask-user-question): cover stable paging, growing fields, previews, Discuss, the receipt and the rich-preview switch in Chromium and WebKit * docs(specs): note the plan page's preview scope and the WKWebView tab-stop gap * fix(ask-user-question): keep Discuss across reconnects, let the Other checkbox cancel it, and make previews keyboard-scrollable * test(ask-user-question): click Submit only once the page-change reveal has settled * feat(ask-user-question): Enter picks, Space adds a note, d discusses and the platform chord submits in the card * feat(pi-ask-user-question): match the card's keys in the terminal — Enter picks, Space notes, Next and Submit rows, Ctrl+Enter sends * docs(ask-user-question): describe the explicit-selection keyboard model in the specs and live spec * chore(locales): restore package.json and tsconfig.json that a catalog edit rewrote * docs(web): note that the platform modifier now comes from @thinkrail/ui/keyboard * Document extension settings in the contracts, settings, host, store, transport and chat specs, move them to protocol v104 after the GitHub star ask took v103, and narrow stored setting flags with a type guard instead of a cast. * Gate Discuss on a shared ASK_DISCUSS_PROTOCOL_VERSION (v104) so a v103 host, whose formatter would report an empty discuss as no answer, never shows the toggle. * ci(e2e): fail over a stalled apt mirror when installing WebKit's system libraries * fix(server): load extensions with the setting snapshot the loader records, so a change and revert mid-reload never leaves a stale tool schema current * ci(e2e): cap each WebKit dependency install attempt so a trickling apt mirror retries instead of exhausting the wait * ci(e2e): install WebKit's missing libraries without Playwright's font group, whose mirror download stalled past the wait * Move extension settings and Discuss to protocol v105 after background workspace creation took v104 * test(e2e): assert the plan-page answer by its lasting receipt, not the transient sent state the card can leave before WebKit sees it --------- Co-authored-by: OLavrik <Olya_lavrik@inbox.ru> Co-authored-by: rsolmano <rinat.suleimanov@jetbrains.com> | 16 hours ago |
| feat(ask-user-question): redesign the questionnaire card — stable height, notes and Other in place, rich previews, Discuss, receipt (#1192) * fix(ask-user-question): make every questionnaire control reachable by keyboard in WebKit * feat(pi-ask-user-question): add question previews, opt-in file previews, discuss-first answers and one-option confirmations * feat(extensions): add per-extension settings and share the workspace file check through the session seam * refactor(resource-renderers): share the framed file preview and add compact chrome for embedded frames * feat(ask-user-question): drive file previews from the rich-preview setting and teach the Discuss and preview conventions * refactor(ask-user-question): stack question pages at a stable height with in-place note slots and a real Other field * feat(ask-user-question): add question previews, a fixed preview pane and a per-question Discuss mark to the card * feat(ask-user-question): replace the answered record with a foldable question → answer receipt * test(ask-user-question): cover stable paging, growing fields, previews, Discuss, the receipt and the rich-preview switch in Chromium and WebKit * docs(specs): note the plan page's preview scope and the WKWebView tab-stop gap * fix(ask-user-question): keep Discuss across reconnects, let the Other checkbox cancel it, and make previews keyboard-scrollable * test(ask-user-question): click Submit only once the page-change reveal has settled * feat(ask-user-question): Enter picks, Space adds a note, d discusses and the platform chord submits in the card * feat(pi-ask-user-question): match the card's keys in the terminal — Enter picks, Space notes, Next and Submit rows, Ctrl+Enter sends * docs(ask-user-question): describe the explicit-selection keyboard model in the specs and live spec * chore(locales): restore package.json and tsconfig.json that a catalog edit rewrote * docs(web): note that the platform modifier now comes from @thinkrail/ui/keyboard * Document extension settings in the contracts, settings, host, store, transport and chat specs, move them to protocol v104 after the GitHub star ask took v103, and narrow stored setting flags with a type guard instead of a cast. * Gate Discuss on a shared ASK_DISCUSS_PROTOCOL_VERSION (v104) so a v103 host, whose formatter would report an empty discuss as no answer, never shows the toggle. * ci(e2e): fail over a stalled apt mirror when installing WebKit's system libraries * fix(server): load extensions with the setting snapshot the loader records, so a change and revert mid-reload never leaves a stale tool schema current * ci(e2e): cap each WebKit dependency install attempt so a trickling apt mirror retries instead of exhausting the wait * ci(e2e): install WebKit's missing libraries without Playwright's font group, whose mirror download stalled past the wait * Move extension settings and Discuss to protocol v105 after background workspace creation took v104 * test(e2e): assert the plan-page answer by its lasting receipt, not the transient sent state the card can leave before WebKit sees it --------- Co-authored-by: OLavrik <Olya_lavrik@inbox.ru> Co-authored-by: rsolmano <rinat.suleimanov@jetbrains.com> | 16 hours ago |
| fix(ci): stop the Windows build failing on CRLF checkouts (#182) `windows-latest` defaults to core.autocrlf=true, so checkout wrote the committed generated CSS as CRLF and `typography:check` compared raw bytes against an LF-emitting generator — every file read as STALE and the nightly never reached the binary compile. Broken since b665d5b. Pin the working tree to LF via .gitattributes, and centralize the five byte-compares (both CLIs + three test read-boundaries) into scripts/generatedFiles.ts so "stale" is defined once and ignores line endings. | 2 months ago |
| feat(web): edge tool rails that mirror the pane model, Minimal themes, and remount-free panel toggles (#680) Projects, Specs, Files, Changes and Review move from per-pane tab strips to persistent left/right/bottom edge rails. The rail renders the layout's group model instead of hiding it: entries come in clusters, one per pane in document order, separated by a hairline; one pressed icon per open pane; removed tools sit dimmed in a trailing cluster. Drops follow the clusters (entry halves insert into that pane, a "New pane here" zone at every boundary creates one) and the pane header title drags its tool. Terminal groups keep named session tabs, and Project Home composes the same rail and pane header. Tools and terminals never share a pane (canJoinAuxiliaryGroup): enforced in every mutation, in normalization on load and across workspaces, in passive terminal placement and preset remaps. The mixed-order anchors (beforeToolByTabId) and terminal recall (lastTerminalByGroup) go with it. Menus name a pane by its contents, hide commands that can never apply to a tab, and the layout owns New terminal / New terminal pane below. Panels no longer remount on shape changes: structural-only panel-group keys, committed sizes re-applied imperatively, and topology-dependent minimums relaxed for the one membership-change commit (useTopologySettled). Themes: the standard Light/Dark and High Contrast palettes are unchanged; the quieter Minimal palettes ship as Minimal Light / Minimal Dark. A theme is a palette and role usage never varies by theme. The rails live in the split workbench renderer (workbenchRails.tsx and friends); the interface design lab that produced the direction stays out of the repository (design/ is gitignored). The spec-graph index also skips the scratch directories other assistants keep in a project (.claude, .superpowers, .gsd, .mockups, .playwright-mcp), whose plans and generated skills carry spec-shaped frontmatter. README screenshots are re-captured from this head (the real project in an isolated host: workbench light/dark and the Specs tool), with alt text that names the edge rails. | 28 days ago |
| feat: unconditional PII-free PostHog error tracking with readable stacks (#769) * feat(analytics): report sanitized exceptions through the basic PostHog sink * feat(host): report crashes, failed requests and logged errors to error tracking * feat: forward UI errors to host error tracking over client.reportError * feat(desktop): forward handled main-process errors to host error tracking * docs: document unconditional sanitized error reports in specs, README and AGENTS.md * test(artifacts): tolerate allow-listed error reports in the desktop analytics probe * feat(analytics): keep raw frames and chunk ids for PostHog symbolication * feat(web): send PostHog chunk ids with client error reports * feat(cli): embed the binary's source map for readable error stacks * feat(release): upload web and desktop-runtime source maps to PostHog * test(release): pin source-map credential scoping in the build action * docs: document source-map upload and readable error stacks * fix(analytics): carry the report's handled flag into the root exception mechanism * docs: pin client error reports to protocol v90 after rebasing onto main * feat(analytics): send a classifier instead of error message text * fix(host): wait at most 1 s for the crash report and tag the crash kind * fix(desktop): derive runtime chunk ids from the code, its map and the release * build(release): run posthog-cli only after a pinned SHA-256 check of its binary * fix: report stable boundary ids, route main's new desktop errors and scope release credentials * fix(analytics): cut the message out of every stack before the SDK parses frames --------- Co-authored-by: danyaberezun <danya.berezun@gmail.com> | 16 days ago |
| Add open-source governance assets (#69) Add the open-source files (product name: ThinkRail): - LICENSE — Apache License 2.0 - CODE_OF_CONDUCT.md — JetBrains OSS & Community Code of Conduct - README.md — overview + the JetBrains incubator badge - CONTRIBUTING.md — dev setup, gates, spec-first + module-boundary workflow - .github PR template + issue templates (bug_report, feature_request, config) | 3 months ago |
| feat(locales): ship Spanish as a built-in interface language (#942) * feat(locales): ship Spanish as a built-in interface language * fix(locales): keep the literal SSH "yes" answer in Spanish * fix(web): wrap long layout-preset actions inside their card | 10 days ago |
| Add open-source governance assets (#69) Add the open-source files (product name: ThinkRail): - LICENSE — Apache License 2.0 - CODE_OF_CONDUCT.md — JetBrains OSS & Community Code of Conduct - README.md — overview + the JetBrains incubator badge - CONTRIBUTING.md — dev setup, gates, spec-first + module-boundary workflow - .github PR template + issue templates (bug_report, feature_request, config) | 3 months ago |
| feat(ask-user-question): redesign the questionnaire card — stable height, notes and Other in place, rich previews, Discuss, receipt (#1192) * fix(ask-user-question): make every questionnaire control reachable by keyboard in WebKit * feat(pi-ask-user-question): add question previews, opt-in file previews, discuss-first answers and one-option confirmations * feat(extensions): add per-extension settings and share the workspace file check through the session seam * refactor(resource-renderers): share the framed file preview and add compact chrome for embedded frames * feat(ask-user-question): drive file previews from the rich-preview setting and teach the Discuss and preview conventions * refactor(ask-user-question): stack question pages at a stable height with in-place note slots and a real Other field * feat(ask-user-question): add question previews, a fixed preview pane and a per-question Discuss mark to the card * feat(ask-user-question): replace the answered record with a foldable question → answer receipt * test(ask-user-question): cover stable paging, growing fields, previews, Discuss, the receipt and the rich-preview switch in Chromium and WebKit * docs(specs): note the plan page's preview scope and the WKWebView tab-stop gap * fix(ask-user-question): keep Discuss across reconnects, let the Other checkbox cancel it, and make previews keyboard-scrollable * test(ask-user-question): click Submit only once the page-change reveal has settled * feat(ask-user-question): Enter picks, Space adds a note, d discusses and the platform chord submits in the card * feat(pi-ask-user-question): match the card's keys in the terminal — Enter picks, Space notes, Next and Submit rows, Ctrl+Enter sends * docs(ask-user-question): describe the explicit-selection keyboard model in the specs and live spec * chore(locales): restore package.json and tsconfig.json that a catalog edit rewrote * docs(web): note that the platform modifier now comes from @thinkrail/ui/keyboard * Document extension settings in the contracts, settings, host, store, transport and chat specs, move them to protocol v104 after the GitHub star ask took v103, and narrow stored setting flags with a type guard instead of a cast. * Gate Discuss on a shared ASK_DISCUSS_PROTOCOL_VERSION (v104) so a v103 host, whose formatter would report an empty discuss as no answer, never shows the toggle. * ci(e2e): fail over a stalled apt mirror when installing WebKit's system libraries * fix(server): load extensions with the setting snapshot the loader records, so a change and revert mid-reload never leaves a stale tool schema current * ci(e2e): cap each WebKit dependency install attempt so a trickling apt mirror retries instead of exhausting the wait * ci(e2e): install WebKit's missing libraries without Playwright's font group, whose mirror download stalled past the wait * Move extension settings and Discuss to protocol v105 after background workspace creation took v104 * test(e2e): assert the plan-page answer by its lasting receipt, not the transient sent state the card can leave before WebKit sees it --------- Co-authored-by: OLavrik <Olya_lavrik@inbox.ru> Co-authored-by: rsolmano <rinat.suleimanov@jetbrains.com> | 16 hours ago |
| feat(ask-user-question): redesign the questionnaire card — stable height, notes and Other in place, rich previews, Discuss, receipt (#1192) * fix(ask-user-question): make every questionnaire control reachable by keyboard in WebKit * feat(pi-ask-user-question): add question previews, opt-in file previews, discuss-first answers and one-option confirmations * feat(extensions): add per-extension settings and share the workspace file check through the session seam * refactor(resource-renderers): share the framed file preview and add compact chrome for embedded frames * feat(ask-user-question): drive file previews from the rich-preview setting and teach the Discuss and preview conventions * refactor(ask-user-question): stack question pages at a stable height with in-place note slots and a real Other field * feat(ask-user-question): add question previews, a fixed preview pane and a per-question Discuss mark to the card * feat(ask-user-question): replace the answered record with a foldable question → answer receipt * test(ask-user-question): cover stable paging, growing fields, previews, Discuss, the receipt and the rich-preview switch in Chromium and WebKit * docs(specs): note the plan page's preview scope and the WKWebView tab-stop gap * fix(ask-user-question): keep Discuss across reconnects, let the Other checkbox cancel it, and make previews keyboard-scrollable * test(ask-user-question): click Submit only once the page-change reveal has settled * feat(ask-user-question): Enter picks, Space adds a note, d discusses and the platform chord submits in the card * feat(pi-ask-user-question): match the card's keys in the terminal — Enter picks, Space notes, Next and Submit rows, Ctrl+Enter sends * docs(ask-user-question): describe the explicit-selection keyboard model in the specs and live spec * chore(locales): restore package.json and tsconfig.json that a catalog edit rewrote * docs(web): note that the platform modifier now comes from @thinkrail/ui/keyboard * Document extension settings in the contracts, settings, host, store, transport and chat specs, move them to protocol v104 after the GitHub star ask took v103, and narrow stored setting flags with a type guard instead of a cast. * Gate Discuss on a shared ASK_DISCUSS_PROTOCOL_VERSION (v104) so a v103 host, whose formatter would report an empty discuss as no answer, never shows the toggle. * ci(e2e): fail over a stalled apt mirror when installing WebKit's system libraries * fix(server): load extensions with the setting snapshot the loader records, so a change and revert mid-reload never leaves a stale tool schema current * ci(e2e): cap each WebKit dependency install attempt so a trickling apt mirror retries instead of exhausting the wait * ci(e2e): install WebKit's missing libraries without Playwright's font group, whose mirror download stalled past the wait * Move extension settings and Discuss to protocol v105 after background workspace creation took v104 * test(e2e): assert the plan-page answer by its lasting receipt, not the transient sent state the card can leave before WebKit sees it --------- Co-authored-by: OLavrik <Olya_lavrik@inbox.ru> Co-authored-by: rsolmano <rinat.suleimanov@jetbrains.com> | 16 hours ago |
| lint(web): reject Object.create(null) outside nullProto (#1067) A Biome GritQL plugin flags `Object.create(null)` in `apps/web/src` except `lib/nullProto.ts`, so new dictionaries keep the value-type check. The three test sites that seeded `removedWorkspaceIds` move to `nullProto`. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 6 days ago |
| feat(ask-user-question): redesign the questionnaire card — stable height, notes and Other in place, rich previews, Discuss, receipt (#1192) * fix(ask-user-question): make every questionnaire control reachable by keyboard in WebKit * feat(pi-ask-user-question): add question previews, opt-in file previews, discuss-first answers and one-option confirmations * feat(extensions): add per-extension settings and share the workspace file check through the session seam * refactor(resource-renderers): share the framed file preview and add compact chrome for embedded frames * feat(ask-user-question): drive file previews from the rich-preview setting and teach the Discuss and preview conventions * refactor(ask-user-question): stack question pages at a stable height with in-place note slots and a real Other field * feat(ask-user-question): add question previews, a fixed preview pane and a per-question Discuss mark to the card * feat(ask-user-question): replace the answered record with a foldable question → answer receipt * test(ask-user-question): cover stable paging, growing fields, previews, Discuss, the receipt and the rich-preview switch in Chromium and WebKit * docs(specs): note the plan page's preview scope and the WKWebView tab-stop gap * fix(ask-user-question): keep Discuss across reconnects, let the Other checkbox cancel it, and make previews keyboard-scrollable * test(ask-user-question): click Submit only once the page-change reveal has settled * feat(ask-user-question): Enter picks, Space adds a note, d discusses and the platform chord submits in the card * feat(pi-ask-user-question): match the card's keys in the terminal — Enter picks, Space notes, Next and Submit rows, Ctrl+Enter sends * docs(ask-user-question): describe the explicit-selection keyboard model in the specs and live spec * chore(locales): restore package.json and tsconfig.json that a catalog edit rewrote * docs(web): note that the platform modifier now comes from @thinkrail/ui/keyboard * Document extension settings in the contracts, settings, host, store, transport and chat specs, move them to protocol v104 after the GitHub star ask took v103, and narrow stored setting flags with a type guard instead of a cast. * Gate Discuss on a shared ASK_DISCUSS_PROTOCOL_VERSION (v104) so a v103 host, whose formatter would report an empty discuss as no answer, never shows the toggle. * ci(e2e): fail over a stalled apt mirror when installing WebKit's system libraries * fix(server): load extensions with the setting snapshot the loader records, so a change and revert mid-reload never leaves a stale tool schema current * ci(e2e): cap each WebKit dependency install attempt so a trickling apt mirror retries instead of exhausting the wait * ci(e2e): install WebKit's missing libraries without Playwright's font group, whose mirror download stalled past the wait * Move extension settings and Discuss to protocol v105 after background workspace creation took v104 * test(e2e): assert the plan-page answer by its lasting receipt, not the transient sent state the card can leave before WebKit sees it --------- Co-authored-by: OLavrik <Olya_lavrik@inbox.ru> Co-authored-by: rsolmano <rinat.suleimanov@jetbrains.com> | 16 hours ago |
| docs(specs): make the goal doc a living product document (#573) * docs(specs): rewrite goal-and-requirements as a living product document * docs(specs): qualify isolation and per-step commit claims in the goal doc * docs(specs): drop V1/V2 framing from architecture, AGENTS and README * docs(workflow): make new-project goal docs living product records * docs(workflow): save pre-filled briefs in the living goal-doc shape * docs(specs): replace V1/V2 labels in module specs with present-tense wording | 1 month ago |
| feat: let users choose the interface and code fonts (#1092) * feat: let users choose the interface and code fonts Appearance gains Fonts and Custom fonts groups: interface and code fonts from the bundled faces, the host's installed fonts or uploaded files, fallback fonts, code size, ligatures and a text-weight slider. typography.json stays the only source of defaults; a new web fonts module overrides only the user-adjustable tokens on :root. * fix(fonts): harden font settings after review - Render the font pickers into the Settings dialog so they scroll and stay inside it. - Keep an open Pierre comment when the code size changes: hand the new row height to the connected Pierre instances instead of remounting the surface. - Settings drafts no longer let a host echo undo an unsent edit or a newer save; xterm and Mermaid follow the code font through a latest-wins watcher; the custom font cap is checked again right before the rename. - Share the Settings folder row, draft input, save, sub-heading, tag and range slider, and one host data-folder poller for locales, themes and fonts. - Name every picker and reset for assistive tech; the preview is inert on the chat canvas. - Translate the font strings into Russian. - Make the font e2e independent of installed fonts and reset settings over the wire. * fix(fonts): wait for the resolved weight and reach the launched host in e2e - fontsLoaded loads the resolved weight too, so Monaco, xterm and Mermaid measure the face they will draw with, not the regular one. - The font e2e talks to the host the page was launched against, so it runs in the binary and desktop artifact modes. * fix(visualize): wait for the code face before the first Mermaid render | 7 days ago |
| fix: use one spelling for Windows directory and relative paths (#775) * docs(specs): record the path-spelling contract for directories and relative paths * fix: store project and workspace directories in the spelling pi records (#766) * fix: send and store worktree-relative paths with / on every host * fix: keep picked drive roots and expand ~\ in Windows project paths * fix(web): read backslashes in agent paths as separators in links, mentions and history * fix: match /-spelled PATH entries in install.ps1 and seed the smoke transcript like pi * test: resolve file URLs and Windows absolute paths correctly in web, website and extension-api tests * ci: run the Windows path suite in the binary-windows job * fix(workspaces): never seed the scratch .gitignore through a symlink on Windows * test: root Windows path fixtures at the canonical spelling and gate only the PowerShell installer suite * docs(specs): state readDir's POSIX paths once in the fs spec * fix(projects): name ~\ in the Windows project-path error | 16 days ago |
| feat(desktop): ship the macOS x64 desktop build (#894) * feat(desktop): ship the macOS x64 desktop build Electrobun 2.0.1 publishes no macOS x64 core, so Intel Macs had no desktop installer. Pin 2.0.5 — the first release with a macos-x64 core and the paired Hutch 0.28.2 — and teach the release recipe about the new target. - collector maps bun-darwin-x64 to the macos-x64 DMG, update manifest, and expanded-app archive under thinkrail-desktop-darwin-x64.dmg - updater enablement accepts darwin-x64 like the other shipped targets - install.sh still refuses the Intel CLI, but now points at the DMG - specs and README drop the "no Intel build" claim * feat(install): ship the Intel macOS CLI and keep Rosetta shells on arm64 * docs(desktop): refresh Electrobun 2.0.5 behaviour notes and document the Intel CLI * docs(architecture): Cottontail is no longer Electrobun's default runtime --------- Co-authored-by: 金宇 <jinyu6@antcode.com> Co-authored-by: rsolmano <rinat.suleimanov@jetbrains.com> | 11 days ago |
| chore(deps): upgrade pi to 1.5.0 (#1160) * chore(deps): upgrade pi to 1.5.0 and re-port the Anthropic SSE framing patch * chore(deps): regenerate bun.lock with Bun 1.4.4 and drop the 1.4.0 pi-ai patch * refactor(extensions): build string enums with TypeBox instead of pi-ai's StringEnum * fix(server): follow pi 1.5.0's openai default, MCP clientRegistration "auto" and manifest semantics * fix(server): rely on pi 1.5.0's rollback of a failed usage append and keep only the torn-line cut * docs(pi-compatibility): record the usage-append leaf restore as removed in pi 1.5 * docs(pi-compatibility): record the pi 1.5.0 re-check and add the pi-visualize changeset * test(server): name pi's current openai default in the cheap-model fallback test * test(server): compare every token counter in the dropped-terminal-write reconciliation test | 4 days ago |
| chore(deps): upgrade pi to 1.5.0 (#1160) * chore(deps): upgrade pi to 1.5.0 and re-port the Anthropic SSE framing patch * chore(deps): regenerate bun.lock with Bun 1.4.4 and drop the 1.4.0 pi-ai patch * refactor(extensions): build string enums with TypeBox instead of pi-ai's StringEnum * fix(server): follow pi 1.5.0's openai default, MCP clientRegistration "auto" and manifest semantics * fix(server): rely on pi 1.5.0's rollback of a failed usage append and keep only the torn-line cut * docs(pi-compatibility): record the usage-append leaf restore as removed in pi 1.5 * docs(pi-compatibility): record the pi 1.5.0 re-check and add the pi-visualize changeset * test(server): name pi's current openai default in the cheap-model fallback test * test(server): compare every token counter in the dropped-terminal-write reconciliation test | 4 days ago |
| build(ts): turn on unused, implicit-return and fallthrough tsc checks (#790) * build(ts): enable unused, implicit-return, and fallthrough checks in the base tsconfig Turn on noImplicitReturns, noUnusedLocals, noUnusedParameters, noFallthroughCasesInSwitch, allowUnreachableCode: false, and allowUnusedLabels: false for every project. Fix the four existing hits. Desktop keeps noImplicitReturns off because the Electrobun SDK sources it compiles fail that check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * build(ts): fix unused declarations upstream added since the checks were enabled * build(ts): keep desktop's own source clean under noImplicitReturns The desktop noImplicitReturns override hid one desktop site besides the two Electrobun SDK functions: runtimeSourceMap.test.ts's frameOf. An explicit annotation lets control flow see explode() never returns, so only the SDK sources need the override. The desktop spec now states when the override goes away (blackboardsh/electrobun#590). * docs(desktop): record the noImplicitReturns override as approved and temporary The override cannot be scoped to the Electrobun SDK files, so it also stops checking desktop's own source. Remove it once an Electrobun release ships blackboardsh/electrobun#590. --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: danyaberezun <danya.berezun@gmail.com> | 13 days ago |
| chore(e2e): move Playwright configs into e2e/ (#1154) * chore(e2e): move Playwright configs into e2e/ Pass -c from the runners and test:workflows, and keep test-results and playwright-report at the repo root so CI artifact paths do not change. * ci: select artifact jobs for the moved binary and desktop configs | 4 days ago |
| chore(tooling): type-check root tooling, cli scripts, and website tests (#1063) Add a root tsconfig for scripts/ and the Playwright configs, run it as the turbo root task //#typecheck:root from `bun run typecheck`, and add the missing root @types/bun. Include apps/cli/scripts in the cli tsconfig and check website unit tests through tsconfig.test.json, since astro check skips them. Fix the type errors this surfaced in e2e/shardPlan.ts and two website tests. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> | 7 days ago |