Skip to content

Claude/update web ux report za ff0#17

Closed
dgarson wants to merge 721 commits intomainfrom
claude/update-web-ux-report-ZAFf0
Closed

Claude/update web ux report za ff0#17
dgarson wants to merge 721 commits intomainfrom
claude/update-web-ux-report-ZAFf0

Conversation

@dgarson
Copy link
Owner

@dgarson dgarson commented Feb 8, 2026

No description provided.

perf(landing): lazy-load below-fold sections + optimize scroll handlers
Memory: add shared OpenAI embeddings rate limiter
… and command:new (M4)

Add three new hook capture points to the experiential-capture handler:

1. PreCompact (CRITICAL priority):
   - Always captures, bypasses rate limiting
   - Saves buffer snapshot with recent captures and evaluations
   - Records assistant text count and tool meta count

2. SessionEnd (command:stop):
   - Captures session summary with full buffer state
   - Includes recent captures and evaluation history
   - Records session lifecycle timestamps

3. Session Transition (command:new):
   - Captures session transition moment
   - Includes accumulated buffer state from ending session
   - Records both recent captures and evaluations

Also extends MeridiaExperienceRecord with 'kind' field (tool_result | precompact | session_end | session_transition) and adds new MeridiaTraceEvent variants for the new capture types.

Refactored handler to use shared helpers: resolveSessionContext(), resolveBufferPath(), loadBuffer().
…reflect MCP tools (M3)

- experience_capture: manually record significant experiences to JSONL+SQLite
- experience_search: FTS5 search with filters (session, tool, date range, score)
- experience_reflect: pattern analysis + reflection prompts on experiential records
- Registered in openclaw-tools.ts as Meridia experiential continuity tools
…fail

Codex/gateway connect error fastfail
feat(meridia): experience-capture, experience-search, experience-reflect MCP tools (M3)
…ions (M5)

- Add src/meridia/reconstitute.ts — core reconstitution engine
  - Queries Meridia SQLite for recent significant experiences (last 48h)
  - Formats compact briefing with key experiences, tool patterns, sessions
  - Configurable token budget (default 2000), lookback hours, min score
  - Gracefully handles missing SQLite or empty databases

- Add meridia-reconstitution bundled hook
  - Hooks into agent:bootstrap to inject MERIDIA-CONTEXT.md
  - Reads config from hooks.internal.entries.meridia-reconstitution
  - Supports maxTokens, lookbackHours, minScore config options
  - Non-fatal: sessions start normally if reconstitution fails

- Add src/meridia/reconstitute.test.ts — unit tests (6 passing)

Every new session now starts with experiential continuity awareness.
feat(meridia): expand experiential capture hooks — PreCompact, SessionEnd, command:new (M4)
feat(meridia): session reconstitution — morning briefing for new sessions (M5)
Introduces MeridiaDbBackend interface that abstracts away the underlying
database implementation. The SQLite-specific code is now isolated in
backends/sqlite.ts while consumers can program against the interface.

New files:
- src/meridia/backend.ts — MeridiaDbBackend interface definition
  with all DB-agnostic types (RecordQueryResult, SessionSummary, etc.)
- src/meridia/backends/sqlite.ts — SQLite implementation (SqliteBackend)
- src/meridia/backends/index.ts — Factory: createBackend(), closeBackend()
- src/meridia/backends/sqlite.test.ts — 25 tests for the backend interface

Changes:
- src/meridia/db.ts — Now a backward-compat shim, re-exports types from
  backend.ts. All functions still work but are marked @deprecated.
- src/meridia/query.ts — Types now re-exported from backend.ts for
  backward compat. Functions still work with DatabaseSync handles.

Key design decisions:
- Interface is DB-agnostic: no DatabaseSync or SQLite types leak through
- getMeta()/setMeta() added for key-value metadata (migration tracking etc.)
- SqliteBackend exposes rawDb getter for backward-compat shims only
- Factory caches singleton by path, like the existing openMeridiaDb()
- All 96 existing tests pass unchanged

Future backends (PostgreSQL, MySQL) can implement MeridiaDbBackend
with ~1 day of work per backend.
feat(meridia): pluggable DB backend interface (M2.5)
dgarson and others added 28 commits February 6, 2026 20:44
…7) (#202)

Implements a comprehensive, configurable scoring system for determining
which experiences should become long-term memories.

## New Module: scoring/

- **types.ts**: Full type definitions for factors, breakdowns, configs
- **factors.ts**: Five factor scorers (novelty, impact, relational, temporal, userIntent)
- **scorer.ts**: Composite scorer with tool/pattern overrides, threshold profiles
- **defaults.ts**: Default weights, profiles (standard/aggressive/conservative), overrides
- **index.ts**: Barrel exports

## Factor Scoring Model

- **Novelty (0.25)**: Detects repetitive vs. new tool usage patterns
- **Impact (0.30)**: Classifies tool types (high/medium/low impact), error detection, meta keywords
- **Relational (0.15)**: Entity detection via tags, keywords, file paths, URLs
- **Temporal (0.10)**: Time-of-day awareness, burst detection, pacing analysis
- **User Intent (0.20)**: Explicit marks, manual captures, intent keywords

## Override System

- Tool-specific rules: fixedScore, minScore, maxScore, weightMultiplier
- Pattern-based rules: error boost, large result detection, tag matching
- User intent override: highest priority

## Integration

- Updated evaluate.ts with evaluateRelevance() bridge function
- Updated config.ts with scoring config resolution (backwards compatible)
- Re-exports for convenience: shouldCaptureMultiFactor, isHighValueMultiFactor, etc.
- breakdownToTrace() for compact trace event embedding

## Tests

- 48 tests across factors.test.ts and scorer.test.ts
- All passing
* refactor(tools): create shared tool execution module

* refactor(pi): use shared tool execution in pi-tool-definition-adapter

* refactor(sdk): use shared tool execution in tool-bridge

* test(tools): add tests for shared tool execution module

* docs: add unified tool execution coverage gap analysis

* fix(auto-reply): use unified tool execution for inline skill commands

* docs(tools): document wrapper reliance on runtime adapters

* test(auto-reply): add inline skill command error handling tests

* docs: update gap analysis with completed fixes

* fix: missing stuff
- Consolidate /agents/dashboard and /agent-status into a single route with grid/list layout toggle
- Reduce summary cards from 7-8 to 4 primary + conditional stalled/errored alert chips
- Declutter agent cards: combined session counts, cron badge in header, no redundant health metric
- Fix detail panel on mobile: use Sheet overlay on sub-lg screens instead of hidden panel
- Lighten activity timeline: borderless rows for completed items, full Card only for live tasks
- Add inline metadata stats (duration, tokens, cost) on timeline rows
- Batch consecutive search/code activities into collapsible groups
- Remove hardcoded mock data fallback in AgentActivityTab; show empty state instead
- Add keyboard navigation (ArrowUp/Down, Escape) and aria-live for screen readers
- Group developer actions (Copy ID, Copy JSON) into overflow dropdown menu
- Promote session section above generic actions in detail panel
- Extract shared format utilities (formatTokenCount, formatRelativeTime, etc.) into lib/format.ts
- Improve Lit dashboard: CSS grid metrics, channel badges, right-aligned tokens, hover highlights

Co-authored-by: Claude <noreply@anthropic.com>
Evaluates the original Meridia V2 architecture proposal against the
actual codebase state and existing architecture docs (ARCH.md,
COMPONENT-MAP.md, 7 component deep-dives). Produces a refined plan
that builds on the designed 14-component system rather than
reinventing it.

Key refinements over the original proposal:
- Two-pass evaluation (cheap gate, expensive phenomenology only on
  captured events) instead of full LLM extraction on every tool result
- Compaction-based graph sync with session-end mini-compaction instead
  of per-event Graphiti writes
- Vector search adapter interface (Graphiti vector first, pgvector
  optional) instead of hard PostgreSQL dependency
- Includes missing components (normalizer, gates, sanitization) the
  original proposal omitted
- Migrates to ExperienceKit type from COMPONENT-MAP rather than
  extending MeridiaExperienceRecord
- 5-phase implementation plan with dependency ordering

https://claude.ai/code/session_01Ko4xrCYytJBNW5VAxzfemE
…l, and reconstitution

Implements the Meridia V2 plan across all 14 components from COMPONENT-MAP.md:

**New modules (26 files):**
- event/normalizer: Component 1 — typed MeridiaEvent envelopes from hook payloads
- gates/budget: Component 2 — rate limits and capture budgets (extracted from hook)
- phenomenology/{taxonomy,prompt,heuristic,extractor}: Component 4 — two-pass
  phenomenological extraction with controlled vocabularies (17 emotions, 5 engagement
  qualities, 12 texture metaphors, 5 sensory channels from experiential-engine docs)
- artifacts/collector: Component 5 — file/link/media reference extraction
- kit/{builder,resolver}: Component 6 + Phase 5 — ExperienceKit assembly and
  meridia://<id> URI resolution
- sanitize/redact: Component 12 — secret redaction and payload truncation
- retrieve/{intent,ranker,hybrid,vector-adapter}: Component 10 — hybrid retrieval
  with blended ranking (significance, recency, diversity, source score)
- reconstitution/{engine,pack-builder}: Component 11 — structured ReconstitutionPack
  replacing bullet-list format with narrative, anchors, uncertainties, approach guidance
- fanout/dispatcher: Component 9 — fire-and-forget async dispatch with error isolation

**Updated existing files:**
- types.ts: Added Phenomenology, CaptureDecision, ArtifactRef, ExperienceKit,
  ReconstitutionPack types; added phenomenology field to legacy record
- hooks/experiential-capture: Uses normalizer, gates, phenomenology extractor,
  artifact collector, kit builder, and sanitizer
- hooks/meridia-reconstitution: Uses enhanced reconstitution engine with legacy fallback
- db/backends/sqlite.ts: Schema v2 migration (phenomenology columns), updated FTS
  searchable text, v1→v2 migration is idempotent
- meridia-search-adapter: Implements readFile() for meridia:// URI resolution,
  includes phenomenology in search snippets
- tools: Fixed pre-existing async/await issues across all three experience tools
- tests: Fixed async/await in sqlite and reflect tool tests, updated schema assertions

https://claude.ai/code/session_01Ko4xrCYytJBNW5VAxzfemE
* feat: added work-queue workflow workers and a worker manager, integrate w/cron

* fix: address 12 logic flaws in workflow engine, adapter, phases, and cron types

- engine: capture phase before clobbering in catch handler (#1)
- engine: remove dead `state.plan ?? plan` fallback (#2)
- engine: mark workflow failed when all execution nodes fail (#6)
- adapter: fix retry count off-by-one (attemptNumber vs retryCount) (#3)
- adapter: clean up abort listener in sleep on timeout (#10)
- discover: fix batch/entries index mismatch when spawns fail (#4)
- execute: add cycle detection to topological sort (#5)
- review: add autoApproved flag to distinguish fallback approvals (#7)
- plan: add comment clarifying sessionKey reuse across repair attempts (#8)
- decompose: remove unused model/maxPhases/maxTasksPerPhase/maxSubtasksPerTask opts (#9)
- types: add autoApproved to ReviewIteration (#7)
- cron/state: use discriminated union for CronEvent (CronJobEvent | CronHealthEvent) (#12)
- tests: add WorkflowWorkerAdapter test suite (8 tests) (#11)

https://claude.ai/code/session_01L8kquwpmUh5zmU9S4MHgPu

---------

Co-authored-by: Claude <noreply@anthropic.com>
…aSearchAdapter

Fixes P1 and P2 issues from code review:
- search() now properly awaits backend.searchRecords() (was calling .map on a Promise)
- status() now async with await on backend.getStats() (was reading undefined properties)
Resolved conflicts by accepting origin/main versions which include:
- Type-safe discriminated unions for CronEvent (job vs health events)
- Better workflow execution semantics (attemptNumber vs retryCount)
- Improved error handling and phase tracking in workflow engine
- Bug fixes for discovery question-to-result alignment
- Cycle detection in topological sort
- Auto-approval tracking in review iterations

All conflicts resolved in favor of main's improvements.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…ntial backoff

- RetryableError: composable error boundary with visual retry feedback
- useRetry: React hook with exponential backoff, jitter, countdown timer
- withRetry: standalone retry utility for non-React contexts
- Comprehensive test suite with 10 test cases
- Card and inline variants, auto-retry option, cancel/reset controls

Closes P4 Error Handling UX: retry patterns for failed operations
- GlobalSearchDialog: full-featured search overlay powered by useGlobalSearch hook
- Category filter chips for narrowing results by type (agents, sessions, goals, etc.)
- Recent searches persisted to localStorage
- Keyboard shortcut Cmd+Shift+F / Ctrl+Shift+F to open
- Search button added to sidebar with keyboard hint
- Score-based ranking with grouped category results
- Comprehensive test suite for keyboard shortcut hook

Wires up the existing useGlobalSearch hook into a production-ready UI.
Addresses P4 Search & Filtering from BACKLOG.md.
* [autodev] Command Palette: Add nested sub-command menus and category filtering

Task 1 - Nested/sub-command menus:
- Replaced single page state with a page stack (PageEntry[]) for arbitrary nesting depth
- Added per-agent sub-menus: Agents > {AgentName} > View Details/Chat/Sessions/Edit Config
- Multi-level breadcrumb navigation with clickable intermediate crumbs
- Back navigation via Backspace (empty search) or clicking breadcrumb entries
- Agent sub-pages show agent info (role, status, current task)

Task 2 - Category filtering in search:
- Added filter chips bar that appears when searching on root page
- Categories: All, Quick Actions, Navigation, Agents, Appearance, Settings
- Active filter highlighted with primary color, dismissible via X button
- When filtering, shows all items in that category (not just top 3/5)
- Appearance and Settings items surface in search results when filtering

* [autodev] Mark command palette nested menus and category filtering as complete
* [autodev] Add progress indicators for long-running operations

New components:
- useAsyncOperation hook: State machine (idle → running → success/error)
  with progress tracking, auto-reset, and callbacks
- OperationProgress component: Visual indicator with three variants
  (inline, banner, compact) showing progress bar, step info, error/retry

Features:
- Step-by-step progress reporting (current/total/message/percent)
- Indeterminate progress bar for operations without step count
- Auto-reset to idle after configurable timeout
- Error state with retry button
- Success state with dismiss option
- Three display variants: inline (card), banner (full-width), compact (single-line)

Test coverage: 10 tests (all passing) covering state transitions,
progress tracking, auto-reset, callbacks, error handling

Barrel exports added to composed/index.ts and hooks/index.ts

* [autodev] Mark progress indicators task as complete
…cron types (openclaw#217)

- engine: capture phase before clobbering in catch handler (#1)
- engine: remove dead `state.plan ?? plan` fallback (#2)
- engine: mark workflow failed when all execution nodes fail (#6)
- adapter: fix retry count off-by-one (attemptNumber vs retryCount) (#3)
- adapter: clean up abort listener in sleep on timeout (#10)
- discover: fix batch/entries index mismatch when spawns fail (#4)
- execute: add cycle detection to topological sort (#5)
- review: add autoApproved flag to distinguish fallback approvals (#7)
- plan: add comment clarifying sessionKey reuse across repair attempts (#8)
- decompose: remove unused model/maxPhases/maxTasksPerPhase/maxSubtasksPerTask opts (#9)
- types: add autoApproved to ReviewIteration (#7)
- cron/state: use discriminated union for CronEvent (CronJobEvent | CronHealthEvent) (#12)
- tests: add WorkflowWorkerAdapter test suite (8 tests) (#11)

https://claude.ai/code/session_01L8kquwpmUh5zmU9S4MHgPu

Co-authored-by: Claude <noreply@anthropic.com>
* feat: event system for meridia

* fix: archive buffered moments after session summary to prevent inflation

Buffered moments were never transitioned after being consumed by
session-capture, causing them to be re-counted on every subsequent
/new command. Now transitions them to 'archived' after saving the summary.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add configurable subsystem debug log suppression

* docs: add changelog entry and test script for suppressSubsystemDebugLogs

* docs: add implementation summary

* feat(meridia): multi-factor memory relevance scoring system

Implement a comprehensive scoring system that evaluates whether experiences
should become long-term memories based on five weighted factors:

- **Novelty**: Is this new information or repetition?
- **Impact**: Does this change understanding, behavior, or system state?
- **Relational**: Does this connect to known entities/people/projects?
- **Temporal**: Is this time-sensitive or evergreen?
- **User Intent**: Was this explicitly marked as important?

Features:
- Configurable weights for each factor (normalized to sum to 1.0)
- Named threshold profiles: balanced, aggressive, conservative, minimal
- Override rules for specific tools (glob-pattern matching)
- evaluateMemoryRelevance() as primary entry point
- shouldCapture(), shouldPersistToGraph(), shouldUseLlmEval() helpers
- Backward-compatible evaluateHeuristic() now delegates to scoring system
- New evaluateHeuristicDetailed() returns full scoring breakdown
- 37 comprehensive tests covering all factors and edge cases

Files:
- extensions/meridia/src/meridia/scoring/types.ts
- extensions/meridia/src/meridia/scoring/config.ts
- extensions/meridia/src/meridia/scoring/factors.ts
- extensions/meridia/src/meridia/scoring/index.ts
- extensions/meridia/src/meridia/scoring/scoring.test.ts
- extensions/meridia/src/meridia/evaluate.ts (updated)

* SDK runner: close message processing parity gaps with Pi embedded agent

- Gap 1 (HIGH): Add streaming block replies during the event loop via
  blockReplyBreak/blockReplyChunking params. Supports "message_end"
  (flush at message boundaries) and "text_end" (per-chunk) modes,
  matching Pi embedded's streaming delivery. Final onBlockReply is
  skipped when streaming was active to avoid duplicate delivery.

- Gap 2 (MEDIUM): Add onReasoningStream callback support. Extract
  thinking/reasoning text from SDK events classified as "system" and
  emit via the new callback, enabling reasoning display in UIs.

- Gap 3 (MEDIUM): Reset chunks/assistantSoFar at message boundaries
  so onPartialReply reflects only the current message, not accumulated
  text from all prior turns.

- Gap 5 (LOW-MED): Add enforceFinalTag support. When enabled, only
  content inside <final>...</final> tags is returned, preventing
  intermediate narration leakage from non-Claude models. Adds shared
  extractFinalTagContent() utility.

- Gap 6 (LOW-MED): Map all payload fields (mediaUrl, mediaUrls,
  replyToId, replyToTag, replyToCurrent, audioAsVoice) in
  adaptSdkResultToPiResult to prevent silent field loss.

Wire all new params through the full chain:
  executor.ts → AgentRuntimeRunParams → sdk-agent-runtime →
  sdk-runner-adapter → sdk-runner

https://claude.ai/code/session_013FRzxnpzCwncubghL7GGCF

* additional merge conflict resolution

---------

Co-authored-by: Claude <noreply@anthropic.com>
* feat: meridian memory clasiffication

* fix: minor safety check around config missing
…ross 13 files) (#207)

Cover all new V2 modules: event normalizer, gates/budget, sanitize/redact,
phenomenology (taxonomy, prompt, heuristic), artifacts collector, kit builder
and resolver, retrieve (intent, ranker, vector-adapter), reconstitution
pack-builder, and fanout dispatcher. Export renderKit from resolver for
testability.

https://claude.ai/code/session_01Ko4xrCYytJBNW5VAxzfemE

Co-authored-by: Claude <noreply@anthropic.com>
* feat: phase 0 to 3 for meridia enhancements/refactoring

* feat(meridia): phase 2 refactoring — sanitize, migrations, fanout, adapter tests

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: clean up stray brace and unused imports from merge resolution

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(meridia): use readPositiveNumber for compaction/capture thresholds

readNumber accepts 0/negative values, but scheduleIntervalHours,
minExperiencesForCompaction, maxPerHour, minIntervalMs etc. must be
positive. Previously, the old local helpers enforced > 0; this was
lost when readNumber was extracted to event.ts. Switch to
readPositiveNumber which falls back to defaults for non-positive values.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add configurable subsystem debug log suppression

* docs: add changelog entry and test script for suppressSubsystemDebugLogs

* docs: add implementation summary

* feat(meridia): multi-factor memory relevance scoring system

Implement a comprehensive scoring system that evaluates whether experiences
should become long-term memories based on five weighted factors:

- **Novelty**: Is this new information or repetition?
- **Impact**: Does this change understanding, behavior, or system state?
- **Relational**: Does this connect to known entities/people/projects?
- **Temporal**: Is this time-sensitive or evergreen?
- **User Intent**: Was this explicitly marked as important?

Features:
- Configurable weights for each factor (normalized to sum to 1.0)
- Named threshold profiles: balanced, aggressive, conservative, minimal
- Override rules for specific tools (glob-pattern matching)
- evaluateMemoryRelevance() as primary entry point
- shouldCapture(), shouldPersistToGraph(), shouldUseLlmEval() helpers
- Backward-compatible evaluateHeuristic() now delegates to scoring system
- New evaluateHeuristicDetailed() returns full scoring breakdown
- 37 comprehensive tests covering all factors and edge cases

Files:
- extensions/meridia/src/meridia/scoring/types.ts
- extensions/meridia/src/meridia/scoring/config.ts
- extensions/meridia/src/meridia/scoring/factors.ts
- extensions/meridia/src/meridia/scoring/index.ts
- extensions/meridia/src/meridia/scoring/scoring.test.ts
- extensions/meridia/src/meridia/evaluate.ts (updated)

* SDK runner: close message processing parity gaps with Pi embedded agent

- Gap 1 (HIGH): Add streaming block replies during the event loop via
  blockReplyBreak/blockReplyChunking params. Supports "message_end"
  (flush at message boundaries) and "text_end" (per-chunk) modes,
  matching Pi embedded's streaming delivery. Final onBlockReply is
  skipped when streaming was active to avoid duplicate delivery.

- Gap 2 (MEDIUM): Add onReasoningStream callback support. Extract
  thinking/reasoning text from SDK events classified as "system" and
  emit via the new callback, enabling reasoning display in UIs.

- Gap 3 (MEDIUM): Reset chunks/assistantSoFar at message boundaries
  so onPartialReply reflects only the current message, not accumulated
  text from all prior turns.

- Gap 5 (LOW-MED): Add enforceFinalTag support. When enabled, only
  content inside <final>...</final> tags is returned, preventing
  intermediate narration leakage from non-Claude models. Adds shared
  extractFinalTagContent() utility.

- Gap 6 (LOW-MED): Map all payload fields (mediaUrl, mediaUrls,
  replyToId, replyToTag, replyToCurrent, audioAsVoice) in
  adaptSdkResultToPiResult to prevent silent field loss.

Wire all new params through the full chain:
  executor.ts → AgentRuntimeRunParams → sdk-agent-runtime →
  sdk-runner-adapter → sdk-runner

https://claude.ai/code/session_013FRzxnpzCwncubghL7GGCF

* additional merge conflict resolution

* Merge origin/main into claude/review-message-processing-djLHt

Resolve merge conflicts in meridia scoring module by taking
origin/main's refactored multi-factor scoring system (scorer.ts,
defaults.ts, updated types/factors/index). Remove HEAD-only
scoring/config.ts and scoring.test.ts that used the old API
(origin/main has proper tests in factors.test.ts and scorer.test.ts).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(meridia): add missing awaits in CLI + fix sanitizeForPersistence JSON corruption

---------

Co-authored-by: Claude <noreply@anthropic.com>
Audit the current apps/web/ codebase against the original 15-item
UX improvement report. Removes 2 items already implemented (ErrorState
component, home panel hierarchy), identifies 5 bugs (fake AI response
in production, missing error boundary, null safety gap, demo delays,
loading state inconsistency), and adds 3 new improvement items
(ErrorState adoption, skeleton loading gaps, consistent back nav).

https://claude.ai/code/session_01NsfuXFnsTT5iq9ENWEb95u
@dgarson dgarson closed this Feb 8, 2026
dgarson added a commit that referenced this pull request Feb 22, 2026
…s, focus-visible

AgentPulseMonitor (view #17):
- Mission control real-time view for all active agents
- Agent cards with sparkline activity graph + status dot + pulse animation
- Activity feed with role=log, aria-live=polite for screen readers
- Right-side detail panel: stats grid, bar chart, relationship map, model badge
- Live mode: simulated event stream every 3.2s, pause/resume toggle
- Status filter chips (active/busy/idle/sleeping/error)
- Full keyboard nav: all interactive elements are <button> with focus-visible rings
- Added to navItems + SKELETON_MAP + lazy import in App.tsx

A11y fixes (WCAG 2.1 AA):
- AgentBuilderWizard: added htmlFor+id to Agent Name + Role & Responsibilities fields
- CronScheduleBuilder: added htmlFor+id to Job Name; sr-only label + aria-label on custom cron input
- SessionExplorer: converted <span onClick> to <button type=button> with proper aria-label + focus-visible ring
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.

2 participants