Skip to content

feat(dashboard): rename vis → dashboard and add agent-tracing dashboard - #137

Merged
elkaix merged 5 commits into
mainfrom
new-dashboard
Jun 14, 2026
Merged

feat(dashboard): rename vis → dashboard and add agent-tracing dashboard#137
elkaix merged 5 commits into
mainfrom
new-dashboard

Conversation

@elkaix

@elkaix elkaix commented Jun 14, 2026

Copy link
Copy Markdown
Member

Summary

  • Renames the vis/pythinker vis subsystem to dashboard/pythinker dashboard throughout — CLI command, Python package, frontend app directory, build scripts, tests, and docs.
  • Introduces pythinker dashboard — a local web UI for inspecting agent sessions: wire events, context messages, state, sub-agents, a dual view, tool statistics, and usage over time.
  • Served by a FastAPI backend (pythinker_code.dashboard) under /api/dashboard, with the React/Vite frontend bundled at build time (make build-dashboard), wired into the wheel, PyInstaller binaries, and the Linux/Windows installers.
  • Reachable from the interactive shell via /reports (alias /dashboard).
  • Fixes correctness issues found in review: attach session auth header to import/delete calls; log previously-swallowed exceptions in session/statistics APIs and build script; group sub-agent events by stable key; gate number-key tab shortcuts to the in-session view.

Test plan

  • make check-pythinker-code passes (ruff + pyright)
  • make test-pythinker-code passes (unit tests, including renamed tests/dashboard/)
  • make check-web passes
  • make build-dashboard produces dashboard/dist/ and syncs to src/pythinker_code/dashboard/static/
  • pythinker dashboard launches the web UI and is accessible in browser
  • /reports and /dashboard slash commands open the dashboard from the shell
  • Installer specs (pythinker.spec, linux/windows variants) include the renamed dashboard statics

Summary by CodeRabbit

  • New Features

    • Introduced "dashboard" UI as the primary web interface for visualizing agent traces, replacing the previous visualization system. Accessible via new pythinker dashboard command and /dashboard alias in the interactive shell.
  • Documentation

    • Updated project documentation and development guides to reflect dashboard terminology and build targets.

elkaix added 2 commits June 13, 2026 23:40
…ackaging)

Introduce `pythinker dashboard` — a local web UI for inspecting agent
sessions: wire events, context messages, state, sub-agents, a dual view,
tool statistics, and usage over time. Served by a FastAPI backend
(`pythinker_code.dashboard`) under `/api/dashboard`, with the React/Vite
frontend bundled at build time (`make build-dashboard`, wired into the
wheel, PyInstaller binaries, and the Linux/Windows installers). Reachable
from the interactive shell via `/reports` (alias `/dashboard`).

Also fixes correctness issues found in review: attach the session auth
header to the import and delete calls; log previously-swallowed
exceptions in the session/statistics APIs and the build script; group
sub-agent events by a stable key; and gate the number-key tab shortcuts
to the in-session view.
Add the dashboard reference page, wire up navigation and cross-links,
refresh the architecture and configuration docs, and add a CHANGELOG
entry introducing `pythinker dashboard`.
@coderabbitai

coderabbitai Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@elkaix, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 4 minutes and 57 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: de2304a6-dac9-488f-9256-497ec283cc0c

📥 Commits

Reviewing files that changed from the base of the PR and between ef3090b and a0da4f3.

⛔ Files ignored due to path filters (1)
  • dashboard/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (9)
  • AGENTS.md
  • dashboard/src/App.tsx
  • dashboard/src/features/statistics/statistics-view.tsx
  • dashboard/src/hooks/use-theme.ts
  • src/pythinker_code/cli/__init__.py
  • src/pythinker_code/dashboard/app.py
  • src/pythinker_code/ui/shell/slash.py
  • tests/dashboard/test_app.py
  • tests/web/test_web_ui_assets.py
📝 Walkthrough

Walkthrough

Renames the vis subsystem to dashboard across the entire codebase: FastAPI routers move from /api/vis to /api/dashboard, the SwitchToVis CLI exception becomes SwitchToDashboard, the pythinker dashboard subcommand replaces pythinker vis, the /reports slash command raises SwitchToDashboard, the frontend API base path and capabilities interface are updated, and all build targets, PyInstaller specs, CI workflows, tests, and docs are updated accordingly. Two functional fixes are also included: Bearer token auth on session import/delete requests, and a safer subagent grouping key fallback in buildTree.

Changes

vis → dashboard rename

Layer / File(s) Summary
Dashboard backend API routers and app wiring
src/pythinker_code/dashboard/api/__init__.py, src/pythinker_code/dashboard/api/sessions.py, src/pythinker_code/dashboard/api/statistics.py, src/pythinker_code/dashboard/api/system.py, src/pythinker_code/dashboard/app.py, src/pythinker_code/utils/server.py
Exports three routers under /api/dashboard; app imports PYTHINKER_DASHBOARD_* env vars, mounts dashboard static assets, exposes run_dashboard_server; adds debug/warning logging in sessions and statistics error paths.
Remove vis API router exports
src/pythinker_code/vis/api/__init__.py
Strips sessions_router, statistics_router, and system_router from __all__, decoupling the vis package from the dashboard app.
CLI exception, subcommand, and shell slash-command routing
src/pythinker_code/cli/__init__.py, src/pythinker_code/cli/_lazy_group.py, src/pythinker_code/cli/dashboard.py, src/pythinker_code/ui/shell/__init__.py, src/pythinker_code/ui/shell/slash.py, src/pythinker_code/utils/subprocess_env.py
SwitchToDashboard replaces SwitchToVis in the CLI reload loop and run path; dashboard lazy subcommand added to LazySubcommandGroup; CLI command handler renamed; /reports slash command raises SwitchToDashboard with a dashboard alias; PYTHINKER_DASHBOARD_SESSION_TOKEN scrubbed by get_clean_env().
Frontend API client, capabilities, and UI components
dashboard/src/lib/api.ts, dashboard/src/App.tsx, dashboard/src/features/wire-viewer/turn-tree.tsx, dashboard/src/hooks/use-theme.ts, dashboard/package.json
API BASE updated to /api/dashboard; DashboardCapabilities and getDashboardCapabilities replace vis counterparts; Bearer token auth added to importSession/deleteSession; App.tsx guards keyboard shortcuts on sessionId; subagent grouping key adds idx:<event.index> fallback; theme localStorage key updated to dashboard-theme.
Build scripts, Makefile, PyInstaller specs, and CI
Makefile, scripts/build_dashboard.py, src/pythinker_code/utils/pyinstaller.py, pythinker.spec, packages/linux-installer/pythinker.spec, packages/windows-installer/pythinker.spec, .github/workflows/*, .gitignore, .github/dependabot.yml
build-vis Makefile target replaced by build-dashboard; build_dashboard.py retargeted with improved Node.js error reporting; require_ui_assets() and all three .spec files validate dashboard/static/index.html; CI workflow steps and gitignore updated.
Test suite updates
tests/core/*, tests/dashboard/test_app.py, tests/ui_and_conv/test_shell_switch_slash.py, tests/utils/*, tests/web/test_web_ui_assets.py, tests/tools/test_memory_routing_guard.py
All tests retargeted to dashboard endpoints, SwitchToDashboard, and pythinker_code.cli.dashboard; test_dashboard_root_explains_missing_assets verifies 503 with make build-dashboard hint.
Documentation and changelog
README.md, AGENTS.md, dashboard/AGENTS.md, CHANGELOG.md
Make targets, repo map, and CHANGELOG Unreleased entry updated to reference dashboard throughout.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested labels

enhancement

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 39.06% which is insufficient. The required threshold is 70.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed Title follows conventional commits format with feat type, dashboard scope, and clear description of the rename and new feature.
Description check ✅ Passed PR description covers the main changes, introduces the new dashboard feature, explains its architecture and accessibility, addresses correctness fixes, and provides a test plan, though some checklist items are unchecked.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch new-dashboard

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov

codecov Bot commented Jun 14, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 75.00000% with 7 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/pythinker_code/cli/dashboard.py 33.33% 2 Missing ⚠️
src/pythinker_code/dashboard/api/sessions.py 33.33% 2 Missing ⚠️
src/pythinker_code/dashboard/app.py 81.81% 2 Missing ⚠️
src/pythinker_code/dashboard/api/statistics.py 80.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/pythinker_code/dashboard/app.py (1)

141-150: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Include IPv6 any-address in allowed origins (or avoid opening [::]).

Line 141 excludes :: from origin_hosts, but Line 150 opens the browser at http://[::]:.... With origin enforcement enabled, dashboard API requests from that origin can be rejected.

Suggested fix
-    origin_hosts = ["localhost", "127.0.0.1"]
-    if host not in {"0.0.0.0", "::"}:
+    origin_hosts = ["localhost", "127.0.0.1"]
+    if host not in {"0.0.0.0", "::"}:
         origin_hosts.append(host)
     elif host == "0.0.0.0":
         origin_hosts.extend(get_network_addresses())
+    else:  # host == "::"
+        origin_hosts.extend(["::1", "::"])
     allowed_origins = [format_url(addr, actual_port) for addr in dict.fromkeys(origin_hosts)]
     os.environ[_ENV_ALLOWED_ORIGINS] = ",".join(allowed_origins)

     # Browser should open localhost
-    browser_host = "localhost" if host == "0.0.0.0" else host
+    browser_host = "localhost" if host in {"0.0.0.0", "::"} else host
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/pythinker_code/dashboard/app.py` around lines 141 - 150, The code
excludes the IPv6 any-address (::) from origin_hosts on line 141, but the
browser_host logic on line 150 does not account for this, allowing the browser
to open at an origin that is not in the allowed_origins list. Fix this by
treating :: similarly to 0.0.0.0: either add special handling in the elif block
to expand :: to specific IPv6 addresses (similar to get_network_addresses()), or
update the browser_host assignment to use "localhost" when host is :: (by
extending the ternary condition to check for both "0.0.0.0" and "::"). The
simpler approach is to update the browser_host ternary condition to treat both
cases the same way.
tests/web/test_web_ui_assets.py (1)

31-42: ⚠️ Potential issue | 🟡 Minor

Add missing assertion for asset path in dashboard error response.

The dashboard test should verify that the specific missing asset path appears in the error response, matching the web test pattern. The missing_ui_page() function includes the asset path in the HTML output, so the assertion should confirm it:

assert "pythinker_code/dashboard/static/index.html" in resp.text

The concern about auth requirements is not valid—the "/" endpoint is not authentication-gated for either app (AuthMiddleware only enforces auth on /api/ paths), so both tests correctly access it without session credentials.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/web/test_web_ui_assets.py` around lines 31 - 42, The
test_dashboard_root_explains_missing_assets function is missing an assertion to
verify that the specific missing asset path appears in the error response. Add
an assertion after the existing "make build-dashboard" assertion to confirm that
the asset path "pythinker_code/dashboard/static/index.html" is present in
resp.text, which will verify that the error response correctly identifies the
missing asset.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@AGENTS.md`:
- Around line 147-148: Update the inline comments for the make commands in
AGENTS.md to use the current naming convention instead of the old
"visualization" terminology. Replace the comment for `make dashboard-back` that
currently says "visualization backend on port 5495" and the comment for `make
dashboard-front` that currently says "visualization frontend dev server" with
descriptions that align with the renamed target names and use the "dashboard-"
nomenclature consistently throughout the documentation.

In `@dashboard/src/App.tsx`:
- Around line 384-385: The numeric tab shortcuts (1–5) are gated behind a
sessionId check at line 384–385, meaning they only function when a session is
active. However, the help overlay text presents these shortcuts as globally
available, creating an inaccurate representation. Update the help content to
either conditionally render the 1–5 shortcut descriptions only when a session is
selected (when sessionId is truthy), or explicitly label them as "session view"
shortcuts in the help text. Address this mismatch at the location where the help
overlay defines the shortcut descriptions, ensuring the displayed shortcuts
accurately reflect their actual availability constraints.

In `@dashboard/src/hooks/use-theme.ts`:
- Around line 13-14: The localStorage read in the use-theme.ts file currently
only checks for the "dashboard-theme" key, but existing users may have
previously saved their theme preference under the old "vis-theme" key. Modify
the localStorage.getItem call to add a fallback mechanism: first attempt to read
from "dashboard-theme", and if that returns null, then read from "vis-theme" as
a fallback before returning the system theme default. This ensures backward
compatibility for users upgrading from the previous version.

In `@src/pythinker_code/cli/__init__.py`:
- Around line 42-44: The __init__ method of the SwitchToDashboard class is
missing the required return type annotation. Add `-> None` to the method
signature of the __init__ method to comply with the repository's type annotation
requirements for public methods. The method signature should declare its return
type explicitly even though __init__ methods implicitly return None.

In `@src/pythinker_code/ui/shell/slash.py`:
- Line 2003: The `reports` function declares an `args` parameter that is not
used anywhere in the function body, which triggers the Ruff ARG001 lint warning.
To fix this, rename the unused `args` parameter to `_args` in the function
signature to follow Python convention for intentionally unused parameters and
satisfy the linter.

---

Outside diff comments:
In `@src/pythinker_code/dashboard/app.py`:
- Around line 141-150: The code excludes the IPv6 any-address (::) from
origin_hosts on line 141, but the browser_host logic on line 150 does not
account for this, allowing the browser to open at an origin that is not in the
allowed_origins list. Fix this by treating :: similarly to 0.0.0.0: either add
special handling in the elif block to expand :: to specific IPv6 addresses
(similar to get_network_addresses()), or update the browser_host assignment to
use "localhost" when host is :: (by extending the ternary condition to check for
both "0.0.0.0" and "::"). The simpler approach is to update the browser_host
ternary condition to treat both cases the same way.

In `@tests/web/test_web_ui_assets.py`:
- Around line 31-42: The test_dashboard_root_explains_missing_assets function is
missing an assertion to verify that the specific missing asset path appears in
the error response. Add an assertion after the existing "make build-dashboard"
assertion to confirm that the asset path
"pythinker_code/dashboard/static/index.html" is present in resp.text, which will
verify that the error response correctly identifies the missing asset.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 41de849d-230a-4466-b8eb-3ece71c8e5bd

📥 Commits

Reviewing files that changed from the base of the PR and between bd23c21 and ef3090b.

⛔ Files ignored due to path filters (10)
  • dashboard/package-lock.json is excluded by !**/package-lock.json
  • docs/.vitepress/config.ts is excluded by !docs/**
  • docs/AGENTS.md is excluded by !docs/**
  • docs/en/configuration/data-locations.md is excluded by !docs/**
  • docs/en/customization/agent-architecture.md is excluded by !docs/**
  • docs/en/customization/architecture.md is excluded by !docs/**
  • docs/en/reference/pythinker-command.md is excluded by !docs/**
  • docs/en/reference/pythinker-dashboard.md is excluded by !docs/**
  • docs/en/reference/slash-commands.md is excluded by !docs/**
  • docs/en/release-notes/changelog.md is excluded by !docs/**
📒 Files selected for processing (86)
  • .github/dependabot.yml
  • .github/workflows/linux-installer.yml
  • .github/workflows/windows-installer.yml
  • .gitignore
  • AGENTS.md
  • CHANGELOG.md
  • Makefile
  • README.md
  • dashboard/AGENTS.md
  • dashboard/components.json
  • dashboard/index.html
  • dashboard/package.json
  • dashboard/src/App.tsx
  • dashboard/src/components/markdown.tsx
  • dashboard/src/components/metric-card.tsx
  • dashboard/src/components/ui/alert-dialog.tsx
  • dashboard/src/components/ui/card.tsx
  • dashboard/src/components/ui/select.tsx
  • dashboard/src/components/ui/tooltip.tsx
  • dashboard/src/features/agents-panel/agent-scope-bar.tsx
  • dashboard/src/features/agents-panel/agents-panel.tsx
  • dashboard/src/features/context-viewer/assistant-message.tsx
  • dashboard/src/features/context-viewer/context-space-map.tsx
  • dashboard/src/features/context-viewer/context-viewer.tsx
  • dashboard/src/features/context-viewer/tool-call-block.tsx
  • dashboard/src/features/context-viewer/user-message.tsx
  • dashboard/src/features/dual-view/dual-view.tsx
  • dashboard/src/features/session-picker/session-picker.tsx
  • dashboard/src/features/sessions-explorer/explorer-toolbar.tsx
  • dashboard/src/features/sessions-explorer/project-group.tsx
  • dashboard/src/features/sessions-explorer/session-card.tsx
  • dashboard/src/features/sessions-explorer/sessions-explorer.tsx
  • dashboard/src/features/state-viewer/state-viewer.tsx
  • dashboard/src/features/statistics/statistics-view.tsx
  • dashboard/src/features/usage/usage-heatmap.tsx
  • dashboard/src/features/usage/usage-trend-chart.tsx
  • dashboard/src/features/usage/usage-view.tsx
  • dashboard/src/features/wire-viewer/decision-path.tsx
  • dashboard/src/features/wire-viewer/integrity-check.tsx
  • dashboard/src/features/wire-viewer/timeline-view.tsx
  • dashboard/src/features/wire-viewer/tool-call-detail.tsx
  • dashboard/src/features/wire-viewer/tool-stats-dashboard.tsx
  • dashboard/src/features/wire-viewer/turn-efficiency.tsx
  • dashboard/src/features/wire-viewer/turn-tree.tsx
  • dashboard/src/features/wire-viewer/usage-chart.tsx
  • dashboard/src/features/wire-viewer/wire-event-card.tsx
  • dashboard/src/features/wire-viewer/wire-filters.tsx
  • dashboard/src/features/wire-viewer/wire-viewer.tsx
  • dashboard/src/hooks/use-theme.ts
  • dashboard/src/index.css
  • dashboard/src/lib/api.ts
  • dashboard/src/lib/cache.ts
  • dashboard/src/lib/utils.ts
  • dashboard/src/main.tsx
  • dashboard/tsconfig.app.json
  • dashboard/tsconfig.json
  • dashboard/tsconfig.node.json
  • dashboard/vite.config.ts
  • packages/linux-installer/pythinker.spec
  • packages/windows-installer/pythinker.spec
  • pythinker.spec
  • scripts/build_dashboard.py
  • src/pythinker_code/cli/__init__.py
  • src/pythinker_code/cli/_lazy_group.py
  • src/pythinker_code/cli/dashboard.py
  • src/pythinker_code/dashboard/__init__.py
  • src/pythinker_code/dashboard/api/__init__.py
  • src/pythinker_code/dashboard/api/sessions.py
  • src/pythinker_code/dashboard/api/statistics.py
  • src/pythinker_code/dashboard/api/system.py
  • src/pythinker_code/dashboard/app.py
  • src/pythinker_code/ui/shell/__init__.py
  • src/pythinker_code/ui/shell/slash.py
  • src/pythinker_code/utils/pyinstaller.py
  • src/pythinker_code/utils/server.py
  • src/pythinker_code/utils/subprocess_env.py
  • src/pythinker_code/vis/api/__init__.py
  • tests/core/test_cli_reload.py
  • tests/core/test_startup_imports.py
  • tests/core/test_wire_file_compat.py
  • tests/dashboard/test_app.py
  • tests/tools/test_memory_routing_guard.py
  • tests/ui_and_conv/test_shell_switch_slash.py
  • tests/utils/test_pyinstaller_utils.py
  • tests/utils/test_subprocess_env.py
  • tests/web/test_web_ui_assets.py
💤 Files with no reviewable changes (1)
  • src/pythinker_code/vis/api/init.py

Comment thread AGENTS.md Outdated
Comment thread dashboard/src/App.tsx
Comment thread dashboard/src/hooks/use-theme.ts Outdated
Comment thread src/pythinker_code/cli/__init__.py Outdated
Comment thread src/pythinker_code/ui/shell/slash.py Outdated
elkaix added 3 commits June 14, 2026 00:28
- Regenerate dashboard/package-lock.json to restore the nested @emnapi
  deps so the onefile build's `npm ci` succeeds (was failing on every
  platform in PR #137 CI).
- Open the browser at localhost for `::` binds, not just `0.0.0.0`, so the
  URL stays within the allowed origins (loopback_browser_host helper + test).
- use-theme: fall back to the legacy "vis-theme" key for upgraders.
- Help overlay: move the session-gated 1-5 tab shortcuts out of "Global"
  into a "Session Views" group.
- AGENTS.md: drop stale "visualization" wording for the dashboard targets.
- Assert the dashboard missing-assets 503 names the expected static path.
The Daily Usage line chart stretched to the full 1400px content width,
leaving the sparse 30-day series looking over-extended. Cap the card at
max-w-3xl and center it (matching loading skeleton) so it stays centered
and readable on wide screens.
…sync

- Add -> None return type to SwitchToDashboard.__init__ (ANN204)
- Rename unused args to _args in reports() slash command (ARG001)
- Add IPv6 :: host to allowed_origins in dashboard app
- Add @emnapi/core@1.11.1 and @emnapi/runtime@1.11.1 to dashboard lockfile

The build was failing on all platforms because npm ci could not find
@emnapi/core@1.11.1 and @emnapi/runtime@1.11.1 in the lockfile. These
are needed by @tailwindcss/oxide-wasm32-wasi which pins ^1.10.0 (now
resolved to 1.11.1 on the registry). Added the missing top-level entries.
@elkaix
elkaix merged commit 4a89e78 into main Jun 14, 2026
32 checks passed
@elkaix
elkaix deleted the new-dashboard branch July 17, 2026 20:04
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