stablyai/orca · warning · RuntimeError

appBlocked("{app}")

Error message

appBlocked("{app}")

What it means

Raised by reject_blocked_app (runtime.py:220-223), called from find_app immediately after a match. The bridge hard-blocks automation of password-manager apps: BLOCKED_APP_FRAGMENTS (line 40-47) lists '1password', 'bitwarden', 'dashlane', 'lastpass', 'nordpass', 'proton pass'. If any fragment appears (substring match, case-insensitive) in the matched app's name OR any of its window names, the bridge refuses automation and raises appBlocked("<appName>"). This is a deliberate security guardrail, not a config toggle.

Source

Thrown at native/computer-use-linux/runtime.py:223

    return any(value == needle or needle in value for value in haystacks)


def parse_positive_pid(value):
    return int(value) if value.isdigit() and int(value) > 0 else None


def find_app(query):
    for app in desktop_apps():
        if app_matches(app, query):
            reject_blocked_app(app)
            return app
    raise RuntimeError(f'appNotFound("{query}")')


def reject_blocked_app(app):
    haystacks = [name_of(app).lower()] + [name_of(window).lower() for _, window in windows_for(app)]
    if any(fragment in value for fragment in BLOCKED_APP_FRAGMENTS for value in haystacks):
        raise RuntimeError(f'appBlocked("{name_of(app)}")')


def action_labels(node):
    labels = []
    count = int(attempt(node.get_n_actions, 0) or 0)
    for index in range(count):
        label = str(attempt(lambda i=index: node.get_action_name(i), "") or "")
        description = str(attempt(lambda i=index: node.get_action_description(i), "") or "")
        value = label or description
        if value and value not in labels:
            labels.append(value)
    return labels


def meaningful_actions(actions):
    noisy = {
        "click",
        "press",

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Do not automate password managers — orchestrate credential entry through the OS keychain / extension APIs instead, or have the user paste manually.
  2. If a non-blocked app was mis-matched (e.g., a browser whose tab title contained a blocked fragment), refine the query (use pid: or a more specific name) to match the intended app without the blocked window title.
  3. There is no opt-out flag by design; do not attempt to bypass BLOCKED_APP_FRAGMENTS.
Defensive patterns

Strategy: validation

Validate before calling

# Before find_app, refuse blocked queries client-side
BLOCKED = ('1password', 'bitwarden', 'dashlane', 'lastpass', 'nordpass', 'proton pass')
if any(frag in str(query or '').lower() for frag in BLOCKED):
    raise SystemExit('Refusing to automate a blocked password-manager app.')

Type guard

def is_blocked_app_query(query) -> bool:
    q = str(query or '').lower()
    return any(frag in q for frag in BLOCKED_APP_FRAGMENTS)

Try / catch

try:
    app = find_app(query)
except RuntimeError as exc:
    if str(exc).startswith('appBlocked('):
        # do not retry — surface to caller that this app is intentionally blocked
        raise SystemExit(f'{exc}. Password managers cannot be automated; use the OS keychain.')
    raise

Prevention

When it happens

Trigger: find_app matched an app whose name or window title contains a blocked fragment — most directly when the query itself names a password manager (e.g., app='1Password') and the AT-SPI app/window title also contains the fragment. The check runs after a successful match, so even an unrelated match whose windows include a blocked title trips it.

Common situations: Agent attempts to automate credential entry into a password manager (the exact scenario this guard exists to prevent); an app whose window title happens to contain 'lastpass' (e.g., a browser tab titled 'LastPass – My Vault') matched the query.

Related errors


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/fd701c84cfc1e104. Report an issue: GitHub.