fix(desktop): unbreak the renderer build (22 tsc errors) + active-glow sidebar rows#127
Merged
Merged
Conversation
… active-glow + idle timestamps The sidebar consolidation (#123 area) landed components importing stores that never landed: @/store/cron, layout drag-order/cron-open/overlay atoms, session yolo-default + presence exports, and the en/zh handoffOrigin i18n key. tsc -b failed with 22 errors, so dist/ could not be rebuilt and the packaged app kept serving the pre-consolidation sidebar (line-2 source labels + device group headers) — the UI regressions were stale-build artifacts, not source state. - store/layout.ts: restore , persisted session / workspace drag-order atoms, (+setters; same storage keys as the original drag-order commit so existing prefs survive) - store/session.ts: restore DEFAULT_DESKTOP_YOLO_ACTIVE, , setDesktopYoloDefaultActive, /setSessionPresence - store/cron.ts (new): + refreshCronJobs() projection for the sidebar section; refreshed on gateway-open in desktop-controller - chat/sidebar/cron-jobs-section.tsx (new): collapsible Cron jobs section (clock row, hover play=trigger now, gear=manage) reusing t.cron strings - desktop-controller: drop unused onArchiveAllSessions, wire onManageCronJob/onTriggerCronJob, refresh cron jobs on gateway open - virtual-session-list: drop the dead showSourceBadge/showDeviceBadge plumbing (rows are single-line by design now) - session-row: active sessions pulse an orange dot and hide the relative timestamp; idle rows keep the static grey dot + age (5m/2h/1d) - i18n: add missing sidebar.row.handoffOrigin to en + zh Verification: tsc -b --force 22 errors -> 0; vitest src suite green (456 tests, 9 remaining failures are node:test .cjs files that pass under npm run test:desktop:platforms: 85 pass / 0 fail); npm run build succeeds. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
🔎 Lint report:
|
This was referenced Jun 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The desktop app could not be rebuilt:
tsc -bfailed with 22 errors because the sidebar consolidation landed components importing stores that never landed (@/store/cron, layout drag-order/cron-open/overlay atoms, session yolo-default + presence exports, en/zhhandoffOrigin). Sincenpm run buildgates on tsc,dist/was frozen at a pre-consolidation bundle — the packaged app still showed line-2 source labels ("Terminal") and per-device group headers, which the operator flagged as UI bugs. They were stale-build artifacts. This PR makes the app buildable again and applies the requested row design: flat single-line rows, relative timestamp on idle rows, pulsing orange dot (timestamp hidden) on active rows.What changed
store/layout.ts: restore$sidebarOverlayMounted, persisted session/workspace drag-order atoms,$sidebarCronOpen+ setters, using the original storage keys (hermes.desktop.sessionOrderetc.) so existing prefs survive.store/session.ts: restoreDEFAULT_DESKTOP_YOLO_ACTIVE/$desktopYoloDefault/setDesktopYoloDefaultActive(yolo-default-on feature) and$sessionPresence/setSessionPresence.store/cron.ts(new):$cronJobs+refreshCronJobs()sidebar projection; refreshed on gateway-open.chat/sidebar/cron-jobs-section.tsx(new): collapsible Cron jobs section (hover actions: play = trigger now, gear = manage) reusing existingt.cronstrings — no new i18n keys.desktop-controller.tsx: drop extraneousonArchiveAllSessions, wireonManageCronJob/onTriggerCronJob, refresh cron jobs on gateway open.virtual-session-list.tsx: remove deadshowSourceBadge/showDeviceBadgeplumbing (rows are single-line by design).session-row.tsx: active rows pulse an orange dot and hide the relative timestamp; idle rows keep the static grey dot + age.i18n/en.ts,i18n/zh.ts: add missingsidebar.row.handoffOrigin(ja/zh-hant already had it).How to review
store/layout.ts/store/session.tsagainst the originals (3fc67b733,db0661401) — they are restorations, not new designs.store/cron.ts+cron-jobs-section.tsxare the only new surface; check the section renders nothing when$cronJobsis empty.session-row.tsxfor the active-state UX change.npx tsc -b --force(0 errors) andnpm run buildinapps/desktop.Evidence
tsc -b --force: 22 errors on main → 0 on this branch.npm run build(previously impossible): succeeds, freshdist/bundle.vitestsrc suite: 447 passed, 0 src failures (the 9 remaining failed files are node:test.cjssuites that vitest cannot host; under their own runnernpm run test:desktop:platforms: 85 pass / 0 fail — pre-existing harness split).yolo-session.test.tspasses again with the restored exports.Verification
npx tsc -b --forceclean;npx vitest run --environment jsdom447 passed;npm run test:desktop:platforms85/0;npm run buildgreen.npm run dist:mac) — operator's running app picks the rebuilt bundle on next restart; low risk since renderer-only changes.Risks / gaps
$sidebarOverlayMountedcurrently has no writer (the hover-peek feature that sets it never landed) — defaults false so behavior matches today; low risk.onManageCronJobnavigates to the cron page without deep-linking the specific job — accepted scope, the cron page lists all jobs.cron.listRPC succeeds once — no work item needed, hidden-by-default is the intended empty state.Collaborators