Skip to content

chore: promote dev to master (update fix + multi-window + coverage + cleanups)#1198

Merged
jaylfc merged 435 commits into
masterfrom
dev
Jun 20, 2026
Merged

chore: promote dev to master (update fix + multi-window + coverage + cleanups)#1198
jaylfc merged 435 commits into
masterfrom
dev

Conversation

@jaylfc

@jaylfc jaylfc commented Jun 20, 2026

Copy link
Copy Markdown
Owner

Promotes the accumulated dev work to master (435 commits) so users can update to it. Jay-authorized promotion.

Headline: fixes the broken in-app update

Also included (highlights)

Health

SPA build green; python suite green (on #1197 off dev). The only red on dev is the ~24 drifted desktop vitest tests (#114), which are tests, not runtime, and have no CI job, so they do not affect the running app.

Dependabot security bumps intentionally excluded (separate pass).

jaylfc and others added 30 commits June 19, 2026 06:57
Cover _unit_for metric mapping, _fake_doc generation, run() result
aggregation (skipped/ok/error/timeout), _run_one error paths,
BackendNotAvailable exception, and all four handler parsing/scoring
functions (_bench_embedding, _bench_reranking, _bench_llm_chat,
_bench_image_generation). Mock time, network, and handler deps.
Add unit tests for shibaclaw_adapter
test: add unit tests for benchmark runner
Add unit tests for AgentGrantsStore
Cover announce, confirm, claim, get_signing_key, record_failed_attempt,
pairing_state, and list_pending with CRUD operations plus edge cases
(missing id, duplicate, expiry, max attempts, uninitialised store).
tests: add unit tests for AuthRequestsStore
tests: add unit tests for ClusterPairingStore
…oute)

shared_folders get called GET /api/shared-folders/{id}, but the backend has no
single-folder GET (only list, files, create, delete, access). Fetch the list and
filter by id, erroring cleanly on an unknown id. Aligned the test fake to return
a bare list from the list endpoint, matching the real API.
…tector.py

Remove unused top-level imports (time, Path, AsyncMock).
Remove superseded monkeypatch on gd.Path.__truediv__ in test_detects_steam_game
that was immediately overridden by the Path replacement on the next line.
Adds a generic installable-PWA shell that any app can opt into via
pwa:true in the app registry. Messages is the first to use it.

- AppManifest gains pwa?: boolean opt-in flag (app-registry.ts)
- messages gets pwa:true as the proven demo app
- app.html + app-standalone-main.tsx + AppStandalone.tsx mirror the
  existing chat PWA trio; the standalone shell reads ?app=<id>,
  validates pwa:true, injects the dynamic manifest link, and mounts
  the app inside InstallPromptBanner
- vite.config.ts: adds app.html as a build entry
- GET /manifest?app=<id> (tinyagentos/routes/manifest.py) returns a
  web app manifest JSON for known pwa-enabled apps; 404 otherwise
- Window.tsx: Install icon button on the right of the title bar for
  pwa:true apps (desktop only); opens /app.html?app=<id> in new tab
- Tests: pwa flag assertions in app-registry.test.ts; AppStandalone
  routing vitest; pytest for the /manifest endpoint (200 shape + 404)
- Use httpx.ConnectError instead of builtin ConnectionError so with_retry
  treats the exception as retryable and actually retries (assert 7 calls)
- Use httpx.Response(503) instead of MagicMock so with_retry's isinstance
  check passes and the retry-on-status path is exercised (assert 7 calls)
- Add httpx import
Force distinct pending_ts values via direct DB update so the ordering
assertion does not depend on time.time() clock granularity.
fix(taosctl): shared_folders get filters list (was hitting a missing route)
tests: clean up unused imports and dead monkeypatch in test_gaming_detector.py
feat(#107): universal standalone-PWA shell (opt-in pwa flag + generic app.html + dynamic manifest + title-bar Install)
test: make test_list_pending_ordered_by_announced_at deterministic
fix: make shibaclaw adapter tests genuinely exercise retry paths
Covers ResourceSnapshot properties, hardware probe functions, ResourceManager
refresh/get_snapshot/yield/reclaim/best_model_for_task/evaluate_migration/
can_accept_job, and low-RAM throttling in _apply_limits. All external
dependencies mocked; 64 tests passing.
AppStandalone called lazy() in the render body, making a new component type each
render and remounting the app (state loss); memoize it per appId. The title-bar
Install button is desktop-only, but mobile has no desktop title bar, so a PWA
app could not be installed from a phone. Add the Install button to the mobile
app title bar (MobileAppWindow) for pwa:true apps; it opens the standalone shell
where the install prompt / Add to Home Screen guide lives.
Add taosctl browsing_history with list and clear verbs wrapping
GET /api/browsing-history and DELETE /api/browsing-history.
Skip the record endpoint (complex Pydantic body).
…ts deterministic

Mock datetime.now in the store module so back-to-back inserts get
distinct, increasing created_ts values. Previously the test relied
on real clock granularity, which is flaky on coarse clocks.
The retry tests exhaust all 7 with_retry attempts, and with_retry backs off with
real asyncio.sleep, so the three tests slept ~31s each (~90s total) in CI. An
autouse fixture makes the backoff instant; the retry COUNT assertions are
unchanged. Suite now runs in well under a second.
fix(#107): memoize standalone lazy (remount bug) + mobile Install button
Add unit tests for resource_manager
feat(taosctl): add browsing_history command group
Remove dead monkeypatch in test_start_returns_entry_with_defaults
test(shibaclaw): mock retry backoff (was sleeping ~90s in CI)
jaylfc added 23 commits June 20, 2026 07:10
Add vitest render test for MigrationBanner component
Add vitest render test for LaunchpadIcon component
Add vitest render test for ModelPickerModal component
Add vitest render test for EmojiPickerField component
test: add vitest tests for use-list-nav hook
Add a vitest test for desktop/src/hooks/use-clock
Add vitest test for use-device-mode hook
Add vitest render test for LoginScreen
test(hooks): add vitest tests for use-focus-trap and getFocusableElements
test: add vitest suite for use-visual-viewport hook
Add vitest test for use-is-pwa hook
test: add vitest test for use-widget-size hook
The in-app Install Update does a git pull, but rebuild_desktop_bundle_if_stale
ran 'npm install', which rewrites desktop/package-lock.json. That left the
tracked lockfile dirty, so the next ff-only pull aborted with 'local changes
would be overwritten by merge' and the update silently failed (reported by a
user on an install that predated the #852 restore).

npm ci installs exactly from the committed lockfile and never rewrites it, so
the tree stays clean for the next pull. Falls back to npm install (then
restores the lockfile) only if ci fails on a package.json/lock mismatch.
fix(update): npm ci so rebuild never dirties package-lock.json (broken in-app update)
@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 →

@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 20, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 260 files, which is 110 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 3bb63af8-4a83-439c-8cac-688949d6641e

📥 Commits

Reviewing files that changed from the base of the PR and between 34d43fa and 4c8efc5.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (260)
  • .gitignore
  • CLA.md
  • CONTRIBUTING.md
  • LICENSE
  • README.md
  • desktop/app.html
  • desktop/node_modules
  • desktop/src/AppStandalone.test.tsx
  • desktop/src/AppStandalone.tsx
  • desktop/src/ChatStandalone.tsx
  • desktop/src/app-standalone-main.tsx
  • desktop/src/apps/AppStudioApp.tsx
  • desktop/src/apps/CodingStudioApp.tsx
  • desktop/src/apps/DesignStudioApp.test.tsx
  • desktop/src/apps/DesignStudioApp.tsx
  • desktop/src/apps/FeedbackApp.test.tsx
  • desktop/src/apps/FeedbackApp.tsx
  • desktop/src/apps/GameStudioApp.tsx
  • desktop/src/apps/MessagesApp.tsx
  • desktop/src/apps/MusicStudioApp.tsx
  • desktop/src/apps/OfficeSuiteApp.test.tsx
  • desktop/src/apps/ProjectsApp/ProjectList.tsx
  • desktop/src/apps/ProjectsApp/ProjectMembers.tsx
  • desktop/src/apps/ProjectsApp/ProjectWorkspace.tsx
  • desktop/src/apps/ProjectsApp/ProjectWorkspacePane.tsx
  • desktop/src/apps/ProjectsApp/ProjectsApp.module.css
  • desktop/src/apps/ProjectsApp/__tests__/ProjectList.empty-state.test.tsx
  • desktop/src/apps/ProjectsApp/board/TaskCardCover.tsx
  • desktop/src/apps/ProjectsApp/index.tsx
  • desktop/src/apps/SettingsApp.tsx
  • desktop/src/apps/SettingsApp/AccountPanel.test.tsx
  • desktop/src/apps/SettingsApp/AccountPanel.tsx
  • desktop/src/apps/appstudio/BuildView.tsx
  • desktop/src/apps/appstudio/TemplatesView.tsx
  • desktop/src/apps/appstudio/build-state.ts
  • desktop/src/apps/appstudio/stream-chat.ts
  • desktop/src/apps/codingstudio/CodeView.tsx
  • desktop/src/apps/designstudio/DesignView.tsx
  • desktop/src/apps/designstudio/MagicView.tsx
  • desktop/src/apps/designstudio/types.ts
  • desktop/src/apps/gamestudio/CreateView.tsx
  • desktop/src/apps/gamestudio/PlayView.tsx
  • desktop/src/apps/gamestudio/create-game.ts
  • desktop/src/apps/gamestudio/game-state.ts
  • desktop/src/apps/gamestudio/match-template.ts
  • desktop/src/apps/musicstudio/ComposeView.tsx
  • desktop/src/apps/officesuite/WriteView.tsx
  • desktop/src/components/CodeBlock.test.tsx
  • desktop/src/components/DockIcon.test.tsx
  • desktop/src/components/DockIcon.tsx
  • desktop/src/components/InstallHelperPanel.test.tsx
  • desktop/src/components/InstallHelperPanel.tsx
  • desktop/src/components/Launchpad.tsx
  • desktop/src/components/LoginGate.test.tsx
  • desktop/src/components/LoginGate.tsx
  • desktop/src/components/NotificationToast.test.tsx
  • desktop/src/components/OffNetworkScreen.test.tsx
  • desktop/src/components/OffNetworkScreen.tsx
  • desktop/src/components/SafetyFloor.test.tsx
  • desktop/src/components/ScreenshotFlash.test.tsx
  • desktop/src/components/TaosAgentCard.test.tsx
  • desktop/src/components/WallpaperTextOverlay.test.tsx
  • desktop/src/components/Window.tsx
  • desktop/src/components/__tests__/DockIcon.context-menu.test.tsx
  • desktop/src/components/__tests__/EmojiPicker.test.tsx
  • desktop/src/components/__tests__/LaunchpadIcon.test.tsx
  • desktop/src/components/__tests__/LoginScreen.test.tsx
  • desktop/src/components/__tests__/MigrationBanner.test.tsx
  • desktop/src/components/__tests__/ModelPickerModal.test.tsx
  • desktop/src/components/mobile/MobileAppWindow.tsx
  • desktop/src/hooks/use-clock.test.ts
  • desktop/src/hooks/use-device-mode.test.ts
  • desktop/src/hooks/use-focus-trap.test.ts
  • desktop/src/hooks/use-is-mobile.test.ts
  • desktop/src/hooks/use-is-pwa.test.ts
  • desktop/src/hooks/use-list-nav.test.ts
  • desktop/src/hooks/use-visual-viewport.test.ts
  • desktop/src/hooks/use-widget-size.test.ts
  • desktop/src/lib/account-client.test.ts
  • desktop/src/lib/account-client.ts
  • desktop/src/lib/agent-browsers.test.ts
  • desktop/src/lib/agent-emoji.test.ts
  • desktop/src/lib/app-event-bus.test.ts
  • desktop/src/lib/browser-site-permissions-api.test.ts
  • desktop/src/lib/channel-admin-api.test.ts
  • desktop/src/lib/chat-attachments-api.test.ts
  • desktop/src/lib/chat-messages-api.test.ts
  • desktop/src/lib/csrf.test.ts
  • desktop/src/lib/framework-api.test.ts
  • desktop/src/lib/github.test.ts
  • desktop/src/lib/hw-detect.test.ts
  • desktop/src/lib/knowledge.test.ts
  • desktop/src/lib/mail.test.ts
  • desktop/src/lib/memory-api.test.ts
  • desktop/src/lib/memory.test.ts
  • desktop/src/lib/models.test.ts
  • desktop/src/lib/personas-api.test.ts
  • desktop/src/lib/platform.test.ts
  • desktop/src/lib/platform.ts
  • desktop/src/lib/projects.test.ts
  • desktop/src/lib/reddit.test.ts
  • desktop/src/lib/slug.test.ts
  • desktop/src/lib/taos-agent-api.test.ts
  • desktop/src/lib/userspace-apps.test.ts
  • desktop/src/lib/utils.test.ts
  • desktop/src/lib/youtube.test.ts
  • desktop/src/registry/app-registry.test.ts
  • desktop/src/registry/app-registry.ts
  • desktop/src/shell/InstallPromptBanner.test.tsx
  • desktop/src/shell/InstallPromptBanner.tsx
  • desktop/src/stores/process-store.test.ts
  • desktop/src/stores/process-store.ts
  • desktop/vite.config.ts
  • docs/STATUS.md
  • landing/index.html
  • pyproject.toml
  • tests/conftest.py
  • tests/projects/test_task_store.py
  • tests/test_agent_grants_store.py
  • tests/test_agent_messages.py
  • tests/test_auth_middleware.py
  • tests/test_auth_requests_store.py
  • tests/test_benchmark_runner.py
  • tests/test_coding_workspaces.py
  • tests/test_desktop_rebuild.py
  • tests/test_docs_only_update.py
  • tests/test_feedback_route.py
  • tests/test_frameworks.py
  • tests/test_gaming_detector.py
  • tests/test_github_identities.py
  • tests/test_group_policy.py
  • tests/test_health_module.py
  • tests/test_install_progress.py
  • tests/test_litellm_config.py
  • tests/test_manifest_route.py
  • tests/test_mentions.py
  • tests/test_notifications_mark_all.py
  • tests/test_notifications_prefs.py
  • tests/test_pairing_store.py
  • tests/test_project_events.py
  • tests/test_project_folders.py
  • tests/test_project_lifecycle.py
  • tests/test_project_storybook.py
  • tests/test_resource_manager.py
  • tests/test_routes_a2a_bus.py
  • tests/test_routes_account_proxy.py
  • tests/test_routes_activity.py
  • tests/test_routes_admin_prompts.py
  • tests/test_routes_agent_archive.py
  • tests/test_routes_agent_auth_requests.py
  • tests/test_routes_agent_debugger.py
  • tests/test_routes_apps.py
  • tests/test_routes_archive.py
  • tests/test_routes_benchmarks.py
  • tests/test_routes_browser_sessions.py
  • tests/test_routes_browsing_history.py
  • tests/test_routes_canvas.py
  • tests/test_routes_catalog.py
  • tests/test_routes_chat_files.py
  • tests/test_routes_cluster_migrate.py
  • tests/test_routes_desktop.py
  • tests/test_routes_events.py
  • tests/test_routes_feedback.py
  • tests/test_routes_framework.py
  • tests/test_routes_games.py
  • tests/test_routes_guides.py
  • tests/test_routes_jobs.py
  • tests/test_routes_knowledge.py
  • tests/test_routes_knowledge_graph.py
  • tests/test_routes_librarian.py
  • tests/test_routes_manifest.py
  • tests/test_routes_memory_management.py
  • tests/test_routes_music.py
  • tests/test_routes_office.py
  • tests/test_routes_project_canvas.py
  • tests/test_routes_service_proxy.py
  • tests/test_routes_shortcuts.py
  • tests/test_routes_skill_exec.py
  • tests/test_routes_system.py
  • tests/test_routes_themes.py
  • tests/test_routes_user_memory.py
  • tests/test_routes_user_personas.py
  • tests/test_routes_userspace_apps.py
  • tests/test_shibaclaw_adapter.py
  • tests/test_system_stats.py
  • tests/test_taosctl.py
  • tests/test_taosctl_apps.py
  • tests/test_taosctl_bookmarks.py
  • tests/test_taosctl_browsing_history.py
  • tests/test_taosctl_canvas.py
  • tests/test_taosctl_client.py
  • tests/test_taosctl_frameworks.py
  • tests/test_taosctl_guides.py
  • tests/test_taosctl_memory.py
  • tests/test_taosctl_models.py
  • tests/test_taosctl_music.py
  • tests/test_taosctl_projects.py
  • tests/test_taosctl_scheduler.py
  • tests/test_taosctl_search.py
  • tests/test_taosctl_shared_folders.py
  • tests/test_taosctl_shortcuts.py
  • tests/test_taosctl_tasks.py
  • tests/test_taosctl_video.py
  • tests/test_task_lifecycle_notifications.py
  • tests/test_task_utils.py
  • tests/test_threads.py
  • tests/test_userspace_seed.py
  • tests/test_userspace_store.py
  • tests/test_webhook_notifier.py
  • tests/test_worker_auth.py
  • tests/userspace/test_broker.py
  • tests/userspace/test_package.py
  • tests/userspace/test_routes.py
  • tests/userspace/test_url_guard.py
  • tinyagentos/app.py
  • tinyagentos/auth_middleware.py
  • tinyagentos/auto_update.py
  • tinyagentos/cli/taosctl/__init__.py
  • tinyagentos/cli/taosctl/__main__.py
  • tinyagentos/cli/taosctl/client.py
  • tinyagentos/cli/taosctl/commands/__init__.py
  • tinyagentos/cli/taosctl/commands/agents.py
  • tinyagentos/cli/taosctl/commands/apps.py
  • tinyagentos/cli/taosctl/commands/auth.py
  • tinyagentos/cli/taosctl/commands/bookmarks.py
  • tinyagentos/cli/taosctl/commands/browsing_history.py
  • tinyagentos/cli/taosctl/commands/canvas.py
  • tinyagentos/cli/taosctl/commands/frameworks.py
  • tinyagentos/cli/taosctl/commands/guides.py
  • tinyagentos/cli/taosctl/commands/jobs.py
  • tinyagentos/cli/taosctl/commands/memory.py
  • tinyagentos/cli/taosctl/commands/models.py
  • tinyagentos/cli/taosctl/commands/music.py
  • tinyagentos/cli/taosctl/commands/projects.py
  • tinyagentos/cli/taosctl/commands/scheduler.py
  • tinyagentos/cli/taosctl/commands/search.py
  • tinyagentos/cli/taosctl/commands/shared_folders.py
  • tinyagentos/cli/taosctl/commands/shortcuts.py
  • tinyagentos/cli/taosctl/commands/tasks.py
  • tinyagentos/cli/taosctl/commands/video.py
  • tinyagentos/cli/taosctl/output.py
  • tinyagentos/coding_workspaces.py
  • tinyagentos/desktop_rebuild.py
  • tinyagentos/feedback_store.py
  • tinyagentos/notifications.py
  • tinyagentos/office_docs.py
  • tinyagentos/projects/task_store.py
  • tinyagentos/routes/__init__.py
  • tinyagentos/routes/account_proxy.py
  • tinyagentos/routes/coding.py
  • tinyagentos/routes/desktop.py
  • tinyagentos/routes/feedback.py
  • tinyagentos/routes/manifest.py
  • tinyagentos/routes/music.py
  • tinyagentos/routes/notifications.py
  • tinyagentos/routes/office.py
  • tinyagentos/routes/projects.py
  • tinyagentos/routes/userspace_apps.py
  • tinyagentos/system_stats.py
  • tinyagentos/userspace/package.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ 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.

@jaylfc jaylfc merged commit 8558555 into master Jun 20, 2026
13 of 14 checks passed
@github-project-automation github-project-automation Bot moved this from Todo to Done in TinyAgentOS Roadmap Jun 20, 2026
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