Skip to content

feat(account): wire premium accounts end to end - #171

Merged
mpiton merged 33 commits into
mainfrom
feat/mat-132-premium-accounts
Jul 17, 2026
Merged

feat(account): wire premium accounts end to end#171
mpiton merged 33 commits into
mainfrom
feat/mat-132-premium-accounts

Conversation

@mpiton

@mpiton mpiton commented Jul 16, 2026

Copy link
Copy Markdown
Owner

Summary

  • validate account add/update operations through the real plugin adapter while keeping secrets in the OS keyring
  • persist only typed account state and opaque account references in SQLite
  • select enabled, valid, hoster-compatible accounts during link analysis without issuing a token
  • resolve one-shot premium URLs only inside the native download engine, with typed JIT rotation and atomic account-reference updates
  • expose authentication, expiry, quota, cooldown, and missing-credential states to the Accounts UI
  • harden plugin URL handling against credential leakage, redirects, proxies, DNS rebinding, private IPv4/IPv6, and NAT64 SSRF

Acceptance coverage

Covers MAT-132 R01–R06: real validation, secret boundaries, eligible-account selection, dedicated credential host function, observable typed failures, and integration scenarios for success/missing/expired/quota/cooldown/rotation.

Verification

  • cargo fmt --all -- --check
  • cargo clippy --workspace --all-targets -- -D warnings
  • cargo test --workspace --all-targets: 1,606 passed, 5 ignored; app-state wiring passed
  • npx oxlint .
  • npm run build
  • npx vitest run: 87 files, 719 tests passed
  • pre-push gates: knip, cargo-deny, Rust tests, TypeScript typecheck and Vitest all passed
  • independent APEX logic/security/final verification: PASS

Dependency and rollout

Depends on mpiton/vortex-mod-1fichier#3 and its immutable v1.1.0 release assets. This PR deliberately leaves registry/registry.toml on the currently published 1fichier v1.0.0 entry. Update the registry only after v1.1.0 exists and its WASM + manifest checksums can be verified.

The SQLite migration is additive. The principal runtime risk is account-state concurrency during JIT rotation; regression tests cover pause/delete races, CAS account_ref updates, orphan prevention, and no row resurrection.

Linear: https://linear.app/mpiton/issue/MAT-132/lot-2-brancher-les-comptes-premium-de-bout-en-bout


Summary by cubic

End-to-end premium account wiring: real plugin-backed validation with typed status, secrets in the OS keyring, eligible-account selection and rotation, and just‑in‑time premium URL resolution inside the native engine with stronger network safety. Covers MAT-132 R01–R06 and updates the registry to vortex-mod-1fichier v1.1.0.

  • New Features

    • Real plugin validator with typed outcomes; auto‑validate on add/update; Accounts UI listens to account events and shows valid/missing/invalid/expired/quota/cooldown with deadline wakeups.
    • Persisted account state: status and cooldown_until; store only account metadata; secrets remain in the keyring; per‑account operation locks; prevent deleting accounts still referenced by downloads.
    • Premium flow: select enabled, valid, hoster‑compatible accounts during link analysis without issuing tokens; LinkGrabber passes moduleName and accountId to download_start while keeping only the source URL in IPC and persistence.
    • Just‑in‑time resolution and rotation: the engine asks a cancellable resolver right before connecting; direct URLs never leave the native runtime; atomic compare‑and‑set updates the download’s opaque account_ref on quota/cooldown with account-exhausted events.
    • Network and plugin hardening: HTTPS‑only for plugin URLs, DNS answer pinning, redirect/private IP/NAT64 SSRF blocking; credentials bound to the selected plugin with isolated slots across reloads; hoster JSON parsed at the adapter boundary; sensitive diagnostics redacted.
  • Migration

    • Additive SQLite changes: accounts.status, accounts.cooldown_until, downloads.account_ref (opaque string).
    • No manual action; existing accounts start as unverified.

Written for commit 13123fd. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added premium source resolution for account-scoped downloads, including hoster link extraction and account rotation with typed premium associations.
    • Extended account validation/status reporting (invalid, missing credential, expired, cooldown, quota exhaustion) and updated the Accounts UI to react to lifecycle/validation events.
  • Security
    • Hardened premium networking and plugin URL access (HTTPS-only, blocked local/private targets, pinned DNS, safer redirects, and redacted sensitive diagnostics).
  • Bug Fixes
    • Improved per-account and per-download concurrency handling, rotation/cooldown/quota persistence, and resolver cancellation to avoid late commits.
  • Changed
    • Updated UI/data contracts to remove credential references and use localized, typed account status.
    • Updated the 1fichier plugin to version 1.1.0.

mpiton added 30 commits July 16, 2026 14:02
@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Changes

MAT-132 adds typed premium-account state, isolated plugin credentials, secure just-in-time source resolution, account rotation, atomic download association updates, SQLite persistence, IPC/runtime wiring, and frontend status/event handling.

Premium account runtime

Layer / File(s) Summary
Typed account state and persistence
src-tauri/src/domain/..., src-tauri/src/adapters/driven/sqlite/...
Accounts persist typed status and cooldown deadlines; downloads use opaque AccountId references with atomic association updates.
Plugin validation and credential isolation
src-tauri/src/adapters/driven/plugin/...
Plugin calls use scoped credentials, typed JSON contracts, redacted diagnostics, and fail-closed account validation.
Account operations and rotation
src-tauri/src/application/commands/..., src-tauri/src/application/services/...
Account commands validate and persist typed outcomes under per-account locks, while rotation distinguishes quota and cooldown exhaustion.
Premium source resolution
src-tauri/src/application/commands/premium_account_*.rs, src-tauri/src/application/commands/resolve_premium_source.rs
Premium links are resolved with selected credentials, eligible fallback accounts, typed failures, and atomic download-reference reconciliation.
Secure download execution
src-tauri/src/adapters/driven/network/...
Sensitive sources use restricted HTTPS clients, public-IP/DNS validation, redacted events/errors, and non-sensitive resume identifiers.
Runtime and frontend integration
src-tauri/src/lib.rs, src-tauri/src/adapters/driving/tauri_ipc.rs, src/hooks/*, src/views/AccountsView/*, src/views/LinkGrabberView/*
IPC, application wiring, account event invalidation, localized statuses, time-aware badges, and premium download metadata are connected.
Release metadata
CHANGELOG.md, registry/registry.toml
MAT-132 entries and the 1fichier plugin release checksums are updated.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

  • mpiton/vortex#128 — Shares account-selection and NoAccountAvailable flow changes.
  • mpiton/vortex#129 — Provides related quota-exhaustion and account-rotation groundwork.
  • mpiton/vortex#153 — Shares download mirror-failover and MirrorSwitched handling.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 59.09% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: end-to-end premium account wiring.

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

@github-actions github-actions Bot added documentation Improvements or additions to documentation rust frontend labels Jul 16, 2026
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@codspeed-hq

codspeed-hq Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Merging this PR will degrade performance by 0.85%

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

⚡ 4 improved benchmarks
❌ 3 regressed benchmarks
✅ 19 untouched benchmarks

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Benchmark BASE HEAD Efficiency
from_status_code_200 94.2 ns 123.3 ns -23.65%
from_status_code_404 123.9 ns 153.1 ns -19.06%
normalize_max_concurrent 150 ns 179.2 ns -16.28%
from_status_code_500 123.9 ns 94.7 ns +30.79%
split 501.1 ns 442.8 ns +13.17%
full_lifecycle 288.9 ns 259.7 ns +11.23%
reject_invalid 610.3 ns 551.9 ns +10.57%

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing feat/mat-132-premium-accounts (13123fd) with main (5b55d38)

Open in CodSpeed

@mpiton
mpiton marked this pull request as ready for review July 16, 2026 16:25
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

cubic analysis

All reported issues were addressed across 80 files

Linked issue analysis

Linked issue: MAT-132: [Lot 2] Brancher les comptes premium de bout en bout

Status Acceptance criteria Notes
R-01 — The add/modify account flow triggers a real validation via the applicative port A PluginAccountValidator adapter was added and CommandBus calls the validator on add/update flows; validation outcome plumbing is applied to persist and publish results.
R-02 — Account secrets are never persisted in plain text (SQLite, logs, frontend events) Persistent models and DTOs were changed to store only opaque refs/metadata; credential material is handled via dedicated credential slots/keyring and redaction of sensitive resolved URLs is implemented.
R-03 — A premium download selects only enabled, valid, and hoster-compatible accounts Account selection and validations updated to prefer validated/eligible accounts; download start and link resolution validate account compatibility and enforce module association.
R-04 — Plugin receives the expected credential via the dedicated host function without direct keyring access Plugin capability surface now uses per-instance credential slots and PluginLoader.extract_hoster_link accepts an explicit credential parameter; registry/loader set credential scope for the call so plugins don't read keyring directly.
R-05 — Authentication, expiry, quota and cooldown produce typed, observable account states in the UI Typed DomainError values and an AccountStatus enum were added; mapping utilities apply typed statuses and UI/read-models/events were updated to expose them; front-end hooks and localization added.
R-06 — Integration tests cover success, missing credential, expired account and rotation to a second account New unit/integration-style tests exercise premium resolution and rotation scenarios; CI verification in the PR shows the test suites passed.

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread src-tauri/src/domain/model/account.rs
Comment thread src-tauri/src/adapters/driven/sqlite/entities/download.rs
Comment thread src-tauri/src/adapters/driven/network/safe_url.rs
Comment thread src-tauri/src/adapters/driven/network/nat64.rs Outdated
Comment thread src-tauri/src/application/commands/premium_account_rotation.rs Outdated
Comment thread src-tauri/src/domain/ports/driven/hoster_link.rs Outdated
Comment thread src-tauri/src/application/services/account_rotator.rs Outdated
Comment thread src-tauri/src/adapters/driven/plugin/extism_loader.rs
Comment thread src-tauri/src/adapters/driven/sqlite/account_repo.rs
Comment thread src-tauri/src/application/commands/resolve_premium_source_tests.rs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 9

🧹 Nitpick comments (1)
src-tauri/src/adapters/driven/sqlite/migrations/m20260716_000010_wire_premium_accounts.rs (1)

30-37: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Consider indexing downloads.account_ref.

has_account_reference (in download_repo.rs) filters on this column, and is used to gate account deletion. Without an index, that lookup is a full table scan of downloads as the table grows.

♻️ Suggested addition
         manager
             .alter_table(
                 Table::alter()
                     .table(Downloads::Table)
                     .add_column(ColumnDef::new(Downloads::AccountRef).text().null())
                     .to_owned(),
             )
-            .await
+            .await?;
+        manager
+            .create_index(
+                Index::create()
+                    .name("idx_downloads_account_ref")
+                    .table(Downloads::Table)
+                    .col(Downloads::AccountRef)
+                    .to_owned(),
+            )
+            .await
🤖 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-tauri/src/adapters/driven/sqlite/migrations/m20260716_000010_wire_premium_accounts.rs`
around lines 30 - 37, Add an index for the nullable Downloads::AccountRef column
in the same migration that adds it, using the project's existing SeaORM index
migration pattern. Ensure the index targets account_ref so has_account_reference
lookups in download_repo.rs avoid full-table scans.
🤖 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 `@src-tauri/src/adapters/driven/plugin/registry.rs`:
- Around line 170-185: Update call_plugin_inner’s registry-entry lookup to
validate entry.enabled while holding the registry access, returning the existing
disabled-plugin error before cloning handles, creating CredentialScope, or
invoking the plugin. Add a regression test covering a plugin disabled after the
loader pre-check and verify no credential is injected or execution occurs.

In `@src-tauri/src/application/commands/premium_account_rotation.rs`:
- Around line 58-84: Update the download-association validation around
compare_and_set_account_reference so it always revalidates the expected
association, including when the account has not rotated, and detects concurrent
reassignment or deletion before returning a premium URL. Make the explicit
“download account association changed during resolution” failure non-rotatable
in the rotation decision logic near is_rotatable, while preserving rotation for
other eligible errors.

In `@src-tauri/src/application/commands/redownload.rs`:
- Around line 459-477: Update redownload_rejects_an_orphaned_account_reference
to provide an empty InMemoryAccountRepo and credential store when constructing
the bus, so account lookup reaches the orphaned-reference path. Change the
assertion from AppError::Validation(_) to AppError::NotFound while preserving
the existing missing-account setup.

In `@src-tauri/src/application/commands/resolve_premium_source.rs`:
- Around line 78-88: Update ResolvePremiumSourceHandler::handle so the account
lock acquisition and synchronous resolve_locked work run inside a Tokio
spawn_blocking boundary, while preserving per-account serialization and
returning the same Result<ExtractedHosterLink, DomainError>. Publish success
only after the blocking resolution completes successfully, and propagate join or
resolution errors through the existing error type.

In `@src-tauri/src/application/commands/update_account.rs`:
- Around line 127-136: Update the account-update command flow after publishing
the committed outcome and validation event to inspect
AccountValidationAttempt.error and return its mapped error when present;
otherwise keep returning Ok(()). Preserve the existing
sync_validation_availability and event publication behavior, matching
handle_validate_account’s error mapping.

In `@src-tauri/src/application/services/account_rotator.rs`:
- Around line 8-10: Update the exhaustion commit path and next_account to share
one synchronization boundary, so selection cannot occur between persisting an
exhausted Account and updating the in-memory cache. Ensure next_account’s final
availability check observes the same coordinated state, preserving rollback or
consistent cache state if persistence fails.

In `@src-tauri/src/domain/ports/driven/download_repository.rs`:
- Around line 61-84: The default has_account_reference implementation is unsafe
because it scans mutable download states through separate queries and can miss
references during transitions. Make has_account_reference a required
DownloadRepository trait method, then implement a single adapter-level EXISTS
query filtering directly by account_id, preserving the Result<bool, DomainError>
contract.

In `@src-tauri/src/domain/ports/driven/hoster_link.rs`:
- Around line 1-16: Replace the derived Debug implementation on
ExtractedHosterLink with a custom redacted formatter, matching the existing
ResolvedDownloadSource behavior so direct_url is never emitted verbatim while
the remaining fields remain available in diagnostics.

In `@src/views/LinkGrabberView/__tests__/LinkGrabberView.test.tsx`:
- Around line 185-195: Update the test setup in “passes the source URL and
premium account association to download_start” so the mocked link-resolution
response uses the distinct directUrl as resolvedUrl while retaining sourceUrl as
originalUrl. Ensure the assertion at the download_start invocation verifies the
resolved URL is not forwarded, making the token-leak check meaningful.

---

Nitpick comments:
In
`@src-tauri/src/adapters/driven/sqlite/migrations/m20260716_000010_wire_premium_accounts.rs`:
- Around line 30-37: Add an index for the nullable Downloads::AccountRef column
in the same migration that adds it, using the project's existing SeaORM index
migration pattern. Ensure the index targets account_ref so has_account_reference
lookups in download_repo.rs avoid full-table scans.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 6bc94f0b-a88c-4e1f-96a5-df719763b713

📥 Commits

Reviewing files that changed from the base of the PR and between 5b55d38 and 0db4d05.

📒 Files selected for processing (80)
  • CHANGELOG.md
  • registry/registry.toml
  • src-tauri/src/adapters/driven/network/download_engine.rs
  • src-tauri/src/adapters/driven/network/mod.rs
  • src-tauri/src/adapters/driven/network/nat64.rs
  • src-tauri/src/adapters/driven/network/safe_url.rs
  • src-tauri/src/adapters/driven/network/safe_url_tests.rs
  • src-tauri/src/adapters/driven/network/segment_worker.rs
  • src-tauri/src/adapters/driven/plugin/account_validator.rs
  • src-tauri/src/adapters/driven/plugin/capabilities.rs
  • src-tauri/src/adapters/driven/plugin/extism_loader.rs
  • src-tauri/src/adapters/driven/plugin/host_functions.rs
  • src-tauri/src/adapters/driven/plugin/hoster_contract.rs
  • src-tauri/src/adapters/driven/plugin/hoster_contract_tests.rs
  • src-tauri/src/adapters/driven/plugin/mod.rs
  • src-tauri/src/adapters/driven/plugin/registry.rs
  • src-tauri/src/adapters/driven/sqlite/account_repo.rs
  • src-tauri/src/adapters/driven/sqlite/connection.rs
  • src-tauri/src/adapters/driven/sqlite/download_repo.rs
  • src-tauri/src/adapters/driven/sqlite/entities/account.rs
  • src-tauri/src/adapters/driven/sqlite/entities/download.rs
  • src-tauri/src/adapters/driven/sqlite/migrations/m20260716_000010_wire_premium_accounts.rs
  • src-tauri/src/adapters/driven/sqlite/migrations/mod.rs
  • src-tauri/src/adapters/driving/tauri_ipc.rs
  • src-tauri/src/application/command_bus.rs
  • src-tauri/src/application/commands/add_account.rs
  • src-tauri/src/application/commands/delete_account.rs
  • src-tauri/src/application/commands/mod.rs
  • src-tauri/src/application/commands/premium_account_resolution.rs
  • src-tauri/src/application/commands/premium_account_rotation.rs
  • src-tauri/src/application/commands/redownload.rs
  • src-tauri/src/application/commands/resolve_links.rs
  • src-tauri/src/application/commands/resolve_premium_source.rs
  • src-tauri/src/application/commands/resolve_premium_source_test_support.rs
  • src-tauri/src/application/commands/resolve_premium_source_tests.rs
  • src-tauri/src/application/commands/start_download.rs
  • src-tauri/src/application/commands/tests_support.rs
  • src-tauri/src/application/commands/update_account.rs
  • src-tauri/src/application/commands/validate_account.rs
  • src-tauri/src/application/queries/list_accounts.rs
  • src-tauri/src/application/read_models/account_view.rs
  • src-tauri/src/application/services/account_operation_locks.rs
  • src-tauri/src/application/services/account_rotator.rs
  • src-tauri/src/application/services/account_selector.rs
  • src-tauri/src/application/services/account_state.rs
  • src-tauri/src/application/services/mod.rs
  • src-tauri/src/domain/error.rs
  • src-tauri/src/domain/event.rs
  • src-tauri/src/domain/model/account.rs
  • src-tauri/src/domain/model/download.rs
  • src-tauri/src/domain/ports/driven/account_repository.rs
  • src-tauri/src/domain/ports/driven/account_validator.rs
  • src-tauri/src/domain/ports/driven/download_repository.rs
  • src-tauri/src/domain/ports/driven/download_source_resolver.rs
  • src-tauri/src/domain/ports/driven/hoster_link.rs
  • src-tauri/src/domain/ports/driven/mod.rs
  • src-tauri/src/domain/ports/driven/plugin_loader.rs
  • src-tauri/src/lib.rs
  • src-tauri/tests/app_state_wiring.rs
  • src/hooks/__tests__/useAccountEvents.test.ts
  • src/hooks/useAccountEvents.ts
  • src/i18n/locales/en.json
  • src/i18n/locales/fr.json
  • src/layouts/AppLayout.tsx
  • src/layouts/__tests__/AppLayout.test.tsx
  • src/types/account.ts
  • src/types/events.ts
  • src/views/AccountsView/AccountRow.tsx
  • src/views/AccountsView/AccountsView.tsx
  • src/views/AccountsView/__tests__/AccountRow.test.tsx
  • src/views/AccountsView/__tests__/AccountsView.test.tsx
  • src/views/AccountsView/__tests__/statusUtils.test.ts
  • src/views/AccountsView/statusUtils.ts
  • src/views/AccountsView/useAccountStatusNow.ts
  • src/views/LinkGrabberView/LinkGrabberView.tsx
  • src/views/LinkGrabberView/__tests__/LinkGrabberView.test.tsx
  • src/views/LinkGrabberView/__tests__/LinkRow.test.tsx
  • src/views/LinkGrabberView/__tests__/MediaGrabberDialog.test.tsx
  • src/views/LinkGrabberView/__tests__/ResolvedLinksSection.test.tsx
  • src/views/LinkGrabberView/types.ts

Comment thread src-tauri/src/adapters/driven/plugin/registry.rs Outdated
Comment thread src-tauri/src/application/commands/premium_account_rotation.rs Outdated
Comment thread src-tauri/src/application/commands/redownload.rs
Comment thread src-tauri/src/application/commands/resolve_premium_source.rs
Comment thread src-tauri/src/application/commands/update_account.rs Outdated
Comment thread src-tauri/src/application/services/account_rotator.rs
Comment thread src-tauri/src/domain/ports/driven/download_repository.rs
Comment thread src-tauri/src/domain/ports/driven/hoster_link.rs
Comment thread src/views/LinkGrabberView/__tests__/LinkGrabberView.test.tsx
@mpiton

mpiton commented Jul 16, 2026

Copy link
Copy Markdown
Owner Author

Addressed the review-body index nitpick in 38c12d3: migration 10 now creates idx_downloads_account_ref immediately after the nullable account_ref backfill and drops it on rollback. Migration coverage asserts both the legacy association backfill and index creation. Final verification: cargo check, Clippy with -D warnings, 1,622 Rust tests plus integration, TypeScript typecheck, oxlint, and 720 Vitest tests all pass.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

All reported issues were addressed across 32 files (changes from recent commits).

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread src-tauri/src/application/commands/add_account.rs Outdated
Comment thread src-tauri/src/adapters/driven/plugin/registry.rs Outdated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation frontend rust

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant