Skip to content

fix: replace AX force-casts with safe casts (#7297)#7310

Merged
ashleeradka merged 1 commit into
mainfrom
swarm/client-security/task-4
Feb 23, 2026
Merged

fix: replace AX force-casts with safe casts (#7297)#7310
ashleeradka merged 1 commit into
mainfrom
swarm/client-security/task-4

Conversation

@ashleeradka
Copy link
Copy Markdown
Contributor

@ashleeradka ashleeradka commented Feb 23, 2026

Summary

Replace force-casts (as!) with safe casts (as?) in the AX capture pipeline. Prevents crashes when Accessibility APIs return unexpected types or permissions change mid-session.

Part of #7293.

Changes

  • Replace as! AXUIElement with guard let ... as? AXUIElement in all 3 files
  • Replace as! AXValue with safe cast in AccessibilityTree.swift
  • Use appropriate fallbacks (continue/return nil) for each context

Files Changed

  • clients/macos/vellum-assistant/ComputerUse/AccessibilityTree.swift
  • clients/macos/vellum-assistant/Ambient/AmbientAXCapture.swift
  • clients/macos/vellum-assistant/Features/Voice/DictationContextCapture.swift

Open with Devin

Co-Authored-By: Claude <noreply@anthropic.com>
@ashleeradka ashleeradka self-assigned this Feb 23, 2026
@ashleeradka ashleeradka merged commit 1438d3b into main Feb 23, 2026
@ashleeradka ashleeradka deleted the swarm/client-security/task-4 branch February 23, 2026 23:51
Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 3 additional findings.

Open in Devin Review

ashleeradka pushed a commit that referenced this pull request May 21, 2026
Brings apps/web/src/domains/settings/ to feature parity with the
platform repo's current end state for the billing, storage, and
compute settings surfaces. Covers four "Web App Repo Move" drift
issues that accumulated after settings paths were frozen on May 20:

- LUM-1683: Billing UI reorder + referral stats (platform #7376)
- LUM-1682: Pro billing machine resize + storage card + tier
  selection (platform #7310, #7312, #7323, #7338)
- LUM-1761: Noa's billing UI polish (platform #7462, #7473, #7492)
- LUM-1760: Shaarson's Pro storage/compute UX (platform #7389,
  #7390, #7392, #7395, #7399, #7400, #7403, #7404)

The port targets feature parity, not 1:1 file translation:

- Routing translated from platform's useAppNavigate / next/navigation
  to react-router (useNavigate, useSearchParams) per target conventions.
- Feature flag reads translated from useAppFeatureFlags() context to
  the target's useFeatureFlagStore.use.X() Zustand pattern.
- Component imports redirected to @vellum/design-library and
  @/generated/api.
- Shared hooks/utils that already exist in the target
  (use-billing-portal-session, payment-method-brand) wired up rather
  than recreated.
- Daemon-aware Assistant type from @/assistant/api.js used in place
  of platform's @/lib/assistants/api.

New files:
- assistant-storage-card.tsx (per-assistant Storage card)
- compute-upgrade-card.tsx (rewritten with full machine-size range)
- plan-feature-list.tsx (inline + checklist variants for
  AdjustPlanModal and PlanCard)
- resize-errors.ts (extractResizeError envelope for friendly resize
  failure messaging)
- tier-picker.tsx (Dropdown-driven tier selection for Pro upgrade)
- lib/billing/machine-sizes.ts (TIER_TO_SIZES, SIZE_LABEL,
  SIZE_DESCRIPTION, machineSizeRank shared util)

Deletions (functionality moved to general settings, per-assistant):
- storage-card.tsx
- machine-size-card.tsx
- machine-size-modal.tsx

Other changes:
- onboarding-page.tsx: storage step replaces pvc-readiness polling;
  failures count now gates wizard progression.
- billing-page.tsx: drops storage/machine card mounts; ReferralPanel
  renders unconditionally.
- general-page.tsx: mounts AssistantStorageCard alongside
  ComputeUpgradeCard.
- adjust-plan-modal.tsx: tier-picker + plan-feature-list, dynamic
  LOST_FEATURES via prop, copy and layout polish.
- referralCodes and referralCodesAdmin flags removed from the store
  and dev panel (no longer gated upstream).
- preferences-menu.tsx: drops referralCodes gating so Earn Credits
  always renders.
- design-library dropdown.tsx: DropdownOption.disabled support +
  findEnabledIndex helper for keyboard/click guards (needed by
  tier-picker).

Platform PR #7476 (unify per-assistant cards into a single
ResizeCard) is not yet merged in platform and is therefore not
included; the two-card layout is the current end state.
ashleeradka added a commit that referenced this pull request May 21, 2026
* chore(web): refresh platform.yaml for billing/storage/compute drift port

Pulls the current platform OpenAPI bundle so the regenerated client picks
up assistantsResize, AssistantResizeRequestRequest, provisioned_storage_gib,
selected_storage_gib, and the onboarding/storage endpoint. Prerequisite for
porting the Pro storage/compute UX cluster (LUM-1760) and selected storage
state surfacing (LUM-1682 #7312) from platform to vellum-assistant.

Refs LUM-1683, LUM-1682, LUM-1761, LUM-1760.

* feat(web/settings): port billing/storage/compute drift from platform

Brings apps/web/src/domains/settings/ to feature parity with the
platform repo's current end state for the billing, storage, and
compute settings surfaces. Covers four "Web App Repo Move" drift
issues that accumulated after settings paths were frozen on May 20:

- LUM-1683: Billing UI reorder + referral stats (platform #7376)
- LUM-1682: Pro billing machine resize + storage card + tier
  selection (platform #7310, #7312, #7323, #7338)
- LUM-1761: Noa's billing UI polish (platform #7462, #7473, #7492)
- LUM-1760: Shaarson's Pro storage/compute UX (platform #7389,
  #7390, #7392, #7395, #7399, #7400, #7403, #7404)

The port targets feature parity, not 1:1 file translation:

- Routing translated from platform's useAppNavigate / next/navigation
  to react-router (useNavigate, useSearchParams) per target conventions.
- Feature flag reads translated from useAppFeatureFlags() context to
  the target's useFeatureFlagStore.use.X() Zustand pattern.
- Component imports redirected to @vellum/design-library and
  @/generated/api.
- Shared hooks/utils that already exist in the target
  (use-billing-portal-session, payment-method-brand) wired up rather
  than recreated.
- Daemon-aware Assistant type from @/assistant/api.js used in place
  of platform's @/lib/assistants/api.

New files:
- assistant-storage-card.tsx (per-assistant Storage card)
- compute-upgrade-card.tsx (rewritten with full machine-size range)
- plan-feature-list.tsx (inline + checklist variants for
  AdjustPlanModal and PlanCard)
- resize-errors.ts (extractResizeError envelope for friendly resize
  failure messaging)
- tier-picker.tsx (Dropdown-driven tier selection for Pro upgrade)
- lib/billing/machine-sizes.ts (TIER_TO_SIZES, SIZE_LABEL,
  SIZE_DESCRIPTION, machineSizeRank shared util)

Deletions (functionality moved to general settings, per-assistant):
- storage-card.tsx
- machine-size-card.tsx
- machine-size-modal.tsx

Other changes:
- onboarding-page.tsx: storage step replaces pvc-readiness polling;
  failures count now gates wizard progression.
- billing-page.tsx: drops storage/machine card mounts; ReferralPanel
  renders unconditionally.
- general-page.tsx: mounts AssistantStorageCard alongside
  ComputeUpgradeCard.
- adjust-plan-modal.tsx: tier-picker + plan-feature-list, dynamic
  LOST_FEATURES via prop, copy and layout polish.
- referralCodes and referralCodesAdmin flags removed from the store
  and dev panel (no longer gated upstream).
- preferences-menu.tsx: drops referralCodes gating so Earn Credits
  always renders.
- design-library dropdown.tsx: DropdownOption.disabled support +
  findEnabledIndex helper for keyboard/click guards (needed by
  tier-picker).

Platform PR #7476 (unify per-assistant cards into a single
ResizeCard) is not yet merged in platform and is therefore not
included; the two-card layout is the current end state.

* fix(web/settings): drop stale eslint-disable for react-hooks/exhaustive-deps

The directive was ported from platform, but apps/web's eslint config
does not enable react-hooks/exhaustive-deps, so the unknown rule
trips the report-unused-disable check. The useMemo dependency array
still keys on clientSecret intentionally to retrigger appearance
resolution on each new SetupIntent.

---------

Co-authored-by: Claude <noreply@anthropic.com>
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