Commit Graph
256 Commits
Author SHA1 Message Date
phantomptrandClaude Opus 5.5 da4797bcdc Running engine jobs: stop offering this tab's own jobs as orphans with Cancel
In the browser the banner only knew the upload queue and the one-shot
upload, so a Files download or upload, a Convert or image build, a RAR
extract or a link download running in this same tab showed up as an
orphan. Every follower polls through jobStatus, so a poll now claims the
job for the tab; Files downloads and the Convert pipeline are also claimed
from their stores.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 12:38:38 -07:00
phantomptrandClaude Opus 5.5 6f8cea0ed6 Files download: a failed status read no longer ends the download in the UI
The engine keeps downloading whether or not this tab can read the job, so
one dropped poll used to leave a running job with no banner and no Cancel.
Failed reads are now counted like the upload poller does: after
MAX_POLL_FAILURES the banner says contact is lost and polling continues at
the slower pace; only an engine that no longer knows the job ends it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 12:37:48 -07:00
phantomptrandClaude Opus 5.5 d8cac94000 Running apps: never publish an empty running set on a failed read, and drop a reply for the previous console
The browser build has no app.db route, so every 5 s poll joined against
nothing and cleared every Playing badge and Close game button. Titles now
come from app.db when it answers, else from the process list, and nothing
is published when neither does. A reply for a console the user has since
switched away from is dropped instead of showing its rows with buttons that
act on the new console.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 12:36:07 -07:00
phantomptrandClaude Opus 5.5 7efd3b994a i18n: translate the 120 texts that were allowlisted as English, and empty the allowlist
Every key is now translated in all 21 languages, and a missing translation fails the gate again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 12:31:48 -07:00
phantomptrandClaude Opus 5.5 1d47c778f5 7.0.0: a new look for the whole app, and fixes that make it faster and sturdier
Not tagged or published yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 11:36:53 -07:00
phantomptrandClaude Opus 5.5 8868bf7111 i18n: drop the 15 keys the redesign left unused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 11:29:19 -07:00
phantomptrandClaude Opus 5.5 bf21821123 i18n: translate the 7.0 texts into every language
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 11:28:21 -07:00
phantomptr 0c09ce1664 Merge branch 'sdk-v044' into makeover 2026-10-10 11:26:14 -07:00
phantomptrandClaude Opus 5.5 6ed3a701fb Pollers and dates: Processes and power status use the shared poller, dates in the app's language, a first-run queue loads
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 11:24:14 -07:00
phantomptr a289ea3f0c Merge branch 'p2-files' into makeover 2026-10-10 11:20:28 -07:00
phantomptrandClaude Opus 5.5 f0409a28b0 Install link: the chosen method's dot uses the accent fill
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 11:17:44 -07:00
phantomptrandClaude Opus 5.5 da4abf91af Sense restyle: Upload, Files, Install, Convert, Disk usage, Volumes, Search, Servers, Connection
- Upload: drop zone is a soft dashed glass well with an icon orb; queue rows
  are glass rows with tinted edges for active/failed; a failed upload row says
  what happened in plain words and has its own Retry.
- Files: drive and sort chips use the shared chip style (no solid accent
  block); roomier glass file rows in the sans face; pill breadcrumb bar.
- Selectable cards (Convert compression, image format, link install method,
  Move to / Send to destinations, Upload choices) share one glass card style
  with an accent ring when chosen; compression levels use icons, not emoji.
- Disk usage treemap uses tints of the theme's palette instead of fixed blue.
- Volumes cards are glass with the shared progress bar; Connection steps no
  longer wear a green frame when done.
- Raw inputs/selects use the shared .input/.select fields; hard tone frames
  become tinted edges; buttons are pills.
- Error cards on Files, Volumes, Search, Disk usage, Servers, Local image and
  Upload preflight get a plain-language message and Retry where it applies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 11:15:46 -07:00
phantomptrandClaude Opus 5.5 8d05f60a7e PS5 Payload SDK v0.44, and scripts/update-ps5-sdk.sh to bump it
Pin v0.44 (sha256 4d06eab7...). Its crt/ and prospero-nid are identical
to v0.43, so the vendored sdk-crt (+ ps5upload.patch) and the portable
prospero-nid stay as they are; the helper, installer and elfldr build to
the same code (only the build-id differs). v0.44 adds LLVM 23 to the
candidate list, so the Makefile comment and Homebrew fallbacks move too.

scripts/update-ps5-sdk.sh (make update-sdk): finds the latest release
(or --tag), checks the zip, rewrites the pin, re-vendors prospero-nid
and crt only when upstream changed them (stops if our crt patch no
longer applies), moves the "SDK vX.Y" doc mentions and installs with
install-ps5-sdk.sh, keeping the old SDK as a backup. --check only
reports. The installer names its backups after the release they hold.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 11:14:44 -07:00
phantomptr 2777d0e6b8 Merge branch 'p2-tools' into makeover 2026-10-10 11:14:14 -07:00
phantomptrandClaude Opus 5.5 7c03d393ad Games screens: glass modals and pill controls in the remaining panels
Game files' detail/move/mount dialogs stand on the float surface (they
were translucent surface-2 over the scrim), and the notes, inputs and
small buttons in Game files, ShadowMount+, the game page copy rows and
the Collection modals move to the rounded glass/pill language.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 11:11:12 -07:00
phantomptrandClaude Opus 5.5 d1d7060005 Chips for the remaining toggles; phone fixes for Tasks, Captures, Bug report
- Bug report's chips, Hardware's fan presets, Settings' retention picker
  use the shared chip; Send payload's path field is a standard input.
- Bordered rows built in template strings get the field radius.
- Phone: Tasks history rows are glass with only running/failed edges
  coloured; missed reminders and screenshot rows wrap their actions under
  the text; Bug report's action bar sits just above the tab bar.
- Hardware metric values no longer wrap mid-number.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 11:10:28 -07:00
phantomptrandClaude Opus 5.5 64fc9d5d59 Games makeover: framed covers, chip tabs, game page hero, Home recent games
- components/GameIconFrame: the reference's white cover frame (glass rim at
  night), caption (title over a muted meta line) and tags that sit on art.
- Collection: framed cover grid, chip filters, glass stats; Ready to play:
  framed cards, chips for the play-time sort/filter, pill search, a glass
  kstuff line (soft token instead of an opacity modifier) and Now playing.
- Games: chip tabs through the shared Tabs, same ?tab= contract.
- Game page: glass hero with the framed cover, big title and fact chips;
  coral-circle section headings; pill controls in the copy rows.
- Game files: glass rows with framed thumbnails, pill search; the running
  apps panel humanises its error.
- Game Activity: shared Tabs, framed icons; Processes: glass rows.
- Home: a Recent games row from the Collection (newest first, chips per
  console that was read, Not installed), hidden when the Collection is empty.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 11:06:32 -07:00
phantomptrandClaude Opus 5.5 b41f76240a Makeover sweep across the tools screens: glass panels, pills, chips
- Hardware: every panel is a glass card with an icon disc header, metric
  rows with the hint under the value, and more room between cards.
- Notifications: unread rows are raised glass with a coral dot instead of a
  solid accent tint; the unread bar matches.
- Settings: text size and theme pickers are chips/glass pills; Backup
  presets and Profile's Crop/Fit are chips; the roster's Save/Add are pills.
- Captures: the count sits beside the description.
- Changelog/FAQ: a wrapped bullet stays one list item (was split into a
  stray paragraph).
- Sweep of my screens, components and layout: old rounded-md/lg bordered
  boxes become glass panels or radius tokens, small buttons become pills,
  single-line fields are glass pills; undefined colour tokens
  (--color-error/-danger/-surface-1) and Tailwind palette colours replaced
  with theme tokens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 11:03:21 -07:00
phantomptrandClaude Opus 5.5 fc67febd7f Link downloads: follow a duplicate, Resume/Replace a taken name; Convert shows its target
- Engine: /api/pkg/remote/download/start takes `existing: resume|replace` for a
  different file already under the download's name (resume moves it to the
  .partial, whose tail is checked against the link; replace deletes it), and
  its 409 carries the file's path and sizes. A live download of the same name
  is answered before anything is taken over.
- Client starts link downloads over the engine API (lib/linkDownload) so the
  409s keep their fields: a duplicate attaches to the running download, and
  Install Package asks Resume (when the file is shorter than the link) or
  Replace instead of the old 'Move or delete it first'.
- Convert & install shows 'Will install on {console}' while it runs; 'Show in
  folder' is hidden where no file manager can open it and says so when
  opening fails.
- Install Package says a refresh is held for the running install.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:59:27 -07:00
phantomptrandClaude Opus 5.5 b5f5e6dfc1 Shared look: chip tabs everywhere, readable status callouts, quieter focus, frosted scrims
- Callout: tinted glass with normal-colour text and a tone-coloured icon
  disc; ErrorCard/SuccessCard/WarningCard are now Callout wrappers, and
  ErrorCard humanizes engine strings and takes onRetry.
- TabbedShell (Logs, Payloads) and the package viewer use chip tabs; Tasks'
  Tasks/History/Stats switch is the shared Tabs instead of a solid accent bar.
- Focus: .input/.select keep their own focus style without the extra ring;
  the command palette's search row lights up instead of a heavy outline.
- Overlays share a frosted .scrim; Cheats' repo browser and the capture
  previews use the shared Modal; Bug report's action bar and the audit log
  header are frosted glass.
- Tasks lists missed scheduled reminders with Run now / Dismiss.
- Retry on list errors across Hardware, Health, Cheats, Saves, Profile,
  FW spoof, Backup, Remote Play; Logs' Open logs folder reports failures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:58:39 -07:00
phantomptrandClaude Opus 5.5 fc16bf47c1 Upload/Convert/Queue: survive missed polls, honest cancels and notices, one IEC size unit
- One-shot upload: a failed status poll no longer fails a transfer the engine
  is still sending. After several in a row it shows lost contact (phase stays
  running, so nothing starts a competing upload) and keeps polling the same
  job; Check again re-attaches now. A failed upload gets a Retry.
- Upload screen subscribes to the phase kind only; the live numbers re-render
  just the status card. QueuePanel and RunningEngineJobs are memoized, and the
  latter no longer re-renders on every progress tick.
- RunningEngineJobs Cancel waits for the engine and keeps the banner with the
  error when the cancel failed.
- Queue Clear says what it did: a running upload was stopped; a running
  install keeps going.
- Delete-source-after-upload failures raise a warning instead of vanishing.
- Convert & install installs on the console chosen at start (or stops with the
  package kept when that console left the roster); giving up on polling stops
  the engine job, or says it may still be running.
- Pkg library Refresh during an install is held and run when it ends.
- Sizes in Upload/Files/Install/Convert/Volumes/First run go through
  formatBytes (IEC); the bandwidth cap is labelled MiB/s like the engine.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:51:29 -07:00
phantomptrandClaude Opus 5.5 6f823594c3 Client: shared usePoll, batched engine log, schedule catch-up, capture delete, formatDate, kernel log windowing
- lib/usePoll: one poll primitive that never overlaps itself and pauses
  while the window is hidden or a transfer to that console runs; Hardware
  (power/storage, PS5 clock, SMP meta), Notifications and the kernel log use it.
- Engine log bridge appends a whole tick in one store update; the log store
  keeps an error counter so Sidebar/More stop re-filtering 500 lines.
- Schedules fire whatever came due since the last tick (15 min catch-up),
  and record later ones as missed instead of silently skipping the day.
- Screenshots / Video clips: Delete for the selection (confirm, engine
  delete like Files, thumbnail too), Retry on list errors, previews in the
  shared Modal.
- formatDate: dates follow the app language.
- Kernel log renders only the rows on screen (fixed-height windowing).
- Logs: Open logs folder shows its error. Settings and Connection load lazily;
  the vendor-react chunk matches exact package names.
- Modal reads onClose through a ref so an inline arrow doesn't re-grab focus
  on every render.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:50:55 -07:00
phantomptrandClaude Opus 5.5 a288865814 Games: lighter polling, one running-games key, stale-page guard, staged pkg install
- Ready to play: the running-games poll skips while the window is hidden
  (and catches up when shown), keeps the old map when nothing changed, looks
  backport rows up in a map, and memoises the cards.
- Running-apps store: every writer is keyed by the bare host (the panel wrote
  host:port, the rest bare host); readers go through runningOn/useRunningTitleIds.
- Game files: a row's param.json read is cached per console + path for two
  minutes, so showing the screen again does not re-read every folder.
- Game page: the view is tagged with its title id; a late reply for a game the
  page already left is dropped.
- Game page Updates/Add-ons: staged packages get an Install/Reinstall button
  that queues through the package library, asking first when the base game is
  not on the console.
- Collection: narrow store selectors (the scan counters live in their own
  line), memoised cards, and covers versioned per game instead of per scan.
- Scan/read error cards on both Games tabs get Try again and a readable reason.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:50:20 -07:00
phantomptr c238d04b45 Merge branch 'main' into makeover 2026-10-10 10:36:48 -07:00
phantomptrandClaude Opus 5.5 0c4329e662 Dark tiles: a deeper fade under the label; dyslexia font reaches the app
The dark photo tiles' status line measured 2.1-3.5:1 over the brightest
photos; the fade under the label now keeps it above 5.9:1. The dyslexia
font was set on body while #root set the app font itself, so it never
showed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:33:40 -07:00
phantomptrandClaude Opus 5.5 5f93bd74ec Makeover polish: banners, palette, colour fixes, phone Home
Banners (engine down, pairing, helper version, Android) and the update bar
float as tinted glass instead of full-width strips. The command palette
gets pill rows with a soft accent highlight. Text on the warn/good game
badges and the selected bug-report capture uses the theme's contrast colour
instead of fixed black or white. On a phone the Recent activity heading
keeps its width and the chips wrap under it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:31:13 -07:00
phantomptrandClaude Opus 5.5 154b195c5c Destructive routes: the addr check returns an Option (clippy result_large_err)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:28:01 -07:00
phantomptrandClaude Opus 5.5 d509f83de2 CSS build: keep Tailwind's nested @supports through the layer flattening
Tailwind nests the colour-mix() of every colour-with-opacity utility
(bg-[var(--color-good)]/5 and the like) in an @supports block inside the
rule, and postcss-cascade-layers drops at-rules nested that way. Only the
full-strength fallback was left. While the colour tokens sat in @theme
Tailwind had resolved those at build time (to the dark theme's colours);
on plain custom properties they painted solid. A small PostCSS step now
hoists such at-rules out beside their rule first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:26:57 -07:00
phantomptrandClaude Opus 5.5 77f5364069 Engine sizes in IEC units from one formatter
The link-copy space check said 'GB' for 10^9 bytes while the collection export and
the health checks said 'GB' for 2^30. ps5upload_core::units::iec_bytes is now the
one formatter (KiB, MiB, GiB), used by all three.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:25:02 -07:00
phantomptrandClaude Opus 5.5 abda7b524c Engine: disk I/O off async workers, quieter log tail, per-console failure dedup, addr required for destructive routes
- Artwork cache reads/writes run on the blocking pool; the cache size is tracked
  instead of walking the folder on every write; concurrent writes of one entry use
  unique temp names.
- Server-folder copies write on the blocking pool and fail on a failed sync.
- Debug/trace lines keep their own 500-line ring, so per-request and per-range
  lines no longer push warnings out of the log tail; the pkg-host per-range line is
  debug.
- Repeated-failure collapsing is keyed by route and console.
- Delete, move, unregister, process kill, power, user delete, backup restore/delete
  and cheat delete answer 400 without an addr instead of acting on the default
  console.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:23:27 -07:00
phantomptrandClaude Opus 5.5 78b3fb7fbf Home: framed photo tiles and a greeting panel
The main actions (Upload, Install, Games, Files, Saves, Convert) are framed
photo tiles: a thick white frame, a soft generated photo in the reference
palette (CSS only, distinct per tile), the label bottom-left and a white
round arrow. Beside them, a greeting panel with the orb and a time-of-day
hello carries the console status, metrics and live sensors that were in
the hero and the Console status card. Recent activity gets filter chips;
power, health, notifications and servers follow as glass cards. Nothing
that Home showed before is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:22:10 -07:00
phantomptrandClaude Opus 5.5 00234f8541 Shell: one glass canvas with pill navigation
Desktop: the app is a large rounded glass canvas floating on the
atmosphere, the sidebar inside it: the orb and wordmark on top, the console
picker as a glass pill, small uppercase section captions, and pill nav
items (the active one a white pill with a coral icon). The content's top
bar holds Back/Forward and the console tabs as pills, and on the right a
search pill that opens the command palette plus white round buttons for
notifications and the theme. The status line sits quietly under the canvas.

Phones: the tab bar is a floating glass pill and More is restyled to match.

Every function, test id, aria label and shortcut is kept; notifications
moved from the sidebar footer to the top bar (the inbox gained an opening
direction and a round-button variant).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:22:10 -07:00
phantomptrandClaude Opus 5.5 39e4e19458 Design system: the Sense look (atmosphere, glass, Poppins, pills)
New light and dark token sets: every surface is translucent glass over a
fixed atmospheric wash (peach, rose and lavender by day; aubergine and
indigo with ember and violet glows by night), with bright white edges,
large radii, warm shadows and one coral accent. Body text keeps >= 4.5:1
on the glass in both modes (numbers in index.css).

The colour tokens moved out of Tailwind's @theme onto :root: Tailwind
inlined @theme values into arbitrary color-mix() classes at build time,
which is what painted dark bands into the light theme.

High contrast makes the glass opaque and drops the blur; Reduced motion and
prefers-reduced-transparency drop the blur too.

Poppins 400-700 is bundled (@fontsource/poppins), with the system stack
behind it so scripts it lacks fall back per glyph.

Primitives follow: pill buttons (coral primary with a glow, white glass
secondary), glass cards and fields, chip-row tabs and segmented controls,
coral toggle, tinted-edge callouts, coral-to-pink progress, glass modals,
drawers, menus and toasts, rows-on-glass tables, a big bold page title, and
the Orb brand mark (also in empty states).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:22:01 -07:00
phantomptrandClaude Opus 5.5 99e7db4a56 Theme: two modes, light and dark
OLED and Rose are gone. A stored or mirrored "oled" reads as dark and
"rose" as light (normalizeTheme), and the stored key is rewritten once so
it only ever holds one of the two. The theme toggle flips between them and
the Settings picker shows two options.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:22:01 -07:00
phantomptrandClaude Opus 5.5 f3cc4175d9 Collection console read: list update/DLC folders once, keep details a failed read missed
Each title cost about nine console calls (two listings per drive plus an
unfiltered appinfo query). The drives' user/patch and user/addcont folders are now
listed once per read and shared; a title's DLC folder is listed only when it has
one; appinfo asks for APP_VER and CONTENT_VERSION only. A listing or version query
that fails (not one that is absent) marks the detail unread, and the snapshot keeps
what the last read found instead of recording 'no update, no DLC'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:18:37 -07:00
phantomptrandClaude Opus 5.5 7f62056adf Link downloads write <name>.partial, resume, and refuse a duplicate
A killed download left a short file under the real name, so every retry got 409
'Move or delete it first', and two downloads of one link wrote one file. Bytes now
land in <name>.partial and are renamed when complete; a retry resumes from the
partial after re-checking its tail against the origin (a mismatch starts over); a
file already complete is reported done; a second live download of the same file is
refused with the first one's id.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:15:53 -07:00
phantomptrandClaude Opus 5.5 e204b9805f Install slot: released on a panic, poison-safe locks, pruned maps, IPv6 key
A panic in an install task left its console 'busy' until the engine restarted, and
a poisoned lock broke installs on every console. The task now holds a guard that
fails the job and frees the slot; every JobStore lock recovers from poisoning;
finish forgets the stop request and keeps the newest 200 finished statuses. The
per-console key uses the shared host normalisation, so IPv6 addresses no longer
collapse to a prefix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:14:09 -07:00
phantomptrandClaude Opus 5.5 9840b00180 FPKG build, compress, exFAT build and unpack jobs fail instead of hanging on a panic
Each job's blocking work now holds the drop guard transfers use (a panic marks the
job failed) plus guards that stop its ticker and free the build's partial file or
the unpack's folder and active-set entry. The tickers skip building events nobody
listens to.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:12:01 -07:00
phantomptrandClaude Opus 5.5 7ccd963956 Job snapshots carry a file count; the file list moves to GET /api/jobs/{id}/files
The 500 ms poll, the 5 s job list and every 200 ms progress event carried the
whole planned file list (megabytes on a big folder), cloned under the jobs lock
each time. The snapshot now has files_count; the client reads the list once per
job. Events are not built when nobody subscribes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 10:09:55 -07:00
phantomptrandClaude Opus 5.5 ac6c704da9 Servers list: an unexpected engine reply shows no servers instead of breaking Home
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 09:57:26 -07:00
phantomptrandClaude Opus 5.5 3ad3063790 i18n: translate the AMPR LZ4 option
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 09:55:13 -07:00
phantomptr 380184e104 Merge branch 'worktree-agent-a1e55c07f9a697874' 2026-10-10 09:50:37 -07:00
phantomptrandClaude Opus 5.5 7f724d3399 6.8.2: every screen gone through, dead code removed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
v6.8.2
2026-10-10 09:50:01 -07:00
phantomptrandClaude Opus 5.5 d42f60b936 i18n: translate the clean-up's new texts into every language
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 09:37:32 -07:00
phantomptrandClaude Opus 5.5 92ccc4d559 Engine: drop routes the app no longer calls
clear-slot, users/list, remoteplay/devices, tmdb/fetch, bps inspect/apply, pkg install cancel,
appinfo/set, time/state get/set, pkg/parse and the fan-curve routes lost their last caller with
today's client clean-up; their handlers, types and the core code only they used go too, as does
the search-index module only tests used.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 09:34:10 -07:00
phantomptrandClaude Opus 5.5 15e0889ada i18n: drop 415 keys nothing uses any more, from every language
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 06:54:21 -07:00
phantomptrandClaude Opus 5.5 b05d12da95 fpkg: builder fixes from the review
- DLC content class: a DLC's param.json names neither applicationCategoryType
  nor applicationDrmType (all seven DLC packages read, four publishers), and
  its container is 0x21 / 0x0a020000. content_class gave it the game pair.
- The flat layout refuses a u2c delta past a byte instead of clamping it at
  255, which sent the console's read to the wrong record (the block layout
  already refused). Two scale tests built such trees with the flat writer;
  they now use larger files, or the block layout.
- A build's .partial is removed on every way out but success: an I/O error in
  the in-memory writer, a failed rename, a panic. A separate Kraken spool is
  removed the same way, and its name carries the process and a count, so two
  builds of one content id into different folders no longer share (and
  truncate) one spool.
- The in-memory writer has the flat layout only; a block-layout request (the
  default) goes to the streaming writer instead of being written flat.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 06:52:47 -07:00
phantomptrandClaude Opus 5.5 f7c578ebcc Client: delete superseded helpers and exports only their tests used
The engine's unified install now owns DPI bring-up and the unreachable-
stream diagnosis (REASON_GUIDANCE plus the engine's hint), so
lib/dpiUnavailable.ts, streamUnreachableMessage/originOf and the
engine-blind hint were no longer reachable. redactDiagnosticText is
replaced by lib/redaction.ts, effectiveMount is inlined where the
Library reads mounts, and the per-console queue reorders within its
group. Also drops test-only exports (loaderAddr, portOf, rarFolderName,
resolveCheatName, fetchJobSummaries, firmwareMajor, recentProblems,
fwToSdkHex/PS5_FIRMWARES, normalizeTitleId, onTaskStatusChange) and
store members only tests read. useStaleHostGuard now reuses
captureHostProbe instead of duplicating it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 06:48:06 -07:00
phantomptrandClaude Opus 5.5 69c51489e2 Client: declare postcss as a dev dependency
cssLayers.test.ts imports it directly; it was only installed as a
transitive dependency. Same version as already locked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 06:48:06 -07:00
phantomptrandClaude Opus 5.5 57ddd70b20 Game page: link another console's queue to /tasks directly
/activity now redirects to /tasks, so the link took a redirect hop and
the e2e check for the /activity URL raced it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-10 06:48:05 -07:00