17 Commits
Author SHA1 Message Date
Dario Gabriel LipicarandClaude Opus 5 819a586cab docs: retire references to files, outputs and pins that no longer exist
Sweep of documentation and comments the shell split and the pin retirement
made false. No behaviour change except one dead nix binding, below.

flake.nix
  * Deletes `appImage = import ./nix/appimage.nix {...}`. That file is NOT in
    the tree; the binding survived only because nix is lazy and nothing ever
    forced it. Anyone referencing `appImage` would have hit a file-not-found at
    eval. The shipped AppImage is the `bin-appimage` output, built by
    nix-bundle-appimage.
  * Four stale `Rev-pinned:` comment blocks -- logos-module-loader-qt,
    logos-liblogos, logos-capability-module, logos-package-manager-ui. None of
    those inputs carries a rev or ref any more; 3c21c1f retired the pins and
    left every explanation behind. The logos-package-manager-ui one was a
    DUPLICATED pair of near-identical paragraphs describing two different revs
    of the same dead pin.

    Rewritten rather than deleted, because two carried constraints that outlive
    the pin and would be expensive to rediscover: capability_module fails CLOSED
    without `token_registry` / `token_delivery`, and package-manager-ui is
    loaded IN-PROCESS so it must match the host runtime's generation.

nix/coverage.nix
  * --filter now lists BOTH app/ and src/. The split moved AppsFilterProxy,
    ModulesFilterProxy, InstallEnums, ShortcutBridge and WorkspaceArea into
    src/, and all five are still compiled into unit-test binaries via srcdeps --
    so their .gcno/.gcda were produced and then discarded, and four of the ten
    test binaries contributed nothing to the published numbers. failUnderLine
    defaults to 0, so this cannot break the build.
  * Its scope note still listed MainContainer as an app/ source.

app/CMakeLists.txt
  * The logos_core-last rule is load-bearing on the mingw link and its comment
    justified it by LogosSharedFromDll.cmake emptying the static archives --
    a file deleted in #348, and contradicted by the comment 14 lines below.
    The rule stands; only its stated reason was gone, which is precisely how
    someone deletes it and gets four undefined references.

docs/project.md
  * The app/ tree listed LogosQmlBridge.h/cpp, mdiview.h/cpp, mdichild.h/cpp
    and an app/qml/ subtree of nine QML files. None exists; the QML lives at
    src/Basecamp/. Replaced with the sources actually there.
  * The nix/ listing named appimage.nix, macos-bundle.nix and macos-dmg.nix --
    none of which exists -- and omitted symbol-gate.nix, which :193 relies on
    as the thing enforcing the shell boundary.
  * MainContainer's section still said app/; 9b8cf6e recorded R100 into src/.
    It also said MainContainer creates MainUIBackend, which Window now owns.
  * LogosQmlBridge's section cited app/ paths for an EXTERNAL header that
    arrives from a flake input.
  * MdiView / MdiChild sections describe classes that no longer exist; the role
    is src/WorkspaceArea.
  * Advertised a `.#bin-macos-dmg` output that is not defined anywhere.

tests/shutdown-tests.mjs
  * Pointed at app/main.cpp:224-254 as "the orderly teardown". Those lines are
    startup. The reference was already wrong when written and has since moved
    twice, so it now names the block instead of line-numbering it.

doctests/basecamp-modules-bundle.test.yaml
  * "Basecamp's *own* shell is deliberately NOT here: it is carried as a
    main_ui plugin again" -- a fold-era clause left in front of its own
    replacement, negating the rest of the sentence and the assertion below it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 19:56:02 -03:00
Dario Gabriel Lipicar 9b8cf6e47e feat(shell): ship main_ui as a plugin that links no logos runtime
Measured on the built artefact: main_ui.dylib DEFINES zero and IMPORTS zero of
TokenManager, StoreRegistry, LogosAPI, LogosAPIClient and logos_core_*, out of
3410 symbols read. It links Qt and nothing else from this workspace, which
nix/symbol-gate.nix enforces across the in-process image set.

Getting there needed the last non-Qt types off the boundary: the model
properties cross as QAbstractItemModel*, catalogInstallStageChanged carries an
int rather than InstallStage::Value, and the two prebuilt AppsFilterProxy
instances are declared in QML instead of owned by MainUIBackend. That last one
removes a real inversion -- PackageCoordinator called setRequiredPackages() on
a proxy the host held a pointer to; it now emits requiredPackagesResolved() and
QML binds to the republished property.

Window resolves the plugin, qobject_casts it to IShellView, checks
hostAbiVersion() against IShellHost_abi, and calls createShell(IShellHost*).
No error-label fallback widget: that degraded to something that looked like a
working app with an empty window.

Filter proxies read role constants off host-side models and InstallEnums is
used by nine host files, so app/interfaces/ gains the contract headers both
sides compile against -- the models inherit the role structs, leaving every
AppsModel::NameRole call site unchanged. The plugin's include path is
app/interfaces only, so including a host header does not compile.

Four things only running it finds:
  * Logos::DesignSystem may be linked by exactly ONE image -- both linked it
    and the app aborted with "Cannot add multiple registrations for
    Logos.Icons"; QML module registration is process-global
  * qmltyperegistrar emits no #include for a SOURCES header given as an
    absolute path outside the project
  * each qt_add_qml_module is its own target and inherits no include dirs
  * AUTOMOC pairs header<->cpp by same-basename-same-DIRECTORY, which the
    split breaks

tst_AppManagerView.qml grows five tests for the QML binding, checked with a
negative control: breaking one assertion fails qml-tests, so they run.
2026-08-22 16:42:13 -03:00
Dario Gabriel Lipicar 7851bf9f46 feat(host): per-plugin identities, an opt-in access policy, and the source split
Each loaded plugin -- including pure-QML ones -- gets its own LogosAPI identity
rather than sharing the host's, so a plugin's calls are attributable and can be
refused independently. The host-services grant is wired through to
capability_module, and its trust root is guarded on an OUTCOME rather than a
log line.

Inter-module access policy stays OFF by default: enforce mode's derived
deny-by-default gates every ui_qml app's calls to its own backend module,
because UI plugins load out-of-process and are not tracked as dependents in the
core ModuleRegistry. Operators opt in per launch with --access-policy enforce
or LOGOS_ACCESS_POLICY.

Takes the Qt host runtime from logos-plugin-qt rather than logos-qt-sdk, which
keeps only the Qt<->lp seam headers, and moves logos-protocol onto the rev that
split host needs. On Windows logos_core must come LAST on the link line: GNU ld
resolves an archive left to right, so the view runtime's references have to be
undefined already when it reaches the import library.

Separates the two source trees -- app/ is the host, src/ is the UI shell -- and
brings the CI onto setup-nix-cache-action. Merges master.
2026-08-22 16:42:13 -03:00
Khushboo Mehta 2757b5fee5 chore: remove install lgx from modules settings 2026-07-30 15:42:21 +00:00
Khushboo Mehta 13113de3f2 chore: bump submodules 2026-07-22 11:45:37 +00:00
Khushboo Mehta 2b3e75b9ea feat: add back hot reload on any qml changes 2026-06-18 13:31:52 +02:00
Iuri Matias 00f809c6c5 several fixes and improvements 2026-06-15 16:07:07 -04:00
Khushboo Mehta bf22620769 feat: migrate basecamp QML to qt_add_qml_module to fix qrc stale cache issues 2026-06-15 14:42:15 +02:00
Iuri Matias 983ed40122 add further tests for qml sandbox 2026-06-08 18:11:01 -04:00
Iuri Matias 05c8990541 improved qml sandbox 2026-06-08 16:27:27 -04:00
Dario LipicarandClaude Opus 4.8 a90f7d1bcd Replace per-module Methods screen with an Interface screen (methods + events) (#210)
* Replace per-module Methods screen with an Interface screen (methods + events)

A module exposes two halves of its API — methods you call and events you
subscribe to. The per-module screen now shows both. The 'View Methods'
button becomes 'Interface', and PluginMethodsView is renamed to
PluginInterfaceView with a Methods section (unchanged, with Call) and a
new Events section below it (event name in amber, signature, and the
event's description; no Call button).

- CoreModuleManager: getEvents(name) -> invokeRemoteMethod(name,
  "getPluginEvents"), mirroring getMethods.
- MainUIBackend: getCoreModuleEvents(name) delegates to it.
- CoreModulesView: 'Interface' button; openInterface()/showingInterface.
- PluginInterfaceView (renamed): loads methods + events, renders both.
- docs: project.md view description.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Harden PluginInterfaceView: stable width + clear stale state

Address review feedback (#210):

- PluginInterfaceView: bind the inner ColumnLayout to the ScrollView's
  availableWidth (via an id) instead of parent.width. Inside a Qt 6
  ScrollView parent.width resolves against the internal Flickable
  contentItem and can transiently collapse to 0 during Repeater reflow —
  the same fix already applied in CoreModulesView/UiModulesTab.
- loadMethods()/loadEvents(): clear methods/events (and resultText) when
  pluginName becomes empty, so a reset view can't show a previous
  plugin's interface.
- CoreModuleManager.h: correct the stale 'Both return' comment now that
  there are three JSON introspection methods (getMethods/getEvents/
  callMethod).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 17:18:04 -03:00
Iuri Matias 1af501e868 remove test apps 2026-05-25 10:34:07 -04:00
Iuri Matias f65db317a6 update liblogos; use new APIs 2026-05-19 16:24:35 -04:00
Dario Lipicar 20a3ce3beb switch to new liblogos function names (#173)
* switch to new liblogos function names

* pr comments
2026-04-24 11:00:06 -03:00
Dario Lipicar 9bc91145b9 allow overriding user directory via launch argument (#164)
* allow overriding user directory via launch argument

* pr comments
2026-04-22 12:43:00 -03:00
Dario Lipicar c1e11a8936 unify dev and portable launcher files (#139) 2026-04-13 10:30:23 -03:00
Logos Workspace 9998048773 add initial spec and project description 2026-04-02 11:30:00 -04:00