* fix: emit the install event and report a path for QML-only ui_qml packages
installPlugin() gated its corePluginFileInstalled/uiPluginFileInstalled event —
and response["path"] — on installedPluginPath being non-empty. That out-param
is a REPORTING detail, not the success signal: a QML-only ui_qml package has no
backend library, so an older logos-package-manager left it empty on a perfectly
good install. The result was that uiPluginFileInstalled never fired (Basecamp
only discovered the plugin after an app restart) and "path" came back empty,
which logos-package-manager-ui reads as failure and draws as a red RETRY.
Success is now the library's own signal — a non-empty return from
installPluginFile() — and the reported path falls back to that return value
when installedPluginPath is empty, so this stays correct against an
unpatched logos-package-manager.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Merge origin/master into feat/windows-cross
master landed #58 (manifest version). Merged clean -- no conflicts -- then the
lock was re-pinned to the merged logos-module-builder (L6) and
logos-package-manager (L3).
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat: add fresh-install gate + thread dep changes through gated flow
Adds a confirmation gate for fresh installs (requestInstall / confirmInstall /
cancelInstall + beforeInstall / installApproved / installCancelled events),
mirroring the existing uninstall/upgrade gate but with no in-module uninstall
step — confirmInstall simply emits installApproved so the initiator runs its
own download+install chain.
Also extends requestUpgrade with an opaque `depChanges` JSON argument that is
echoed into the beforeUpgrade / beforeInstall payload, so a host confirmation
dialog can list the transitive dependency changes an operation will apply. The
module never interprets it (malformed/empty -> empty array).
This lets the host (basecamp) own a single confirmation dialog for install,
upgrade, and downgrade — replacing the double-dialog where PMUI and basecamp
both confirmed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* chore: address review nits — confirmInstall single critical section + depChanges doc
- confirmInstall now validates, captures the echo fields, and clears the gate
in ONE critical section instead of two, so a concurrent cancel/reset/
ack-timeout can't swap the pending action out between the check and the
capture (which would emit installApproved with an empty/wrong payload).
No behavior change under the current single-dispatch model; hardens against
a future concurrency:multi flip.
- Fix requestUpgrade/requestInstall depChanges doc: the module DOES parse the
JSON (to re-embed it as an array via attachDepChanges) but never interprets
or acts on its contents.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* migrate to typed events
* Address PR review: clarify event-related comments
- test_package_manager.cpp: EventCapture now comes from the test
framework, not a local helper "below".
- package_manager_impl.h: drop the misleading "unit-test use" example
for the no-listener case (tests do wire listeners).
- package_manager_impl.cpp: reword the destructor threading note to
reference the typed event methods rather than a stored callback.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor: replace hashesValid with packageValid
Update QVariantMap field names and documentation to match upstream
package_valid rename in SignatureVerificationResult.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: replace TOFU with explicit keyring management API
Remove setTofuEnabled and add addTrustedKey, removeTrustedKey, and
listTrustedKeys methods that call the lgx C API directly. This gives
the UI/app explicit control over trust decisions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address PR review feedback
- Warn on invalid signature policy values instead of silently ignoring
- Distinguish signature verification errors from unsigned packages
- Document optional fields in installPlugin response
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* bump dependencies
* Add tests
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>