Skip to main content

Documentation Index

Fetch the complete documentation index at: https://ade-app.dev/docs/llms.txt

Use this file to discover all available pages before exploring further.

v1.1.8 lands three PRs since v1.1.7: an Electron Viewer surface that wires app control + sessions + chat together, a Mobile Models Registry that groups Droid alongside the existing Claude/Codex/Cursor tabs and adds a runtime-environment banner to the chat system prompt, and a wide performance optimization pass across the desktop main process and renderer (caching, dedupe, IPC bridge cleanup, lifecycle correctness). Ships in TestFlight build 10 of 1.1.1.

Desktop

A profile-driven cleanup of CPU/memory/IPC/render hot paths uncovered while running the Electron app under stress. No product-behavior changes — just removing waste, polling, avoidable re-renders, redundant IPC, log spam, and tightening lifecycle/contracts that showed up under load.
  • Auth detection. aiIntegrationService and authDetector now dedupe + cache auth lookups, with a shallowCliAuth fast path. refreshOpenCodeInventory opts into the full pass automatically (shallowCliAuth = !shouldProbeCliModels) so a refresh never reuses stale Cursor/Droid auth state. Tests expanded.
  • IPC surface hardening. registerIpc.timePhase takes a thunk now (Promise.resolve().then(...).catch(...)) so synchronous throws degrade to []/null fallbacks instead of failing whole snapshot calls. Adds validation + redaction across the lane / suggestions / status surface.
  • Preload bridge cleanup. preload.ts reorganized end-to-end. createShortIpcCache captures the request reference and only nulls promise when it still equals our request, so a force: true call no longer races a stale .finally. createKeyedShortIpcCache is now bounded (KEYED_IPC_CACHE_MAX_ENTRIES = 256, touch-on-access LRU) so high-cardinality keys (image paths, session ids, diff args) can’t grow monotonically across long sessions. IPC fanouts wrap each subscriber in try/catch so one throwing renderer doesn’t starve later subscribers, and the agentChatEvent fanout invalidates agentChatSummaryCache in beforeDispatch so background events don’t get a 1s-stale cached summary.
  • PTY lifecycle. ptyService.onData early-returns on entry.disposed so late chunks can’t mutate post-teardown state, re-arm the pending-data timer, or emit ptyData after ptyExit.
  • Lanes services. autoRebaseService adds a hasAuthoritativeLaneSet guard so the missing-parent prune only fires when the caller didn’t supply a lane subset — no more wiped statuses for lanes outside the requested slice. rebaseSuggestionService normalizes primary lane refs via branchNameFromLaneRef before building origin/<branch>, and the suggestions cache + in-flight promise are now scoped to default-shape requests only (force, lanes-subset, and refreshRemoteTracking bypass the shared cache).
  • Memory + sync. syncService force: true bypasses the cached value but still rides the in-flight dedupe promise — overlapping callers no longer kick off redundant computeTransferReadiness() runs. memoryService.evaluateWriteGate keeps the tier IN (1, 2) filter on its dedupe scan, so candidate-tier-3 episodes are preserved across addCandidateMemory callers (procedural promotion needs each distinct episode). embeddingService / embeddingWorkerService worker shutdown is fixed, and knowledgeCaptureService low-signal regexes now also require !hasDurablePrFeedbackSignals && wordCount < 10, so “Thanks, but always X…” style guidance is preserved instead of being dropped as courtesy text.
  • Project icon resolver. Negative icon lookups no longer cache misses without an invalidation signal — a freshly added src/app/icon.png or public/favicon.svg is picked up on the next call.
  • Renderer. AppShell, TopBar, TabNav, ChatGitToolbar, AgentChatPane, AgentChatComposer, LanesPage, WorkspaceGraphPage, TerminalView, and PaneTilingLayout cut polling, log spam, and avoidable re-renders. WorkspaceGraphPage.refreshGraphLanes keeps includeStatus: true (and skips the heavier conflict/rebase phases instead) so dirty/behind chips stay current without paying for a full snapshot. appStore slice cleanup + tests; terminalAttention lifecycle correctness.
  • Optimize skill. .claude/commands/optimize.md lands as the /optimize skill that drove this pass.

iOS

The Work model picker gets a Droid provider group, tighter reasoning-effort UX, and family-first provider routing.
  • Droid provider tab. WorkModelCatalog registers a Droid group with Anthropic / OpenAI / Google / Factory sub-providers. provider == "factory" now maps into the droid group key, so Factory-provider models (glm-*, kimi-*, minimax-*) land in the Droid group instead of forming a separate one.
  • Reasoning-effort row dropped. The standalone segmented row is gone; gpt-5 mini exposes only medium / high. Tapping the header of a reasoning-capable card commits the model with effort: nil (server default) instead of forcing a tier pill — users who don’t care about effort aren’t required to pick one.
  • Single-provider filter rows hidden. Claude and Codex tabs no longer render redundant single-provider filter rows.
  • Family-first routing. Droid provider routing prefers family over ID substring matches, so an Anthropic model whose ID happens to contain “codex” still resolves to the anthropic bucket. Substring fallbacks only run when family is empty.
  • Effort normalization. WorkModelPickerSheet normalizes currentReasoningEffort the same way as the incoming effort before diffing, avoiding spurious “changed” comparisons from casing/whitespace drift.