ODIAN Launcher: hub, installer, local stack and remembered sign-in (M2)
- Tauri 2 + Svelte 5 hub in ODIAN dark: patch notes and roadmap, install and update progress, local stack status, settings with DHP and MCP addresses. - crates/odian-packs: Rust installer for pack format v1 (signed manifests, resumable verified downloads from a DHP or an ODIAN drive), byte-compatible with ODIAN_MCP_Server's Python odian_packs. - Local stack on 127.0.0.1: Postgres -> Engine API -> tile server -> Odian.exe, one Job Object, clean shutdown; database snapshot restore on a fresh PC only. - Keycloak sign-in through the DHP's MCP, remembered until Sign out with a launcher session that renews the Engine token silently. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+309
@@ -0,0 +1,309 @@
|
||||
{
|
||||
"cases": [
|
||||
{
|
||||
"path": "Odian/x.exe",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "db/20260915T082529Z/data/public.odb_air_timeline_2026_02.dump",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "../a",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path must not contain empty, '.' or '..' parts: '../a'"
|
||||
},
|
||||
{
|
||||
"path": "a/../b",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path must not contain empty, '.' or '..' parts: 'a/../b'"
|
||||
},
|
||||
{
|
||||
"path": "/a",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path must be relative with '/' separators: '/a'"
|
||||
},
|
||||
{
|
||||
"path": "C:/a",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'C:' holds a control character or one of <>:\"|?*: 'C:/a'"
|
||||
},
|
||||
{
|
||||
"path": "a\\b",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path must be relative with '/' separators: 'a\\\\b'"
|
||||
},
|
||||
{
|
||||
"path": "a//b",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path must not contain empty, '.' or '..' parts: 'a//b'"
|
||||
},
|
||||
{
|
||||
"path": "",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: empty path"
|
||||
},
|
||||
{
|
||||
"path": "./a",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path must not contain empty, '.' or '..' parts: './a'"
|
||||
},
|
||||
{
|
||||
"path": "a/",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path must not contain empty, '.' or '..' parts: 'a/'"
|
||||
},
|
||||
{
|
||||
"path": "a/.",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path must not contain empty, '.' or '..' parts: 'a/.'"
|
||||
},
|
||||
{
|
||||
"path": ".",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path must not contain empty, '.' or '..' parts: '.'"
|
||||
},
|
||||
{
|
||||
"path": "..",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path must not contain empty, '.' or '..' parts: '..'"
|
||||
},
|
||||
{
|
||||
"path": "a/..",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path must not contain empty, '.' or '..' parts: 'a/..'"
|
||||
},
|
||||
{
|
||||
"path": "Odian/Odian.exe:hidden",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'Odian.exe:hidden' holds a control character or one of <>:\"|?*: 'Odian/Odian.exe:hidden'"
|
||||
},
|
||||
{
|
||||
"path": "a/b.",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'b.' ends with a dot or space: 'a/b.'"
|
||||
},
|
||||
{
|
||||
"path": "a/b ",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'b ' ends with a dot or space: 'a/b '"
|
||||
},
|
||||
{
|
||||
"path": "CON",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'CON' is a reserved Windows device name: 'CON'"
|
||||
},
|
||||
{
|
||||
"path": "con",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'con' is a reserved Windows device name: 'con'"
|
||||
},
|
||||
{
|
||||
"path": "a/CoN.TxT",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'CoN.TxT' is a reserved Windows device name: 'a/CoN.TxT'"
|
||||
},
|
||||
{
|
||||
"path": "a/aux.txt",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'aux.txt' is a reserved Windows device name: 'a/aux.txt'"
|
||||
},
|
||||
{
|
||||
"path": "a/Lpt1.log",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'Lpt1.log' is a reserved Windows device name: 'a/Lpt1.log'"
|
||||
},
|
||||
{
|
||||
"path": "NUL.tar.gz",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'NUL.tar.gz' is a reserved Windows device name: 'NUL.tar.gz'"
|
||||
},
|
||||
{
|
||||
"path": "a/nul..x",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'nul..x' is a reserved Windows device name: 'a/nul..x'"
|
||||
},
|
||||
{
|
||||
"path": "a/prn",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'prn' is a reserved Windows device name: 'a/prn'"
|
||||
},
|
||||
{
|
||||
"path": "a/prn_x",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/com\u00b9",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'com\u00b9' is a reserved Windows device name: 'a/com\u00b9'"
|
||||
},
|
||||
{
|
||||
"path": "a/COM\u00b2.txt",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'COM\u00b2.txt' is a reserved Windows device name: 'a/COM\u00b2.txt'"
|
||||
},
|
||||
{
|
||||
"path": "a/lpt\u00b3",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'lpt\u00b3' is a reserved Windows device name: 'a/lpt\u00b3'"
|
||||
},
|
||||
{
|
||||
"path": "a/lpt0",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'lpt0' is a reserved Windows device name: 'a/lpt0'"
|
||||
},
|
||||
{
|
||||
"path": "a/com0",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'com0' is a reserved Windows device name: 'a/com0'"
|
||||
},
|
||||
{
|
||||
"path": "a/comA",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/com10",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/con .txt",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/b\u0000c",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'b\\x00c' holds a control character or one of <>:\"|?*: 'a/b\\x00c'"
|
||||
},
|
||||
{
|
||||
"path": "a/b\nc",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'b\\nc' holds a control character or one of <>:\"|?*: 'a/b\\nc'"
|
||||
},
|
||||
{
|
||||
"path": "a/b\u001fc",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'b\\x1fc' holds a control character or one of <>:\"|?*: 'a/b\\x1fc'"
|
||||
},
|
||||
{
|
||||
"path": "a/b\u007fc",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/b\u0085c",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/b\u2028c",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/b?c",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'b?c' holds a control character or one of <>:\"|?*: 'a/b?c'"
|
||||
},
|
||||
{
|
||||
"path": "a/b*c",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'b*c' holds a control character or one of <>:\"|?*: 'a/b*c'"
|
||||
},
|
||||
{
|
||||
"path": "a/b\"c",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'b\"c' holds a control character or one of <>:\"|?*: 'a/b\"c'"
|
||||
},
|
||||
{
|
||||
"path": "a/b|c",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'b|c' holds a control character or one of <>:\"|?*: 'a/b|c'"
|
||||
},
|
||||
{
|
||||
"path": "a/b<c",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'b<c' holds a control character or one of <>:\"|?*: 'a/b<c'"
|
||||
},
|
||||
{
|
||||
"path": "a/b>c",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'b>c' holds a control character or one of <>:\"|?*: 'a/b>c'"
|
||||
},
|
||||
{
|
||||
"path": "a/console.txt",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/auxiliary",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/.hidden",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/b c.txt",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": " a/b",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/ b",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/b.c.",
|
||||
"python": "error",
|
||||
"python_error": "ManifestError: path part 'b.c.' ends with a dot or space: 'a/b.c.'"
|
||||
},
|
||||
{
|
||||
"path": "donn\u00e9es/\u00e9t\u00e9.png",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "\u4e2d\u6587/\u8def\u5f84.txt",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/\ud83d\ude00.png",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/b#c%20d",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/aux\u00a0",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/com\u0660",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
},
|
||||
{
|
||||
"path": "a/\u212aon",
|
||||
"python": "ok",
|
||||
"python_error": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user