Commit Graph
367 Commits
Author SHA1 Message Date
phantomptrandClaude Opus 5.5 79a14d5731 console page: Files
Drives -> folders (folders first, natural name order, sizes, free space),
paged 256 at a time through /api/fs/list's next offset; "Show more" loads
the next page when the D-pad reaches it. The actions sheet (triangle or the
on-screen "..."): View, Copy to..., Move to..., Rename, New folder, Info,
Delete (confirm names the item and the count). Select (square or the
toggle) applies Copy/Move/Delete to several items, sent one request at a
time; Copy/Move/Delete are off while a batch is being started. Moves rename
on the same drive and fall back to a move copy job on 409 cross_mount; copy
and move send each item's full destination path, as JOB_COPY and the
engine use it. Viewer for png/jpg (blob URL, revoked on close) and
txt/log/json/ini/xml (first 1 MiB as text nodes, D-pad steps through it).
Circle goes up one folder or closes the open modal.

ConfirmDialog (and every new modal) restores focus to the row now at the
opener's place when the opener is gone; Files also refocuses that place
when a refresh removes the focused row. App's circle handler is now a
nav fallback so a section's own circle runs first. Home's Browse USB
appears, since Files opens at ctx.params.path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-17 06:16:58 -07:00
phantomptrandClaude Opus 5.5 f91e0f9b67 console page: Home
Running game with Close, one storage card per drive, every job with its
owner (this console / a PC) and Cancel, quick actions Browse USB (hidden
until Files opens at a path), Rest mode and Restart. Every destructive
action goes through the shared ConfirmDialog (nav modal, focus on the safe
choice, ○ closes). useJobs polls /api/jobs every 1 s while a job runs,
every 5 s otherwise, stops on unmount and on 401. Sections get a context
(status, refreshStatus, openSection with params). Strings in 21 locales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-17 05:49:08 -07:00
phantomptrandClaude Opus 5.5 8f7233827f console page: modal-scoped navigation, anti-framing headers, D-pad echo guard
- nav.ts: while a [data-nav-modal] is open only handlers scoped inside it
  run (onNavAction's new scope getter), so the reload banner (and later
  dialogs) keep ○/L1/R1 from moving focus to the page behind; confirm
  with focus outside the modal brings focus in instead of clicking.
- R12: an Arrow keydown within 100 ms after the gamepad fired the same
  direction is dropped as the browser's echo.
- GET / adds frame-ancestors 'none' and X-Frame-Options: DENY.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-17 05:29:45 -07:00
phantomptrandClaude Opus 5.5 99dda9acb8 console page: build, shell, controller navigation
The page the helper serves on the PS5 itself: client/src/console/ built by
vite.console.config.ts into one self-contained dist-console/index.html
(script and styles inlined, safari13, 253 KiB raw / 84.5 KiB gzip; the
build fails over 450 KiB raw or 150 KiB gzip). payload/Makefile gzips it
into build/webui_page.c and the helper serves it at GET /, with
GET /api/token for the per-start token.

- Shell: top bar (logo, console chip from /api/status), rail of the
  implemented sections (Home, Files, Settings placeholders), hint bar
  showing only verified bindings, reload banner on a 401.
- nav.ts: spatial focus (aligned neighbours first), the R11 default input
  table (keyboard + Gamepad "standard", all unverified), D-pad repeat.
- api.ts: token fetched once, X-PS5U-Token on every POST, 401 → expired.
- strings.ts: cw_* keys from all 21 locales via build-console-strings.mjs
  (vm-eval like the i18n gate), English fallback.
- CI: client npm ci before every make payload.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-17 05:23:26 -07:00
phantomptr e7f200db70 Release v7.0.34 2026-10-17 00:56:04 -07:00
phantomptr 68b56f12ab Release v7.0.33 2026-10-16 21:50:44 -07:00
phantomptrandClaude Opus 5.5 374d094678 PS5 updates install without their base; exact bytes count as installed; About links the website
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-16 21:50:41 -07:00
phantomptr 99523745b4 Release v7.0.32 2026-10-16 18:48:46 -07:00
phantomptrandClaude Opus 5.5 638a1cec15 Find rest mode over every network; offer Wake when not awake
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-16 18:48:33 -07:00
phantomptr c16e5ab264 Release v7.0.31 2026-10-16 15:17:10 -07:00
phantomptrandClaude Opus 5.5 538fb60df8 Home tiles say rest mode; CHANGELOG 7.0.31
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-16 14:55:54 -07:00
phantomptr f81909bca1 Merge branch 'worktree-agent-af3ef2a6d0e919531' into rel-7031 2026-10-16 14:49:27 -07:00
phantomptrandClaude Opus 5.5 4ee9e08c09 Client: tell rest mode apart from off or broken
Per the 2026-10-16 rest-mode detection spec (client side). The engine's
status verdict (power: awake/rest/unreachable, reason console_rest_mode)
is read defensively, so this builds alone and lights up once the engine
side lands.

- HostRuntime.power, set by the status poller; rest flips the console down
  at once (no miss debounce) and is logged on the edge.
- Status bar, console tabs, Home badge/metric, game page console rows:
  "In rest mode" in the calm accent, "Not answering" for unreachable.
- ConnectionGate: rest-mode notice with Wake / Wake & sign in from that
  console's own profile (shared useConsoleWake), and a not-answering notice
  naming Settings > System > Power Saving > Features Available in Rest Mode.
- Connection Check: a closed :9021 on a console DDP says is asleep reads
  "Your PS5 is in rest mode. Wake it, then check again", no VPN hints.
- PowerControl reads the shown console's credentials and seeds its power
  state from the poller.
- Auto-redeploy holds while the console rests (no TCP probes); keep-awake
  skips resting consoles.
- Upload queue parks an upload that meets rest mode as "Waiting for the
  PS5 to wake" (pending, no spent recovery attempt) and resumes it on the
  helper-up edge, desktop and browser; Files uploads stop instead of
  retrying into a sleeping console and resume the same way.
- 16 new strings (joberr.console_rest_mode among them) in all 21 locales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-16 14:48:51 -07:00
phantomptrandClaude Opus 5.5 3916d73051 Engine: tell rest mode apart from off or broken
When the helper's port and the loader both refuse, or the session connect
gets no TCP answer, require_in asks DDP (2 SRCH within ~800 ms). A 620
reply is the new token console_rest_mode ("The PS5 is in rest mode. Wake
it, and the helper can be sent again."). No reply after a timeout stays
ava1_unreachable with a plainer message. DDP 200 or silence after a
refusal keeps helper_not_ava1 as before. A verdict DDP explained is
cached with the pool refusal for 12 s (PROBED_REFUSAL_TTL, past the
client's 10 s poll); other refusals keep their 5 s / 30 s TTLs. The probe
is injectable (Pool::with_power_probe) and skips loopback hosts.

GET /api/ps5/status failures answer {error, reason, power}. Upload,
download and relay stalls on a console DDP calls asleep fail with
console_rest_mode instead of the bare "no durable progress".

payload_check (Tauri and the browser twin) passes reason and power
through; payloadCheck returns them as optional fields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-16 14:44:42 -07:00
phantomptr 8a79431093 Release v7.0.30 2026-10-16 13:19:29 -07:00
phantomptrandClaude Opus 5.5 2ade96f096 CHANGELOG: 7.0.30; Connection names the right Settings section for reconnect
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-16 12:46:22 -07:00
phantomptr 70193bb46e Merge branch 'worktree-agent-a10551a6718792ae5' into rel-7030
# Conflicts:
#	client/src/i18n/locales/ar.ts
#	client/src/i18n/locales/bn.ts
#	client/src/i18n/locales/de.ts
#	client/src/i18n/locales/en.ts
#	client/src/i18n/locales/es.ts
#	client/src/i18n/locales/fa.ts
#	client/src/i18n/locales/fr.ts
#	client/src/i18n/locales/hi.ts
#	client/src/i18n/locales/hu.ts
#	client/src/i18n/locales/id.ts
#	client/src/i18n/locales/it.ts
#	client/src/i18n/locales/ja.ts
#	client/src/i18n/locales/ko.ts
#	client/src/i18n/locales/pl.ts
#	client/src/i18n/locales/pt-BR.ts
#	client/src/i18n/locales/ru.ts
#	client/src/i18n/locales/th.ts
#	client/src/i18n/locales/tr.ts
#	client/src/i18n/locales/vi.ts
#	client/src/i18n/locales/zh-CN.ts
#	client/src/i18n/locales/zh-TW.ts
2026-10-16 12:34:57 -07:00
phantomptrandClaude Opus 5.5 47bb893488 Stop helper: turn the console's helper off and keep it off (#471)
Engine: POST /api/ps5/helper/stop { addr } sends node.shutdown over the
paired AVA1 session (payload_lifecycle::shutdown_running_payload) and waits
for the helper's port to go quiet before answering {state: "stopped"};
{state: "not_running"} when nothing answered. Refused with 409
{reason: "busy"} while this engine runs a transfer, download, relay,
console file operation or install against that console (a per-console busy
count held by each job, plus the install slot); 502 {reason: "refused" |
"still_running"} otherwise.

Client: "Stop helper" beside Send/Resend on the Connection screen, behind a
confirm. A stop marks the console "stopped by you" (persisted in
localStorage, so desktop and browser builds keep it across restarts). The
reconnect loop, a queue's mid-run recovery and unattended queue runs (wake
resume, re-attach after restart) leave a marked console alone. Send helper,
Check, the setup wizard, Quick bring-up and starting an upload clear the
mark, as does a helper seen answering a minute after the stop. Connection
and the screen gate show "Stopped" rather than a missing helper. Strings in
all 21 locales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-16 12:34:18 -07:00
phantomptrandClaude Opus 5.5 051eb0ac89 Files: a compact phone layout (#470)
Below the sm breakpoint a Files row is checkbox, icon, name (ellipsized,
full name in title), size and one ⋮ that opens the row's actions in the
desktop order with the same labels and icons, Delete last in red. The
desktop buttons and the menu come from one list (buildRowActions), so
both run the same handlers. The menu is the row's existing right-click
menu: portaled, keyboard-navigable, closed by outside tap and Escape,
placed against the ⋮ and flipped above it near the bottom of the screen.

The selection bar keeps "N selected" on one line and scrolls its actions
sideways on a phone; the Recent list sits on the opaque floating-menu
surface above the rows at every width (it was the 4% page tint, so the
rows read through it). Toolbar, drive chips, path bar, sort chips and
rows are denser at phone width; Add folder / New folder / Refresh show
their icon alone there. The desktop layout is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-16 12:32:11 -07:00
phantomptr 67f2201a89 Release v7.0.29 2026-10-16 11:26:59 -07:00
phantomptrandClaude Opus 5.5 9fc954e5e5 Convert: make a game folder from an image or debug package (#469)
Engine: POST /api/folder/build unpacks a game image (or, once the pkg
reader lands, a debug-key .pkg) into <out>/<name>. It runs as a job with
Write and Verify stages; every path is checked before anything is written
(.., absolute, empty components, names this OS cannot hold, file/folder
clashes, case clashes on a case-insensitive drive); data streams in 8 MiB
chunks with cancel per chunk; the folder is written as <name>.partial/
(marked so the output-folder sweep can tell it from a user's own) and
renamed only after the read-back: every size and empty folder, and the
SHA-256 of a seeded sample (or every file) re-read from a freshly opened
source. An existing target, a plain folder source and a shortfall of
free space (files + 64 MiB) are refused before the job starts.

Client: a third "What to make" tile, A game folder. A folder source
disables Make with "This is already a folder"; .pkg is accepted as a
source; then is keep only; the finished card shows the folder and Show in
folder. The queue, prefs, pipeline and stage list know the folder kind.
Strings in all 21 locales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-16 10:58:12 -07:00
phantomptr d040883261 Release v7.0.28 2026-10-16 08:27:37 -07:00
phantomptr 72da996e8b Merge branch 'worktree-agent-a461a6c996d73ec3c' into release-prep
# Conflicts:
#	client/src/i18n/locales/ar.ts
#	client/src/i18n/locales/bn.ts
#	client/src/i18n/locales/de.ts
#	client/src/i18n/locales/en.ts
#	client/src/i18n/locales/es.ts
#	client/src/i18n/locales/fa.ts
#	client/src/i18n/locales/fr.ts
#	client/src/i18n/locales/hi.ts
#	client/src/i18n/locales/hu.ts
#	client/src/i18n/locales/id.ts
#	client/src/i18n/locales/it.ts
#	client/src/i18n/locales/ja.ts
#	client/src/i18n/locales/ko.ts
#	client/src/i18n/locales/pl.ts
#	client/src/i18n/locales/pt-BR.ts
#	client/src/i18n/locales/ru.ts
#	client/src/i18n/locales/th.ts
#	client/src/i18n/locales/tr.ts
#	client/src/i18n/locales/vi.ts
#	client/src/i18n/locales/zh-CN.ts
#	client/src/i18n/locales/zh-TW.ts
2026-10-16 07:47:51 -07:00
phantomptr 140bd26f0f Merge branch 'worktree-agent-a271b63e8e1248a07' into release-prep 2026-10-16 07:47:27 -07:00
phantomptrandClaude Opus 5.5 1af1a1afa9 Console to console: take over from another device, Test connection (#444)
Pausing a routed send now ends both consoles' halves, so its journal is free
to resume from any device with any helper. The driving engine keeps a shared
record of each send on the receiving console (/data/ps5upload/c2c/<tx>.json)
with a 45 s lease refreshed every 15 s; another device lists those sends
(GET /api/transfer/ps5-to-ps5/remote), takes one over or watches a direct one
(POST /api/transfer/ps5-to-ps5 with adopt: take | watch, same tx_id), and the
engine that had it stops driving without ending anything ("taken over by").

Helper: a new caps bit, CAP_SHARED_JOBS (4). job.status / job.cancel answer
any paired device for uploads and downloads (operations and local copies stay
owner-only), and a JobOpen moves a parked upload of another device to the
opener; an attached one is still refused. SPEC §18.5-18.6.

Test connection in Send to another console runs the console's net.reach probe
from the sending console to the dial target (plus the relay legs, and an
optional real 4 KiB direct send). Tasks shows "Sends from other devices" with
Watch / Take over / Resume here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 07:46:28 -07:00
phantomptrandClaude Opus 5.5 d1e938749c Background watcher: renderer mirrors until the engine answers /api/activity; gate fixes (#457)
native_job_notify turns true only after a successful /api/activity poll, so a
remote engine on an older version leaves job notifications with the page. The
BgStrings parity test reads the Rust file through Vite (no node types in the
client tsconfig); a clippy fix in the tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 07:16:16 -07:00
phantomptrandClaude Opus 5.5 e90dd6e4b4 Decompress a .ffpfsc on the console, decoded by the kernel (#453)
Files gets "Decompress to .exfat…" on a .ffpfsc again. The first build (pulled
before 7.0.23) inflated the blocks in the helper with vendored zlib, and the helper
died with SIGBUS within minutes of loading it; once the console froze. This one has
no decoder: the helper mounts the container read-only the way ShadowMount+ mounts a
.ffpfsc (LVD image type 9, read-only single-save flags, 4096-byte sectors, pfs with
mkeymode=AC), so the kernel decodes it, and copies the file inside to <name>.part,
then renames it in the same folder. The kernel lists that file rounded up to whole
64 KiB blocks; only the inode's real length is copied.

The checks from the first build stay: the container's block table is read before the
kernel sees it, a destination that exists and a drive without room for the image plus
1 GiB are refused, the size and exFAT boot sector are checked before the rename, and
Stop removes the .part and the mount. One unpack runs at a time. The mount is not in
the mount table the helper sees, so it is recorded on the /mnt tmpfs (owner pid, LVD
unit, .part) and a helper that starts after one died mid-copy releases it; a record of
a live instance is left alone.

Measured on the FW 13.60 Phat: a 315 MB image (127 MB container) in 3.5 s and a 4.5 GB
one (3.0 GB container) in 65 s, both byte-identical to the source; Stop, a takeover
mid-copy and a stale record all left no mount, LVD unit or .part behind.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 07:09:42 -07:00
phantomptrandClaude Opus 5.5 f436661bf9 Renderer: name jobs for the host, let it announce endings, wake the queue (#457)
- lib/bgWork.ts names the engine jobs the page starts (queue and Upload screen
  uploads, installs, File System downloads), tells the host whether the page is
  showing, the notification setting and the notification texts in the person's
  language, and passes the host's bg-tick / bg-job-finished to the queue.
- lib/wakeableSleep.ts: the upload queue's and install polling's sleeps end on
  the host's clock when the hidden window's timers are throttled; a finished job
  ends the status-poll sleeps at once. Settle delays still wait their full time.
- Job-outcome notifications are tagged jobOutcome; the OS mirror skips them
  when the host reports native_job_notify (false in the browser build: the old
  behaviour).
- keepAwakeHold.ts holds the host's background-work hold, refreshed every
  minute, while a transfer runs or the upload queue is draining.
- 17 bg_* strings in all 21 languages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 07:04:17 -07:00
phantomptrandClaude Opus 5.5 413703be89 Host: background watcher and Android transfer service (#457)
bg_activity.rs polls the engine's /api/activity every second from Rust, so a
hidden or frozen WebView no longer decides whether work is running or has
ended. A pure step() turns each snapshot into start/update/finished/stop
actions: the first poll only records seq, an engine restart resets it, a
renderer hold refreshed within 5 minutes counts as work, and nothing active for
30 s stops. Finished jobs are emitted to the page (bg-job-finished, plus a
bg-tick heartbeat while work runs) and announced through the OS when the app is
in the background, in the language the page sends.

Android: a connectedDevice foreground service (dataSync as fallback) with a
partial wake lock and a Wi-Fi lock keeps the process and its in-process engine
alive, with an ongoing progress notification and a separate result channel. The
Kotlin class, manifest entries and R8 keep rules are written by
android-postinit-patch.sh. JNI_OnLoad and the context helpers move to
android_jni.rs so both callers share them; app classes load through the
context's class loader. The mobile engine start is now once per process, as
Activity recreation can run setup again.

Desktop: notifications through the notification plugin's Rust API when the
main window is hidden, minimised or unfocused; backgroundThrottling disabled on
the window (macOS 14+).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 07:04:16 -07:00
phantomptrandClaude Opus 5.5 3ba4656c68 Desktop Cargo.lock: follow the engine's lz4_flex 0.14
The lz4_flex bump only updated engine/Cargo.lock; the desktop crate builds the same
engine crates and failed --locked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 06:24:31 -07:00
phantomptr 8c5552ecd5 Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/client/frontend-117a2bf004' into deps-2026-10-16 2026-10-16 06:02:17 -07:00
phantomptr bffbd984fc Merge remote-tracking branch 'origin/dependabot/cargo/client/src-tauri/tauri-shell-196865a7e0' into deps-2026-10-16 2026-10-16 06:02:17 -07:00
phantomptr 4e7db556f2 Merge remote-tracking branch 'origin/dependabot/cargo/client/src-tauri/png-0.18.1' into deps-2026-10-16 2026-10-16 06:02:17 -07:00
dependabot[bot] b6951dcc86 Bump the frontend group across 1 directory with 12 updates
Bumps the frontend group with 12 updates in the /client directory:

| Package | From | To |
| --- | --- | --- |
| [@tauri-apps/api](https://github.com/tauri-apps/tauri) | `2.12.1` | `2.12.3` |
| [@tauri-apps/plugin-dialog](https://github.com/tauri-apps/plugins-workspace) | `2.8.1` | `2.8.2` |
| [@tauri-apps/plugin-notification](https://github.com/tauri-apps/plugins-workspace) | `2.5.1` | `2.6.0` |
| [@tauri-apps/plugin-opener](https://github.com/tauri-apps/plugins-workspace) | `2.7.0` | `2.7.1` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.52.0` | `1.56.0` |
| [@playwright/test](https://github.com/microsoft/playwright) | `1.63.0` | `1.64.0` |
| [@tauri-apps/cli](https://github.com/tauri-apps/tauri) | `2.12.1` | `2.12.2` |
| [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) | `5.0.3` | `5.0.4` |
| [postcss](https://github.com/postcss/postcss) | `8.5.28` | `8.5.30` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.71.1` | `8.71.2` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.3.3` | `8.3.4` |
| [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `5.0.3` | `5.0.4` |



Updates `@tauri-apps/api` from 2.12.1 to 2.12.3
- [Release notes](https://github.com/tauri-apps/tauri/releases)
- [Commits](https://github.com/tauri-apps/tauri/compare/@tauri-apps/api-v2.12.1...@tauri-apps/api-v2.12.3)

Updates `@tauri-apps/plugin-dialog` from 2.8.1 to 2.8.2
- [Release notes](https://github.com/tauri-apps/plugins-workspace/releases)
- [Commits](https://github.com/tauri-apps/plugins-workspace/compare/http-v2.8.1...http-v2.8.2)

Updates `@tauri-apps/plugin-notification` from 2.5.1 to 2.6.0
- [Release notes](https://github.com/tauri-apps/plugins-workspace/releases)
- [Commits](https://github.com/tauri-apps/plugins-workspace/compare/fs-v2.5.1...fs-v2.6.0)

Updates `@tauri-apps/plugin-opener` from 2.7.0 to 2.7.1
- [Release notes](https://github.com/tauri-apps/plugins-workspace/releases)
- [Commits](https://github.com/tauri-apps/plugins-workspace/compare/fs-v2.7.0...fs-v2.7.1)

Updates `lucide-react` from 1.52.0 to 1.56.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.56.0/packages/lucide-react)

Updates `@playwright/test` from 1.63.0 to 1.64.0
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.63.0...v1.64.0)

Updates `@tauri-apps/cli` from 2.12.1 to 2.12.2
- [Release notes](https://github.com/tauri-apps/tauri/releases)
- [Commits](https://github.com/tauri-apps/tauri/compare/@tauri-apps/cli-v2.12.1...@tauri-apps/cli-v2.12.2)

Updates `@vitest/coverage-v8` from 5.0.3 to 5.0.4
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.4/packages/coverage-v8)

Updates `postcss` from 8.5.28 to 8.5.30
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.5.28...8.5.30)

Updates `typescript-eslint` from 8.71.1 to 8.71.2
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.2/packages/typescript-eslint)

Updates `vite` from 8.3.3 to 8.3.4
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.3.4/packages/vite)

Updates `vitest` from 5.0.3 to 5.0.4
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.4/packages/vitest)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.64.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: frontend
- dependency-name: "@tauri-apps/api"
  dependency-version: 2.12.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: frontend
- dependency-name: "@tauri-apps/cli"
  dependency-version: 2.12.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: frontend
- dependency-name: "@tauri-apps/plugin-dialog"
  dependency-version: 2.8.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: frontend
- dependency-name: "@tauri-apps/plugin-notification"
  dependency-version: 2.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: frontend
- dependency-name: "@tauri-apps/plugin-opener"
  dependency-version: 2.7.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: frontend
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 5.0.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: frontend
- dependency-name: lucide-react
  dependency-version: 1.56.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: frontend
- dependency-name: postcss
  dependency-version: 8.5.30
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: frontend
- dependency-name: typescript-eslint
  dependency-version: 8.71.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: frontend
- dependency-name: vite
  dependency-version: 8.3.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: frontend
- dependency-name: vitest
  dependency-version: 5.0.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: frontend
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 08:13:32 +00:00
phantomptr 80e68028a6 Release v7.0.27 2026-10-16 01:09:45 -07:00
dependabot[bot] 407b08700e Bump png from 0.17.16 to 0.18.1 in /client/src-tauri
Bumps [png](https://github.com/image-rs/image-png) from 0.17.16 to 0.18.1.
- [Changelog](https://github.com/image-rs/image-png/blob/master/CHANGES.md)
- [Commits](https://github.com/image-rs/image-png/commits)

---
updated-dependencies:
- dependency-name: png
  dependency-version: 0.18.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 06:45:10 +00:00
dependabot[bot] 3160ed2b89 Bump the tauri-shell group in /client/src-tauri with 8 updates
Bumps the tauri-shell group in /client/src-tauri with 8 updates:

| Package | From | To |
| --- | --- | --- |
| [tauri](https://github.com/tauri-apps/tauri) | `2.12.1` | `2.12.2` |
| [tauri-plugin-dialog](https://github.com/tauri-apps/plugins-workspace) | `2.8.1` | `2.8.2` |
| [tauri-plugin-notification](https://github.com/tauri-apps/plugins-workspace) | `2.5.1` | `2.6.0` |
| [tauri-plugin-single-instance](https://github.com/tauri-apps/plugins-workspace) | `2.5.2` | `2.5.3` |
| [serde_json](https://github.com/serde-rs/json) | `1.0.151` | `1.0.154` |
| [tauri-plugin-opener](https://github.com/tauri-apps/plugins-workspace) | `2.7.0` | `2.7.1` |
| [tauri-build](https://github.com/tauri-apps/tauri) | `2.7.1` | `2.7.2` |
| [uuid](https://github.com/uuid-rs/uuid) | `1.27.0` | `1.28.0` |


Updates `tauri` from 2.12.1 to 2.12.2
- [Release notes](https://github.com/tauri-apps/tauri/releases)
- [Commits](https://github.com/tauri-apps/tauri/compare/tauri-v2.12.1...tauri-v2.12.2)

Updates `tauri-plugin-dialog` from 2.8.1 to 2.8.2
- [Release notes](https://github.com/tauri-apps/plugins-workspace/releases)
- [Commits](https://github.com/tauri-apps/plugins-workspace/compare/http-v2.8.1...http-v2.8.2)

Updates `tauri-plugin-notification` from 2.5.1 to 2.6.0
- [Release notes](https://github.com/tauri-apps/plugins-workspace/releases)
- [Commits](https://github.com/tauri-apps/plugins-workspace/compare/fs-v2.5.1...fs-v2.6.0)

Updates `tauri-plugin-single-instance` from 2.5.2 to 2.5.3
- [Release notes](https://github.com/tauri-apps/plugins-workspace/releases)
- [Commits](https://github.com/tauri-apps/plugins-workspace/compare/fs-v2.5.2...http-v2.5.3)

Updates `serde_json` from 1.0.151 to 1.0.154
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.151...v1.0.154)

Updates `tauri-plugin-opener` from 2.7.0 to 2.7.1
- [Release notes](https://github.com/tauri-apps/plugins-workspace/releases)
- [Commits](https://github.com/tauri-apps/plugins-workspace/compare/fs-v2.7.0...fs-v2.7.1)

Updates `tauri-build` from 2.7.1 to 2.7.2
- [Release notes](https://github.com/tauri-apps/tauri/releases)
- [Commits](https://github.com/tauri-apps/tauri/compare/tauri-build-v2.7.1...tauri-build-v2.7.2)

Updates `uuid` from 1.27.0 to 1.28.0
- [Release notes](https://github.com/uuid-rs/uuid/releases)
- [Commits](https://github.com/uuid-rs/uuid/compare/v1.27.0...v1.28.0)

---
updated-dependencies:
- dependency-name: tauri
  dependency-version: 2.12.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: tauri-shell
- dependency-name: tauri-plugin-dialog
  dependency-version: 2.8.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: tauri-shell
- dependency-name: tauri-plugin-notification
  dependency-version: 2.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: tauri-shell
- dependency-name: tauri-plugin-single-instance
  dependency-version: 2.5.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: tauri-shell
- dependency-name: serde_json
  dependency-version: 1.0.154
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: tauri-shell
- dependency-name: tauri-plugin-opener
  dependency-version: 2.7.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: tauri-shell
- dependency-name: tauri-build
  dependency-version: 2.7.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: tauri-shell
- dependency-name: uuid
  dependency-version: 1.28.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: tauri-shell
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 06:45:05 +00:00
phantomptr d74824c886 Release v7.0.26 2026-10-15 18:13:07 -07:00
phantomptrandClaude Opus 5.5 f61f5629e7 Reddit fixes: folder games register with ShadowMount+, resumable stalls, solid-rar retries, PM updates, drag to move
- Receiver writes sce_sys/param.json and param.sfo as .ava-hold and puts them in
  place when the job finishes: ShadowMount+ registered a folder whose eboot.bin
  was still arriving, failed twice and skipped the title for good (repro on
  13.60).
- AVA1 SkipProgress (0x30): a sender reading past data the receiver holds (a
  resumed solid .rar/.7z) keeps the job alive; the console ended it as stalled
  after 900 s on every retry.
- RAR5 unknown-size entries no longer wrap the unpacked total.
- Upload queue: stalled rows offer Restart transfer, stopped/interrupted rows
  offer Resume, "Retry failed uploads" actually runs them and is translated as
  an action.
- Payload Manager tab: Update for payloads stored from the Catalog, keeping the
  boot-list place; repository installs are left to Payload Manager.
- Files: drag folders (and, without drag-out, files) onto a folder or the
  breadcrumb to move them.
- README links the compose file from the feature list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-15 18:05:34 -07:00
phantomptrandClaude Opus 5.5 42403e4892 Collection: a deleted folder no longer breaks saving or scanning (#461)
Saving settings re-checked every root still existed, so once one was
gone nothing could be saved, removing that root included. Only roots
being added are checked now. A scan skips a root it can't open instead
of failing, keeps its caches, and lists it in missing_roots; Collection
names it and Folders marks it "Not found, skipped".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-15 17:06:14 -07:00
phantomptr 08e32214af Release v7.0.25 2026-10-15 12:12:35 -07:00
phantomptrandClaude Opus 5.5 139de00ce3 Profile: drop Create User, it could never work (#460)
13.60's libSceUserService exports no create call, and the old path
(GetInitialUser + SetUserName) only renamed the initial user; in a
payload GetInitialUser fails with 0x80940004. user.create now answers
with "add the user on the PS5" and touches nothing; Profile says so
instead of showing the button.

Also fix the worker-commit crash tests' race: the sender now waits for
credit and stops once the job stopped or finished on its own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-15 12:12:30 -07:00
phantomptr 0b6fb9bfb3 Release v7.0.24 2026-10-15 10:05:18 -07:00
phantomptrandClaude Opus 5.5 0c1aeae1ef Payloads → Ports: the ports in use on the PS5 (Discord ask)
New helper method net.ports (147, frame 265/266): binds each TCP and UDP
port and closes it at once (never connects, so no loader sees a silent
client), then binds 127.0.0.1 and the LAN address to tell network,
console-only and outgoing sockets apart. The socket sysctls
(net.inet.*.pcblist, kern.file) answer ENOENT on FW 13.60. A full pass
takes ~890 ms on the Phat. The engine names well-known ports and the
Payloads screen lists them, with Open only for web UIs and unknown ports.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-15 10:05:11 -07:00
phantomptrandClaude Opus 5.5 98bda5a1c0 Folder homebrew hint: folders can be on a USB or external drive (#452)
The Installed section said every folder game was registered from
/data/homebrew/<id>-app, also for folders on USB drives.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-15 08:17:50 -07:00
phantomptr 61f6d0e9e8 Release v7.0.23 2026-10-15 00:18:50 -07:00
phantomptrandClaude Opus 5.5 d055239ddb Revert "Decompress a .ffpfsc on the console (#453)"
This reverts commit 1f27c1a560.

Every helper build that linked the vendored zlib died within minutes on a
FW 13.60 Phat with SIGBUS in a system library touching helper code at
zlib's inflateEnd (logged by the new fault detail: addr=0x200161159,
rip=0x88007fe60), most often right after an app kill. One such build was
running when the console went down during a game launch and did not come
back. The same helper without zlib ran through repeated launches and kills.
The decompress op goes back out until it can run without linking zlib into
the helper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-14 23:51:53 -07:00
phantomptrandClaude Opus 5.5 d92cf3cba2 Tasks view shows a transfer's speed and ETA (#444)
The Files queue row showed speed and time left, but the task the same
transfer drives in the Tasks view had only its bar: the bridge passed bytes
and never the rate the queue and the single-file transfer already compute.
Both now pass the rate and, when the total is known, the time left.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-14 20:36:45 -07:00
phantomptrandClaude Opus 5.5 f534ab020f Updates: give packaged Linux installs the command that installs them (#456)
The updater downloads the new package and opens its folder. On Bazzite and
other rpm-ostree systems that left people to work out `rpm-ostree uninstall`
plus `rpm-ostree install` by hand. A packaged Linux copy now gets the one
command to run, with a Copy button: `rpm-ostree uninstall <pkg> --install
<rpm> && systemctl reboot` on rpm-ostree (the package name read from the rpm
database), `sudo dnf install` for rpm, `sudo apt install` for deb. The README's
Bazzite row says the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-14 20:35:14 -07:00
phantomptrandClaude Opus 5.5 ccdd5b1e28 Payloads: export and import playlists with their custom repos
Asked on Discord: share a working autoload setup with friends. The Playlists
panel gets Export… and Import…: one JSON file with every playlist, the
auto-loader's choice and the custom repos the catalogue knows. Import adds the
repos first (their ids come from host/owner/name, so repo steps resolve with
no remapping), then the playlists beside the ones already here with new ids
and names kept apart; the auto-loader choice is taken only when none is set.
Strings in all 21 locales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-14 20:32:08 -07:00