@dreb/coding-agent 2.69.0 → 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 +3 -1
- package/docs/dashboard.md +113 -18
- package/package.json +1 -1
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
|
|
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
|
|
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
|
|
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.
|
|
619
|
-
IBM Plex Mono, JetBrains Mono,
|
|
620
|
-
(
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
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.**
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
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.
|