Skip to content

Release: dev to master (Image Studio, Game Studio, DeepSeek, store popularity, app redesigns)#938

Merged
jaylfc merged 124 commits into
masterfrom
dev
Jun 15, 2026
Merged

Release: dev to master (Image Studio, Game Studio, DeepSeek, store popularity, app redesigns)#938
jaylfc merged 124 commits into
masterfrom
dev

Conversation

@jaylfc

@jaylfc jaylfc commented Jun 15, 2026

Copy link
Copy Markdown
Owner

Release dev to master. 124 commits since the last master release (#889).

Highlights

  • Image Studio app (Create / Library / Edit) with tier-aware edit backends: IOPaint (CPU/ARM erase + inpaint), Real-ESRGAN upscale, FLUX.1-Fill GPU inpaint/outpaint. Backends auto-register via manifest lifecycle.
  • Game Studio phase 1: offline-AI game maker shell with live three.js preview, fullscreen play with mandatory exit-to-taOS, device preview, mobile support.
  • DeepSeek provider: add DeepSeek in Providers and use it with any framework agent via LiteLLM (api.deepseek.com, v4-pro / v4-flash + legacy ids).
  • Store popularity backend: GitHub-stars popularity, non-blocking and rate-limit-aware, telemetry-ready.
  • App redesigns to the Store/Images design bar: GitHub, Reddit, Messages, Agents, Contacts, Weather, Media Player, Activity; game/terminal chrome tokenized.
  • A2A coordination bus read-only view in Messages; Files right-click context menu (copy/cut/paste/delete/rename).
  • Indigo opt-in third theme; mobile/PWA safe-area fixes across the shell.
  • Secrets injection at deploy: agents receive their granted secrets as env vars (never logged).
  • Catalog install scripts + port hygiene; reproducible Python deps lockfile.

Verification

  • dev CI green (lint, spa-build, tests 3.12 + 3.13).
  • Every constituent PR merged under the tightened gitar gate (each Bug/Security/Edge-Case finding fixed before merge).
  • Clean fast-forward from master, no conflicts, no open WIP PRs on dev.

jaylfc added 30 commits June 14, 2026 14:17
…le (Safari blank windows)

WebKit drops/staleifies backdrop-filter compositing layers while a tab is
hidden and does not rebuild them when it is shown again, so switching back
into taOS leaves frosted-glass surfaces (windows, dock, top bar, the agent
chat panel) blank until something forces a re-composite. The existing
theme-switch repaint (#867) never fires here because rAF is paused while the
tab is hidden.

Extend the same proven nudge to run on visibilitychange (->visible), pageshow
(bfcache restore), and focus. installWebkitRepaintGuards() is idempotent and
wired into both the desktop shell (App.tsx) and the standalone chat PWA
(chat-main.tsx). Adds tests.

Fixes the blank taOS Agent window Jay hit after switching back to the taOS
Safari tab.
…che (bot review)

- Only Safari/WebKit drops backdrop-filter layers on tab-hide, so gate
  installWebkitRepaintGuards() to isWebKit() (AppleWebKit, not Chrome/Edge).
  Chromium/Gecko no longer pay a needless repaint on visibility/focus.
- Drop the blanket focus listener; pageshow now repaints only on bfcache
  restore (persisted=true), not on every normal load.
- Tests: deterministic Safari UA, isWebKit matrix, pageshow persisted vs not,
  order-independent idempotency check.

Refs #891
…-book PDF

The storybook demo's final deliverable is a PDF; no project export existed.

- tinyagentos/projects/storybook.py: pure-Pillow renderer (no new deps) that
  composes a cover + per-page illustration with a caption band into a multi-page
  PDF. System-font probe (DejaVu/macOS) with graceful fallback; cover-fit art,
  word-wrap, placeholder for missing illustrations.
- export_storybook agent tool (project_tools): ownership-checked, resolves page
  image_refs from the workspace generated dir, slug-guards the path, saves to the
  project's files/exports/<slug>.pdf and returns a download url under the existing
  /api/projects/{slug}/files route. Registered in skill_exec + seeded in skills.py.
- agent manual: document export_storybook as the final step of the storybook flow
  (trimmed the image-prompting section to stay under the compiled-manual cap).
- tests: renderer (valid PDF, missing art/empty text, cover default, wrap, fit)
  + the agent tool (renders pdf, requires pages, rejects other users' project).

Refs #37
Several load-time surfaces hardcoded the old indigo brand colour (#1a1b2e and
the #1a1b2e->#252848 gradient) from before the graphite rebrand, so they
flashed indigo/purple before the theme applied, and didn't follow the active
theme afterwards.

- ChatStandalone (chat-pwa root), OnboardingScreen, LoginGate: hardcoded
  indigo bg/gradient -> var(--color-shell-bg), so they match whatever theme is
  active (base token is graphite, so no purple pre-theme; follows indigo/light
  once applied).
- TerminalApp ANSI black + cursorAccent (xterm needs literal hex): indigo ->
  graphite #141415/#1c1c1f.
- index.html theme-color meta (mobile chrome): #1a1b2e -> #141415.

The indigo THEME keeps its colours (builtin-themes / wallpaper defs untouched).
…n) + terminal tracks the theme at runtime

The mobile-PWA purple was in the BACKEND, not the SPA:
- static/manifest-desktop.json + manifest-chat.json: background_color +
  theme_color were indigo (#1a1b2e / #1a1a2e). That is the native PWA splash
  on launch, which no in-app CSS can touch. -> graphite #141415 (dark default).
  (Already-installed PWAs may keep the old splash until reinstalled.)
- routes/auth.py server-rendered login page: indigo gradient + #151625 input +
  purple card -> neutral graphite (it is pre-auth, no theme context, so it
  matches the dark default).
- TerminalApp: xterm theme + container backgrounds were hardcoded indigo
  (#151625). Now built from the active theme's CSS tokens (buildXtermTheme reads
  --color-shell-bg/-text/--color-accent) and re-applied on theme switch, so the
  terminal tracks whatever theme is active at runtime.

Refs #899
…in purple + terminal theme-reactive; PWA reinstall caveat), cross-agent learning #900
…persistent mobile-PWA purple)

The chat PWA has its own entry HTML (desktop/chat.html), separate from
index.html. Its theme-color meta and iOS apple-touch-startup splash background
were still #1a1b2e, so the mobile PWA kept flashing indigo on launch (status
bar + iOS splash) even after the manifest + SPA fixes, and survived reinstall
because it is baked into the served HTML. -> graphite #141415.

Refs #899
…lor-scheme

The desktop index.html had html,body { background: transparent }, so the
browser-default white showed through behind Safari's top status-bar area and
bottom toolbar, and in the safe-area strips (Safari tints its chrome from the
page edge colour). Set the document background to var(--color-shell-bg) with a
graphite fallback + color-scheme: dark on both index.html and chat.html so
Safari renders its UI + safe areas dark and theme-aware.

Refs #899
…ss token + safe-area

MobileSplitView (the chat-pwa mobile header / back-nav bar) used a hardcoded
indigo glass rgba(15,15,30,0.7) -- the purple strip at the top. Add a
--color-shell-bg-glass token (neutral graphite, theme-overridable) and use it,
border via --color-shell-border, and extend the bar's bg up behind the status
bar (paddingTop safe-area-inset-top) so the top strip matches the bar not the
body. Combined with the body -> var(--color-shell-bg) fix, the white Safari
bars, purple top, and bottom dead-space all resolve and follow the theme.

Refs #899 #39
fastapi 0.137.0 broke APIRouter inclusion: app.include_router(router)
contributes none of the router's routes to the app. With the previous
open-ended fastapi>=0.115.0 pin, CI floated to 0.137.0 and create_app()
came up with an empty /api surface, failing every route-registration
test on dev (and cascading to all open PRs). Minimal repro: a 3-route
APIRouter included into a fresh FastAPI app yields zero of its paths
under 0.137.0; 0.136.3 yields all three. Cap to the last good release.
fix(deps): cap fastapi <0.137 (0.137.0 include_router regression)
…sible

fix(theme): repaint backdrop-filter layers on tab-visible (Safari blank windows)
fix(theme): purple/indigo flash on load -> match active theme
feat(projects): export_storybook tool -> illustrated children's-book PDF
…ipts

Every catalog manifest with install.method: script was audited against the
two installer resolution paths (services via ScriptInstaller at the repo
root; agents via the deployer at the manifest dir). 11 entries named an
install script that existed nowhere, so the store offered a broken install
for each.

Wrote real, researched, idempotent install scripts (each based on the
project's official upstream instructions, set -euo pipefail, detect-installed
exit 0, pinned versions/SHA256 for downloads) for 10:
  services: stable-diffusion-cpp, tailscale, wan2gp, lcm-dreamshaper-rknn,
            musicgpt, dify, ltx-video
  agents:   moltis, agent-zero, picoclaw

Also:
- audit-manifests.py: new convention-aware guard that fails when a manifest
  names an install.script that does not resolve on disk (mirrors both
  installer paths; accepts install.package / install.command alternatives).
- moltis manifest: corrected homepage (moltis-ai/moltis 404 -> moltis-org/moltis)
  and license (Apache-2.0 -> MIT) to match the real upstream.
- ltx-video: remapped service port 7861 -> 7862 to clear a collision with
  stable-diffusion-cpp.
- removed rk3588-sd-gpu: upstream is a one-shot research CLI with no
  installable service (no server, TVM-from-unpinned-master, no port), so it
  has no honest install path. Removed the manifest + catalog index entry
  rather than ship a fabricated installer.

Pre-existing, out of scope: the ltx-video MODEL manifest still reports
context_window=0 (unrelated to install scripts).
Correct stale CURRENT STATE: #902 (fastapi <0.137 cap), #891 (Safari),
#899 (theming), #895 (storybook) are MERGED to dev (tip f57edde), not
in flight. master unchanged + gated on Jay. Record #904 (catalog install
scripts), the 3060 freed for taOSmd, the resume pair for the 20:40Z
window, and tasks #35/#40.
…mmon ports

Per the port-hygiene rule (issue #695 / port_allocator.py): apps must not
bind well-known/core/common host ports. The new host-binding services
defaulted to common ports (7860/7861/7864/8882, and dify on 3000 which is
in RESERVED_PORTS). Remapped each script default + manifest port to its
deterministic slot in the managed 30000-40000 pool (matching
allocate_host_port's per-id hash), still overridable via TAOS_<id>_PORT:

  stable-diffusion-cpp 7861 -> 30450    wan2gp     7860 -> 33109
  lcm-dreamshaper-rknn 7864 -> 32275    musicgpt   8882 -> 30264
  dify                 3000 -> 35444    ltx-video  7862 -> 36909
  moltis (MOLTIS_PORT) 3000 -> 32213

Docker/LXC apps already get a high-pool host port from allocate_host_port
(their manifest port is container-internal), so only the host-binding
script/agent defaults needed remapping here.
- ltx-video: pipeline config matched the 13B preset while the installer
  fetches the 2B distilled checkpoint; point it at ltxv-2b-0.9.8-distilled.yaml
  so config and weights agree.
- lcm-dreamshaper, wan2gp: default ref was a moving branch (master/main)
  despite 'pinned' framing; default to the current upstream commit SHA for
  genuine reproducibility (still TAOS_LCM_COMMIT / TAOS_WAN2GP_REF overridable).
- tailscale: the bundled SHA256 of the frequently-rotated install.sh is now
  advisory (warn + proceed over HTTPS) instead of a hard-fail; set
  TAOS_TAILSCALE_INSTALL_SHA256 to enforce a strict pin.
pip/script services run on the host, so their declared port is the
effective bind. Per the port-hygiene rule (issue #695 / port_allocator.py)
these must live in the managed high pool (>= 30000), never on a
reserved/common port.

- Remapped 10 standalone media-gen/TTS store apps off common ports into
  their deterministic high-pool slots (matching allocate_host_port):
  chatterbox-tts 8881->30145, cogvideox 7860->30412, fastsdcpu 7860->37120,
  hunyuanvideo 7860->39378, kokoro-tts-server 8880->36195, mochi-1 7860->37536,
  piper 10200->36534, sd-webui 7860->35685, wan-2-1 7860->36576,
  whisper-cpp 8080->36823.
- audit-manifests.py: new port-hygiene guard that fails when a pip/script
  service declares a reserved or sub-pool host port, with an ALLOWLIST for
  LLM/inference/NPU backends taOS connects to by a hardcoded localhost URL
  (ollama 11434 is referenced in 10 places across resource_manager /
  job_worker / cluster probe; also rkllama, rk-llama-cpp, vllm, llama-cpp,
  mlc-llm, openllm, ezrknpu). Those need a coordinated code+config change to
  move, tracked separately, and are not store apps grabbing a core port.

Stacked on #904 (catalog install scripts), which already remapped the 6
script services it added + removed rk3588-sd-gpu.
fix(catalog): real install scripts for entries that had none
- Sync install-script comments/logs to the remapped high-pool ports
  (header/docstring lines still cited the old 7860/7861/7864/8882/3000
  defaults after the functional remap); ltx-video collision note rewritten
  since ltx-video (36909) and sd-cpp (30450) no longer share a port.
- audit-manifests.py: port-hygiene guard now flags ports above the pool too
  (p >= _POOL_END), not just below _POOL_START, so the check covers the full
  [30000, 40000) window it claims.
- install-tailscale.sh: header + residual-risk comments now describe the
  advisory SHA behaviour (warn + proceed over HTTPS, strict only when
  TAOS_TAILSCALE_INSTALL_SHA256 is set) instead of the old hard-fail claim.
Security review flagged the advisory-by-default SHA check as a supply-chain
integrity downgrade (fail-open). Make it fail-closed: a mismatch aborts. To
handle upstream rotating install.sh, an operator updates the pinned hash
(preferred) or sets TAOS_TAILSCALE_ALLOW_UNPINNED=1 to override one run.
This keeps the secure default while leaving a documented escape hatch, which
also resolves gitar's rotation concern.
fix(catalog): port hygiene for host-binding services + audit guard
jaylfc added 21 commits June 15, 2026 12:51
build(deps): reproducible Python deps via committed lockfile
…tier works on install

The IOPaint and FLUX.1-Fill service manifests had no lifecycle block, so auto_register_from_manifest derived an empty backend_type and added no backends entry on install. With no registered backend the catalog reported no image-editing capability and /api/images/edit, /remove-bg and /upscale returned 503 on every install.

IOPaint also declared type: iopaint, which the flat-format path read as the backend type but with no default_url. Switch it to type: service (the catalog path) and carry the backend type via lifecycle.backend_type, with a local default_url on the deterministic high-pool port. Add the same lifecycle block to flux-fill (still GPU/CUDA gated by its hardware_tiers).

Also populate context_window on the ltx-video model manifest (128, the T5 prompt limit from the diffusers LTX pipeline), the lone audit-manifests.py failure.
fix(catalog): auto-register iopaint + flux-fill edit backends
fix(flux-fill): loopback bind by default
fix(test): safety-regression test failure
fix(images-edit): reliability hardening
feat(game-studio): Game Studio app shell (phase 1)
… (39 apps)

- Add Game Studio (offline-AI game maker, three.js + react-three-fiber)
- Expand Images to Image Studio (Create / Library / Edit, tier-aware backends)
- New Creative Studios feature section
- Add taOS Agent + Browser (Streamed) to bundled apps; DeepSeek to Providers
- Bump bundled-app count 36 to 39 across the doc
* feat(store): popularity backend from GitHub stars, telemetry-ready (#13)

* fix(store): non-blocking rate-limit-aware popularity fetch, strict repo parse

* fix(store): atomic cache persist (temp file + replace)

Prevents popularity-cache corruption if the process crashes mid-write.
Writes to a sibling .tmp then atomically replaces the target.
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@jaylfc jaylfc merged commit cfb0449 into master Jun 15, 2026
12 of 14 checks passed
@github-actions

Copy link
Copy Markdown

👋 Thanks for the PR! This one targets master, which is our
stable branch (it's what live installs track). Please retarget it to
dev — click Edit next to the PR title and change the base
branch dropdown from master to dev. Your commits and any review
carry over, nothing is lost.

See CONTRIBUTING.md for the branch model.

@coderabbitai

coderabbitai Bot commented Jun 15, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@jaylfc, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 1 minute and 31 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: e814b965-3651-423c-bc6b-0818d5cf09a7

📥 Commits

Reviewing files that changed from the base of the PR and between 2122412 and 51eb7b7.

⛔ Files ignored due to path filters (2)
  • desktop/package-lock.json is excluded by !**/package-lock.json
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (124)
  • .github/workflows/ci.yml
  • README.md
  • app-catalog/agents/agent-zero/scripts/install-agent-zero.sh
  • app-catalog/agents/moltis/manifest.yaml
  • app-catalog/agents/moltis/scripts/install-moltis.sh
  • app-catalog/agents/picoclaw/scripts/install-picoclaw.sh
  • app-catalog/catalog.yaml
  • app-catalog/models/ltx-video/manifest.yaml
  • app-catalog/models/snowflake-arctic-embed-s/manifest.yaml
  • app-catalog/services/chatterbox-tts/manifest.yaml
  • app-catalog/services/cogvideox/manifest.yaml
  • app-catalog/services/dify/manifest.yaml
  • app-catalog/services/fastsdcpu/manifest.yaml
  • app-catalog/services/flux-fill/manifest.yaml
  • app-catalog/services/hunyuanvideo/manifest.yaml
  • app-catalog/services/iopaint/manifest.yaml
  • app-catalog/services/kokoro-tts-server/manifest.yaml
  • app-catalog/services/lcm-dreamshaper-rknn/manifest.yaml
  • app-catalog/services/ltx-video/manifest.yaml
  • app-catalog/services/mochi-1/manifest.yaml
  • app-catalog/services/musicgpt/manifest.yaml
  • app-catalog/services/piper/manifest.yaml
  • app-catalog/services/rk3588-sd-gpu/manifest.yaml
  • app-catalog/services/sd-webui/manifest.yaml
  • app-catalog/services/stable-diffusion-cpp/manifest.yaml
  • app-catalog/services/wan-2-1/manifest.yaml
  • app-catalog/services/wan2gp/manifest.yaml
  • app-catalog/services/whisper-cpp/manifest.yaml
  • desktop/chat.html
  • desktop/index.html
  • desktop/package.json
  • desktop/src/App.tsx
  • desktop/src/ChatStandalone.tsx
  • desktop/src/apps/ActivityApp.tsx
  • desktop/src/apps/ChessApp.tsx
  • desktop/src/apps/ContactsApp.tsx
  • desktop/src/apps/CrosswordsApp.tsx
  • desktop/src/apps/FilesApp.tsx
  • desktop/src/apps/GameStudioApp.tsx
  • desktop/src/apps/GitHubApp.module.css
  • desktop/src/apps/GitHubApp.tsx
  • desktop/src/apps/ImagesApp.tsx
  • desktop/src/apps/MediaPlayerApp.tsx
  • desktop/src/apps/MessagesApp.tsx
  • desktop/src/apps/ProvidersApp.tsx
  • desktop/src/apps/RedditApp.css
  • desktop/src/apps/RedditApp.tsx
  • desktop/src/apps/TerminalApp.tsx
  • desktop/src/apps/WeatherApp.tsx
  • desktop/src/apps/agents/AgentRow.tsx
  • desktop/src/apps/chat/A2aBusPanel.tsx
  • desktop/src/apps/gamestudio/CreateView.tsx
  • desktop/src/apps/gamestudio/PlayView.tsx
  • desktop/src/apps/gamestudio/ShareView.tsx
  • desktop/src/apps/gamestudio/templates.ts
  • desktop/src/apps/gamestudio/types.ts
  • desktop/src/apps/gamestudio/useGameScene.ts
  • desktop/src/apps/images/CreateView.tsx
  • desktop/src/apps/images/EditView.tsx
  • desktop/src/apps/images/LibraryView.tsx
  • desktop/src/apps/images/controls.tsx
  • desktop/src/apps/images/types.ts
  • desktop/src/chat-main.tsx
  • desktop/src/components/ContextMenu.tsx
  • desktop/src/components/LoginGate.tsx
  • desktop/src/components/OnboardingScreen.tsx
  • desktop/src/components/SafetyFloor.tsx
  • desktop/src/components/mobile/MobileDock.tsx
  • desktop/src/components/mobile/MobileSplitView.tsx
  • desktop/src/lib/models.ts
  • desktop/src/registry/app-registry.ts
  • desktop/src/stores/__tests__/restore-theme.test.ts
  • desktop/src/stores/__tests__/webkit-repaint.test.ts
  • desktop/src/stores/theme-store.ts
  • desktop/src/theme/__tests__/builtin-themes.test.ts
  • desktop/src/theme/builtin-themes.ts
  • desktop/src/theme/theme-config.ts
  • desktop/src/theme/tokens.css
  • desktop/src/vite-env.d.ts
  • docs/STATUS.md
  • docs/agent-manual/09-os-control.md
  • docs/agent-manual/10-image-prompting.md
  • docs/taos-agent-manual.md
  • pyproject.toml
  • scripts/audit-manifests.py
  • scripts/install-dify.sh
  • scripts/install-flux-fill.sh
  • scripts/install-iopaint.sh
  • scripts/install-lcm-dreamshaper.sh
  • scripts/install-ltx-video.sh
  • scripts/install-musicgpt.sh
  • scripts/install-sd-cpp.sh
  • scripts/install-tailscale.sh
  • scripts/install-wan2gp.sh
  • static/manifest-chat.json
  • static/manifest-desktop.json
  • tests/routes/test_store_popularity_route.py
  • tests/test_a2a_bus.py
  • tests/test_config_auto_register.py
  • tests/test_deploy_secrets.py
  • tests/test_project_tools.py
  • tests/test_routes_images_edit.py
  • tests/test_routes_user_workspace.py
  • tests/test_store_popularity.py
  • tests/test_storybook_pdf.py
  • tinyagentos/app.py
  • tinyagentos/backend_adapters.py
  • tinyagentos/deployer.py
  • tinyagentos/projects/storybook.py
  • tinyagentos/providers/__init__.py
  • tinyagentos/routes/__init__.py
  • tinyagentos/routes/a2a_bus.py
  • tinyagentos/routes/agents.py
  • tinyagentos/routes/auth.py
  • tinyagentos/routes/images_edit.py
  • tinyagentos/routes/providers.py
  • tinyagentos/routes/skill_exec.py
  • tinyagentos/routes/store.py
  • tinyagentos/routes/user_workspace.py
  • tinyagentos/scheduler/backend_catalog.py
  • tinyagentos/skills.py
  • tinyagentos/store_popularity.py
  • tinyagentos/themes/schema.py
  • tinyagentos/tools/project_tools.py
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

1 participant