{"record":{"id":"fd701c84cfc1e104","repo":"stablyai/orca","slug":"appblocked-app","errorCode":null,"errorMessage":"appBlocked(\"{app}\")","messagePattern":"appBlocked\\(\"(.+?)\"\\)","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"warning","filePath":"native/computer-use-linux/runtime.py","lineNumber":223,"sourceCode":"    return any(value == needle or needle in value for value in haystacks)\n\n\ndef parse_positive_pid(value):\n    return int(value) if value.isdigit() and int(value) > 0 else None\n\n\ndef find_app(query):\n    for app in desktop_apps():\n        if app_matches(app, query):\n            reject_blocked_app(app)\n            return app\n    raise RuntimeError(f'appNotFound(\"{query}\")')\n\n\ndef reject_blocked_app(app):\n    haystacks = [name_of(app).lower()] + [name_of(window).lower() for _, window in windows_for(app)]\n    if any(fragment in value for fragment in BLOCKED_APP_FRAGMENTS for value in haystacks):\n        raise RuntimeError(f'appBlocked(\"{name_of(app)}\")')\n\n\ndef action_labels(node):\n    labels = []\n    count = int(attempt(node.get_n_actions, 0) or 0)\n    for index in range(count):\n        label = str(attempt(lambda i=index: node.get_action_name(i), \"\") or \"\")\n        description = str(attempt(lambda i=index: node.get_action_description(i), \"\") or \"\")\n        value = label or description\n        if value and value not in labels:\n            labels.append(value)\n    return labels\n\n\ndef meaningful_actions(actions):\n    noisy = {\n        \"click\",\n        \"press\",","sourceCodeStart":205,"sourceCodeEnd":241,"githubUrl":"https://github.com/stablyai/orca/blob/1136503c6a231a16dce8f921f6fadb63d181e8db/native/computer-use-linux/runtime.py#L205-L241","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Do not automate password managers — orchestrate credential entry through the OS keychain / extension APIs instead, or have the user paste manually.","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.","There is no opt-out flag by design; do not attempt to bypass BLOCKED_APP_FRAGMENTS."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"# Before find_app, refuse blocked queries client-side\nBLOCKED = ('1password', 'bitwarden', 'dashlane', 'lastpass', 'nordpass', 'proton pass')\nif any(frag in str(query or '').lower() for frag in BLOCKED):\n    raise SystemExit('Refusing to automate a blocked password-manager app.')","typeGuard":"def is_blocked_app_query(query) -> bool:\n    q = str(query or '').lower()\n    return any(frag in q for frag in BLOCKED_APP_FRAGMENTS)","tryCatchPattern":"try:\n    app = find_app(query)\nexcept RuntimeError as exc:\n    if str(exc).startswith('appBlocked('):\n        # do not retry — surface to caller that this app is intentionally blocked\n        raise SystemExit(f'{exc}. Password managers cannot be automated; use the OS keychain.')\n    raise","preventionTips":["Never automate password managers — use the OS keychain / extension APIs.","If a non-blocked app was mis-matched due to a blocked window-title fragment, refine the query to avoid that window.","Do not attempt to bypass BLOCKED_APP_FRAGMENTS — it is a deliberate security guardrail."],"tags":["linux","at-spi","security","blocked-apps","password-manager","guardrail"],"backgroundTag":null,"analyzedSha":"1136503c6a231a16dce8f921f6fadb63d181e8db","analyzedAt":"2026-08-12T23:15:58.167Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}