storebound/apps/desktop/src-tauri/capabilities/main.json
CRT bd3ab20e1d Desktop: never a blank window (frozen-prototype fix, error screens, logs, state migration, boot check)
The signed release showed only its background colour and never started the sidecar. Tauri's freezePrototype
freezes Object.prototype before the bundle runs; d3-color and d3-format (under the visx charts) assign
`constructor` / `toString` on plain objects while loading, which throws on a frozen prototype, so the bundle
stopped before React drew anything. The saved state was not the cause.

- build/freeze-safe.ts: Vite plugin that rewrites those assignments in dependencies into a helper that defines
  the property when the frozen prototype would refuse it
- error boundaries for the window, each screen and each app tab (Copy details, Reload, Reset saved state with a
  backup); public/boot.js shows the same panel when the bundle fails or the window stays empty
- logs/host.log (start, saved state, sidecar start/stop, panics) and logs/webview.log (log_webview), rotated,
  home as ~, keys, tokens and e-mail addresses replaced
- state.json `version` 2 with an explicit 1 -> 2 migration (original kept as state.json.v1.bak), per-entry
  tolerant parsing, partial settings keep their fields, unreadable files kept aside
- folders that are gone: "Folder not found" with Locate... (project_locate) / Remove; portfolio reads skip them
- tools/desktop-boot-check.ts: the built window with the release CSP and the frozen prototype, a mocked host from
  the state fixtures (empty, D1 with folders gone, D3) and the real sidecar, through every screen; in bun run ci,
  the Forgejo CI workflow and the macOS release
2026-10-11 09:36:34 +08:00

57 lines
1.9 KiB
JSON

{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "main-window",
"description": "The main window with the app's own bundled pages only (no remote content). It may listen to app events (sidecar progress, tool downloads, deep links) and call the storebound app commands; every command re-checks the window label and page origin in Rust. No plugin API is granted to the webview: the sidecar is spawned from Rust with fixed arguments, dialogs, the opener, notifications, the updater and process control are driven from Rust only, and credentials never reach the page.",
"windows": [
"main"
],
"local": true,
"permissions": [
"core:event:allow-listen",
"core:event:allow-unlisten",
"allow-app-info",
"allow-sidecar-status",
"allow-sidecar-call",
"allow-cache-get",
"allow-cache-clear",
"allow-job-cancel",
"allow-write-with-confirm",
"allow-projects-list",
"allow-project-add",
"allow-project-init",
"allow-project-remove",
"allow-project-set-accounts",
"allow-accounts-list",
"allow-account-add-play",
"allow-account-add-apple",
"allow-account-remove",
"allow-portfolio-status",
"allow-open-external",
"allow-tools-info",
"allow-tools-install",
"allow-tools-uninstall",
"allow-workspace-get",
"allow-studio-save",
"allow-studio-remove",
"allow-studio-logo",
"allow-account-update",
"allow-account-check",
"allow-store-apps-refresh",
"allow-store-apps-cached",
"allow-overrides-set",
"allow-settings-set",
"allow-cache-info",
"allow-data-reveal",
"allow-notify",
"allow-app-reset",
"allow-update-check",
"allow-update-install",
"allow-project-import-fastlane",
"allow-export-save",
"allow-price-sheet-pick",
"allow-project-reveal",
"allow-project-locate",
"allow-state-reset",
"allow-log-webview"
]
}