Add markdown mirror generation for DB graphs, including page and journal paths, regeneration, debounced write handling, and settings UI.
Serialize page and block property values into mirrored Markdown by resolving property-value entities to their display content.
Persist mirror files through the node worker platform and make browser worker mirror storage fail fast as unsupported.
Fix Electron userAppCfgs writes to avoid returning unserializable Electron state over IPC.
Add ADR and targeted tests for mirror generation, worker wiring, platform storage, and graph path handling.
Summary:
- Clear pending inflight tx ids when a db-sync websocket closes or is detected stale closed.
- Cover websocket close and stale-loop cleanup so reconnect can flush pending local txs again.
Tests:
- bb dev:test -v frontend.worker.sync.restart-test/ws-close-clears-inflight-before-reconnect-test
- bb dev:test -v frontend.worker.sync.restart-test/stale-loop-marks-non-open-ws-closed-test
- bb dev:test -v frontend.worker.sync.restart-test
When viewing a page in zoom/focus mode, pressing Shift+Tab could outdent
blocks past the zoom root boundary, causing them to disappear from the
focused view. This adds a guard in both single-block (indent-outdent) and
multi-block (on-tab) code paths to check for the zoom boundary.
Fixes#12582
* enhance(db-sync): add usage stats script
* fix(db-sync): use --local for local D1 scripts
* fix(db-sync): record activity only on successful sync requests
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
The npm `open` package (v8.4.2) is CommonJS with `module.exports = open;`
and no `.default` property, so importing it as `["open" :default open-external]`
left `open-external` undefined. Every custom-scheme click (freetube://, tg://,
etc.) reached `open-default-app!`, showed the confirmation dialog, and then
threw `TypeError: ...default is not a function` from inside (default-open url),
which Electron logged as an uncaughtException with no user-visible feedback.
Switch to `:as open-external` so the symbol binds to module.exports itself
(the open function). The neighboring node-fetch import is left as `:default`
because node-fetch v2.7.0 explicitly sets `exports.default = exports` for
ESM-interop, so it actually has a default export.
Regression from d6403b7746 (#12460), which replaced the prior working
`(defonce open (js/require "open"))` with the shadow-cljs ESM-style import.