HKUDS/nanobot · error · TuiUnavailableError
TUI release archive is incomplete
Error message
TUI release archive is incomplete
What it means
In _verified_release_archive, the archive's file set does not exactly equal the expected bundle names (asset binary, sidecar files, MANIFEST.sha256) — files are missing or unexpected extras are present. The archive at fault is the downloaded release ZIP whose contents mismatch the manifest expectations.
Solutions
- Re-download from the matching official GitHub release
- Ensure the release was packaged with the current bundle layout (asset plus _TUI_RELEASE_FILES plus manifest)
- Check for a version mismatch between nanobot and the release it is fetching
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at nanobot/cli/tui_launcher.py:339 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of HKUDS/nanobot@42f37dc4c0 (2026-08-26).
Data as JSON: /api/errors/256c1453b380e5a3.
Report an issue: GitHub.
Appendix: source
Thrown at nanobot/cli/tui_launcher.py:339
):
raise TuiUnavailableError("TUI release manifest is malformed")
checksums[name] = digest
if set(checksums) != expected_names:
raise TuiUnavailableError("TUI release manifest is incomplete")
return checksums
def _verified_release_archive(raw: bytes, asset: str) -> dict[str, bytes]:
expected_names = set(_release_bundle_names(asset))
files: dict[str, bytes] = {}
try:
with zipfile.ZipFile(io.BytesIO(raw)) as archive:
entries = archive.infolist()
names = [entry.filename for entry in entries if not entry.is_dir()]
if len(names) != len(entries) or len(names) != len(set(names)):
raise TuiUnavailableError("TUI release archive contains invalid entries")
if set(names) != expected_names:
raise TuiUnavailableError("TUI release archive is incomplete")
for entry in entries:
limit = 150 * 1024 * 1024 if entry.filename == asset else _TUI_RELEASE_LIMITS[
entry.filename
]
if entry.file_size == 0 or entry.file_size > limit:
raise TuiUnavailableError(
f"TUI release file has an invalid size: {entry.filename}"
)
files[entry.filename] = archive.read(entry)
except zipfile.BadZipFile as exc:
raise TuiUnavailableError("downloaded TUI archive is not a valid ZIP file") from exc
checksums = _release_manifest(files["MANIFEST.sha256"], asset)
for name, expected in checksums.items():
if hashlib.sha256(files[name]).hexdigest() != expected:
raise TuiUnavailableError(f"TUI release file failed verification: {name}")
return files
View on GitHub (pinned to 42f37dc4c0)