Commit Graph

13 Commits

Author SHA1 Message Date
Innei 4c94aee97b ✨ feat(acceptance): pin the list rail on wide screens and add shift/cmd multi-select (#19559)
* 🐛 fix(desktop): ignore stale dist bundles when orchestrating dev startup

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

* ✨ feat(acceptance): pin the list rail on wide screens and add shift/cmd multi-select

Claude-Session: https://claude.ai/code/session_01E7e9mKLWsnGPgvgB42oM3V
2026-09-14 15:08:18 +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 8933f37316 ✨ feat(desktop): surface server 401 reason and add auth log analyzer (#19240)
- server: emit X-Auth-Failure (jwt_expired / jwt_signature / user_inactive / no_token ...) next to X-Auth-Required on session UNAUTHORIZED responses
- desktop: log every 401/403 through the backend proxy at info level with hadToken, authRequired, authFailure and locally decoded JWT claims (sub / exp / expiredBy)
- desktop: add scripts/analyzeAuthLog.mjs (bun run log:auth) that turns a user's main.log into verdict codes with next steps

Claude-Session: https://claude.ai/code/session_01XjdtgxABquDMKeLZxu8q64
2026-09-08 00:15:18 +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 3f039d795b ♻️ refactor(desktop): migrate renderer OTA to V2 packs (#18745)
* ♻️ refactor(desktop): migrate renderer OTA to V2 packs

* ⚡️ perf(desktop): decode renderer packs asynchronously
2026-08-27 17:50:49 +08:00
Innei 0643d3b39f ♻️ refactor(desktop): scope renderer OTA by release version (#18724) 2026-08-26 23:21:57 +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
Innei e7801149bc ✨ feat(desktop): add terminal font settings (#17455) 2026-07-23 00:03:07 +08:00
Innei e55eb44823 🐛 fix(desktop): restore dev & automation pipeline after electron-vite removal (#17238) 2026-07-16 17:45:47 +08:00