Skip to content

fix(parity): close iOS/Android/macOS feature & API parity gaps#128

Merged
rafiki270 merged 7 commits into
mainfrom
fix/cross-platform-parity
Jun 14, 2026
Merged

fix(parity): close iOS/Android/macOS feature & API parity gaps#128
rafiki270 merged 7 commits into
mainfrom
fix/cross-platform-parity

Conversation

@rafiki270

Copy link
Copy Markdown
Contributor

Closes the cross-platform parity gaps found by a multi-agent audit of iOS/Android/macOS against the CLI + shared contract + docs. Each gap was resolved toward the newer/canonical implementation; every finding was adversarially verified (Opus + Codex) before and after fixing.

Gaps closed

Navigation — iOS now detects genuine load failures (didFail, ignoring benign NSURLErrorCancelled) without false-positives; macOS gains the same WKWebView failure capture; Android reload returns loadTime; navigate timeout honored on iOS/macOS.
Tabs/DOM — Android tab payloads emit windowId:"main"; Android get-attributes drops the undocumented count.
ScreenshotfullPage now genuinely scroll-and-stitches on all three (iOS/Android previously viewport-only); Android memory-capped + OutOfMemoryError-safe; macOS pixel-accurate Retina stitch; consistent contentHeight/page-relative imageScaleY/truncated metadata.
Storage — Android clipboard hasImage real detection; iOS/macOS cookies honor url/domain; delete-cookies empty-body is a safe no-op everywhere; get-cookies defaults to current-page scope.
Network — Android get-network-log honors type filter, returns summary, adds mimeType/font; status filter is a category (success|error|pending) per contract on all three; since honored everywhere.
AI/MCP — macOS JS dialogs are now real (per-renderer DialogState + WKUIDelegate, no global singleton); ai-catalog/ai-fitness registered on macOS+Android with kelpie_ai_catalog/kelpie_ai_fitness MCP tools + CLI + docs.
Docs — request-interception and geolocation reconciled as unsupported on all platforms (were stale "Android-only").

Verification

  • macOS, iOS, Android: all build clean (xcodebuild/gradle BUILD SUCCEEDED)
  • make lint-swift 0 violations; ktlint clean; CLI 400/400, shared 12/12 tests pass
  • Adversarial Opus + Codex diff review; per-topic re-audit confirms closure

Known follow-ups (not in this PR)

  • iOS LLM annotated-screenshot fullPage is still viewport-only (separate code path)
  • CEF/Chromium JS dialogs not wired (needs an Obj-C++ CefJSDialogHandler bridge)
  • No native unit-test harness exists (only TS has vitest)

🤖 Generated with Claude Code

rafiki270 and others added 7 commits June 14, 2026 00:06
Bring iOS/Android/macOS to functional parity (newer/canonical impl wins):
- nav: iOS load-failure detection (didFail+TIMEOUT); Android reload loadTime; honor navigate timeout on iOS/macOS
- tabs: Android tab payloads emit windowId:"main"
- storage: Android clipboard hasImage real detection; iOS/macOS cookies honor url/domain
- capture: honor fullPage screenshot on Android (full-content draw) and macOS (scroll-stitch)
- dom: Android get-attributes drops undocumented count
- network: Android get-network-log type filter + summary + mimeType/font; status/since filters on all 3
- ai: macOS real JS dialog handling (DialogState + WKUIDelegate); ai-catalog/ai-fitness routes on macOS+Android

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- iOS navigate: ignore NSURLErrorCancelled/FrameLoadInterrupted, clear on new
  provisional nav, only fail when page genuinely didn't load (no false positives)
- macOS navigate: add WKWebView load-failure capture (parity with iOS/Android)
- macOS dialogs: per-renderer DialogState resolved by windowId/tabId (was a
  process-wide singleton that broke multi-window)
- screenshot fullPage: Android scroll-and-stitch + height cap + OutOfMemoryError
  catch (was unbounded bitmap → crash); macOS pixel-accurate CGImage stitch
  (was Retina-incorrect); consistent imageScaleY metadata for full-page
- cookies: align delete-cookies empty-body to safe no-op on all 3; get-cookies
  defaults to current-page scope on iOS/macOS (Android-canonical)
- network: status filter is a category (success/error/pending) per contract,
  not an exact HTTP code; corrected docs/api/devtools.md to match

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…rupted is not a Foundation constant)

The wave-2 nav-failure agents referenced a nonexistent constant, breaking the
macOS (and iOS) Swift build. NSURLErrorCancelled (-999) already covers the
benign superseded/redirect-interrupted/stopLoading cancellations.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ture docs

- iOS screenshot fullPage: port scroll-and-stitch (was takeSnapshot viewport-only,
  never captured beyond the viewport) + page-relative imageScaleY/contentHeight
  metadata, matching Android/macOS
- docs: request-interception and geolocation are unsupported on ALL platforms
  (functionality.md, api/README.md) — were stale "Android-only"
- docs/api/core.md: full-page is scroll-and-stitch on all three platforms
- CEFRenderer comment: per-renderer DialogState (no more shared singleton)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ncile

- screenshot fullPage: emit truncated:false on iOS+macOS so the full-page
  response shape matches Android (which sets it under its height cap)
- docs: geolocation override is unsupported on ALL platforms (browser.md
  caveat + api/README matrix were stale "Android via CDP")

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- screenshot-annotated honors fullPage on iOS/Android/macOS (reuses the shared
  scroll-and-stitch capture; was viewport-only)
- macOS CEF/Chromium JS dialogs wired via CefJSDialogHandler -> per-renderer
  DialogState (alert/confirm/prompt/beforeunload), reaching WKWebView parity
- starter native unit-test harness: XCTest targets (iOS/macOS) + Android JUnit,
  covering CookieScope matching and network status-category/since parsing

Verified: macOS xcodebuild test 35/35, iOS test-build, Android assembleDebug +
testDebugUnitTest, swiftlint 0 violations, adversarial review SHIP.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
….1.11, shared 0.1.2)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@rafiki270 rafiki270 merged commit 6765529 into main Jun 14, 2026
4 checks passed
@rafiki270 rafiki270 deleted the fix/cross-platform-parity branch June 14, 2026 04:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant