Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Promotes the current
devline tomain— 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.
@font-faces so rendering no longer depends on device-installed fonts (JetBrains Mono pins Latin; Symbols Nerd Font for icons; Hebrew faces for Hebrew).window.term, saved per-browser inlocalStoragelike the theme.clearTextureAtlason font load).chela/dashboard/static/fonts/README.md.OKF knowledge layer (Phases 1–3)
chela knowledge export→ conformant OKF v0.1 bundle (chela/okf.py)./api/knowledge/*routes.docs/OKF.md. Bundle data stays local (git-ignored); no new network listener.viewer.html) and Phase 5 (adapters) remain open follow-ups.Dashboard
Commits
443c70c…aa800b7(8). Fonts add ~2 MB of binary assets; only the selected face is downloaded at runtime.🤖 Generated with Claude Code