Skip to content

v2.18.0

Choose a tag to compare

@github-actions github-actions released this 01 Jul 10:59
· 175 commits to main since this release

Changed

  • Web UI completely redesigned with OpenCode manpage design system — The Memory Explorer dashboard has been rebuilt from the ground up. The previous Matrix/CRT-terminal aesthetic (green-on-black, #00ff00 phosphor, ASCII box-drawing titles ┌─ ─┐) has been replaced with a warm, readable manpage design system derived from the OpenCode brand identity. All colors, spacing, radius, and typography are now CSS custom properties (:root tokens) in styles.css, making the design system easy to extend without hardcoding hex values. Key changes:
    • styles.css — Full rewrite (~1842 → ~1050 lines). Warm cream canvas (#fdfcfc), near-black ink (#201d1d), JetBrains Mono / Berkeley Mono font stack, 4px radius on interactive elements, 0px on containers, hairline borders (rgba(15,0,0,0.12)), no shadows or gradients. Apple Human Interface Guidelines semantic ramp (accent #007aff, danger #ff3b30, warning #ff9f0a, success #30d158) used for in-product interactive states.
    • index.html — Rewritten SPA shell with clean title (no ASCII box-drawing), [+] bracket markers in section headers, grouped header actions, clean tab layout with underline-on-active. All ~70 element IDs preserved (app.js binding contract).
    • app.js — Radar chart hardcoded colors (#ccc, #3b82f6, #666) replaced with DESIGN.md tokens (#9a9898 ash, #007aff accent, #646262 mute). updateSectionTitle() box-drawing chars replaced with [+] bracket markers. Application logic unchanged.
    • i18n.js — Six box-drawing strings (English + Chinese) replaced with [+] bracket markers. No ASCII box-drawing characters remain.
    • src/web/AGENTS.md — Updated to document the design system, token convention, and the [+]/[-]/[x] bracket-marker usage.
    • Fixed latent bug: timeline section CSS used undefined custom properties (--text-color, --border-color, --primary-color, --bg-color, --card-bg) that were never declared, causing broken/inherit styling. Now uses proper DESIGN.md tokens.

Contributors

No community contributors for this release. All work by @ZeR020.

Fixed

  • API add-memory bypassed dedup and conflict detection (#feature-9-10)handleAddMemory (the web API POST /api/memories path) re-implemented the embedding/insert orchestration instead of delegating to memoryClient.addMemory, so memories added via the Web UI or REST API skipped ingest-time deduplication (checkDuplicateAtIngest) and conflict detection (detectConflicts) that the in-agent memory tool gets. Two near-identical memories added via the API would both be stored; the same content added via the tool would merge. Fixed by routing handleAddMemory through memoryClient.addMemory, deleting ~45 lines of duplicated orchestration. The API path now returns { duplicate: true } when a near-duplicate is merged, matching the tool path's contract.
  • Conflict heuristic missed substitution-based contradictions (#feature-9)checkContradictionHeuristic only triggered on negation patterns (not, never, removed, disabled, un-, etc.). Statements like "Authentication uses JWT tokens instead of session cookies" never reached the LLM contradiction check because "instead of" is not a negation word. Added SUBSTITUTION_PATTERNS (instead of, replaced by, rather than, switched to/from, migrated to/from, no longer, moved to/from) to text-analysis.ts; the heuristic now opens the LLM gate when one memory has a substitution phrase and the other shares >30% key-word overlap.
  • Web UI crashes completely if a vendor script fails to loadapp.js called marked.setOptions() at top-level script execution (before any function is defined) and lucide.createIcons() inside renderMemories() / DOMContentLoaded. If any vendored library (lucide, marked, DOMPurify, jsonrepair) failed to load — missing file, stale install, network race — the ReferenceError killed the entire script: no functions defined, no event handlers attached, no API calls made. The UI froze at its initial HTML state ("Initializing...", "Total: 0", all tabs unresponsive). Fixed by guarding all top-level and call-site library accesses (typeof marked !== "undefined", safeCreateIcons() wrapper for all 8 lucide.createIcons() call sites, renderMarkdown falls back to escapeHtml when marked/DOMPurify are missing). The UI now degrades gracefully: memories and transcripts load and display as plain text, tabs work, even without the vendor scripts.

Contributors

No community contributors for this release. All work by @ZeR020.

Full Changelog: v2.17.5...v2.18.0