{"record":{"id":"dba8e8f526a45320","repo":"stablyai/orca","slug":"name-is-required-dba8e8","errorCode":null,"errorMessage":"{name} is required","messagePattern":"(.+?) is required","errorType":"validation","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"native/computer-use-linux/runtime.py","lineNumber":824,"sourceCode":"        raise RuntimeError(f\"{name} must be a positive integer\")\n    if parsed <= 0:\n        raise RuntimeError(f\"{name} must be a positive integer\")\n    return parsed\n\n\ndef require_positive_number(value, name):\n    try:\n        parsed = float(value)\n    except (TypeError, ValueError):\n        raise RuntimeError(f\"{name} must be a positive number\")\n    if not math.isfinite(parsed) or parsed <= 0:\n        raise RuntimeError(f\"{name} must be a positive number\")\n    return parsed\n\n\ndef require_non_empty_string(value, name):\n    if value is None or str(value) == \"\":\n        raise RuntimeError(f\"{name} is required\")\n    return str(value)\n\n\ndef click_at(x, y, button, count, modifiers=None):\n    button = (button or \"left\").lower()\n    buttons = {\"left\": (\"b1p\", \"b1r\"), \"right\": (\"b3p\", \"b3r\"), \"middle\": (\"b2p\", \"b2r\")}\n    if button not in buttons:\n        raise RuntimeError(f\"unsupported mouse button: {button}\")\n    parsed_count = require_positive_integer(1 if count is None else count, \"click_count\")\n    modifier_keys = click_modifier_keys(modifiers)\n    if modifier_keys:\n        modified_click_at(x, y, button, parsed_count, modifier_keys)\n        return\n    down, up = buttons[button]\n    for _ in range(parsed_count):\n        Atspi.generate_mouse_event(round(x), round(y), \"abs\")\n        Atspi.generate_mouse_event(round(x), round(y), down)\n        time.sleep(0.03)","sourceCodeStart":806,"sourceCodeEnd":842,"githubUrl":"https://github.com/stablyai/orca/blob/1136503c6a231a16dce8f921f6fadb63d181e8db/native/computer-use-linux/runtime.py#L806-L842","documentation":"Raised by require_non_empty_string (runtime.py:824) when value is None or str(value) == ''. It is the presence guard for required textual fields. Call sites pass name='key' for press_key and hotkey (runtime.py:1111, 1114) and name='text' for type_text and paste_text (runtime.py:1108, 1117).","triggerScenarios":"Invoking press_key/hotkey with operation['key'] missing, null, or empty; invoking type_text/paste_text with operation['text'] missing, null, or empty string. Only a literally empty string trips this — whitespace-only strings like ' ' pass through.","commonSituations":"An agent template forgets to populate the key/text field; a caller sends {'tool':'press_key'} with no 'key'; a paste_text operation is dispatched with an empty clipboard payload.","solutions":["Always include a non-empty 'key' for press_key/hotkey or 'text' for type_text/paste_text.","Skip dispatching the operation entirely when the relevant field is empty rather than sending it to fail.","If the field is user input, validate non-emptiness in your UI/controller before calling run_operation."],"exampleFix":"// before\n{\"tool\":\"type_text\",\"text\":\"\"}\n// after\n{\"tool\":\"type_text\",\"text\":\"hello\"}","handlingStrategy":"validation","validationCode":"def require_text(value, field):\n    if value is None or str(value).strip() == \"\":\n        raise ValueError(f\"{field} is required\")\n    return str(value)\n\nop = {\"tool\": \"type_text\", \"text\": require_text(raw_text, \"text\")}","typeGuard":"def is_non_empty(value) -> bool:\n    return value is not None and str(value) != \"\"","tryCatchPattern":"try:\n    run_operation(op)\nexcept RuntimeError as e:\n    if \"is required\" in str(e):\n        # skip the action; nothing to type\n        pass\n    else:\n        raise","preventionTips":["Populate 'key' / 'text' fields with non-empty values before dispatch.","Skip operations whose required text/key field is empty rather than sending them.","Validate presence in your controller/UI layer."],"tags":["validation","input-validation","computer-use","python"],"backgroundTag":null,"analyzedSha":"1136503c6a231a16dce8f921f6fadb63d181e8db","analyzedAt":"2026-08-12T23:15:58.167Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}