Skip to content

feat(dashboard): render adapter-origin tool calls#67

Merged
olivrg merged 15 commits into
mainfrom
feat/dashboard-adapter-origin-rendering
Jun 16, 2026
Merged

feat(dashboard): render adapter-origin tool calls#67
olivrg merged 15 commits into
mainfrom
feat/dashboard-adapter-origin-rendering

Conversation

@olivrg

@olivrg olivrg commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

Description

Implements #16: the Feed and Audit pages now coherently render and filter non-MCP-origin (adapter/sideband) tool calls. Pure consumer of the record_kind / origin / metadata audit shape from #12 — no contract re-cut.

  • Origin column on both Feed and Audit, with friendly labels (mcp → MCP, openclaw → OpenClaw) and a raw-slug fallback for any future adapter.
  • Record-kind chips (Install Scan / Drift / Expired) rendered orthogonally to the decision badge; tool_call renders no chip. Covers all non-tool_call kinds, satisfying "render install-scan as a distinct action type."
  • metadata.channel_id / metadata.sender_id surfaced as Audit columns and as filter controls; filtered server-side via SQLite json_extract (no schema change, no migration).
  • Dashboard API: /api/audit and /api/audit/export accept origin / record_kind / channel_id / sender_id filters.
  • Live Feed: the action SSE event carries origin + record_kind (additive; MCP path unchanged). metadata is intentionally not on the event — the Feed fetches the full record on card expand, where channel/sender appear under "Adapter Context."
  • Free-text filters use substring matching (LIKE %value%) for origin/channel/sender, consistent with the tool-name field's search-as-you-type behaviour; record_kind stays exact (it's a select).
  • Minor polish: pointer cursor on <select> dropdowns.

Closes #16

Type of Change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Refactor (no functional changes)
  • Documentation
  • CI / build / tooling

Packages Affected

  • packages/proxy
  • packages/dashboard
  • packages/python-sdk
  • Root config / monorepo tooling
  • docs/
  • examples/

Checklist

  • I have read CONTRIBUTING.md
  • My code follows the existing style (ESLint + Prettier pass)
  • TypeScript strict mode — no any types or @ts-ignore without justification
  • I have added or updated tests for my changes
  • All CI checks pass (pnpm secrets:scan, pnpm docs:check:ci, pnpm audit --audit-level=high, pnpm build, pnpm lint, pnpm format:check, pnpm typecheck, pnpm test)
  • I have updated documentation if this changes user-facing behavior
  • Commit messages follow Conventional Commits (e.g. feat:, fix:, docs:)

How to Test

  1. pnpm --filter @gethelio/proxy test (1575 tests) and pnpm --filter @gethelio/dashboard test (300 tests) — both green.
  2. With seeded adapter-origin audit records, open the dashboard: the Audit page shows an Origin column (MCP / OpenClaw), record-kind chips (Install Scan / Drift / Expired), and Channel / Sender columns; the Feed shows origin + kind chips, with channel/sender under "Adapter Context" on card expand.
  3. Filter the Audit page by Origin / Record Kind / Channel ID / Sender ID; confirm partial text in Origin/Channel/Sender narrows results as you type. Confirm GET /api/audit/export?format=csv&origin=openclaw returns only OpenClaw rows.
  4. Confirm MCP records render unchanged (MCP label, no kind chip, for channel/sender).

Additional Context

Known follow-up: #66 (CSV export is missing the origin/record_kind/metadata columns).

olivrg added 15 commits June 15, 2026 20:02
Tailwind v4 dropped the default button cursor and we restored it globally for
button/[role=button]/summary, but native <select> dropdowns kept the default
arrow. Add `select` to the rule so the audit filter dropdowns (status, record
kind) and all other selects share the pointer affordance.
origin, metadata.channel_id and metadata.sender_id filtered by exact equality,
while the tool-name filter uses substring (LIKE %value%). In the dashboard's
free-text filter inputs this made origin/channel/sender feel unresponsive —
partial input matched nothing until the exact value was typed, unlike the
tool field which narrows as you type. Switch all three to substring LIKE for
a consistent search-as-you-type experience. record_kind stays exact (select).
@olivrg olivrg merged commit 525f6eb into main Jun 16, 2026
3 checks passed
@olivrg olivrg deleted the feat/dashboard-adapter-origin-rendering branch June 16, 2026 10:31
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.

Dashboard: render adapter-origin tool calls

1 participant