Commit graph

106 commits

Author SHA1 Message Date
Jake Rosoman
88fec35f5f fix(ffi): use dynamic error codes and fix Box::from_raw UB in action result 2026-04-06 14:21:50 +10:00
Jake Rosoman
3cd32d49ef feat(ffi): copy generated header to include/ for distribution 2026-04-06 14:17:23 +10:00
Jake Rosoman
bae931d7c5 style(ffi): apply rustfmt formatting 2026-04-06 14:16:09 +10:00
Jake Rosoman
ecba145827 feat(ffi): add surfaces list and get_tree FFI 2026-04-06 14:14:55 +10:00
Jake Rosoman
15115149a5 feat(ffi): add screenshot capture and image buffer 2026-04-06 14:13:27 +10:00
Jake Rosoman
2adcbb4cc0 feat(ffi): add clipboard, mouse, and drag FFI functions 2026-04-06 14:12:05 +10:00
Jake Rosoman
297dfeb3e6 feat(ffi): add window list, focus, and operations 2026-04-06 14:10:33 +10:00
Jake Rosoman
42c61ff0c1 feat(ffi): add action types, execute_action, resolve_element 2026-04-06 14:08:50 +10:00
Jake Rosoman
80b0e1fbf4 feat(ffi): add app lifecycle FFI functions 2026-04-06 14:06:22 +10:00
Jake Rosoman
34b04e16bc feat(ffi): add tree flattening with depth-first AdNodeTree 2026-04-06 14:04:59 +10:00
Jake Rosoman
b0e42c13a2 feat(ffi): add adapter lifecycle and permissions check 2026-04-06 14:02:09 +10:00
Jake Rosoman
272071b133 feat(ffi): add thread-local error handling with C accessors 2026-04-06 14:00:01 +10:00
Jake Rosoman
c724bc4892 feat(ffi): add primitive, window, app, surface C types with conversions 2026-04-06 13:57:14 +10:00
Jake Rosoman
920e7ef719 feat: scaffold ffi crate with cbindgen 2026-04-06 13:53:27 +10:00
Lahfir
ccc734ecbc docs: add surface-first snapshot rule for overlays
When a sheet, alert, popover, or menu is open, agents should snapshot
the specific surface instead of the full window. Background refs are
irrelevant while an overlay has focus and waste tokens.
2026-03-03 12:34:50 -08:00
github-actions[bot]
eb607e2b8e
chore(main): release 0.1.11 (#17)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-03 09:54:25 -05:00
Lahfir
39b2bc6348 fix: show skill install prompt on all success paths
promptSkillInstall() was only called after fresh download. Now also
shows when binary already exists or comes from AGENT_DESKTOP_BINARY_PATH.
2026-03-03 06:50:02 -08:00
github-actions[bot]
ceb02470c1
chore(main): release 0.1.10 (#16)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-03 09:23:49 -05:00
Lahfir
208af12459 fix: add clawhub login step before sync in CI
clawhub CLI requires explicit login, env var alone is not enough.
2026-03-03 06:22:06 -08:00
github-actions[bot]
4abb4b9484
chore(main): release 0.1.9 (#15)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-03 09:19:22 -05:00
Lahfir
97665203a4
feat: scalable skill architecture with ClawHub auto-publishing (#14)
* feat: restructure skills for ClawHub publishing with CI auto-publish

- Sync core skill to 54 commands (add notification commands)
- Move macOS skill from .claude/skills/ to git-tracked skills/
- Extract Notification Center section to references/notifications.md
- Add ClawHub metadata (version, tags, requirements) to all SKILL.md
- Remove macos.md from core skill (moved to platform skill)
- Create scripts/link-skills.sh for local dev symlinks
- Add publish-skills CI job to release.yml (ClawHub auto-publish)
- Add skill install prompt to npm postinstall

* refactor: consolidate macOS into single agent-desktop skill

Merge agent-desktop-macos back into agent-desktop/references/macos.md
as a single publishable skill. Includes Notification Center content
inline rather than as a separate reference file.
2026-03-03 06:16:15 -08:00
Lahfir
b8149816b7
Merge pull request #13 from lahfir/release-please--branches--main--components--agent-desktop
chore(main): release 0.1.8
2026-03-01 00:56:57 -08:00
github-actions[bot]
b53a545dc9
chore(main): release 0.1.8 2026-03-01 08:36:36 +00:00
Lahfir
4a300c8cb0 feat: implement --compact flag to collapse single-child unnamed nodes
Activate the existing --compact CLI flag (previously a no-op) to reduce
tree verbosity by collapsing pass-through container nodes that carry no
semantic information (no ref, no name, no value, no description, no
states, exactly one child).

Slack with -i --compact: 264 → 214 nodes, ~5,967 → ~5,117 tokens (14%
reduction). All 161 refs preserved. Finder unaffected (3% reduction).

Handles Electron's empty-string-vs-None pattern using is_none_or.
2026-03-01 00:36:20 -08:00
Lahfir
a19c1b5132 feat: add electron/web app compatibility for accessibility tree traversal
Skip depth budget for non-semantic AXGroup/AXGenericElement wrappers with
empty name and value, allowing default --max-depth 10 to find 100+ refs
in Electron apps like Slack and VS Code (previously found only 3).

Raise resolver search depth from 20 to ABSOLUTE_MAX_DEPTH (50) so ref
resolution succeeds for deeply nested Electron elements.

Fix surface detection to check if focused window itself is the target
surface (Electron reports dialogs as focused window, not as children)
and check both AXRole and AXSubrole for surface matching.

Update Phase 2 (Windows) and Phase 3 (Linux) docs with equivalent
web/Electron compatibility patterns for their respective APIs.
2026-02-28 19:03:11 -08:00
Lahfir
4d9daeadce
Merge pull request #12 from lahfir/release-please--branches--main--components--agent-desktop
chore(main): release 0.1.7
2026-02-27 16:25:21 -08:00
github-actions[bot]
614f82bedc
chore(main): release 0.1.7 2026-02-28 00:24:51 +00:00
Lahfir
b1fd368f19
Merge pull request #11 from lahfir/feat/notification-management-macos
feat: add notification management commands (macOS)
2026-02-27 16:24:35 -08:00
Lahfir
37c05cfaf4 chore: add skills-lock.json to gitignore 2026-02-27 16:18:01 -08:00
Lahfir
25a16be888 chore: remove accidentally committed files 2026-02-27 16:17:00 -08:00
Lahfir
3dd9081e81 style: fix formatting in nc_session.rs 2026-02-27 16:16:40 -08:00
Lahfir
3881bc82bd fix(macos): restore frontmost app after notification center interaction
NcSession now captures the frontmost application before opening
Notification Center and reactivates it on close, preventing the
source app (e.g. Script Editor) from stealing focus during dismiss.
2026-02-27 14:30:31 -08:00
Lahfir
27ef4f34c0 fix(macos): remove AXPress from dismiss action list
AXPress "clicks" the notification body (opening the source app) but
does not actually dismiss it. Removing it from the initial action list
forces the code to fall through to the hover-and-close-button strategy,
which reliably removes the notification from Notification Center.
2026-02-27 14:25:15 -08:00
Lahfir
8aa672c668 refactor: resolve code review findings from notification PR
- fix(core): wait --notification uses index-diff detection instead of
  count, passes text filter, checks deadline before sleep
- fix(core): dismiss-all-notifications uses single NC session with
  batch adapter method and reports individual failures
- refactor(macos): extract dismiss_entry helper to eliminate duplicate
  dismiss logic between single and batch operations
- refactor(macos): restrict nc_session visibility to pub(crate), use
  absolute paths for pgrep/osascript, add bounded wait with kill
  fallback
- refactor(macos): single-pass is_notification_group check using
  matches! macro
- refactor: extract notification CLI args and dispatch into separate
  files to keep cli_args.rs and dispatch.rs under 400 LOC
- refactor: rename DismissAllNotificationsArgs to
  DismissAllNotificationsCliArgs for consistency
- fix(core): remove unused timestamp field from NotificationInfo
- fix: remove poll_interval_ms from wait command (hardcode 500ms)
- docs: update phases.md with completed notification status and
  cross-platform reference notes
2026-02-27 12:42:46 -08:00
Lahfir
844e964b82 docs: update phases with notification and tray trait methods 2026-02-27 11:57:18 -08:00
Lahfir
de651737f1 refactor(macos): headless-first dismiss with cursor as last resort
Try AXDismiss/AXRemoveFromParent/AXPress on the notification group
element before falling back to cursor hover. Extract try_dismiss_button
helper. Cursor-based hover only triggers if all headless strategies
fail.
2026-02-27 11:37:47 -08:00
Lahfir
979758538f fix(macos): use pgrep and async osascript for NC lifecycle
CGWindowList requires Screen Recording permission on macOS Sequoia to
read other processes' window names, and SystemUIServer blocks AX access
to its menu bar (crashes with Obj-C foreign exception). Switch to pgrep
for PID lookup and osascript clicking ControlCenter's Clock menu bar
item, spawned async to avoid blocking.
2026-02-27 11:33:36 -08:00
Lahfir
2374330bb1 test: add notification error and filter matching tests
Add error code serialization and notification_not_found tests in core.
Add matches_filters unit tests in macOS list module covering app,
text, combined, and no-filter cases.
2026-02-27 10:53:15 -08:00
Lahfir
53d697d522 feat(macos): implement dismiss and notification action commands
Dismiss synthesizes mouse hover to reveal close button (Sequoia), then
finds and AXPress it. Falls back to AXPress on notification group.
Notification action finds matching AXButton by name and presses it.
Both reuse shared list_entries for AX element access.
2026-02-27 10:51:13 -08:00
Lahfir
53549a384e feat(macos): implement notification list via AX tree traversal
Traverses NC's AX tree to extract notification info (app, title, body,
actions). Handles variable nesting depth across Sonoma/Sequoia via
recursive heuristic matching. Supports --app, --text, and --limit
filters applied during traversal for early termination.
2026-02-27 10:47:36 -08:00
Lahfir
0d55c21de0 feat(macos): add NC session RAII guard and notification adapter wiring
Implements NcSession for safe Notification Center lifecycle management
(open via AX press on clock, close via Escape, with Drop fallback).
Wires list_notifications, dismiss_notification, and notification_action
adapter methods to placeholder stubs pending Phase 3/4 implementation.
2026-02-27 10:45:25 -08:00
Lahfir
c5b05bab60 feat: add notification command types, adapter trait, and CLI wiring
Core types (NotificationInfo, NotificationFilter), 3 adapter methods
with not_supported defaults, NotificationNotFound error code, 4 command
handlers, CLI args with index>=1 validation, dispatch arms, wait
--notification extension, and batch_dispatch split to stay under 400 LOC.
2026-02-27 10:40:07 -08:00
Lahfir
03268ce18e docs: add comprehensive phase roadmap 2026-02-25 01:50:57 -08:00
Lahfir
50335f4576 chore: remove internal docs from tracking and fix gitignore 2026-02-24 06:24:26 -08:00
Lahfir
a73fe2e6c1 docs: add architecture diagram to README 2026-02-24 06:22:52 -08:00
Lahfir
74f2c4f977 docs: rewrite README for clarity and add npm installation 2026-02-24 06:01:57 -08:00
Lahfir
38633518e3
Merge pull request #10 from lahfir/release-please--branches--main--components--agent-desktop
chore(main): release 0.1.6
2026-02-24 05:56:49 -08:00
github-actions[bot]
5a0adb7fd6
chore(main): release 0.1.6 2026-02-24 13:56:03 +00:00
Lahfir
d4197e8f6f fix: handle null bounds in refmap and improve sidebar click resolution
Rect deserialization now tolerates null/missing fields (defaults to 0.0),
preventing corrupt refmaps from breaking all subsequent click commands.
read_bounds rejects NaN/Inf at the source. Sidebar cells now resolve via
parent row AXSelected instead of falling through to CGClick. Extracted
chain step functions into chain_steps.rs to stay within 400 LOC limit.
2026-02-24 05:55:44 -08:00
Lahfir
a33b86649c
Merge pull request #9 from lahfir/release-please--branches--main--components--agent-desktop
chore(main): release 0.1.5
2026-02-23 04:43:39 -08:00