Commit Graph

8 Commits

Author SHA1 Message Date
Innei bf938ff524 🐛 fix(desktop): skip the main hash in Vite development mode (#19486)
resolveMainHash walked the full source graph on every dev config load and
failed whenever root node_modules drifted from the Desktop lockfile. The
runtime already disables renderer OTA when MAIN_HASH is empty, so dev builds
now resolve to an empty hash unless MAIN_HASH is set explicitly.

Claude-Session: https://claude.ai/code/session_01DjXmqHj7t17UfwNuXMjfn3
2026-09-12 18:58:53 +08:00
Innei 92c2452d53 🐛 fix(desktop): canonicalize main hash graph paths (#19484) 2026-09-12 18:41:40 +08:00
Innei 6b85e332f1 🐛 fix(desktop): pin bundled npm deps through the Desktop lockfile (#19462)
* 🐛 fix(desktop): pin bundled npm deps through the Desktop lockfile

The main hash accepted any npm module that happened to resolve inside apps/desktop/node_modules, so a module linked from outside the frozen install (or from a stale store entry) could enter the renderer OTA hash without the lockfile ever pinning it.

Resolve each bundled module to its package name@version and require apps/desktop/pnpm-lock.yaml to pin it, keeping the file:/link:/git/tarball escape hatch for specifiers that pin by resolution instead of version.

partial-json is imported by packages/utils and packages/context-engine but was never declared, so the Desktop lockfile could not pin it: declare it in both packages and record it in apps/desktop/pnpm-lock.yaml.

* 🔊 chore(desktop): name the changed bundles before a dev restart

The dev orchestrator logged only that a main/preload bundle changed, which cannot distinguish the debounced restart from an unrelated vite rebuild. Collect every file reported by the watcher during the debounce window and print it with its event type, size and mtime.

* 📝 docs(acceptance): publish the round from the session's own observations

A delivery verified on the real product earlier in the session still had to re-run the plan and checker stage to obtain a published round. Document that those observations and artifacts are the evidence: write plan[] and cases[] from them, disclose anything never captured, and ingest.
2026-09-12 12:35:36 +08:00
Innei bb97d05277 🐛 fix(desktop): stabilize renderer OTA compatibility and full-release state (#19410)
* 🐛 fix(desktop): stabilize renderer OTA compatibility and full-release state

* fix: allow sentry cli install build
2026-09-11 23:39:47 +08:00
Innei 9357042766 🐛 fix(desktop): derive renderer OTA compatibility from source inputs (#19351)
* 🐛 fix(desktop): derive renderer OTA compatibility from source inputs

* 🐛 fix(desktop): set up Node before validating S3 releases

* 🐛 fix(desktop): report OTA decisions and preserve diagnostics
2026-09-09 23:52:33 +08:00
Innei 82acc9f2d7 🐛 fix(desktop): hash renderer OTA main bundles (#18799)
* 🐛 fix(desktop): hash renderer OTA main bundles

* 🐛 fix(desktop): hash externalized runtime modules in mainHash

Externalized main-process modules (electron-log, font-list, native addons
and their dependency trees) never reach the emitted bundles, so a renderer
OTA patch could be gated against an installed binary whose external runtime
module had changed.

Each platform now contributes an `externals` digest: name@version for
registry packages, plus full source content for workspace packages whose
version never bumps.

Claude-Session: https://claude.ai/code/session_01HNtnp2V5PrHc6tgrjwLRwN

* ♻️ refactor(desktop): unify update notification info

* test: avoid building main hash bundles in unit test
2026-08-30 21:38:00 +08:00
Innei 2fd9cfb970 ✨ feat(desktop): gzip renderer OTA CAS and keep r0 plus last-2 deltas (#18694)
* ✨ feat(desktop): gzip renderer OTA CAS and keep r0 plus last-2 deltas

Tree-diff with zstd --patch-from instead of re-downloading the full renderer,
gzip the original CAS objects, and generate deltas from the packaged r0 tree
plus the two most recent patch versions.

* ♻️ refactor(desktop): simplify renderer OTA lineage

* 🐛 fix(ci): publish renderer base after r0
2026-08-26 15:26:11 +08:00
Innei 19f910750c ✨ feat(desktop): renderer OTA hot update without app restart (#18648)
* ✨ feat(desktop): renderer OTA hot update without app restart

* 🐛 fix(desktop): address renderer OTA review findings

- compute mainHash only from committed files and include src/common
- inject UPDATE_SERVER_URL into beta builds so OTA is enabled
- validate all MPA entry htmls at staging, not just index.html
- use async fs for renderer tree hashing/staging off the main event loop

* ♻️ refactor(desktop): validate renderer OTA manifest with zod + zod-compiler

* 🐛 fix(desktop): pin renderer OTA build lineage

* 🐛 fix(desktop): isolate renderer OTA lineages
2026-08-24 23:39:03 +08:00