Skip to content

OKF knowledge layer + web-terminal font picker#13

Merged
Devail1 merged 8 commits into
mainfrom
dev
Jul 4, 2026
Merged

OKF knowledge layer + web-terminal font picker#13
Devail1 merged 8 commits into
mainfrom
dev

Conversation

@Devail1

@Devail1 Devail1 commented Jul 4, 2026

Copy link
Copy Markdown
Owner

Promotes the current dev line to main — two independent workstreams plus a small dashboard fix.

Web terminal: bundled fonts + live font picker

The ttyd/xterm.js terminal had no Hebrew coverage (Hebrew fell back per-device to a mismatched monospace — the "ransom note" look), and Latin silently rode on whatever monospace the viewer had installed.

  • Self-contained fonts — bundle @font-faces so rendering no longer depends on device-installed fonts (JetBrains Mono pins Latin; Symbols Nerd Font for icons; Hebrew faces for Hebrew).
  • Settings › Terminal font picker — choose the English (JetBrains Mono, Fira Code, IBM Plex Mono, Source Code Pro, Cascadia Code) and Hebrew (Miriam Mono, Noto Sans Hebrew, Heebo, Assistant, Rubik, Frank Ruhl, David Libre) faces independently, plus size. Applied live to every open terminal via window.term, saved per-browser in localStorage like the theme.
  • Bug fix — an xterm texture-atlas FOUT where the Hebrew font appeared to change when selecting text (clearTextureAtlas on font load).
  • Fonts are separately-licensed assets (all OFL except Miriam Mono CLM, GPL-2 — the only free monospace Hebrew font); the project's MIT license is unaffected. See chela/dashboard/static/fonts/README.md.

OKF knowledge layer (Phases 1–3)

  • chela knowledge export → conformant OKF v0.1 bundle (chela/okf.py).
  • Embedded read-only Knowledge view in the dashboard — glance / browse / backlinks / search / graph, backed by loopback /api/knowledge/* routes.
  • Design + security/exposure boundary in docs/OKF.md. Bundle data stays local (git-ignored); no new network listener.
  • Phase 4 (portable viewer.html) and Phase 5 (adapters) remain open follow-ups.

Dashboard

  • Pin the minimized dock to the bottom of the wall.

Commits 443c70c…aa800b7 (8). Fonts add ~2 MB of binary assets; only the selected face is downloaded at runtime.

🤖 Generated with Claude Code

Devail1 and others added 8 commits June 29, 2026 16:35
Design for exporting the fleet's accumulated knowledge (dispatch runs,
schedules, agent recaps, PR links) as a portable Open Knowledge Format
bundle, with a glance/browse/search/graph viewer — embedded in the
dashboard and shipped self-contained inside each bundle. README roadmap
points at docs/OKF.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Local-only posture made explicit: OKF code is public (MIT) but the bundle
is local fleet data and is never published. Routes inherit the dashboard's
127.0.0.1 loopback + tailnet-only (Tailscale) serving, so OKF adds no new
exposure surface; bundle dir git-ignored; portable viewer is opt-in/manual.

Embedded-viewer search should reuse the home-root mem_index retrieval
primitive (sqlite-vec + fastembed), scoped to OKF content — not the
orchestrator's private corpus/recall server. Typed frontmatter + backlinks
are the verifiable-landing-structure argument over raw embeddings.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Phase 2 of docs/OKF.md. New chela/okf.py serializes runtime state into a
conformant Open Knowledge Format bundle under ~/.chela/knowledge (override
--out, filter --since): dispatcher runs, scheduled tasks, live agent windows
(with transcript recap + latest PR folded in), and the projects they touch —
plus the reserved per-dir index.md listings, a date-grouped log.md, and a
bundle-root index.md declaring okf_version. Pure serializer, no new deps
(reuses pyyaml); relative cross-links so the bundle resolves under file://.

Boundary (docs/OKF.md → Security): the bundle is LOCAL fleet data. Default
output is outside the repo, an in-repo --out is warned, and knowledge/ +
*.okf/ are git-ignored.

Viewer (Phases 3-5) intentionally deferred to a fresh context.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Phase 3 of the OKF viewer: a read-only "Knowledge" view in the dashboard,
backed by a consumer half of chela/okf.py.

Reader (chela/okf.py, after the frozen export_bundle):
- parse_doc — frontmatter/body split, tolerant of missing/broken YAML
- read_tree — concepts by dir + counts-by-type + log; exported:false when absent
- read_concept — frontmatter + body + outbound links + computed backlinks
  (inverts the link graph — the one thing `ls` can't show)
- read_search — substring over meta+body, type/tag filters, meta-ranked
- read_graph — concept nodes + resolvable concept→concept edges
- _safe_concept_path — blocks ../ traversal and non-.md paths

Routes (dashboard/app.py): /api/knowledge/{tree,concept,search,graph} +
POST /api/knowledge/export. _ensure_bundle auto-exports to ~/.chela/knowledge
on first view; Refresh forces re-export. Inherits the loopback bind — no new
listener (the bundle is private fleet data).

Frontend: new static/js/knowledge.js (vanilla JS, modeled on schedules.js):
glance / browse / concept detail (frontmatter card + rendered body +
Referenced-by backlinks) / debounced search / dependency-free circular SVG
graph. The knMd/knResolve helpers are self-contained for Phase 4's portable
viewer.html to reuse. Wired nav item, panel, refresh dispatch, palette entry;
.kn-* CSS matches the existing tokens.

docs/OKF.md: correct the "Lit components" line to the vanilla-JS reality.
tests: 8 reader tests (61 total green), ruff clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Feedback was the glance read sparse + like raw data. Make concepts
self-describing at the producer, then have glance synthesize.

Producer (chela/okf.py):
- agent description = its latest recap excerpt (what it's doing) via
  _excerpt (skips headings, falls back to a locator when there's no
  transcript); add project + pr_url extension keys
- project description = "N agents · M runs" rollup (+ agent_count/run_count)
- reader _summary passes resource/project/pr_url through to tree cards

Glance (knowledge.js): was a redundant double-list (same concepts under
Freshest and Browse + an empty Activity column). Now: a synthesized digest
line, a Sessions feed (agent → project link + recap + PR ↗), project rollup
chips, Activity only when non-empty, and the flat browse folded into a
<details>.

64 tests green, ruff clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
When every terminal pane was minimized the grid collapsed to ~0 height and
the minimized dock rode up under the toolbar. Make the terminals panel a
flex column (desktop/wall only) so #term-stage grows to take the slack and
the dock stays pinned to the bottom in every case. Phones (single mode, no
dock, fixed keybar) are left untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rminal

The web terminal (ttyd/xterm.js) had no Hebrew coverage, so Hebrew fell
back per-device to a mismatched monospace ("ransom note" look), and Latin
silently rode on whatever monospace the viewer happened to have installed.

Bundle self-contained @font-faces so rendering no longer depends on
device-installed fonts:
- JetBrains Mono (OFL) pins Latin to a real monospace on any viewer
- Symbols Nerd Font supplies powerline/dev icon glyphs
- Miriam Mono CLM (GPL-2), Noto Sans Hebrew (OFL), Heebo (OFL) supply
  Hebrew; only the selected face is downloaded

Add a Settings > Terminal font picker (font + size) that applies live to
every open terminal via window.term, stored per-viewer in localStorage
like the theme. Also fixes an xterm texture-atlas FOUT where the Hebrew
font appeared to change when selecting text (clearTextureAtlas on load).

Fonts are separately-licensed assets merely aggregated into the repo; the
project's MIT license is unaffected (see static/fonts/LICENSE-*.md).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add an English (Latin) font selector alongside the Hebrew one, with more
faces for each. English and Hebrew are chosen independently and applied
live to every open terminal.

- English (all OFL, monospace): JetBrains Mono, Fira Code, IBM Plex Mono,
  Source Code Pro, Cascadia Code
- Hebrew: Miriam Mono (GPL-2, the only monospace one), plus OFL Noto Sans
  Hebrew, Heebo, Assistant, Rubik, Frank Ruhl Libre, David Libre

The @font-face rules are now generated from a _TERM_FONTS manifest (add a
font = one list entry), and the per-font license notes are consolidated
into static/fonts/README.md (OFL/GPL license text files retained for
compliance).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Devail1 Devail1 merged commit 53efad0 into main Jul 4, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant