@dreb/coding-agent 2.68.1 → 2.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -81,7 +81,9 @@ Or use a custom provider (corporate proxy, Bedrock, etc.) — see [Custom provid
81
81
 
82
82
  Then just talk to dreb. All 13 standard built-in tools are enabled by default (unless `backgroundAgents.maxConcurrentSubagents` is `0`, which removes `subagent` from new parent sessions): `read`, `write`, `edit`, `bash`, `grep`, `find`, `ls`, `web_search`, `web_fetch`, `subagent`, `wait`, `watch_github_ci`, and `ask_user`. Use `--tools` to restrict to a subset (e.g., `--tools read,grep,find,ls` for read-only). Three additional tools — `search`, `skill`, and `tasks_update` — are always active regardless of `--tools`. `suggest_next` is active by default but excluded when `--tools` is specified. The model uses these to fulfill your requests. Add capabilities via [skills](#skills), [prompt templates](#prompt-templates), [extensions](#extensions), or [packages](#packages).
83
83
 
84
- **Also available:** [`@dreb/telegram`](https://www.npmjs.com/package/@dreb/telegram) — run dreb as a Telegram bot with live tool status and visible results for user-facing tools (`npm install -g @dreb/telegram`). [`@dreb/dashboard`](https://www.npmjs.com/package/@dreb/dashboard) — run `dreb dashboard` for a browser UI with fleet overview, full chat steering, dismissible session banners confined to the transcript column without shifting the fleet sidebar, a grouped header with back navigation on the left, model/thinking controls in a separate row, and the fleet sidebar toggle in the bottom usage/context-stats row (also available with details collapsed), explicit navigation that preserves viewed closed transcripts as read-only snapshots, a TUI-parity rolling TPS indicator with long-term delta, generic fail-closed built-in slash-command discovery and execution, inline provider/API failures with partial output preserved, sanitized raster tool images plus sent user uploads retained as bounded transcript previews by default, a bounded all-agent subagent panel with drill-in, a fleet sidebar on session/subagent views with the fleet cards' project/status/reasons, activity/latest-assistant preview, subagents, tasks, model/context/cost, and message/activity metadata (deterministic order, persisted desktop collapse and pointer/keyboard-resizable width, highest-priority status border while hidden, safe-area-aware mobile drawer with managed focus and Escape-to-close without aborting the agent), host file browser, dreb memory editor with exact-revision saves and automatic index cleanup on delete, curated appearance themes with per-browser light/dark mode and font selection (theme default, Google-hosted IBM Plex Mono, or the bundled self-hosted JetBrains Mono, Fira Code, Iosevka, OpenDyslexic, and Atkinson Hyperlegible), and resilient Tailscale/rotating-code pairing with a configurable 180-day default and advance expiry warnings (`npm install -g @dreb/dashboard`; see [docs/dashboard.md](docs/dashboard.md)). Tool images cross browser-facing transport as content-addressed references; in dashboard mode each unique image crosses the RPC stdout pipe at most once per child process (later occurrences become references), and browser-local Settings offers placeholders, bounded previews, or informed-opt-in originals, with size disclosure and confirmation above 1 MiB. Full-resolution HTML export remains self-contained. The Memories screen is dreb-only (`~/.dreb/memory` and populated active/on-disk-session project `.dreb/memory`; empty projects are omitted), shows complete indexes with a >200-line warning, opens local index links within the selected scope, replaces stale editor content with visible loading feedback, surfaces malformed entry frontmatter for repair, preserves drafts on conflicts, and does not create/rename entries or expose Claude paths. Live-first startup fetches runtime cards and opens SSE before the historical inventory scan finishes; unchanged session metadata is reused on later inventory and recovery reads. Compact SSE snapshots then update live fleet cards without repeatedly fetching the cross-project inventory, and session drill-in hydrates state, messages, and background agents through one ordered snapshot request. Direct sidebar switching, including leaving a closed session, loads the destination with its own screen state and per-session text draft; abandoned hydration cannot overwrite the new view. While drill-in remains mounted, authoritative detail refreshes keep its header current, confirmed model/thinking changes are reconciled without stale snapshot rollback, and post-compaction context uses a conservative estimate until fresh provider usage arrives. Terminal provider failures show their reason on fleet cards, while transient failures clear terminal state when automatic retry begins and remain recorded inline on the failed attempt. Its top bar and persistent session header indicators report connecting, connected, retrying, resyncing, disconnected, or auth failed; bounded SSE replay plus an explicit snapshot barrier restores session state, tasks, and image references after a reload, restart, gap, backpressure disconnect, or stalled stream, while authenticated image routes recover bytes separately from authoritative transcripts. Persisted sessions whose recorded working directory is missing remain visible and resumable: Dashboard asks for an existing runtime directory, validates it before starting the child, shows both historical and effective paths, and leaves the original session header unchanged.
84
+ **Also available:** [`@dreb/telegram`](https://www.npmjs.com/package/@dreb/telegram) — run dreb as a Telegram bot with live tool status and visible results for user-facing tools (`npm install -g @dreb/telegram`). [`@dreb/dashboard`](https://www.npmjs.com/package/@dreb/dashboard) — run `dreb dashboard` for a browser UI with fleet overview, full chat steering, dismissible session banners confined to the transcript column without shifting the fleet sidebar, a grouped header with back navigation on the left, model/thinking controls in a separate row, and the fleet sidebar toggle in the bottom usage/context-stats row (also available with details collapsed), explicit navigation that preserves viewed closed transcripts as read-only snapshots, a TUI-parity rolling TPS indicator with long-term delta, generic fail-closed built-in slash-command discovery and execution, inline provider/API failures with partial output preserved, sanitized raster tool images plus sent user uploads retained as bounded transcript previews by default, a bounded all-agent subagent panel with drill-in, a fleet sidebar on session/subagent views with the fleet cards' project/status/reasons, activity/latest-assistant preview, subagents, tasks, model/context/cost, and message/activity metadata (deterministic order, persisted desktop collapse and pointer/keyboard-resizable width, highest-priority status border while hidden, safe-area-aware mobile drawer with managed focus and Escape-to-close without aborting the agent), host file browser, dreb memory editor with exact-revision saves and automatic index cleanup on delete, curated appearance themes with per-browser light/dark mode and a font picker (36 explicit choices plus Theme default: the existing Google-hosted IBM Plex Mono and bundled JetBrains Mono, Fira Code, Iosevka, OpenDyslexic, and Atkinson Hyperlegible, plus 15 sans-serif and 15 serif families; visible open-listbox options preview their regular faces, restricted derivatives have neutral primary names with secondary source attribution, and alternate self-hosted fonts remain lazy when closed), and resilient Tailscale/rotating-code pairing with a configurable 180-day default and advance expiry warnings (`npm install -g @dreb/dashboard`; see [docs/dashboard.md](docs/dashboard.md)). Tool images cross browser-facing transport as content-addressed references; in dashboard mode each unique image crosses the RPC stdout pipe at most once per child process (later occurrences become references), and browser-local Settings offers placeholders, bounded previews, or informed-opt-in originals, with size disclosure and confirmation above 1 MiB. Full-resolution HTML export remains self-contained. The Memories screen is dreb-only (`~/.dreb/memory` and populated active/on-disk-session project `.dreb/memory`; empty projects are omitted), shows complete indexes with a >200-line warning, opens local index links within the selected scope, replaces stale editor content with visible loading feedback, surfaces malformed entry frontmatter for repair, preserves drafts on conflicts, and does not create/rename entries or expose Claude paths. Live-first startup fetches runtime cards and opens SSE before the historical inventory scan finishes; unchanged session metadata is reused on later inventory and recovery reads. Compact SSE snapshots then update live fleet cards without repeatedly fetching the cross-project inventory, and session drill-in hydrates state, messages, and background agents through one ordered snapshot request. Direct sidebar switching, including leaving a closed session, loads the destination with its own screen state and per-session text draft; abandoned hydration cannot overwrite the new view. While drill-in remains mounted, authoritative detail refreshes keep its header current, confirmed model/thinking changes are reconciled without stale snapshot rollback, and post-compaction context uses a conservative estimate until fresh provider usage arrives. Terminal provider failures show their reason on fleet cards, while transient failures clear terminal state when automatic retry begins and remain recorded inline on the failed attempt. Its top bar and persistent session header indicators report connecting, connected, retrying, resyncing, disconnected, or auth failed; bounded SSE replay plus an explicit snapshot barrier restores session state, tasks, and image references after a reload, restart, gap, backpressure disconnect, or stalled stream, while authenticated image routes recover bytes separately from authoritative transcripts. Persisted sessions whose recorded working directory is missing remain visible and resumable: Dashboard asks for an existing runtime directory, validates it before starting the child, shows both historical and effective paths, and leaves the original session header unchanged.
85
+
86
+ Dashboard theme cards keep IBM Plex Mono for Theme default previews, while the font picker's Theme default previews the active theme's built-in family. All 30 additions have real regular, italic, bold, and bold-italic styles, with previews loaded as rows approach the visible scroll window. The 30 added families are source-attributed Latin subsets with neutral internal names (all OFL-licensed); existing IBM Google hosting is unchanged. No font uploads or new multilingual bundles are added; missing scripts use browser fallback. See [expanded font provenance](../dashboard/src/client/assets/fonts/expanded/PROVENANCE.md), [keyboard controls and lazy loading](docs/dashboard.md#appearance-system), and [manual custom fonts in a private source build](docs/dashboard.md#custom-fonts-in-a-source-build). There is no runtime font-upload or install-directory mechanism.
85
87
 
86
88
  **Platform notes:** [Windows](docs/windows.md) | [Termux (Android)](docs/termux.md) | [tmux](docs/tmux.md) | [Terminal setup](docs/terminal-setup.md) | [Shell aliases](docs/shell-aliases.md)
87
89
 
@@ -97,7 +99,7 @@ Then just talk to dreb. All 13 standard built-in tools are enabled by default (u
97
99
 
98
100
  For each built-in provider, dreb maintains a list of tool-capable models, updated with every release. Authenticate via subscription (`/login`) or API key, then select any model from that provider via `/model`.
99
101
 
100
- GPT-6 Astra is available as `openai-codex/gpt-6-astra` and `github-copilot/gpt-6-astra`, with `xhigh` and native `max` thinking support. Codex defaults to `gpt-5.6-luna`. Missing saved defaults now warn and prefer the same provider's available default; explicit removed model IDs are not automatically migrated. See [model selection and removed models](docs/providers.md#model-selection-and-removed-models).
102
+ GPT-6 models (Astra, Sol, Luna, 6.1 Sol) are available on `openai-codex` and `github-copilot`, with `xhigh` and native `max` thinking support. The `openai-codex` catalog is derived automatically from the OpenAI catalog, so new frontier models appear there without manual updates (whether they work depends on your ChatGPT plan/workspace). Codex defaults to `gpt-5.6-luna`. Missing saved defaults now warn and prefer the same provider's available default; explicit removed model IDs are not automatically migrated. See [model selection and removed models](docs/providers.md#model-selection-and-removed-models).
101
103
 
102
104
  **Subscriptions:**
103
105
  - OpenAI ChatGPT Plus/Pro (Codex)
package/docs/dashboard.md CHANGED
@@ -143,7 +143,7 @@ networking window above.
143
143
  | **Subagent view** | Transcript of a background agent: live events via the RPC relay, hydrated from the agent's on-disk session log (`/subagents/:agentId/messages`) so the transcript survives browser reloads. Shows the task, streaming output, tool activity, and any safe Dispatch Arbiter changed/unchanged/failure records with the final agent/model/thinking. No raw arbiter output is displayed or transported. While the child is running, a composer sends the user's text unchanged to that specific child as steering input, displays its pending steering queue, and reports its effective `one-at-a-time` or `all` delivery mode. Completed, failed, rehydrated, and unavailable children remain read-only. |
144
144
  | **Files** | Host-wide browser with places shortcuts (home, /tmp, project roots), breadcrumbs to `/`, new-folder, download, drop-zone/picker upload with explicit collision prompts, and "new session here" on any directory. It also shows the **effective global nested-context trust** for the displayed canonical directory: untrusted, trusted by that root, inherited from a granting root, or global expert trust-all. You can trust the displayed folder and descendants, or untrust the actual granting root; untrusting an inherited folder removes that root's trust for all descendants. |
145
145
  | **Memories** | Dreb-only memory management for `~/.dreb/memory` and `.dreb/memory` under active/disk project roots. It lists existing `MEMORY.md` indexes and direct child `.md` entries only (no Claude paths, create, or rename), shows entry frontmatter or metadata errors so malformed files can be repaired, renders sanitized Markdown preview beside a raw editor, and uses exact SHA-256 revisions so stale saves/deletes return conflicts while preserving drafts. The index view is complete, not truncated, and warns when it exceeds the 200-line memory-index convention. Entry deletion requires both entry and index revisions, removes only matching safe Markdown-link index lines (`file.md` / `./file.md`), writes the cleaned index atomically before unlinking the entry, and rolls back loudly if the unlink fails. |
146
- | **Settings** | Persistent defaults (default model, thinking level, steering/follow-up queue modes, auto-compaction, opt-in continuation of pending work after successful automatic compaction, auto-retry) via `get_settings`/`set_settings` — validation errors are shown verbatim. The continuation option is off by default, can keep unattended model turns and costs running indefinitely, does not restart completed answers, and never affects manual `/compact`. The tab-title card exposes the default-enabled generator toggle and an exact authenticated `provider/model` picker; an unset model clearly retains Explore-agent routing, a pinned model can be cleared back to that route, and edits apply to new unnamed sessions. The scoped-models editor controls model cycling for new sessions only: grouped search, model/provider/all toggles, responsive controls, accessible up/down partial-scope ordering, and save/reset. An absent `enabledModels` is future-inclusive all models in registry order and cannot be reordered; a partial scope is a non-empty ordered list of canonical `provider/model` references. Editing legacy glob, fuzzy, or thinking-suffix values saves normalized exact references. The selected context reads effective global + project settings but writes global; a project-level `enabledModels` shadow is warned. The global-only Dispatch Arbiter card exposes enable/disable, exact authenticated model selection, thinking, guide path, and readiness guidance; model-less enablement is blocked and RPC/runtime validation remains fail-closed. Entering Settings flushes pending writes and reloads durable global + project settings, so external edits appear; read, parse, or write failures fail loudly instead of showing stale settings. The global-only nested-context policy lists every explicit trusted root for audit and revoke, offers a simple add-by-path control, and includes a prominently warned expert trust-all toggle; the Files view remains the primary place to grant trust while browsing. Most defaults seed new sessions, including **Max concurrent subagents** (default 4). Setting it to 0 starts new parents without the subagent tool and tells the parent model to perform normally delegated work itself; positive values cap running children per parent session. Context-trust changes are observed by active main/subagent processes for future lazy loads, but cannot remove already injected content. Dashboard-local preferences (always expand thinking, transcript image display mode, needs-attention notification permission) live in the browser, alongside an appearance section: a theme gallery of eight curated themes (entropist.ca, Dim, Solarized, Gruvbox, Caves of Qud, Van Gogh, and the colorblind-safe Okabe-Ito and Paul Tol) with live preview cards plus system/light/dark mode and Theme default/IBM Plex Mono/JetBrains Mono/Fira Code/Iosevka/OpenDyslexic/Atkinson Hyperlegible font selectors, saved per browser. Shows the current rotating pairing code on the host/local dashboard, the 1–3650 day lifetime used only for future pairings (180-day default), and paired-device expiry dates with unpair. |
146
+ | **Settings** | Persistent defaults (default model, thinking level, steering/follow-up queue modes, auto-compaction, opt-in continuation of pending work after successful automatic compaction, auto-retry) via `get_settings`/`set_settings` — validation errors are shown verbatim. The continuation option is off by default, can keep unattended model turns and costs running indefinitely, does not restart completed answers, and never affects manual `/compact`. The tab-title card exposes the default-enabled generator toggle and an exact authenticated `provider/model` picker; an unset model clearly retains Explore-agent routing, a pinned model can be cleared back to that route, and edits apply to new unnamed sessions. The scoped-models editor controls model cycling for new sessions only: grouped search, model/provider/all toggles, responsive controls, accessible up/down partial-scope ordering, and save/reset. An absent `enabledModels` is future-inclusive all models in registry order and cannot be reordered; a partial scope is a non-empty ordered list of canonical `provider/model` references. Editing legacy glob, fuzzy, or thinking-suffix values saves normalized exact references. The selected context reads effective global + project settings but writes global; a project-level `enabledModels` shadow is warned. The global-only Dispatch Arbiter card exposes enable/disable, exact authenticated model selection, thinking, guide path, and readiness guidance; model-less enablement is blocked and RPC/runtime validation remains fail-closed. Entering Settings flushes pending writes and reloads durable global + project settings, so external edits appear; read, parse, or write failures fail loudly instead of showing stale settings. The global-only nested-context policy lists every explicit trusted root for audit and revoke, offers a simple add-by-path control, and includes a prominently warned expert trust-all toggle; the Files view remains the primary place to grant trust while browsing. Most defaults seed new sessions, including **Max concurrent subagents** (default 4). Setting it to 0 starts new parents without the subagent tool and tells the parent model to perform normally delegated work itself; positive values cap running children per parent session. Context-trust changes are observed by active main/subagent processes for future lazy loads, but cannot remove already injected content. Dashboard-local preferences (always expand thinking, transcript image display mode, needs-attention notification permission) live in the browser, alongside an appearance section: a theme gallery of eight curated themes (entropist.ca, Dim, Solarized, Gruvbox, Caves of Qud, Van Gogh, and the colorblind-safe Okabe-Ito and Paul Tol) with live preview cards plus system/light/dark mode and a font picker with 36 explicit choices plus Theme default (the existing IBM Plex Mono/JetBrains Mono/Fira Code/Iosevka/OpenDyslexic/Atkinson Hyperlegible plus 15 sans-serif and 15 serif families), regular-face previews in the open listbox, saved per browser. Shows the current rotating pairing code on the host/local dashboard, the 1–3650 day lifetime used only for future pairings (180-day default), and paired-device expiry dates with unpair. |
147
147
  | **Pairing** | Remote first-login: identity echo, rotating-code entry, and the security copy explaining what pairing grants. |
148
148
 
149
149
  ### Fleet sidebar controls and session switching
@@ -615,13 +615,30 @@ TUI theme system** — dashboard themes intentionally do not map to TUI themes.
615
615
  - **Theme gallery and font selection.** The settings appearance section shows
616
616
  mode and font selectors plus a grid of live preview cards (one per theme).
617
617
  Each card previews its palette locally without touching the page until you
618
- commit by clicking it. Theme default preserves each theme's built-in font;
619
- IBM Plex Mono, JetBrains Mono, Fira Code (coding ligatures), Iosevka
620
- (compact, coding ligatures), the bundled dyslexia-friendly OpenDyslexic, and
621
- the low-vision-friendly Atkinson Hyperlegible can also be selected
622
- independently. Explicit
623
- choices are reflected in the previews, while Theme default previews stay on
624
- IBM Plex Mono so the inactive Gruvbox card does not fetch JetBrains Mono.
618
+ commit by clicking it. The font picker offers **36 explicit choices plus
619
+ Theme default**: the six existing choices — IBM Plex Mono, JetBrains Mono,
620
+ Fira Code (coding ligatures), Iosevka (compact, coding ligatures), bundled
621
+ dyslexia-friendly OpenDyslexic, and low-vision-friendly Atkinson Hyperlegible —
622
+ plus 15 sans-serif and 15 serif families. Existing IDs and saved choices are
623
+ preserved; explicit choices override any theme and appear in theme-card
624
+ previews. Theme default preserves each theme's built-in font. Theme-card
625
+ previews stay on IBM Plex Mono for Theme default so an inactive Gruvbox card
626
+ does not fetch JetBrains Mono; the font picker's Theme default option instead
627
+ previews the **active** theme's built-in family, even if an explicit override
628
+ is currently selected.
629
+ Visible options preview their own regular face in the open listbox. The select-only
630
+ combobox supports Arrow Up/Down, Home/End, and typeahead to highlight options
631
+ without changing the saved choice; Enter/Space opens or commits, Escape
632
+ closes without committing, and Tab closes and moves focus without committing.
633
+ “Existing choices”, “Sans-serif fonts”, and “Serif fonts” are non-selectable
634
+ category headings, shown as uppercase, full-width dividers—not font options
635
+ or the smaller “Based on …” source descriptions.
636
+ Opening explicitly focuses the trigger. Background scrolling dismisses the
637
+ menu when its trigger leaves the viewport; internal catalog scrolling does not.
638
+ RFN-restricted additions have neutral primary option/trigger names and separate
639
+ “Based on …” descriptions naming the source (for example, Dreb Sans 07 / Based
640
+ on Lato). Typeahead also searches source families, and preference IDs are
641
+ unchanged. PT Serif uses Dreb Text 07 to avoid the reserved individual word Serif.
625
642
  - **Per-browser persistence.** Selections are stored in per-browser
626
643
  `localStorage` (`dreb.dashboard.theme`, `dreb.dashboard.colorMode`, and
627
644
  `dreb.dashboard.font`), with a cross-tab sync listener; a pristine install
@@ -631,20 +648,98 @@ TUI theme system** — dashboard themes intentionally do not map to TUI themes.
631
648
  - **No wrong-appearance flash.** A synchronous bootstrap in `index.html` paints
632
649
  the correct theme, mode, and explicit font before any CSS loads, and keeps a
633
650
  live `theme-color` meta in sync with the active background.
634
- - **Font loading.** Most themes default to Google-hosted IBM Plex Mono; Gruvbox
635
- defaults to the bundled self-hosted JetBrains Mono (OFL, provenance in
636
- `src/client/assets/fonts/`). Fira Code, Iosevka, the dyslexia-friendly
637
- OpenDyslexic, and the low-vision-friendly Atkinson Hyperlegible are bundled
638
- self-hosted explicit options (OFL, same directory, one provenance file each),
639
- and any explicit font selection overrides the theme default. The self-hosted
640
- families are lazy-loaded only
641
- when active typography uses them — rendering a theme or its preview card
642
- never fetches an alternate font. No `light-dark()` is used, keeping an iOS
643
- Safari 16.4 floor.
651
+ - **Font loading.** Existing Google-hosted IBM Plex Mono is unchanged; most
652
+ themes use it by default, while Gruvbox uses bundled self-hosted JetBrains
653
+ Mono. The existing five self-hosted families remain OFL-licensed with their
654
+ provenance in `packages/dashboard/src/client/assets/fonts/`. The 30 additions
655
+ are source-attributed Latin subsets with neutral internal names, all OFL-licensed; see
656
+ [`expanded/PROVENANCE.md`](../../dashboard/src/client/assets/fonts/expanded/PROVENANCE.md)
657
+ for sources, processing, checksums, and licenses.
658
+ Self-hosted faces load lazily when selected typography or open font-picker
659
+ previews use them. With the picker closed, alternate families are not used;
660
+ opening its listbox loads regular previews only as rows approach the visible
661
+ scroll window, not every family or unused bold/italic resource. Older browsers
662
+ without IntersectionObserver preview the complete open list. Every added
663
+ family has real regular, italic, bold, and bold-italic (400/700) support. Theme cards never introduce an alternate family beyond
664
+ the explicit selection. No font uploads or new multilingual bundles are
665
+ added; missing scripts use browser fallback.
666
+ New font source assets add **5,457,304 B** to the existing **1,395,464 B**, for
667
+ **6,852,768 B** combined. This source-asset total is not a startup download;
668
+ all new regular previews total **2,350,548 B**, downloaded progressively as
669
+ the list is explored. A local cold desktop fixture opened in about **14 ms**
670
+ and requested **109,412 B** of new fonts; closed startup requested none and
671
+ reopening reused loaded resources. Network/device speeds vary; the font
672
+ count is inexpensive DOM work (136 additional elements), while downloads
673
+ remain the main tradeoff. The same-toolchain production comparison adds
674
+ **4,737 B gzipped** across JavaScript and CSS; selected styles are fetched
675
+ on demand, and legal packaging does not duplicate source font binaries.
676
+ No `light-dark()` is used, keeping an iOS Safari 16.4 floor.
644
677
  - **PWA launch colors.** The static `manifest.webmanifest` keeps white
645
678
  (default-light) launch colors as the fallback; the live `theme-color` meta
646
679
  follows the active appearance once the app loads.
647
680
 
681
+ ### Custom fonts in a source build
682
+
683
+ The released Dashboard supports its bundled catalog only. There is **no font
684
+ upload control, custom-font install directory, settings-file font path, or
685
+ runtime font discovery**. Uploading a font through the host Files screen does
686
+ not register it with the appearance picker; installing it in your OS does not
687
+ add a picker entry either. Font uploads are a separate feature, not a hidden
688
+ configuration option.
689
+
690
+ For a private customization, manually add the font to a **source checkout** and
691
+ rebuild Dashboard. This is a developer workflow; npm upgrades do not preserve
692
+ edits to an installed package:
693
+
694
+ 1. Put legally usable WOFF2 files and their license/provenance under
695
+ `packages/dashboard/src/client/assets/fonts/custom/`. Keep them separate from
696
+ `expanded/`, which is the hash-locked, generated catalog. Retain required
697
+ notices and obey Reserved Font Name rules if modifying a font. Supply genuine
698
+ normal/italic and weight faces for the styles you intend to use.
699
+ 2. Add a unique ID, label, CSS family, and existing `Sans-serif` or `Serif` group
700
+ to `packages/dashboard/src/client/state/font-catalog.ts`. For example:
701
+ ```ts
702
+ { id: "my-custom-font", label: "My Custom Font", family: "My Custom Font", group: "Sans-serif" },
703
+ ```
704
+ `appearance.ts` derives the valid IDs, picker entries and preview stack from
705
+ this registry. Keep restricted derivative names neutral, with secondary
706
+ source attribution using the registry's existing naming pattern.
707
+ 3. Create `packages/dashboard/src/client/styles/custom-fonts.css` with the real
708
+ faces and a scoped font override. For a regular-400 face:
709
+ ```css
710
+ @font-face {
711
+ font-family: "My Custom Font";
712
+ src: url("../assets/fonts/custom/my-custom-font-regular.woff2") format("woff2");
713
+ font-style: normal;
714
+ font-weight: 400;
715
+ font-display: swap;
716
+ }
717
+ [data-font="my-custom-font"] {
718
+ --mono-font: "My Custom Font", "IBM Plex Mono", "Courier New", monospace;
719
+ }
720
+ ```
721
+ Add corresponding rules for the other real faces. Link this stylesheet in
722
+ `packages/dashboard/src/client/index.html` **after** `font-catalog.css`; do
723
+ not append hand-written rules to the generated stylesheet.
724
+ 4. Add `my-custom-font` to the inline `FONTS` allowlist in that same HTML file so
725
+ saved selection restores synchronously. Update the catalog/count/group and
726
+ bootstrap test expectations for your private extra entry; retain the
727
+ existing checks for the managed `expanded/` records. If distributing your
728
+ build, include custom notices/provenance in Dashboard's `package.json`
729
+ `files` list as well as the built font resources.
730
+ 5. From the repository root, using Node 22, run `npm run check`, `npm run build`,
731
+ and `npm run verify-workspace-links`, then the Dashboard tests:
732
+ ```sh
733
+ npm run test --workspace @dreb/dashboard
734
+ node packages/dashboard/dist/index.js
735
+ ```
736
+ Use this built server, not an unchanged globally installed Dashboard. Check
737
+ selection, reload restoration, actual face loading and fallback behavior.
738
+
739
+ There is no need to change server/RPC code for a private bundled font. A GUI
740
+ upload feature would additionally need validation, storage, registration,
741
+ persistence and licensing handling; it remains separate from this catalog.
742
+
648
743
  ## Limitations (deliberate, sequenced later)
649
744
 
650
745
  - No shell passthrough from the browser.
@@ -55,11 +55,16 @@ A pre-commit hook runs biome checks, tests, and `tsgo --noEmit` (matching CI) au
55
55
  ```bash
56
56
  npm test # All workspace tests
57
57
  npx vitest --run packages/coding-agent/test/some.test.ts # Single file
58
- bash test.sh # Full suite, including configured live providers
59
- bash test.sh --no-live-api # Offline suite (skips live provider calls)
58
+ bash test.sh # Full suite, offline (no live provider calls)
59
+ bash test.sh --live-api # Also run live provider tests (spends real quota)
60
60
  ```
61
61
 
62
- CI runs `bash test.sh`. The script does not unset API keys: provider tests run when their credentials are available, including OAuth credentials from `~/.dreb/agent/auth.json`, and can consume tokens or subscription quota. CI normally has no provider credentials, so its live tests skip. Use `--no-live-api` for explicit offline isolation; it sets `DREB_SKIP_LIVE_API=1`. Both script modes disable local LLM tests.
62
+ **Live provider tests are opt-in.** They make real, billed requests with API keys and subscription OAuth logins from `~/.dreb/agent/auth.json`, so `npm test`, `bash test.sh`, the pre-commit hook, and CI all skip them by default, even when credentials are present. Credentials are not read or refreshed unless you opt in.
63
+
64
+ - `DREB_LIVE_API=1` (or `bash test.sh --live-api`) enables live provider tests for every provider you have credentials for.
65
+ - `DREB_LIVE_API_EXPENSIVE=1` additionally enables the context-overflow tests, which send prompts larger than a model's full context window (hundreds of thousands of tokens per request). It has no effect without `DREB_LIVE_API=1`.
66
+
67
+ Target a single file or provider when running live tests, for example `DREB_LIVE_API=1 npx vitest --run packages/ai/test/stream.test.ts -t "OpenAI Codex"`. New live tests must gate on `isLiveApiEnabled()` (or `isExpensiveLiveApiEnabled()`) from the package's `test/live-api.ts`; `packages/ai/test/live-api-gating.test.ts` fails if a credential-gated `skipIf`/`runIf` bypasses it. `test.sh` also disables local LLM tests.
63
68
 
64
69
  When updating live model fixtures, check protocol behavior as well as catalog membership. Adaptive Claude tests that assert visible thinking must request `thinkingDisplay: "summarized"`. A conservative registry window is not necessarily the endpoint's hard limit: overflow tests may need to check full input usage (`input + cacheRead + cacheWrite`) when the server accepts a request beyond the configured window.
65
70
 
package/docs/providers.md CHANGED
@@ -50,7 +50,8 @@ Use `/logout` to clear credentials. Tokens are stored in `~/.dreb/agent/auth.jso
50
50
 
51
51
  - Requires ChatGPT Plus or Pro subscription
52
52
  - Personal use only; for production, use the OpenAI Platform API
53
- - Built-in models are `gpt-5.4-mini`, `gpt-5.5`, `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna` (default), and `gpt-6-astra`. The Codex catalog is maintained separately from the OpenAI Platform API catalog.
53
+ - The Codex catalog is derived automatically from the OpenAI Platform catalog at build time: frontier GPT models (GPT-5.5 and newer, named variants such as Sol/Terra/Luna/Astra, and `gpt-daybreak-*` previews) are mirrored onto `openai-codex`, plus `gpt-5.4-mini`. `-pro`, `-mini`, `-nano`, `-chat` and `-codex` variants and dated snapshots are excluded. The build fails loudly if a known Codex model disappears from the OpenAI catalog or a derived model lacks the catalog limits Codex requires (logic in `packages/ai/scripts/codex-models.ts`). Default is `gpt-5.6-luna`. Every Codex model uses a 272k context window, matching Codex CLI's default: the models support ~1M, but prompts above 272k input are billed at 2x. To use a larger window, override `contextWindow` for the model via `modelOverrides` in `models.json`.
54
+ - Which models actually work depends on your ChatGPT plan/workspace — enterprise workspaces often enable new models later. An unavailable model fails with "model is not supported when using Codex with a ChatGPT account".
54
55
  - Astra supports text/image input, a conservative 272K configured context window, and up to 128K output tokens. Codex `minimal` effort is clamped to `low`; `xhigh` and `max` are sent unchanged.
55
56
 
56
57
  ### Kimi For Coding
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dreb/coding-agent",
3
- "version": "2.68.1",
3
+ "version": "2.70.0",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "drebConfig": {