a11y-computer-use 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- a11y_computer_use-0.1.1/.editorconfig +22 -0
- a11y_computer_use-0.1.1/.github/CODEOWNERS +3 -0
- a11y_computer_use-0.1.1/.github/ISSUE_TEMPLATE/app_compatibility.yml +154 -0
- a11y_computer_use-0.1.1/.github/ISSUE_TEMPLATE/bug_report.yml +188 -0
- a11y_computer_use-0.1.1/.github/ISSUE_TEMPLATE/config.yml +8 -0
- a11y_computer_use-0.1.1/.github/ISSUE_TEMPLATE/feature_request.yml +78 -0
- a11y_computer_use-0.1.1/.github/PULL_REQUEST_TEMPLATE.md +50 -0
- a11y_computer_use-0.1.1/.github/dependabot.yml +23 -0
- a11y_computer_use-0.1.1/.github/workflows/ci.yml +274 -0
- a11y_computer_use-0.1.1/.github/workflows/release.yml +56 -0
- a11y_computer_use-0.1.1/.gitignore +27 -0
- a11y_computer_use-0.1.1/CHANGELOG.md +178 -0
- a11y_computer_use-0.1.1/CITATION.cff +11 -0
- a11y_computer_use-0.1.1/CODE_OF_CONDUCT.md +86 -0
- a11y_computer_use-0.1.1/CONTRIBUTING.md +300 -0
- a11y_computer_use-0.1.1/LICENSE +201 -0
- a11y_computer_use-0.1.1/NOTICE +6 -0
- a11y_computer_use-0.1.1/PKG-INFO +347 -0
- a11y_computer_use-0.1.1/README.md +104 -0
- a11y_computer_use-0.1.1/SECURITY.md +176 -0
- a11y_computer_use-0.1.1/a11y_computer_use/__init__.py +8 -0
- a11y_computer_use-0.1.1/a11y_computer_use/__main__.py +6 -0
- a11y_computer_use-0.1.1/a11y_computer_use/act.py +822 -0
- a11y_computer_use-0.1.1/a11y_computer_use/adapters/__init__.py +22 -0
- a11y_computer_use-0.1.1/a11y_computer_use/adapters/anthropic_computer.py +287 -0
- a11y_computer_use-0.1.1/a11y_computer_use/adapters/base.py +625 -0
- a11y_computer_use-0.1.1/a11y_computer_use/adapters/openai_computer.py +310 -0
- a11y_computer_use-0.1.1/a11y_computer_use/agent.py +396 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena.py +410 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/_cu.js +42 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/_style.css +15 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/checkboxes.html +39 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/checkboxes.json +9 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/copy_value.html +41 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/copy_value.json +9 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/dropdown.html +51 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/dropdown.json +14 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/dropdown_custom.html +73 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/dropdown_custom.json +10 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/form_fill.html +31 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/form_fill.json +9 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/iframe_field.html +36 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/iframe_field.json +10 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/iframe_field_inner.html +34 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/long_list.html +141 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/long_list.json +9 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/menu.html +86 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/menu.json +9 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/modal_confirm.html +60 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/modal_confirm.json +9 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/search_filter.html +52 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/search_filter.json +9 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/similar_buttons.html +38 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/similar_buttons.json +9 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/table_row.html +48 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/table_row.json +9 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/tabs.html +57 -0
- a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/tabs.json +9 -0
- a11y_computer_use-0.1.1/a11y_computer_use/bench.py +116 -0
- a11y_computer_use-0.1.1/a11y_computer_use/capture.py +388 -0
- a11y_computer_use-0.1.1/a11y_computer_use/cli.py +455 -0
- a11y_computer_use-0.1.1/a11y_computer_use/doctor.py +457 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/__init__.py +64 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/_atspi.py +636 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/_atspi_events.py +144 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/_cdp.py +283 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/_cdp_ax.py +292 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/_linux_input.py +379 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/_linux_system.py +351 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/_uia.py +182 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/_win_input.py +114 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/_win_system.py +72 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/base.py +157 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/browser.py +784 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/linux.py +504 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/macos.py +142 -0
- a11y_computer_use-0.1.1/a11y_computer_use/drivers/windows.py +258 -0
- a11y_computer_use-0.1.1/a11y_computer_use/h2h.py +775 -0
- a11y_computer_use-0.1.1/a11y_computer_use/marks.py +65 -0
- a11y_computer_use-0.1.1/a11y_computer_use/observe.py +1555 -0
- a11y_computer_use-0.1.1/a11y_computer_use/overlay.py +283 -0
- a11y_computer_use-0.1.1/a11y_computer_use/providers.py +681 -0
- a11y_computer_use-0.1.1/a11y_computer_use/safety.py +818 -0
- a11y_computer_use-0.1.1/a11y_computer_use/schema.py +528 -0
- a11y_computer_use-0.1.1/a11y_computer_use/server.py +1926 -0
- a11y_computer_use-0.1.1/docs/agent-loop.md +134 -0
- a11y_computer_use-0.1.1/docs/benchmark.md +172 -0
- a11y_computer_use-0.1.1/docs/benchmarks/h2h-2026-09-02-superseded.json +852 -0
- a11y_computer_use-0.1.1/docs/benchmarks/h2h-2026-09-02.json +4938 -0
- a11y_computer_use-0.1.1/docs/benchmarks/h2h-2026-09-02.md +195 -0
- a11y_computer_use-0.1.1/docs/benchmarks/production-2026-09-04.json +322 -0
- a11y_computer_use-0.1.1/docs/benchmarks/production-2026-09-04.md +88 -0
- a11y_computer_use-0.1.1/docs/box-testbed.md +282 -0
- a11y_computer_use-0.1.1/docs/browser-backend.md +120 -0
- a11y_computer_use-0.1.1/docs/ci.md +136 -0
- a11y_computer_use-0.1.1/docs/concurrency.md +109 -0
- a11y_computer_use-0.1.1/docs/decisions/confirmation-gate.md +50 -0
- a11y_computer_use-0.1.1/docs/decisions/demand-validation.md +180 -0
- a11y_computer_use-0.1.1/docs/decisions/language-boundary.md +51 -0
- a11y_computer_use-0.1.1/docs/decisions/phase-0-review.md +58 -0
- a11y_computer_use-0.1.1/docs/decisions/plan-2026-07.md +281 -0
- a11y_computer_use-0.1.1/docs/decisions/stories.json +380 -0
- a11y_computer_use-0.1.1/docs/linux-port.md +92 -0
- a11y_computer_use-0.1.1/docs/observation-cost.md +159 -0
- a11y_computer_use-0.1.1/docs/production.md +127 -0
- a11y_computer_use-0.1.1/docs/provider-adapters.md +234 -0
- a11y_computer_use-0.1.1/docs/windows-port.md +48 -0
- a11y_computer_use-0.1.1/examples/README.md +136 -0
- a11y_computer_use-0.1.1/examples/agent_task.py +52 -0
- a11y_computer_use-0.1.1/examples/anthropic_computer_use.py +114 -0
- a11y_computer_use-0.1.1/examples/inprocess_python.py +47 -0
- a11y_computer_use-0.1.1/examples/mcp_subprocess.mjs +46 -0
- a11y_computer_use-0.1.1/examples/openai_computer_use.py +116 -0
- a11y_computer_use-0.1.1/examples/web_a11y_demo.py +105 -0
- a11y_computer_use-0.1.1/pyproject.toml +93 -0
- a11y_computer_use-0.1.1/tests/__init__.py +0 -0
- a11y_computer_use-0.1.1/tests/conftest.py +190 -0
- a11y_computer_use-0.1.1/tests/e2e/__init__.py +0 -0
- a11y_computer_use-0.1.1/tests/e2e/test_live_smoke.py +174 -0
- a11y_computer_use-0.1.1/tests/e2e/test_mcp_stdio.py +121 -0
- a11y_computer_use-0.1.1/tests/fixtures/.gitkeep +0 -0
- a11y_computer_use-0.1.1/tests/fixtures/__init__.py +0 -0
- a11y_computer_use-0.1.1/tests/fixtures/trees.py +161 -0
- a11y_computer_use-0.1.1/tests/test_act.py +652 -0
- a11y_computer_use-0.1.1/tests/test_adapters.py +793 -0
- a11y_computer_use-0.1.1/tests/test_agent.py +570 -0
- a11y_computer_use-0.1.1/tests/test_arena.py +276 -0
- a11y_computer_use-0.1.1/tests/test_ax_press.py +188 -0
- a11y_computer_use-0.1.1/tests/test_bench.py +63 -0
- a11y_computer_use-0.1.1/tests/test_box_scripts.py +163 -0
- a11y_computer_use-0.1.1/tests/test_browser.py +761 -0
- a11y_computer_use-0.1.1/tests/test_capture.py +234 -0
- a11y_computer_use-0.1.1/tests/test_cdp_reliability.py +293 -0
- a11y_computer_use-0.1.1/tests/test_cli.py +252 -0
- a11y_computer_use-0.1.1/tests/test_doctor.py +304 -0
- a11y_computer_use-0.1.1/tests/test_drivers.py +99 -0
- a11y_computer_use-0.1.1/tests/test_h2h.py +608 -0
- a11y_computer_use-0.1.1/tests/test_linux_desktop_live.py +280 -0
- a11y_computer_use-0.1.1/tests/test_linux_focus_safety.py +155 -0
- a11y_computer_use-0.1.1/tests/test_linux_live.py +310 -0
- a11y_computer_use-0.1.1/tests/test_linux_synthetic.py +385 -0
- a11y_computer_use-0.1.1/tests/test_linux_system_synthetic.py +127 -0
- a11y_computer_use-0.1.1/tests/test_marks.py +59 -0
- a11y_computer_use-0.1.1/tests/test_observe.py +910 -0
- a11y_computer_use-0.1.1/tests/test_overlay.py +36 -0
- a11y_computer_use-0.1.1/tests/test_providers.py +438 -0
- a11y_computer_use-0.1.1/tests/test_runtime_concurrency.py +310 -0
- a11y_computer_use-0.1.1/tests/test_runtime_scroll_safety.py +136 -0
- a11y_computer_use-0.1.1/tests/test_safety.py +415 -0
- a11y_computer_use-0.1.1/tests/test_safety_hardening.py +836 -0
- a11y_computer_use-0.1.1/tests/test_safety_persistence.py +456 -0
- a11y_computer_use-0.1.1/tests/test_scaffold.py +91 -0
- a11y_computer_use-0.1.1/tests/test_server.py +1032 -0
- a11y_computer_use-0.1.1/tests/test_windows_live.py +137 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# EditorConfig: https://editorconfig.org
|
|
2
|
+
root = true
|
|
3
|
+
|
|
4
|
+
[*]
|
|
5
|
+
charset = utf-8
|
|
6
|
+
end_of_line = lf
|
|
7
|
+
insert_final_newline = true
|
|
8
|
+
trim_trailing_whitespace = true
|
|
9
|
+
|
|
10
|
+
[*.py]
|
|
11
|
+
indent_style = space
|
|
12
|
+
indent_size = 4
|
|
13
|
+
|
|
14
|
+
[*.{yml,yaml,json,toml}]
|
|
15
|
+
indent_style = space
|
|
16
|
+
indent_size = 2
|
|
17
|
+
|
|
18
|
+
# Markdown: 2-space list indentation; keep trailing double-space line breaks.
|
|
19
|
+
[*.md]
|
|
20
|
+
indent_style = space
|
|
21
|
+
indent_size = 2
|
|
22
|
+
trim_trailing_whitespace = false
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
name: App compatibility report
|
|
2
|
+
description: An app whose accessibility tree is missing, partial or hostile. Say which roles showed up and whether the vision fallback worked.
|
|
3
|
+
title: "[app-compat] <app> on <platform>"
|
|
4
|
+
labels: ["app-compat"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
This template builds the per-app coverage table. Two signals matter most: what `desktop_snapshot` returned (a full snapshot with no clickable or editable element ends with a line beginning `note: no interactive elements were found`), and whether `screenshot` plus coordinate `click` got the task done when refs could not.
|
|
10
|
+
|
|
11
|
+
Values in a snapshot can contain private text. Redact before you paste. Secure fields never carry a value.
|
|
12
|
+
|
|
13
|
+
- type: input
|
|
14
|
+
id: app_name
|
|
15
|
+
attributes:
|
|
16
|
+
label: App name and version
|
|
17
|
+
placeholder: Telegram 11.2 / Slack 4.40 / LibreOffice Writer 24.8
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
|
|
21
|
+
- type: input
|
|
22
|
+
id: app_id
|
|
23
|
+
attributes:
|
|
24
|
+
label: App identifier
|
|
25
|
+
description: What the permission gate keys on. macOS bundle id, Windows process image name, Linux process comm name, or the CDP target (tab) id of the bound tab for the browser backend (the `id` field of the target in `http://127.0.0.1:9222/json`; paste the page URL as well).
|
|
26
|
+
placeholder: ru.keepcoder.Telegram / slack.exe / soffice.bin / <CDP target id> (https://app.example.com)
|
|
27
|
+
validations:
|
|
28
|
+
required: true
|
|
29
|
+
|
|
30
|
+
- type: dropdown
|
|
31
|
+
id: backend
|
|
32
|
+
attributes:
|
|
33
|
+
label: Backend
|
|
34
|
+
options:
|
|
35
|
+
- macOS (AXUIElement)
|
|
36
|
+
- Windows (UI Automation)
|
|
37
|
+
- Linux X11 or XWayland (AT-SPI2)
|
|
38
|
+
- Linux native Wayland (AT-SPI2)
|
|
39
|
+
- Browser (Chromium over CDP)
|
|
40
|
+
validations:
|
|
41
|
+
required: true
|
|
42
|
+
|
|
43
|
+
- type: dropdown
|
|
44
|
+
id: toolkit
|
|
45
|
+
attributes:
|
|
46
|
+
label: UI toolkit, if you know it
|
|
47
|
+
options:
|
|
48
|
+
- Native (AppKit, SwiftUI, Win32, WinUI, GTK, Qt)
|
|
49
|
+
- Chromium or Electron
|
|
50
|
+
- Custom-drawn (game engine, Flutter, a canvas-drawn client)
|
|
51
|
+
- Java (Swing, JavaFX)
|
|
52
|
+
- Not sure
|
|
53
|
+
|
|
54
|
+
- type: dropdown
|
|
55
|
+
id: scope_tried
|
|
56
|
+
attributes:
|
|
57
|
+
label: Snapshot scopes tried
|
|
58
|
+
description: The handoff note suggests `scope="app"` when `scope="window"` came back empty.
|
|
59
|
+
options:
|
|
60
|
+
- window only
|
|
61
|
+
- app only
|
|
62
|
+
- both window and app
|
|
63
|
+
validations:
|
|
64
|
+
required: true
|
|
65
|
+
|
|
66
|
+
- type: dropdown
|
|
67
|
+
id: tree_state
|
|
68
|
+
attributes:
|
|
69
|
+
label: What did desktop_snapshot return?
|
|
70
|
+
options:
|
|
71
|
+
- Nothing actionable, the handoff note appeared (no clickable or editable element)
|
|
72
|
+
- A shell only (window and groups, no buttons or fields)
|
|
73
|
+
- Partial (some controls present, others missing)
|
|
74
|
+
- Controls present but untitled (no title, description or value, so refs are unusable)
|
|
75
|
+
- A full tree, but actions fail (press returns False, stale_ref, wrong bounds)
|
|
76
|
+
- The snapshot timed out or raised an error
|
|
77
|
+
validations:
|
|
78
|
+
required: true
|
|
79
|
+
|
|
80
|
+
- type: checkboxes
|
|
81
|
+
id: role_coverage
|
|
82
|
+
attributes:
|
|
83
|
+
label: Role coverage
|
|
84
|
+
description: Tick each kind of element that appears in the snapshot with a usable title or value. Role names are the snapshot's lowercase forms.
|
|
85
|
+
options:
|
|
86
|
+
- label: Buttons, menu items and links (button, menuitem, link) with titles
|
|
87
|
+
- label: Text inputs (textfield, textarea, searchfield) marked edit
|
|
88
|
+
- label: Password fields as securetextfield
|
|
89
|
+
- label: Toggles (checkbox, radiobutton) with a checked or unchecked flag
|
|
90
|
+
- label: Lists, tables and outlines (list, table, outline, grid, row, cell)
|
|
91
|
+
- label: Tab groups and toolbars
|
|
92
|
+
- label: Web content (webarea) with children
|
|
93
|
+
- label: Static text and images with titles
|
|
94
|
+
|
|
95
|
+
- type: textarea
|
|
96
|
+
id: snapshot
|
|
97
|
+
attributes:
|
|
98
|
+
label: Snapshot excerpt
|
|
99
|
+
description: The header line `[snap-N] <app> (<scope>)` and enough element lines to show what is missing. Include the trailing note if there was one.
|
|
100
|
+
render: text
|
|
101
|
+
validations:
|
|
102
|
+
required: true
|
|
103
|
+
|
|
104
|
+
- type: dropdown
|
|
105
|
+
id: web_a11y
|
|
106
|
+
attributes:
|
|
107
|
+
label: Chromium or Electron apps only, did the accessibility force-enable help?
|
|
108
|
+
description: On macOS a11y-computer-use sets `AXManualAccessibility` and `AXEnhancedUserInterface` on the app element once per process; on Linux it sets `org.a11y.Status` on the session bus. Set `A11Y_COMPUTER_USE_NO_WEB_A11Y=1` to compare with it off; `examples/web_a11y_demo.py` prints a before and after on macOS.
|
|
109
|
+
options:
|
|
110
|
+
- Not applicable, the app is not Chromium or Electron
|
|
111
|
+
- Yes, the tree populated after the first snapshot
|
|
112
|
+
- Partly, some web content appeared but not the whole page
|
|
113
|
+
- No, the tree stayed empty with the force-enable on
|
|
114
|
+
- Not compared
|
|
115
|
+
|
|
116
|
+
- type: dropdown
|
|
117
|
+
id: vision_fallback
|
|
118
|
+
attributes:
|
|
119
|
+
label: Did the vision fallback work?
|
|
120
|
+
description: The vision path is `screenshot` (downscaled to 1280 px on the long edge by default), `zoom` for a native-resolution crop, then `click` by x and y in display-qualified physical pixels. On macOS it needs the Screen Recording grant; on native Wayland it needs `grim`; on Windows `screenshot` and `zoom` are not implemented yet.
|
|
121
|
+
options:
|
|
122
|
+
- Yes, screenshot plus coordinate click completed the task
|
|
123
|
+
- Partly, the screenshot worked but coordinate clicks landed off target or the app ignored synthetic input
|
|
124
|
+
- No, screenshot failed (permission_denied_screen, unsupported, or NotImplementedError on Windows)
|
|
125
|
+
- Not tried
|
|
126
|
+
validations:
|
|
127
|
+
required: true
|
|
128
|
+
|
|
129
|
+
- type: textarea
|
|
130
|
+
id: actions
|
|
131
|
+
attributes:
|
|
132
|
+
label: Which actions worked and which did not
|
|
133
|
+
description: For example `click(ref)` through the a11y press versus a synthetic click with `A11Y_COMPUTER_USE_AX_CLICKS=0`, `set_value`, `type`, `scroll` with `into_view=true`. Paste the error strings.
|
|
134
|
+
|
|
135
|
+
- type: textarea
|
|
136
|
+
id: native_inspector
|
|
137
|
+
attributes:
|
|
138
|
+
label: What a native accessibility inspector shows
|
|
139
|
+
description: Accessibility Inspector (Xcode) on macOS, Accessibility Insights on Windows, Accerciser on Linux, `chrome://accessibility` for Chromium. Does the native inspector see more than a11y-computer-use did? A screenshot of the inspector helps.
|
|
140
|
+
|
|
141
|
+
- type: textarea
|
|
142
|
+
id: doctor
|
|
143
|
+
attributes:
|
|
144
|
+
label: Output of a11y-computer-use doctor
|
|
145
|
+
render: text
|
|
146
|
+
|
|
147
|
+
- type: checkboxes
|
|
148
|
+
id: checklist
|
|
149
|
+
attributes:
|
|
150
|
+
label: Checklist
|
|
151
|
+
options:
|
|
152
|
+
- label: The pastes above contain no passwords, tokens or private text.
|
|
153
|
+
required: true
|
|
154
|
+
- label: I searched the open and closed issues for this app.
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: A tool call, CLI command or Runtime method did the wrong thing. Include the doctor report, the snapshot excerpt and the audit line.
|
|
3
|
+
title: "[bug] "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for the report. Two things before you start.
|
|
10
|
+
|
|
11
|
+
Redact secrets. The audit log keeps typed text and key chords in the clear unless the field was secure; clipboard writes and secure fields are already written as `[REDACTED]`. Read every paste before you submit.
|
|
12
|
+
|
|
13
|
+
Known gaps are not bugs. Raw coordinate input (click, drag, scroll, key chords) returns `unsupported` on native Wayland by design; ref-based press, `set_value` and typing into a focused field still work there (docs/linux-port.md). A `NotImplementedError` raised from `a11y_computer_use/drivers/windows.py` names the native API that primitive will use and marks a known gap. `window` supports `list` and `raise` only, and `app quit` is not exposed; both raise `ValueError`. For any of these, open a feature request instead.
|
|
14
|
+
|
|
15
|
+
- type: dropdown
|
|
16
|
+
id: backend
|
|
17
|
+
attributes:
|
|
18
|
+
label: Backend
|
|
19
|
+
description: The driver the server ran on. The default is the current OS; `A11Y_COMPUTER_USE_DRIVER=browser` selects the browser backend explicitly.
|
|
20
|
+
options:
|
|
21
|
+
- macOS (AXUIElement, CGEvent)
|
|
22
|
+
- Windows (UI Automation, SendInput)
|
|
23
|
+
- Linux X11 or XWayland (AT-SPI2, XTEST)
|
|
24
|
+
- Linux native Wayland (AT-SPI2 only, WAYLAND_DISPLAY set and no DISPLAY)
|
|
25
|
+
- Browser (Chromium over CDP)
|
|
26
|
+
validations:
|
|
27
|
+
required: true
|
|
28
|
+
|
|
29
|
+
- type: input
|
|
30
|
+
id: os_version
|
|
31
|
+
attributes:
|
|
32
|
+
label: OS and version
|
|
33
|
+
description: For the browser backend, also give the Chromium version and whether it ran headless.
|
|
34
|
+
placeholder: macOS 15.5 / Windows 11 / Ubuntu 24.04 with GNOME on Wayland / Chrome 128 headless
|
|
35
|
+
validations:
|
|
36
|
+
required: true
|
|
37
|
+
|
|
38
|
+
- type: input
|
|
39
|
+
id: app
|
|
40
|
+
attributes:
|
|
41
|
+
label: App under control
|
|
42
|
+
description: The identifier the permission gate keys on. macOS uses the bundle id, Windows the process image name, Linux the process comm name, the browser backend the CDP tab id (paste the page URL as well).
|
|
43
|
+
placeholder: com.apple.finder / notepad.exe / gedit / https://example.com
|
|
44
|
+
validations:
|
|
45
|
+
required: true
|
|
46
|
+
|
|
47
|
+
- type: dropdown
|
|
48
|
+
id: tool
|
|
49
|
+
attributes:
|
|
50
|
+
label: Tool or command
|
|
51
|
+
description: The MCP tool, CLI subcommand or Python entry point that misbehaved.
|
|
52
|
+
options:
|
|
53
|
+
- desktop_snapshot
|
|
54
|
+
- find
|
|
55
|
+
- screenshot
|
|
56
|
+
- zoom
|
|
57
|
+
- click
|
|
58
|
+
- type
|
|
59
|
+
- key
|
|
60
|
+
- scroll
|
|
61
|
+
- drag
|
|
62
|
+
- wait_for
|
|
63
|
+
- act
|
|
64
|
+
- set_value
|
|
65
|
+
- scroll_to_find
|
|
66
|
+
- app
|
|
67
|
+
- window
|
|
68
|
+
- clipboard
|
|
69
|
+
- console (browser backend only)
|
|
70
|
+
- network (browser backend only)
|
|
71
|
+
- a11y-computer-use mcp (server startup or handshake)
|
|
72
|
+
- a11y-computer-use doctor
|
|
73
|
+
- a11y-computer-use snapshot
|
|
74
|
+
- a11y-computer-use run-once
|
|
75
|
+
- a11y-computer-use bench
|
|
76
|
+
- a11y-computer-use agent (the reference agent loop)
|
|
77
|
+
- Python API (server.Runtime, safety, drivers)
|
|
78
|
+
- Not sure
|
|
79
|
+
validations:
|
|
80
|
+
required: true
|
|
81
|
+
|
|
82
|
+
- type: dropdown
|
|
83
|
+
id: error_code
|
|
84
|
+
attributes:
|
|
85
|
+
label: Error code
|
|
86
|
+
description: >-
|
|
87
|
+
The code at the start of the error string, if there was one. Structured errors arrive as
|
|
88
|
+
`<code>: <message> | detail: {...} | hint: ...`; safety refusals as `<verdict>: <reason>`.
|
|
89
|
+
options:
|
|
90
|
+
- stale_ref
|
|
91
|
+
- permission_denied_accessibility
|
|
92
|
+
- permission_denied_screen
|
|
93
|
+
- secure_field
|
|
94
|
+
- focus_changed
|
|
95
|
+
- app_not_found
|
|
96
|
+
- timeout
|
|
97
|
+
- confirmation_declined
|
|
98
|
+
- unsupported
|
|
99
|
+
- needs_permission (a safety verdict, the app has no grant)
|
|
100
|
+
- deny (a safety verdict, deny list or insufficient tier)
|
|
101
|
+
- NotImplementedError
|
|
102
|
+
- ValueError
|
|
103
|
+
- Another traceback (paste it below)
|
|
104
|
+
- No error, the behaviour was wrong
|
|
105
|
+
|
|
106
|
+
- type: input
|
|
107
|
+
id: version
|
|
108
|
+
attributes:
|
|
109
|
+
label: a11y-computer-use version and commit
|
|
110
|
+
description: a11y-computer-use is not published on PyPI, so name the commit you installed from (`git rev-parse --short HEAD`) and the extras you installed.
|
|
111
|
+
placeholder: 0.0.1 at <short sha>, pip install -e '.[dev,browser]'
|
|
112
|
+
validations:
|
|
113
|
+
required: true
|
|
114
|
+
|
|
115
|
+
- type: textarea
|
|
116
|
+
id: doctor
|
|
117
|
+
attributes:
|
|
118
|
+
label: Output of a11y-computer-use doctor
|
|
119
|
+
description: Run `a11y-computer-use doctor` (from a clone, `.venv/bin/a11y-computer-use doctor`) in the same host context that runs the server. On macOS the grants attach to the responsible app, and the report names it. Paste the whole output. If doctor itself fails on your platform, paste that traceback instead.
|
|
120
|
+
render: text
|
|
121
|
+
validations:
|
|
122
|
+
required: true
|
|
123
|
+
|
|
124
|
+
- type: textarea
|
|
125
|
+
id: snapshot
|
|
126
|
+
attributes:
|
|
127
|
+
label: Snapshot excerpt
|
|
128
|
+
description: >-
|
|
129
|
+
The relevant lines of the `desktop_snapshot` or `find` output. Keep the header line
|
|
130
|
+
`[snap-N] <app> (<scope>)` and the element lines around the target ref. If the snapshot ended
|
|
131
|
+
with a line beginning `note: no interactive elements were found`, use the app compatibility
|
|
132
|
+
template instead.
|
|
133
|
+
render: text
|
|
134
|
+
|
|
135
|
+
- type: textarea
|
|
136
|
+
id: steps
|
|
137
|
+
attributes:
|
|
138
|
+
label: Steps to reproduce
|
|
139
|
+
description: The tool calls in order, with their arguments. For `act`, paste the steps list. For the CLI, paste the exact command line.
|
|
140
|
+
placeholder: |
|
|
141
|
+
1. desktop_snapshot(app="com.apple.TextEdit", scope="window")
|
|
142
|
+
2. click(ref="e7", verify=true)
|
|
143
|
+
validations:
|
|
144
|
+
required: true
|
|
145
|
+
|
|
146
|
+
- type: textarea
|
|
147
|
+
id: expected
|
|
148
|
+
attributes:
|
|
149
|
+
label: Expected behaviour
|
|
150
|
+
validations:
|
|
151
|
+
required: true
|
|
152
|
+
|
|
153
|
+
- type: textarea
|
|
154
|
+
id: actual
|
|
155
|
+
attributes:
|
|
156
|
+
label: Actual behaviour
|
|
157
|
+
description: Paste the full error string or traceback, and the `effect:` diff if you used `verify=true`.
|
|
158
|
+
render: text
|
|
159
|
+
validations:
|
|
160
|
+
required: true
|
|
161
|
+
|
|
162
|
+
- type: textarea
|
|
163
|
+
id: audit
|
|
164
|
+
attributes:
|
|
165
|
+
label: Audit log entry
|
|
166
|
+
description: The JSONL line(s) for the failing action. The log is at `~/.a11y-computer-use/audit/<YYYY-MM-DD>.jsonl`, one file per UTC day, and every gated call is written, including refusals. Redact `params.text` and `params.chord` if they contain anything private.
|
|
167
|
+
render: json
|
|
168
|
+
|
|
169
|
+
- type: textarea
|
|
170
|
+
id: environment
|
|
171
|
+
attributes:
|
|
172
|
+
label: Environment variables and host
|
|
173
|
+
description: Any `A11Y_COMPUTER_USE_*` variables in effect and the MCP host that started the server (Claude Code via `claude mcp add`, a Node client, an in-process `server.Runtime`, `a11y-computer-use run-once`, `a11y-computer-use agent`). `A11Y_COMPUTER_USE_AX_CLICKS` and `A11Y_COMPUTER_USE_CONFIRM` are read once when `a11y_computer_use.server` is imported, so they must be set in the host process before it spawns the server.
|
|
174
|
+
placeholder: |
|
|
175
|
+
A11Y_COMPUTER_USE_DRIVER=browser
|
|
176
|
+
A11Y_COMPUTER_USE_CDP_ENDPOINT=http://127.0.0.1:9222
|
|
177
|
+
host = Claude Code
|
|
178
|
+
|
|
179
|
+
- type: checkboxes
|
|
180
|
+
id: checklist
|
|
181
|
+
attributes:
|
|
182
|
+
label: Checklist
|
|
183
|
+
options:
|
|
184
|
+
- label: I searched the open and closed issues for this problem.
|
|
185
|
+
required: true
|
|
186
|
+
- label: The pastes above contain no passwords, tokens or private text.
|
|
187
|
+
required: true
|
|
188
|
+
- label: I reproduced this on the current head of the branch I installed from.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Questions and ideas
|
|
4
|
+
url: https://github.com/Perception-Dynamics-Inc/a11y-computer-use/issues
|
|
5
|
+
about: Search existing issues first. Ask how to embed a11y-computer-use, share an integration, or discuss the roadmap by opening an issue that starts from PLAN.md.
|
|
6
|
+
- name: Security vulnerabilities
|
|
7
|
+
url: https://github.com/Perception-Dynamics-Inc/a11y-computer-use/security/policy
|
|
8
|
+
about: Do not open a public issue for a vulnerability. SECURITY.md describes how to report one privately.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Propose a new tool, a driver primitive, a safety behavior or an integration surface.
|
|
3
|
+
title: "[feature] "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
a11y-computer-use is an embeddable Driver plus an MCP surface: pruned accessibility snapshots, element refs, and a safety layer. PLAN.md section 4 lists what the project deliberately does not build and section 9 lists the roadmap phases. Skim both first so the proposal lands in the right place.
|
|
10
|
+
|
|
11
|
+
- type: textarea
|
|
12
|
+
id: problem
|
|
13
|
+
attributes:
|
|
14
|
+
label: Problem
|
|
15
|
+
description: What are you trying to make an agent do that a11y-computer-use cannot do today? Name the app and the platform.
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
|
|
19
|
+
- type: dropdown
|
|
20
|
+
id: area
|
|
21
|
+
attributes:
|
|
22
|
+
label: Area
|
|
23
|
+
description: Pick every part this touches.
|
|
24
|
+
multiple: true
|
|
25
|
+
options:
|
|
26
|
+
- Observation (desktop_snapshot, find, diff mode, refs and re-resolution)
|
|
27
|
+
- Action (click, type, key, scroll, drag, act, set_value, scroll_to_find, wait_for)
|
|
28
|
+
- Vision path (screenshot, zoom, Set-of-Mark)
|
|
29
|
+
- Safety (tiers, grants, confirmation gate, audit log, secure fields)
|
|
30
|
+
- macOS driver
|
|
31
|
+
- Windows driver
|
|
32
|
+
- Linux driver (AT-SPI2, X11, Wayland)
|
|
33
|
+
- Browser driver (CDP, console, network)
|
|
34
|
+
- MCP surface and host integration
|
|
35
|
+
- CLI (mcp, doctor, snapshot, run-once, bench, agent)
|
|
36
|
+
- Python API (server.Runtime, safety, drivers)
|
|
37
|
+
- Docs and examples
|
|
38
|
+
- Packaging and release
|
|
39
|
+
- Something else
|
|
40
|
+
validations:
|
|
41
|
+
required: true
|
|
42
|
+
|
|
43
|
+
- type: textarea
|
|
44
|
+
id: proposal
|
|
45
|
+
attributes:
|
|
46
|
+
label: Proposed change
|
|
47
|
+
description: For a new MCP tool, give the signature and the safety tier you expect it to gate at (`read`, `click` or `full`). For a driver primitive, name the native API on each backend you know. For a safety change, say what the audit entry should record.
|
|
48
|
+
validations:
|
|
49
|
+
required: true
|
|
50
|
+
|
|
51
|
+
- type: textarea
|
|
52
|
+
id: workarounds
|
|
53
|
+
attributes:
|
|
54
|
+
label: Workarounds you tried
|
|
55
|
+
description: Which existing tools you combined (for example `find` followed by `act`, or `screenshot` followed by a coordinate `click`) and where they fell short.
|
|
56
|
+
|
|
57
|
+
- type: dropdown
|
|
58
|
+
id: backends
|
|
59
|
+
attributes:
|
|
60
|
+
label: Backends this should cover
|
|
61
|
+
multiple: true
|
|
62
|
+
options:
|
|
63
|
+
- macOS
|
|
64
|
+
- Windows
|
|
65
|
+
- Linux (X11 or XWayland)
|
|
66
|
+
- Linux (native Wayland)
|
|
67
|
+
- Browser (CDP)
|
|
68
|
+
- Platform-free core (observe, act, safety, server)
|
|
69
|
+
|
|
70
|
+
- type: checkboxes
|
|
71
|
+
id: checklist
|
|
72
|
+
attributes:
|
|
73
|
+
label: Checklist
|
|
74
|
+
options:
|
|
75
|
+
- label: I checked PLAN.md and the open issues for this idea.
|
|
76
|
+
required: true
|
|
77
|
+
- label: I can help implement it.
|
|
78
|
+
- label: I can test it on the backends selected above.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
What changed and why. Link the issue if there is one.
|
|
4
|
+
|
|
5
|
+
## Platforms touched
|
|
6
|
+
|
|
7
|
+
- [ ] Platform-free core (observe, act, safety, schema, server, cli)
|
|
8
|
+
- [ ] macOS driver (a11y_computer_use/drivers/macos.py and the observe, act, capture modules it delegates to)
|
|
9
|
+
- [ ] Windows driver (a11y_computer_use/drivers/windows.py, _uia, _win_input, _win_system)
|
|
10
|
+
- [ ] Linux driver (a11y_computer_use/drivers/linux.py, _atspi, _linux_input, _linux_system)
|
|
11
|
+
- [ ] Browser driver (a11y_computer_use/drivers/browser.py, _cdp, _cdp_ax)
|
|
12
|
+
- [ ] CI workflow (.github/workflows/ci.yml)
|
|
13
|
+
- [ ] Docs or examples only
|
|
14
|
+
|
|
15
|
+
## Tests run
|
|
16
|
+
|
|
17
|
+
Paste the summary line of each run and name the skips you saw.
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
.venv/bin/pytest -q
|
|
21
|
+
<summary line, for example: N passed, M skipped>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Live runs, where the change touches them:
|
|
25
|
+
|
|
26
|
+
- [ ] macOS live tests ran with the Accessibility and Screen Recording grants held by the test process. Without the grants they skip with "Accessibility TCC grant missing"; `a11y-computer-use doctor` shows the grant state.
|
|
27
|
+
- [ ] Windows live UIA tests: `pytest tests/test_windows_live.py -q -s` on Windows.
|
|
28
|
+
- [ ] Linux live AT-SPI2 tests: `pytest tests/test_linux_live.py` under `xvfb-run` and `dbus-run-session`, the way the linux job in ci.yml runs them.
|
|
29
|
+
- [ ] Browser live tests: `pytest tests/test_browser.py -k live` and `pytest tests/test_arena.py -k live` against a Chromium started with `--remote-debugging-port=9222`, with `A11Y_COMPUTER_USE_CDP_ENDPOINT` pointing at it.
|
|
30
|
+
- [ ] Not applicable, the change has no live path.
|
|
31
|
+
|
|
32
|
+
If a tool was added or removed: `tests/test_server.py` pins the tool list in `EXPECTED_TOOLS`, and `tests/test_browser.py` asserts that `console` and `network` exist only on the browser backend. Update both, and every doc that states the count.
|
|
33
|
+
|
|
34
|
+
## Docs updated
|
|
35
|
+
|
|
36
|
+
- [ ] README.md
|
|
37
|
+
- [ ] docs/ (name the file)
|
|
38
|
+
- [ ] Docstrings and the MCP tool descriptions in a11y_computer_use/server.py
|
|
39
|
+
- [ ] docs/decisions/plan-2026-07.md, where the roadmap status changed
|
|
40
|
+
- [ ] No doc change needed (say why)
|
|
41
|
+
|
|
42
|
+
## Claims
|
|
43
|
+
|
|
44
|
+
- [ ] Every sentence in this PR, its commits and the docs it touches states what is implemented and verified. Anything gated, unsupported, skipped in CI or tested only through a fake transport is labelled that way in the same sentence.
|
|
45
|
+
- [ ] Every number I wrote (tool counts, test counts, token figures, timings) was measured on this branch, and the command that produced it is in this description.
|
|
46
|
+
|
|
47
|
+
## Commits
|
|
48
|
+
|
|
49
|
+
- [ ] Commit messages carry no `Co-Authored-By` or "Generated with" trailers. The message ends at the body.
|
|
50
|
+
- [ ] The branch is rebased on the target branch and CI is green, or the failing job is explained above.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Dependabot keeps the Python dependencies declared in pyproject.toml and the
|
|
2
|
+
# actions used by .github/workflows current. Both ecosystems are checked weekly.
|
|
3
|
+
version: 2
|
|
4
|
+
updates:
|
|
5
|
+
- package-ecosystem: pip
|
|
6
|
+
directory: /
|
|
7
|
+
schedule:
|
|
8
|
+
interval: weekly
|
|
9
|
+
commit-message:
|
|
10
|
+
prefix: deps
|
|
11
|
+
ignore:
|
|
12
|
+
# a11y_computer_use/server.py imports FastMCP from mcp.server.fastmcp, which
|
|
13
|
+
# mcp 2.0 removed; pyproject.toml pins mcp<2 for that reason. Skip the
|
|
14
|
+
# major bump until the import is migrated.
|
|
15
|
+
- dependency-name: mcp
|
|
16
|
+
update-types: ["version-update:semver-major"]
|
|
17
|
+
|
|
18
|
+
- package-ecosystem: github-actions
|
|
19
|
+
directory: /
|
|
20
|
+
schedule:
|
|
21
|
+
interval: weekly
|
|
22
|
+
commit-message:
|
|
23
|
+
prefix: ci
|