🎉 Anna 1.1.0-beta.160 → beta.166 & @anna-ai/cli 0.1.53 — App Folders, Faster Cloud Agent Wakes, Byte-Perfect `tools.invoke` & Mobile Preview in the Dev Harness!

Hey Anna app developers! :waving_hand:

This batch touches the whole journey of your app: how users organize it on their dashboard, how fast the Cloud Agent behind it wakes up, how much disk it gets, how faithfully its data flows through tools.invoke — and how you preview its mobile experience before shipping. Several fixes here trace directly back to your reports, so a big warm thank-you to @HappyLight (#320) and @martindelophy (#296 follow-ups) — your byte-level verification and minimal repros are the gold standard of bug reports. :folded_hands::yellow_heart:

Let’s dive in! :rocket:


:sparkles: New Features

  • :file_folder: iOS-style folders in the Apps view (beta.160) — Users can now organize their installed apps into folders, just like a phone home screen: drag one app onto another to create a folder, drag apps into folder tiles, and reorder/rename/dissolve inside an expanded overlay. Layouts are persisted server-side and sync across devices. For the API-curious: PUT /apps/grid gains a declarative {layout} payload (single-transaction folder create/rename/reorder/dissolve), and the old {ordered} payload keeps working for folder-less layouts. There’s also a new optimistic-locking layout_etag — concurrent edits from two devices now get a clean 409 layout_conflict instead of silently overwriting each other. :locked:

  • :mobile_phone: Chat | Apps parity on anna-mobile (beta.160) — The mobile app’s home screen gains the same Chat/Apps toggle and edits the same server-side layout as the Web dashboard. Apps that haven’t declared mobile support are shown grayed out — one more gentle nudge to go mobile (see the CLI section below for how easy that just got :wink:).

  • :high_voltage: Cloud Agent wakes got seriously faster — and honest (beta.164) — We attacked wake latency on multiple fronts:

    • Sub-second online detection: agent presence transitions are now pushed via pub/sub instead of waiting on polling loops, and the wake poll interval dropped from 1.5s → 0.5s.
    • Login prewarm: opening the dashboard now fire-and-forgets a wake of your suspended agent, hiding the resume time inside your first few seconds of browsing. By the time you (or your users) open an app, the agent is often already there. :person_running:
    • Real wake-stage progress: the wake overlay now shows actual stages (booting → connecting) driven by server events instead of an optimistic carousel. What you see is what’s happening.
    • Mobile wake banner: the mobile app shell gains a lightweight top banner for wake progress (these events used to be silently dropped on mobile), with reconciliation on open, a watchdog, and a Retry on failure.
  • :floppy_disk: Bigger persistent volumes, tiered by plan (beta.163) — Cloud Agent volumes now scale with the subscription: Free 3 GB / Starter 5 GB / Pro 20 GB / Max 100 GB (compute stays 4C/4G across the board). Existing agents are automatically extended on upgrade — never shrunk. More room for your app’s workspace data. :package:

  • :broom: Disk usage transparency & cleanup (beta.163) — The Cloud Agent card on /agents gains a Storage modal showing a per-directory breakdown (workspace / apps / system, with Executa names resolved) plus targeted cleanup. The dashboard chat’s agent indicator also shows a disk-headroom badge with an amber warning under 20% free — so “why is my app failing to write?” is diagnosable at a glance.

  • :microscope: Under the hood — We’ve instrumented the entire wake path (wake samples, cold-boot stage breakdown, P50/P95 dashboards) so wake latency is now a measured, monitored number we hold ourselves accountable to. Expect further tuning driven by real data. :chart_increasing:


:bug: Bug Fixes

  • :package: tools.invoke results are now byte-for-byte intact (beta.165) — reported by @HappyLight in Platform invoke responses are silently truncated at 32,000 characters (#320), with WebP-header math and an exact boundary repro that made the investigation a joy :detective:. A platform-side LLM-context safeguard (per-string 32,000-char truncation + appended advisory text) had leaked into the app-facing invoke path — corrupting HTML and Base64 data URLs while still reporting success, and behaving differently from the local dev harness. Fixed: application data passes through verbatim — no truncation, no appended warnings, ever. If a result genuinely exceeds the transport limit, you now get an explicit, machine-readable result_too_large error carrying the actual size and the allowed maximum, so your app can deterministically fall back to the upload/reference path. Clear transport contract, now documented in the Host API docs: sync tools.invoke result ≤ 4 MiB, tools.invokeAsync result ≤ 256 KB, async args ≤ 64 KiB — no per-field limits. Regression-tested with the exact scenarios from the report. :test_tube:

  • :locked_with_key: “Save all permissions” no longer 400s on capabilities you never declared (beta.161) — surfaced by @martindelophy’s Timeline Studio reports (#308): apps declaring only llm.complete hit Save failed: manifest does not declare agent.session.auto — a dead end, since the offending flag wasn’t even visible in the modal. Root cause: dev installs seeded a generous grant superset, the frontend echoed those stale flags back, and the backend strictly rejected data the platform itself had planted. :sweat_smile: Fixed from both ends: the permissions modal now forces undeclared flags to false, and the server clamps echoed undeclared complete / agent.auto / agent.fixed / inherit_host_tools to false instead of erroring — self-healing existing dirty grants with zero privilege change (runtime authority was always declaration ∩ grant).

  • :ice: Suspended Cloud Agents no longer masquerade as online (beta.166) — When an agent was suspended, its frozen process never got the chance to say goodbye, leaving a 60–90s “fake online” window. During it, tools.invoke and chat would dispatch commands into a frozen machine and time out, and login prewarm would skip the wake it should have triggered. Presence is now cleared the moment a suspend succeeds, so the very next call takes the proper wake path immediately. Fewer mysterious timeouts right after idle periods. :stopwatch:


:toolbox: @anna-ai/cli 0.1.53 — update now!

npm i -g @anna-ai/cli@latest
# or
pnpm add -g @anna-ai/cli@latest
  • :mobile_phone: Mobile preview in the dev harness — the headline: the harness dashboard titlebar gains a :desktop_computer: Desktop / :mobile_phone: Mobile toggle. Switch to Mobile and the app iframe remounts at a phone-sized viewport (390×844) serving your view’s mobile_entry — with production-parity resolution: a mobile_ window source serves mobile_entry, falling back to your regular entry for single responsive bundles, exactly like the platform. Same session, same window — only the served entry and simulated size change.
  • :construction: Same gate as production — if your manifest’s ui.form_factors doesn’t declare "mobile", the toggle is disabled (production would never give you a mobile container, so the harness won’t simulate one). The tooltip tells you why.
  • :printer: anna-app dev prints your mobile entry — mobile-declaring apps see the resolved mobile entry at startup, and a declared-but-missing mobile_entry file now fails fast with a clear error instead of surfacing as a mysterious 404 later.

With anna-mobile’s new Apps view putting mobile-ready apps front and center (and graying out the rest), there’s never been a better moment to add "mobile" to your form_factors — and now you can iterate on it entirely locally. :flexed_biceps:


:puzzle_piece: Compatibility Notes

  • :green_circle: Everything is additive — no manifest or code changes required. Existing apps keep working unchanged.
  • :green_circle: PUT /apps/grid {ordered} payloads keep working for folder-less layouts; layout_etag / base_etag is opt-in (omitting it degrades to last-write-wins as before).
  • :yellow_circle: result_too_large is a new error your app can receive from tools.invoke when a result exceeds 4 MiB — previously this surfaced as a timeout (or worse, truncated “success”). If you produce very large results, handle it by switching to the upload/reference path. It’s retriable: false.
  • :green_circle: Volume tier upgrades apply automatically on subscription changes — extension only, never shrink, no action needed.
  • :green_circle: CLI 0.1.53 is a drop-in update; no new flags required.

:open_mailbox_with_raised_flag: Feedback Welcome!

Organizing your apps into folders? Watching your agent wake in under a second after login? Shipping multi-megabyte invoke results with zero corruption? Previewing your mobile entry without leaving the harness? We’d love to hear how it feels!

Once again, this batch was community-powered: @HappyLight’s forensic #320 report and @martindelophy’s relentless Timeline Studio follow-ups directly shaped what shipped. Detailed reproductions are the fastest path from “bug” to “fixed and regression-tested” — keep them coming! :flexed_biceps:

Happy building! :purple_heart::sparkles: