mirror of
https://github.com/saphid/frame-control.git
synced 2026-10-28 23:03:01 +01:00
Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dad5f78a02 | ||
|
|
36da680e14 | ||
|
|
841c0b84be | ||
|
|
68f46bdd60 | ||
|
|
7eaa878827 | ||
|
|
c8577804df | ||
|
|
eda0a563c0 | ||
|
|
4f1072cb4d | ||
|
|
326078cc24 |
No files matched your search
@@ -0,0 +1,29 @@
|
||||
# DeckyFileServer 1.2.0 address correction, 28 October 2026
|
||||
|
||||
Official store ID 60 and ZIP SHA-256
|
||||
`7dc2ecdcd05aa415d1ac90afaff28ecb17f77809a2bc7a77aee8e92505b976f0`.
|
||||
The exact bundled frontend `dist/index.js` has SHA-256
|
||||
`791015d8b3f234fad89ce422b09fb32bbad05e7c867d501706cfbcf9f7c6187f`.
|
||||
Only that pinned managed archive receives this change. A changed archive keeps
|
||||
the normal native/root rejection.
|
||||
|
||||
The [pinned corresponding Go source](../../ui/vendor/deckyfileserver-1.2.0/README.md)
|
||||
calls `ListenAndServeTLS` for every server start. The official frontend instead
|
||||
constructs `http://steamdeck:<port>` when uploads are off, and toggles the
|
||||
second address between HTTP and HTTPS using the upload setting. Neither rule
|
||||
matches the server. The `steamdeck` hostname also has no verified resolution
|
||||
on Frame. Earlier [real Frame backend evidence](framey-fileserver-arm64-2026-10-27.md)
|
||||
confirmed private HTTPS listing and download with uploads disabled.
|
||||
|
||||
The managed installer now checks the original frontend hash and replaces the
|
||||
two displayed addresses with one `https://<backend IP>:<port>` address. A
|
||||
rendered-element check executes the installed official bundle and verifies
|
||||
that URL with uploads off and on; it also checks that no `steamdeck` address
|
||||
remains. Receipts add `deckyfileserver-https-address`. Older managed copies
|
||||
without it display an update or reinstall notice; the compatibility status
|
||||
stays **partial**.
|
||||
|
||||
This check does not prove a live browser can reach every returned IP, or that
|
||||
the folder picker works in Framey. Use a preconfigured directory. Uploads,
|
||||
generated thumbnails, worn VR, physical controllers and wearer readability
|
||||
remain unverified. This correction did not touch the real headset.
|
||||
@@ -78,7 +78,7 @@ The API column shows manifest / actual bundled frontend API. Many manifests say
|
||||
| 56: MangoPeel 0.0.7 | 1 / 2 | partial | Initializer succeeds; gamescope/MangoHud actions and backend are unverified. | static archive, local browser, fake-Frame |
|
||||
| 58: Volume Boost 0.0.7 | legacy / legacy | works | Default-sink controls pass in local Chromium through real Decky 3.3.0 ARM64: linked slider/keyboard and numeric writes, separate channels, re-link and reopen, with independent Pulse readback including 125%/150% while muted. Exact original volume/mute restored. Audible output, Bluetooth sinks and worn VR unverified. | static archive, local browser, fake-Frame, isolated Linux backend, real Frame SSH |
|
||||
| 59: Web Browser 1.4.3 | legacy / legacy | broken | The exact frontend now initializes with a null Steam React-root lookup. The browser itself still requires Steam GamepadUI CDP injection and a backend WebSocket unavailable in Framey; no working browser tab was verified. | static archive, local browser, fake-Frame, focused local browser |
|
||||
| 60: DeckyFileServer 1.2.0 | 1 / 2 | partial | Managed install supplies a native ARM64 helper and removes the exact archive's unnecessary root request. Real Decky 3.3.0 on Frame passes private read-only HTTPS listing/download and upload denial. Frontend address/picker limitations remain; use HTTPS and a preconfigured directory. Uploads, generated thumbnails and worn VR are unverified. Shared Toggle value rendering is repaired; other listed blockers remain. | static archive, local browser, fake-Frame, real Decky 3.3.0 amd64, real Frame SSH |
|
||||
| 60: DeckyFileServer 1.2.0 | 1 / 2 | partial | Managed install supplies a native ARM64 helper, removes the exact archive's unnecessary root request, and displays the backend-returned IP with HTTPS. Real Decky 3.3.0 on Frame passes private read-only HTTPS listing/download and upload denial. The Steam folder picker remains unavailable; use a preconfigured directory. Uploads, generated thumbnails and worn VR are unverified. Existing managed copies need update or reinstall for the address fix. | static archive, local browser, fake-Frame, real Decky 3.3.0 amd64, real Frame SSH |
|
||||
| 61: TabMaster 2.15.1 | 1 / 2 | partial | Local Chromium rendered the QAM and navigable Overview/Filters documentation with an actual Decky 3.3.0 amd64 backend. Library-tab editing remains unavailable: Steam login/library patches and MobX reactions have no target. ARM64 and worn VR unverified. | static archive, local browser, fake-Frame |
|
||||
| 62: TS3 QuickAccess 1.2.0 | legacy / legacy | broken | Plugin contains a non-ARM64 Linux binary: ts3-qs4sd/bin/ts3-qs4sd.so. | static archive, local browser, fake-Frame |
|
||||
| 63: Free Loader 1.6.0 | 1 / 2 | partial | The exact archive's byte-identical duplicate ZIP members pass guarded install/remove. Actual Decky 3.3.0 in a private network-isolated container discovers the plugin, reads default settings and empty local deals, and retains a settings change after restart. Live deal-feed refresh, notifications, Steam store integration, real Frame ARM64 service and worn VR remain unverified; no feed request was made. | static archive, local browser, fake-Frame pinned install/remove, local exact-archive transaction, isolated Python backend, isolated Linux backend |
|
||||
@@ -287,7 +287,7 @@ DFL includes exports imported through decky-frontend-lib / @decky/ui. Steam stor
|
||||
|
||||
All published Linux native payloads in this snapshot are x86_64; no published aarch64 payload was found. The three Windows DLLs belong to Decky-Framegen. Except for the exact managed DeckyFileServer and Decky Localsend adaptations below, the installer still rejects these archives. Apart from LocalSend and DeckyFileServer, ARM64 builds were not attempted: the constraints below remain unresolved.
|
||||
|
||||
A [DeckyFileServer ARM64 follow-up](evidence/framey-fileserver-arm64-2026-10-27.md) ships an offline, digest-checked GPL helper build, corresponding vendored source and a build recipe. Only its exact managed archive can replace the x86 helper and remove its unnecessary root flag. Actual Decky 3.3.0 discovery/RPC and real Frame HTTPS private-fixture listing/download pass; uploads stay disabled. Hostname-DNS failures and empty optional arguments are repaired. Decky 3.3.0 still exposes `decky.HOME`; that call is unchanged. The plugin moves from broken to partial: its frontend advertises HTTP/steamdeck URLs and needs a Steam folder picker. Use HTTPS and a preconfigured directory. Uploads, generated thumbnails and worn VR remain unverified.
|
||||
A [DeckyFileServer ARM64 follow-up](evidence/framey-fileserver-arm64-2026-10-27.md) ships an offline, digest-checked GPL helper build, corresponding vendored source and a build recipe. Only its exact managed archive can replace the x86 helper and remove its unnecessary root flag. Actual Decky 3.3.0 discovery/RPC and real Frame HTTPS private-fixture listing/download pass; uploads stay disabled. Hostname-DNS failures and empty optional arguments are repaired. Decky 3.3.0 still exposes `decky.HOME`; that call is unchanged. The plugin remains partial. A [frontend URL follow-up](evidence/framey-fileserver-url-2026-10-28.md) changes only the exact managed bundle to display the backend-returned IP with HTTPS, matching the helper. Existing managed copies need update or reinstall. The Steam folder picker is still unavailable; use a preconfigured directory. Uploads, generated thumbnails and worn VR remain unverified.
|
||||
|
||||
[LocalSend ARM64 build/runtime evidence](evidence/framey-localsend-arm64-2026-10-26.md) covers an isolated real-Frame protocol 2.0 info response from an earlier helper build. [Exact official source matching](evidence/framey-localsend-source-match-2026-10-27.md) now identifies the official helper source and a reproducible ARM64 build from that revision. The exact official x86 backend passed one local private-namespace transfer, and the rebuilt ARM64 helper passed one locked real-Frame private marker transfer. Published Decky 3.3.0 AMD64/ARM64 runtime checks discovered the adapted plugin and read its stopped status and configuration. Only the exact managed 0.4.5 archive can replace its x86 helper on Frame. The actual managed Decky service on Frame, user-facing transfer, local discovery and worn VR remain unverified ([managed adaptation evidence](evidence/framey-localsend-managed-2026-10-27.md)).
|
||||
|
||||
|
||||
@@ -131,7 +131,7 @@ def render(data):
|
||||
'A [DeckyFileServer ARM64 follow-up](evidence/framey-fileserver-arm64-2026-10-27.md) ships an offline, digest-checked GPL helper build, corresponding vendored source and a build recipe. '
|
||||
'Only its exact managed archive can replace the x86 helper and remove its unnecessary root flag. Actual Decky 3.3.0 discovery/RPC and real Frame HTTPS private-fixture listing/download pass; uploads stay disabled. '
|
||||
'Hostname-DNS failures and empty optional arguments are repaired. Decky 3.3.0 still exposes `decky.HOME`; that call is unchanged. '
|
||||
'The plugin moves from broken to partial: its frontend advertises HTTP/steamdeck URLs and needs a Steam folder picker. Use HTTPS and a preconfigured directory. Uploads, generated thumbnails and worn VR remain unverified.', '',
|
||||
'The plugin remains partial. A [frontend URL follow-up](evidence/framey-fileserver-url-2026-10-28.md) changes only the exact managed bundle to display the backend-returned IP with HTTPS, matching the helper. Existing managed copies need update or reinstall. The Steam folder picker is still unavailable; use a preconfigured directory. Uploads, generated thumbnails and worn VR remain unverified.', '',
|
||||
'[LocalSend ARM64 build/runtime evidence](evidence/framey-localsend-arm64-2026-10-26.md) '
|
||||
'covers an isolated real-Frame protocol 2.0 info response from an earlier helper build. '
|
||||
'[Exact official source matching](evidence/framey-localsend-source-match-2026-10-27.md) '
|
||||
|
||||
@@ -41,7 +41,8 @@ def check_coverage():
|
||||
shims.add(node.args[0].value)
|
||||
cases = json.loads((ROOT/'tests/decky-runtime/cases.json').read_text())
|
||||
# Frontend-only compatibility probes need no archive/backend adaptation.
|
||||
if shims != {case['shim'] for case in cases if case['shim'] is not None}:
|
||||
covered = {shim for case in cases for shim in ([case['shim']] if case['shim'] else []) + case.get('additionalShims', [])}
|
||||
if shims != covered:
|
||||
raise ValueError('Every managed shim needs an actual Decky runtime case')
|
||||
return cases
|
||||
|
||||
|
||||
@@ -47,7 +47,10 @@
|
||||
{
|
||||
"id": 60,
|
||||
"shim": "deckyfileserver-user-native",
|
||||
"probe": "fileserver"
|
||||
"probe": "fileserver",
|
||||
"additionalShims": [
|
||||
"deckyfileserver-https-address"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 125,
|
||||
|
||||
@@ -90,7 +90,8 @@ def main():
|
||||
plugin = base/'plugins'/record['folder']
|
||||
receipt = json.loads((plugin/'.frame-control-store.json').read_text())
|
||||
if not args.reproduce_timer_regression:
|
||||
assert receipt.get('compatShims', []) == ([case['shim']] if case['shim'] else []), receipt
|
||||
expected_shims = ([case['shim']] if case['shim'] else []) + case.get('additionalShims', [])
|
||||
assert receipt.get('compatShims', []) == expected_shims, receipt
|
||||
else:
|
||||
assert record['id'] == 96
|
||||
with zipfile.ZipFile(io.BytesIO(data)) as original:
|
||||
|
||||
@@ -9,7 +9,8 @@ import subprocess
|
||||
import threading
|
||||
import zipfile
|
||||
|
||||
from harness import FrameTestCase, ROOT, Server, api, finished, ok, require, ssh
|
||||
from harness import FrameTestCase, ROOT, Server, api, finished, ok, require, reset, ssh
|
||||
import frame_decky_store
|
||||
from framey_official import LEGACY_PLUGINS, PLUGINS as PANEL_PLUGINS, archive as official_archive
|
||||
|
||||
OFFICIAL_PLUGINS = PANEL_PLUGINS + LEGACY_PLUGINS
|
||||
@@ -99,6 +100,13 @@ u=h/'.config/systemd/user/frame-control-decky.service'; u.parent.mkdir(parents=T
|
||||
input=source, capture_output=True, timeout=20)
|
||||
self.assertEqual(copy.returncode, 0, copy.stderr)
|
||||
|
||||
def test_fake_frame_reset_clears_managed_decky_state(self):
|
||||
ssh('mkdir -p ~/.local/share/frame-control/decky/plugins/test-leftover ~/.config/systemd/user')
|
||||
ssh('touch ~/.config/systemd/user/frame-control-decky.service')
|
||||
reset()
|
||||
self.assertEqual(ssh('test -e ~/.local/share/frame-control/decky && echo yes || echo no').strip(), 'no')
|
||||
self.assertEqual(ssh('test -e ~/.config/systemd/user/frame-control-decky.service && echo yes || echo no').strip(), 'no')
|
||||
|
||||
def test_store_install_update_remove_and_guards(self):
|
||||
self.backend()
|
||||
status, _, _ = api('GET', '/api/decky/store', headers={'X-Frame-UI':''})
|
||||
@@ -190,6 +198,9 @@ u=h/'.config/systemd/user/frame-control-decky.service'; u.parent.mkdir(parents=T
|
||||
installed = f"~/.local/share/frame-control/decky/plugins/{plugin['folder']}"
|
||||
with zipfile.ZipFile(io.BytesIO(official_archive(plugin))) as bundle:
|
||||
expected = hashlib.sha256(bundle.read(plugin['folder']+'/dist/index.js')).hexdigest()
|
||||
if plugin['id'] == 60:
|
||||
# The pinned managed bundle rewrites the two incorrect addresses.
|
||||
expected = '05819ddd0ee9c3ce7eeb184977a2f7905d7c8f5cfaec8bdff837d7935985a0e7'
|
||||
self.assertEqual(ssh(f'sha256sum {installed}/dist/index.js').split()[0], expected)
|
||||
self.assertEqual(json.loads(ssh(f'cat {installed}/plugin.json')).get('api_version', 'legacy'), plugin['api_version'])
|
||||
if plugin['id'] == 96:
|
||||
@@ -205,8 +216,8 @@ u=h/'.config/systemd/user/frame-control-decky.service'; u.parent.mkdir(parents=T
|
||||
if plugin['id'] == 60:
|
||||
self.assertEqual(json.loads(ssh(f'cat {installed}/plugin.json'))['flags'], [])
|
||||
receipt = json.loads(ssh(f'cat {installed}/.frame-control-store.json'))
|
||||
self.assertEqual(receipt['compatShims'], ['deckyfileserver-user-native'])
|
||||
import frame_decky_store
|
||||
self.assertEqual(receipt['compatShims'],
|
||||
['deckyfileserver-user-native', 'deckyfileserver-https-address'])
|
||||
arch = ssh('uname -m').strip()
|
||||
self.assertEqual(ssh(f'sha256sum {installed}/bin/backend').split()[0],
|
||||
frame_decky_store.FILESERVER_BINARIES[arch])
|
||||
|
||||
@@ -304,6 +304,8 @@ def clean_home():
|
||||
pass
|
||||
for pattern in (fs.DEVKIT_GAMES + '/*', fs.DEVKIT_GAMES + '/.[!.]*', HOME + '/devkit-utils',
|
||||
HOME + '/.devkit-utils.frame-control', HOME + '/Applications', HOME + '/Downloads/*',
|
||||
HOME + '/.local/share/frame-control',
|
||||
HOME + '/.config/systemd/user/frame-control-decky.service',
|
||||
fs.STEAM_ROOT + '/steamapps/compatdata', fs.STEAM_ROOT + '/steamapps/shadercache',
|
||||
fs.STEAM_ROOT + '/logs', '/var/log/fakeframe/devkit-*', '/var/log/fakeframe/shortcut-*'):
|
||||
for p in glob.glob(pattern):
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import {readFileSync} from 'node:fs';
|
||||
import vm from 'node:vm';
|
||||
|
||||
const source = readFileSync(process.argv[2], 'utf8');
|
||||
const testSource = source.replace(/export \{ index as default \};/, 'globalThis.__Content = Content;');
|
||||
assert.notEqual(testSource, source, 'official module export must be present');
|
||||
|
||||
const DFL = new Proxy({
|
||||
definePlugin: factory => factory(),
|
||||
staticClasses: {Title: 'title'},
|
||||
}, {get(target, name) { return target[name] ?? name; }});
|
||||
const createElement = (type, props, ...children) => ({type, props: props ?? {}, children});
|
||||
|
||||
for (const allow_uploads of [false, true]) {
|
||||
const SP_REACT = {
|
||||
createElement,
|
||||
createContext: value => ({value}),
|
||||
useState: initial => [{...initial, server_running: true,
|
||||
ip_address: '192.0.2.5', port: 8421, allow_uploads}, () => {}],
|
||||
useEffect() {},
|
||||
};
|
||||
const window = {SP_REACT,
|
||||
__DECKY_SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED_deckyLoaderAPIInit: {
|
||||
connect: () => ({_version: 2, callable: () => async () => ({}), openFilePicker: async () => ({})}),
|
||||
},
|
||||
};
|
||||
const context = vm.createContext({window, SP_REACT, DFL, setInterval() {}, clearInterval() {}});
|
||||
vm.runInContext(testSource, context);
|
||||
const tree = context.__Content();
|
||||
const fields = [];
|
||||
function visit(value) {
|
||||
if (!value || typeof value !== 'object') return;
|
||||
if (value.type === DFL.Field) fields.push(value);
|
||||
for (const child of value.children ?? []) visit(child);
|
||||
}
|
||||
visit(tree);
|
||||
const addresses = fields.filter(field => field.props.label === 'Server Address');
|
||||
assert.equal(addresses.length, 1);
|
||||
assert.equal(addresses[0].children.join(''), 'https://192.0.2.5:8421');
|
||||
assert.equal(fields.filter(field => field.children.join('').includes('steamdeck')).length, 0);
|
||||
}
|
||||
@@ -228,12 +228,16 @@ class StoreTransaction(unittest.TestCase):
|
||||
self.assertEqual(result.returncode, 0, result.stderr)
|
||||
plugin = self.folder.parent/record['folder']
|
||||
self.assertEqual(json.loads((plugin/'plugin.json').read_text())['flags'], [])
|
||||
self.assertEqual(json.loads((plugin/'.frame-control-store.json').read_text())['compatShims'], ['deckyfileserver-user-native'])
|
||||
self.assertEqual(json.loads((plugin/'.frame-control-store.json').read_text())['compatShims'],
|
||||
['deckyfileserver-user-native', 'deckyfileserver-https-address'])
|
||||
helper = plugin/'bin/backend'
|
||||
self.assertEqual(hashlib.sha256(helper.read_bytes()).hexdigest(), frame_decky_store.FILESERVER_BINARIES[platform.machine()])
|
||||
self.assertEqual(helper.stat().st_mode & 0o777, 0o700)
|
||||
compile((plugin/'main.py').read_text(), str(plugin/'main.py'), 'exec')
|
||||
self.assertIn('if arg]', (plugin/'main.py').read_text())
|
||||
rendered = subprocess.run(['node', str(Path(__file__).parent/'page/framey_fileserver_url.mjs'),
|
||||
str(plugin/'dist/index.js')], capture_output=True, text=True, timeout=20)
|
||||
self.assertEqual(rendered.returncode, 0, rendered.stderr)
|
||||
|
||||
@unittest.skipUnless(__import__('platform').machine() in ('x86_64', 'aarch64'), 'native Linux helper architecture')
|
||||
def test_exact_localsend_gets_verified_native_helper_and_preserves_source(self):
|
||||
|
||||
@@ -80,6 +80,16 @@ class Compatibility(unittest.TestCase):
|
||||
self.assertIn('Update or reinstall', result[0]['compatibility']['reason'])
|
||||
self.assertEqual(result[1]['compatibility']['status'], 'works')
|
||||
|
||||
def test_fileserver_old_copy_requires_https_address_update(self):
|
||||
plugin = next(p for p in json.loads(compatibility.DATA.read_text())['plugins'] if p['id'] == 60)
|
||||
old = dict(storeId=60, version=plugin['version'], sha256=plugin['sha256'],
|
||||
compatShims=['deckyfileserver-user-native'])
|
||||
updated = dict(old, compatShims=['deckyfileserver-user-native', 'deckyfileserver-https-address'])
|
||||
result = frame_decky.status(lambda *a, **k: json.dumps({'plugins': [old, updated]}))['plugins']
|
||||
self.assertIn('Update or reinstall', result[0]['compatibility']['reason'])
|
||||
self.assertNotIn('Update or reinstall', result[1]['compatibility']['reason'])
|
||||
self.assertEqual([p['compatibility']['status'] for p in result], ['partial', 'partial'])
|
||||
|
||||
def test_missing_audit_data_is_unverified(self):
|
||||
with patch.object(compatibility, 'DATA', Path('/nonexistent/framey-audit.json')):
|
||||
self.assertEqual(compatibility.lookup(12, 'a'*64, '1.0')['status'], 'unverified')
|
||||
@@ -385,7 +385,38 @@ try:
|
||||
new=' if "disable_thumbnails" in status:\n await Plugin.set_disable_thumbnails(self, status["disable_thumbnails"])\n if "server_running" in status:\n await Plugin.set_server_running(self, status["server_running"])'
|
||||
if old not in text: raise RuntimeError('DeckyFileServer start configuration changed')
|
||||
source.write_text(text.replace(old,new))
|
||||
# The helper always calls ListenAndServeTLS. The published panel
|
||||
# prints HTTP when uploads are disabled and hard-codes a Deck
|
||||
# hostname that the Frame does not provide. Keep only the
|
||||
# actual address returned by this backend.
|
||||
frontend=unpacked/'dist/index.js'
|
||||
original=frontend.read_bytes()
|
||||
if hashlib.sha256(original).hexdigest()!='791015d8b3f234fad89ce422b09fb32bbad05e7c867d501706cfbcf9f7c6187f':
|
||||
raise RuntimeError('DeckyFileServer frontend source changed')
|
||||
bundle=original.decode('utf-8')
|
||||
old_url=""" window.SP_REACT.createElement(DFL.Field, { inlineWrap: "shift-children-below", label: "Server Address", bottomSeparator: "none" },
|
||||
"http",
|
||||
state.allow_uploads ? "s" : "",
|
||||
"://steamdeck:",
|
||||
state.port),
|
||||
window.SP_REACT.createElement(DFL.Field, { inlineWrap: "shift-children-below" },
|
||||
"http",
|
||||
state.allow_uploads ? "s" : "",
|
||||
"://",
|
||||
state.ip_address,
|
||||
":",
|
||||
state.port),
|
||||
"""
|
||||
new_url=""" window.SP_REACT.createElement(DFL.Field, { inlineWrap: "shift-children-below", label: "Server Address", bottomSeparator: "none" },
|
||||
"https://",
|
||||
state.ip_address,
|
||||
":",
|
||||
state.port),
|
||||
"""
|
||||
if bundle.count(old_url)!=1: raise RuntimeError('DeckyFileServer address UI changed')
|
||||
frontend.write_text(bundle.replace(old_url,new_url),encoding='utf-8')
|
||||
compat_shims.append('deckyfileserver-user-native')
|
||||
compat_shims.append('deckyfileserver-https-address')
|
||||
# Simple Timer 1.0.0 has annotation-only task state, orphaned
|
||||
# replacement tasks and canceled deadlines that resume on restart.
|
||||
# Preserve its API1 instance convention and upstream license.
|
||||
|
||||
@@ -4349,7 +4349,7 @@
|
||||
"https://github.com/grimkor/DeckyFileServer"
|
||||
],
|
||||
"status": "partial",
|
||||
"reason": "Managed install supplies a native ARM64 helper and removes the exact archive's unnecessary root request. Real Decky 3.3.0 on Frame passes private read-only HTTPS listing/download and upload denial. Frontend address/picker limitations remain; use HTTPS and a preconfigured directory. Uploads, generated thumbnails and worn VR are unverified. Shared Toggle value rendering is repaired; other listed blockers remain.",
|
||||
"reason": "Managed install supplies a native ARM64 helper, removes the exact archive's unnecessary root request, and displays the backend-returned IP with HTTPS. Real Decky 3.3.0 on Frame passes private read-only HTTPS listing/download and upload denial. The Steam folder picker remains unavailable; use a preconfigured directory. Uploads, generated thumbnails and worn VR are unverified. Existing managed copies need update or reinstall for the address fix.",
|
||||
"blockInstall": false,
|
||||
"verification": [
|
||||
"static archive",
|
||||
@@ -4385,7 +4385,8 @@
|
||||
"reason": "ValueError: Root plugins are not supported by the Frame user service"
|
||||
},
|
||||
"requiredShims": [
|
||||
"deckyfileserver-user-native"
|
||||
"deckyfileserver-user-native",
|
||||
"deckyfileserver-https-address"
|
||||
],
|
||||
"managedNative": {
|
||||
"shim": "deckyfileserver-user-native",
|
||||
|
||||
Reference in new issue
Block a user