screenhand 0.2.0 → 0.3.1
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.
- package/README.md +165 -446
- package/bin/darwin-arm64/macos-bridge +0 -0
- package/dist/mcp-desktop.js +3615 -400
- package/dist/scripts/export-help-center.js +112 -0
- package/dist/scripts/marketing-loop.js +117 -0
- package/dist/scripts/observer-daemon.js +288 -0
- package/dist/scripts/orchestrator-daemon.js +399 -0
- package/dist/scripts/threads-campaign.js +208 -0
- package/dist/src/community/fetcher.js +109 -0
- package/dist/src/community/index.js +6 -0
- package/dist/src/community/publisher.js +191 -0
- package/dist/src/community/remote-api.js +121 -0
- package/dist/src/community/types.js +3 -0
- package/dist/src/community/validator.js +95 -0
- package/dist/src/context-tracker.js +489 -0
- package/dist/src/ingestion/coverage-auditor.js +233 -0
- package/dist/src/ingestion/doc-parser.js +164 -0
- package/dist/src/ingestion/index.js +8 -0
- package/dist/src/ingestion/menu-scanner.js +152 -0
- package/dist/src/ingestion/reference-merger.js +186 -0
- package/dist/src/ingestion/shortcut-extractor.js +180 -0
- package/dist/src/ingestion/tutorial-extractor.js +170 -0
- package/dist/src/ingestion/types.js +3 -0
- package/dist/src/jobs/manager.js +82 -14
- package/dist/src/jobs/runner.js +138 -15
- package/dist/src/learning/engine.js +356 -0
- package/dist/src/learning/index.js +9 -0
- package/dist/src/learning/locator-policy.js +120 -0
- package/dist/src/learning/pattern-policy.js +89 -0
- package/dist/src/learning/recovery-policy.js +116 -0
- package/dist/src/learning/sensor-policy.js +115 -0
- package/dist/src/learning/timing-model.js +204 -0
- package/dist/src/learning/topology-policy.js +90 -0
- package/dist/src/learning/types.js +9 -0
- package/dist/src/logging/timeline-logger.js +4 -1
- package/dist/src/memory/playbook-seeds.js +200 -0
- package/dist/src/memory/recall.js +60 -8
- package/dist/src/memory/service.js +30 -5
- package/dist/src/memory/store.js +34 -5
- package/dist/src/native/bridge-client.js +253 -31
- package/dist/src/observer/state.js +199 -0
- package/dist/src/observer/types.js +43 -0
- package/dist/src/orchestrator/state.js +68 -0
- package/dist/src/orchestrator/types.js +22 -0
- package/dist/src/perception/ax-source.js +162 -0
- package/dist/src/perception/cdp-source.js +162 -0
- package/dist/src/perception/coordinator.js +771 -0
- package/dist/src/perception/frame-differ.js +287 -0
- package/dist/src/perception/index.js +22 -0
- package/dist/src/perception/manager.js +199 -0
- package/dist/src/perception/types.js +47 -0
- package/dist/src/perception/vision-source.js +399 -0
- package/dist/src/planner/deterministic.js +298 -0
- package/dist/src/planner/executor.js +870 -0
- package/dist/src/planner/goal-store.js +92 -0
- package/dist/src/planner/index.js +21 -0
- package/dist/src/planner/planner.js +520 -0
- package/dist/src/planner/tool-registry.js +71 -0
- package/dist/src/planner/types.js +22 -0
- package/dist/src/platform/explorer.js +213 -0
- package/dist/src/platform/help-center-markdown.js +527 -0
- package/dist/src/platform/learner.js +257 -0
- package/dist/src/playbook/engine.js +296 -11
- package/dist/src/playbook/mcp-recorder.js +204 -0
- package/dist/src/playbook/recorder.js +3 -2
- package/dist/src/playbook/runner.js +1 -1
- package/dist/src/playbook/store.js +139 -10
- package/dist/src/recovery/detectors.js +156 -0
- package/dist/src/recovery/engine.js +327 -0
- package/dist/src/recovery/index.js +20 -0
- package/dist/src/recovery/strategies.js +274 -0
- package/dist/src/recovery/types.js +20 -0
- package/dist/src/runtime/accessibility-adapter.js +55 -18
- package/dist/src/runtime/applescript-adapter.js +8 -2
- package/dist/src/runtime/cdp-chrome-adapter.js +1 -1
- package/dist/src/runtime/executor.js +23 -3
- package/dist/src/runtime/locator-cache.js +24 -2
- package/dist/src/runtime/service.js +59 -15
- package/dist/src/runtime/session-manager.js +4 -1
- package/dist/src/runtime/vision-adapter.js +2 -1
- package/dist/src/state/app-map-types.js +72 -0
- package/dist/src/state/app-map.js +1974 -0
- package/dist/src/state/entity-tracker.js +108 -0
- package/dist/src/state/fusion.js +96 -0
- package/dist/src/state/index.js +21 -0
- package/dist/src/state/ladder-generator.js +236 -0
- package/dist/src/state/persistence.js +156 -0
- package/dist/src/state/types.js +17 -0
- package/dist/src/state/world-model.js +1456 -0
- package/dist/src/util/atomic-write.js +19 -4
- package/dist/src/util/sanitize.js +146 -0
- package/dist-app-maps/com.figma.Desktop.json +959 -0
- package/dist-app-maps/com.hnc.Discord.json +1146 -0
- package/dist-app-maps/notion.id.json +2831 -0
- package/dist-playbooks/canva-screenhand-carousel.json +445 -0
- package/dist-playbooks/codex-desktop.json +76 -0
- package/dist-playbooks/competitor-research-stack.json +122 -0
- package/dist-playbooks/davinci-color-grade.json +153 -0
- package/dist-playbooks/davinci-edit-timeline.json +162 -0
- package/dist-playbooks/davinci-render.json +114 -0
- package/dist-playbooks/devto.json +52 -0
- package/dist-playbooks/discord.json +41 -0
- package/dist-playbooks/google-flow-create-project.json +59 -0
- package/dist-playbooks/google-flow-edit-image.json +90 -0
- package/dist-playbooks/google-flow-edit-video.json +90 -0
- package/dist-playbooks/google-flow-generate-image.json +68 -0
- package/dist-playbooks/google-flow-generate-video.json +191 -0
- package/dist-playbooks/google-flow-open-project.json +48 -0
- package/dist-playbooks/google-flow-open-scenebuilder.json +64 -0
- package/dist-playbooks/google-flow-search-assets.json +64 -0
- package/dist-playbooks/instagram.json +57 -0
- package/dist-playbooks/linkedin.json +52 -0
- package/dist-playbooks/n8n.json +43 -0
- package/dist-playbooks/reddit.json +52 -0
- package/dist-playbooks/threads.json +59 -0
- package/dist-playbooks/x-twitter.json +59 -0
- package/dist-playbooks/youtube.json +59 -0
- package/dist-references/canva.json +646 -0
- package/dist-references/codex-desktop.json +305 -0
- package/dist-references/davinci-resolve-keyboard.json +594 -0
- package/dist-references/davinci-resolve-menu-map.json +1139 -0
- package/dist-references/davinci-resolve-menus-batch1.json +116 -0
- package/dist-references/davinci-resolve-menus-batch2.json +372 -0
- package/dist-references/davinci-resolve-menus-batch3.json +330 -0
- package/dist-references/davinci-resolve-menus-batch4.json +297 -0
- package/dist-references/davinci-resolve-shortcuts.json +333 -0
- package/dist-references/devpost.json +186 -0
- package/dist-references/devto.json +317 -0
- package/dist-references/discord.json +549 -0
- package/dist-references/figma.json +1186 -0
- package/dist-references/finder.json +146 -0
- package/dist-references/google-ads-transparency.json +95 -0
- package/dist-references/google-flow.json +649 -0
- package/dist-references/instagram.json +341 -0
- package/dist-references/linkedin.json +324 -0
- package/dist-references/meta-ad-library.json +86 -0
- package/dist-references/n8n.json +387 -0
- package/dist-references/notes.json +27 -0
- package/dist-references/notion.json +163 -0
- package/dist-references/reddit.json +341 -0
- package/dist-references/threads.json +337 -0
- package/dist-references/x-twitter.json +403 -0
- package/dist-references/youtube.json +373 -0
- package/native/macos-bridge/Package.swift +22 -0
- package/native/macos-bridge/Sources/AccessibilityBridge.swift +482 -0
- package/native/macos-bridge/Sources/AppManagement.swift +339 -0
- package/native/macos-bridge/Sources/CoreGraphicsBridge.swift +537 -0
- package/native/macos-bridge/Sources/ObserverBridge.swift +120 -0
- package/native/macos-bridge/Sources/StreamCapture.swift +136 -0
- package/native/macos-bridge/Sources/VisionBridge.swift +238 -0
- package/native/macos-bridge/Sources/main.swift +498 -0
- package/native/windows-bridge/AppManagement.cs +234 -0
- package/native/windows-bridge/InputBridge.cs +436 -0
- package/native/windows-bridge/Program.cs +270 -0
- package/native/windows-bridge/ScreenCapture.cs +453 -0
- package/native/windows-bridge/UIAutomationBridge.cs +571 -0
- package/native/windows-bridge/WindowsBridge.csproj +17 -0
- package/package.json +12 -1
- package/scripts/postinstall.cjs +127 -0
- package/dist/.audit-log.jsonl +0 -55
- package/dist/.screenhand/memory/.lock +0 -1
- package/dist/.screenhand/memory/actions.jsonl +0 -85
- package/dist/.screenhand/memory/errors.jsonl +0 -5
- package/dist/.screenhand/memory/errors.jsonl.bak +0 -4
- package/dist/.screenhand/memory/state.json +0 -35
- package/dist/.screenhand/memory/state.json.bak +0 -35
- package/dist/.screenhand/memory/strategies.jsonl +0 -12
- package/dist/agent/cli.js +0 -73
- package/dist/agent/loop.js +0 -258
- package/dist/config.js +0 -9
- package/dist/index.js +0 -56
- package/dist/logging/timeline-logger.js +0 -29
- package/dist/mcp/mcp-stdio-server.js +0 -448
- package/dist/mcp/server.js +0 -347
- package/dist/mcp-entry.js +0 -59
- package/dist/memory/recall.js +0 -160
- package/dist/memory/research.js +0 -98
- package/dist/memory/seeds.js +0 -89
- package/dist/memory/session.js +0 -161
- package/dist/memory/store.js +0 -391
- package/dist/memory/types.js +0 -4
- package/dist/monitor/codex-monitor.js +0 -377
- package/dist/monitor/task-queue.js +0 -84
- package/dist/monitor/types.js +0 -49
- package/dist/native/bridge-client.js +0 -174
- package/dist/native/macos-bridge-client.js +0 -5
- package/dist/npm-publish-helper.js +0 -117
- package/dist/npm-token-cdp.js +0 -113
- package/dist/npm-token-create.js +0 -135
- package/dist/npm-token-finish.js +0 -126
- package/dist/playbook/engine.js +0 -193
- package/dist/playbook/index.js +0 -4
- package/dist/playbook/recorder.js +0 -519
- package/dist/playbook/runner.js +0 -392
- package/dist/playbook/store.js +0 -166
- package/dist/playbook/types.js +0 -4
- package/dist/runtime/accessibility-adapter.js +0 -377
- package/dist/runtime/app-adapter.js +0 -48
- package/dist/runtime/applescript-adapter.js +0 -283
- package/dist/runtime/ax-role-map.js +0 -80
- package/dist/runtime/browser-adapter.js +0 -36
- package/dist/runtime/cdp-chrome-adapter.js +0 -505
- package/dist/runtime/composite-adapter.js +0 -205
- package/dist/runtime/executor.js +0 -250
- package/dist/runtime/locator-cache.js +0 -12
- package/dist/runtime/planning-loop.js +0 -47
- package/dist/runtime/service.js +0 -372
- package/dist/runtime/session-manager.js +0 -28
- package/dist/runtime/state-observer.js +0 -105
- package/dist/runtime/vision-adapter.js +0 -208
- package/dist/test-mcp-protocol.js +0 -138
- package/dist/types.js +0 -1
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "discord",
|
|
3
|
+
"name": "Discord Automation",
|
|
4
|
+
"description": "Battle-tested playbook for Discord browser automation via CDP. Covers server navigation, channel browsing, messaging, DMs, reactions, server joining, friend requests, and search. Discord uses React with aria-labels and data-list-item-id attributes for reliable selectors.",
|
|
5
|
+
"platform": "discord",
|
|
6
|
+
"bundleId": "com.hnc.Discord",
|
|
7
|
+
"version": "1.0.0",
|
|
8
|
+
"urlPatterns": [
|
|
9
|
+
"*discord.com*"
|
|
10
|
+
],
|
|
11
|
+
"tags": [
|
|
12
|
+
"discord",
|
|
13
|
+
"chat",
|
|
14
|
+
"community",
|
|
15
|
+
"browser",
|
|
16
|
+
"cdp"
|
|
17
|
+
],
|
|
18
|
+
"successCount": 0,
|
|
19
|
+
"failCount": 0,
|
|
20
|
+
"urls": {
|
|
21
|
+
"home": "https://discord.com/channels/@me",
|
|
22
|
+
"server": "https://discord.com/channels/{serverId}/{channelId}",
|
|
23
|
+
"invite": "https://discord.com/invite/{inviteCode}",
|
|
24
|
+
"discovery": "https://discord.com/discovery/servers",
|
|
25
|
+
"settings": "https://discord.com/channels/@me/settings",
|
|
26
|
+
"dm": "https://discord.com/channels/@me/{dmChannelId}"
|
|
27
|
+
},
|
|
28
|
+
"selectors": {
|
|
29
|
+
"nav_sidebar": {
|
|
30
|
+
"home": "[data-list-item-id='guildsnav___home']",
|
|
31
|
+
"server": "[data-list-item-id='guildsnav___{serverId}']",
|
|
32
|
+
"add_server": "[data-list-item-id='guildsnav___create-join-button']",
|
|
33
|
+
"discover": "[data-list-item-id='guildsnav___guild-discover-button']",
|
|
34
|
+
"download": "[data-list-item-id='guildsnav___app-download-button']",
|
|
35
|
+
"servers_sidebar": "nav[aria-label='Servers sidebar']",
|
|
36
|
+
"servers_group": "div[aria-label='Servers'][role='group']"
|
|
37
|
+
},
|
|
38
|
+
"dm_sidebar": {
|
|
39
|
+
"friends": "[data-list-item-id*='___friends']",
|
|
40
|
+
"shop": "[data-list-item-id*='___shop']",
|
|
41
|
+
"quests": "[data-list-item-id*='___quests']",
|
|
42
|
+
"dm_list": "ul[aria-label='Direct Messages']",
|
|
43
|
+
"create_dm": "div[role='button'][aria-label='Create Message']",
|
|
44
|
+
"search_conversations": "button:has-text('Find or start a conversation')"
|
|
45
|
+
},
|
|
46
|
+
"channel_sidebar": {
|
|
47
|
+
"channel": "[data-list-item-id*='channels___']",
|
|
48
|
+
"category": "[aria-label*='(category)']",
|
|
49
|
+
"text_channel": "[aria-label*='(text channel)']",
|
|
50
|
+
"voice_channel": "[aria-label*='(voice channel)']",
|
|
51
|
+
"locked_icon": "Voice (Locked) icon"
|
|
52
|
+
},
|
|
53
|
+
"header": {
|
|
54
|
+
"threads": "button[aria-label='Threads']",
|
|
55
|
+
"notification_settings": "button[aria-label='Notification Settings']",
|
|
56
|
+
"pinned_messages": "button[aria-label='Pinned Messages']",
|
|
57
|
+
"member_list": "button[aria-label='Show Member List']",
|
|
58
|
+
"search": "button[aria-label='Search']",
|
|
59
|
+
"channel_header": "[aria-label='Channel header']",
|
|
60
|
+
"inbox": "div[role='button'][aria-label='Inbox']",
|
|
61
|
+
"help": "div[role='button'][aria-label='Help']"
|
|
62
|
+
},
|
|
63
|
+
"messages": {
|
|
64
|
+
"message": "[id^='chat-messages-']",
|
|
65
|
+
"username": "[class*='username']",
|
|
66
|
+
"content": "[id^='message-content-']",
|
|
67
|
+
"timestamp": "time",
|
|
68
|
+
"reaction": "[class*='reaction']",
|
|
69
|
+
"accessory": "[class*='accessory']"
|
|
70
|
+
},
|
|
71
|
+
"message_actions": {
|
|
72
|
+
"add_reaction": "[aria-label='Add Reaction']",
|
|
73
|
+
"reply": "[aria-label='Reply']",
|
|
74
|
+
"create_thread": "[aria-label='Create Thread']",
|
|
75
|
+
"more": "[aria-label='More']",
|
|
76
|
+
"edit": "[aria-label='Edit']",
|
|
77
|
+
"note": "Message action buttons appear on hover over a message"
|
|
78
|
+
},
|
|
79
|
+
"message_input": {
|
|
80
|
+
"textbox": "div[role='textbox']",
|
|
81
|
+
"upload_button": "button[aria-label='Upload a File or Send Stickers and GIFs']",
|
|
82
|
+
"emoji_button": "button[aria-label*='emoji' i]",
|
|
83
|
+
"gif_button": "button[aria-label*='GIF' i]",
|
|
84
|
+
"sticker_button": "button[aria-label*='sticker' i]"
|
|
85
|
+
},
|
|
86
|
+
"user_panel": {
|
|
87
|
+
"section": "section[aria-label='User status and settings']",
|
|
88
|
+
"mute": "button[aria-label='Mute']",
|
|
89
|
+
"deafen": "button[aria-label='Deafen']",
|
|
90
|
+
"settings": "button[aria-label='User Settings']"
|
|
91
|
+
},
|
|
92
|
+
"friends": {
|
|
93
|
+
"tab_list": "div[role='tablist'][aria-label='Friends']",
|
|
94
|
+
"add_friend": "div[role='tab'][aria-label='Add Friend']",
|
|
95
|
+
"friend_input": "input[aria-label='You can add friends with their Discord username.']",
|
|
96
|
+
"send_request": "button:has-text('Send Friend Request')",
|
|
97
|
+
"new_group_dm": "div[role='button'][aria-label='New Group DM']"
|
|
98
|
+
},
|
|
99
|
+
"invite": {
|
|
100
|
+
"accept_button": "button:has-text('Accept Invite')",
|
|
101
|
+
"server_name": "h1",
|
|
102
|
+
"member_count": "[class*='memberCount']"
|
|
103
|
+
},
|
|
104
|
+
"discovery": {
|
|
105
|
+
"search_input": "input[placeholder='Search']",
|
|
106
|
+
"category_gaming": "[aria-label='Gaming']",
|
|
107
|
+
"category_music": "[aria-label='Music']",
|
|
108
|
+
"category_entertainment": "[aria-label='Entertainment']",
|
|
109
|
+
"category_science_tech": "[aria-label='Science & Tech']"
|
|
110
|
+
},
|
|
111
|
+
"server_actions": {
|
|
112
|
+
"server_menu": "[aria-label*='server actions']",
|
|
113
|
+
"invite_people": "button:has-text('Invite People')",
|
|
114
|
+
"server_settings": "button:has-text('Server Settings')"
|
|
115
|
+
},
|
|
116
|
+
"onboarding": {
|
|
117
|
+
"start_onboarding": "button:has-text('Start Onboarding')",
|
|
118
|
+
"channels_and_roles": "button:has-text('Channels & Roles')",
|
|
119
|
+
"browse_channels": "button:has-text('Browse Channels')",
|
|
120
|
+
"customize": "button:has-text('Customize')",
|
|
121
|
+
"server_guide": "button:has-text('Server Guide')",
|
|
122
|
+
"next": "button:has-text('Next')",
|
|
123
|
+
"finish": "button:has-text('Finish')"
|
|
124
|
+
},
|
|
125
|
+
"notification_settings": {
|
|
126
|
+
"notification_settings_btn": "button:has-text('Notification Settings')",
|
|
127
|
+
"only_mentions": "div:has-text('Only @mentions')",
|
|
128
|
+
"suppress_everyone": "div:has-text('Suppress @everyone and @here')",
|
|
129
|
+
"suppress_roles": "div:has-text('Suppress All Role @mentions')",
|
|
130
|
+
"done": "button:has-text('Done')"
|
|
131
|
+
},
|
|
132
|
+
"app_directory": {
|
|
133
|
+
"app_directory_btn": "button:has-text('App Directory')",
|
|
134
|
+
"moderation_category": "button:has-text('Moderation and Tools')",
|
|
135
|
+
"add_app": "button:has-text('Add App')"
|
|
136
|
+
},
|
|
137
|
+
"server_features": {
|
|
138
|
+
"events": "button:has-text('1 Event')",
|
|
139
|
+
"listen_in": "button:has-text('Listen In')",
|
|
140
|
+
"follow": "button:has-text('Follow')",
|
|
141
|
+
"react_to_post": "button:has-text('React to Post')"
|
|
142
|
+
},
|
|
143
|
+
"dialogs": {
|
|
144
|
+
"dialog": "[role='dialog']",
|
|
145
|
+
"close": "button[aria-label='Close']"
|
|
146
|
+
},
|
|
147
|
+
"auto_discovered": {
|
|
148
|
+
"auto_mmyc9stb_q44": "#general",
|
|
149
|
+
"auto_mmyid8uw_qs7": "#introductions"
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"detection": {
|
|
153
|
+
"is_logged_in": "!!document.querySelector('[data-list-item-id=\"guildsnav___home\"]')",
|
|
154
|
+
"is_home": "window.location.pathname === '/channels/@me'",
|
|
155
|
+
"is_server": "/^\\/channels\\/\\d+\\/\\d+$/.test(window.location.pathname)",
|
|
156
|
+
"is_dm": "/^\\/channels\\/@me\\/\\d+$/.test(window.location.pathname)",
|
|
157
|
+
"is_invite": "window.location.pathname.startsWith('/invite/')",
|
|
158
|
+
"is_discovery": "window.location.pathname.includes('/discovery/')",
|
|
159
|
+
"has_message_input": "!!document.querySelector('div[role=\"textbox\"]')",
|
|
160
|
+
"has_dialog": "!!document.querySelector('[role=\"dialog\"]')"
|
|
161
|
+
},
|
|
162
|
+
"flows": {
|
|
163
|
+
"send_message": {
|
|
164
|
+
"steps": [
|
|
165
|
+
"Navigate to discord.com/channels/{serverId}/{channelId}",
|
|
166
|
+
"Wait 2s for channel to load",
|
|
167
|
+
"Find message textbox: div[role='textbox']",
|
|
168
|
+
"Click textbox via browser_human_click",
|
|
169
|
+
"Type message via browser_fill_form with ~50ms delay",
|
|
170
|
+
"Press Enter to send (dispatch keydown Enter event on textbox)",
|
|
171
|
+
"Wait 1s for message to appear in chat"
|
|
172
|
+
],
|
|
173
|
+
"guards": [
|
|
174
|
+
"Must be logged in",
|
|
175
|
+
"Must have permission to send messages in channel"
|
|
176
|
+
],
|
|
177
|
+
"why": "Discord message textbox is a contenteditable div with role='textbox'. browser_fill_form works reliably. Enter key sends the message."
|
|
178
|
+
},
|
|
179
|
+
"send_dm": {
|
|
180
|
+
"steps": [
|
|
181
|
+
"Navigate to discord.com/channels/@me",
|
|
182
|
+
"Click existing DM in sidebar, or click 'Create Message' button",
|
|
183
|
+
"If new DM: search for user in the dialog",
|
|
184
|
+
"Click matching user from results",
|
|
185
|
+
"Type message into div[role='textbox']",
|
|
186
|
+
"Press Enter to send"
|
|
187
|
+
],
|
|
188
|
+
"guards": [
|
|
189
|
+
"Must be logged in",
|
|
190
|
+
"Must be friends or have mutual server for DMs"
|
|
191
|
+
]
|
|
192
|
+
},
|
|
193
|
+
"join_server_via_invite": {
|
|
194
|
+
"steps": [
|
|
195
|
+
"Navigate to discord.com/invite/{inviteCode}",
|
|
196
|
+
"Wait 2s for invite page to load",
|
|
197
|
+
"Click 'Accept Invite' button: button:has-text('Accept Invite')",
|
|
198
|
+
"Wait 3-5s for redirect to server channel",
|
|
199
|
+
"May encounter CAPTCHA — cannot automate CAPTCHA"
|
|
200
|
+
],
|
|
201
|
+
"guards": [
|
|
202
|
+
"Must be logged in"
|
|
203
|
+
],
|
|
204
|
+
"why": "Direct invite URL is the most reliable way to join. After accepting, Discord redirects to the server's default channel. Some servers require verification (Collab.Land bot, CAPTCHA)."
|
|
205
|
+
},
|
|
206
|
+
"discover_servers": {
|
|
207
|
+
"steps": [
|
|
208
|
+
"Click Discover button: [data-list-item-id='guildsnav___guild-discover-button']",
|
|
209
|
+
"Or navigate to discord.com/discovery/servers",
|
|
210
|
+
"Wait 2s for discovery page to load",
|
|
211
|
+
"Type search query into input[placeholder='Search']",
|
|
212
|
+
"Browse category buttons: Gaming, Music, Entertainment, Science & Tech",
|
|
213
|
+
"Click server card to view details",
|
|
214
|
+
"Click Join to join server"
|
|
215
|
+
],
|
|
216
|
+
"guards": [
|
|
217
|
+
"Must be logged in"
|
|
218
|
+
]
|
|
219
|
+
},
|
|
220
|
+
"navigate_channels": {
|
|
221
|
+
"steps": [
|
|
222
|
+
"Click server icon in left sidebar: [data-list-item-id='guildsnav___{serverId}']",
|
|
223
|
+
"Wait 1s for channel list to load",
|
|
224
|
+
"Channels listed as [data-list-item-id='channels___{channelId}']",
|
|
225
|
+
"Categories have aria-label containing '(category)'",
|
|
226
|
+
"Text channels have aria-label containing '(text channel)'",
|
|
227
|
+
"Click desired channel to open it"
|
|
228
|
+
],
|
|
229
|
+
"guards": [
|
|
230
|
+
"Must be logged in",
|
|
231
|
+
"Must be a member of the server"
|
|
232
|
+
],
|
|
233
|
+
"why": "Discord uses data-list-item-id attributes with channel IDs for reliable selection. Locked channels show 'Voice (Locked)' in their text."
|
|
234
|
+
},
|
|
235
|
+
"add_reaction": {
|
|
236
|
+
"steps": [
|
|
237
|
+
"Hover over message to reveal action buttons",
|
|
238
|
+
"Click 'Add Reaction' button: [aria-label='Add Reaction']",
|
|
239
|
+
"Wait 1s for emoji picker to open",
|
|
240
|
+
"Search for emoji or click from grid",
|
|
241
|
+
"Reaction appears on the message"
|
|
242
|
+
],
|
|
243
|
+
"guards": [
|
|
244
|
+
"Must be logged in",
|
|
245
|
+
"Must have permission to react"
|
|
246
|
+
],
|
|
247
|
+
"why": "Message action buttons only appear on hover. Use browser_js to dispatch mouseover event on the message element first."
|
|
248
|
+
},
|
|
249
|
+
"reply_to_message": {
|
|
250
|
+
"steps": [
|
|
251
|
+
"Hover over message to reveal action buttons",
|
|
252
|
+
"Click 'Reply' button: [aria-label='Reply']",
|
|
253
|
+
"Message input shows reply context",
|
|
254
|
+
"Type reply into div[role='textbox']",
|
|
255
|
+
"Press Enter to send reply"
|
|
256
|
+
],
|
|
257
|
+
"guards": [
|
|
258
|
+
"Must be logged in",
|
|
259
|
+
"Must have send message permission"
|
|
260
|
+
]
|
|
261
|
+
},
|
|
262
|
+
"add_friend": {
|
|
263
|
+
"steps": [
|
|
264
|
+
"Navigate to discord.com/channels/@me",
|
|
265
|
+
"Click 'Add Friend' tab in Friends area",
|
|
266
|
+
"Find input: input[aria-label='You can add friends with their Discord username.']",
|
|
267
|
+
"Type username via browser_fill_form",
|
|
268
|
+
"Click 'Send Friend Request' button",
|
|
269
|
+
"Wait for confirmation"
|
|
270
|
+
],
|
|
271
|
+
"guards": [
|
|
272
|
+
"Must be logged in"
|
|
273
|
+
]
|
|
274
|
+
},
|
|
275
|
+
"search_messages": {
|
|
276
|
+
"steps": [
|
|
277
|
+
"Click Search button in header: button[aria-label='Search']",
|
|
278
|
+
"Wait 1s for search panel to open",
|
|
279
|
+
"Type search query",
|
|
280
|
+
"Filter by: from:, in:, has:, before:, after:, mentions:",
|
|
281
|
+
"Results appear in search panel"
|
|
282
|
+
],
|
|
283
|
+
"guards": [
|
|
284
|
+
"Must be logged in"
|
|
285
|
+
]
|
|
286
|
+
},
|
|
287
|
+
"create_server": {
|
|
288
|
+
"steps": [
|
|
289
|
+
"Click 'Add a Server': [data-list-item-id='guildsnav___create-join-button']",
|
|
290
|
+
"Wait 1s for dialog to open",
|
|
291
|
+
"Choose 'Create My Own' or template",
|
|
292
|
+
"Set server name and icon",
|
|
293
|
+
"Click Create",
|
|
294
|
+
"Server appears in sidebar"
|
|
295
|
+
],
|
|
296
|
+
"guards": [
|
|
297
|
+
"Must be logged in"
|
|
298
|
+
]
|
|
299
|
+
},
|
|
300
|
+
"scroll_and_extract_messages": {
|
|
301
|
+
"steps": [
|
|
302
|
+
"Navigate to discord.com/channels/{serverId}/{channelId}",
|
|
303
|
+
"Wait 2s for messages to load",
|
|
304
|
+
"Extract messages from [id^='chat-messages-'] elements",
|
|
305
|
+
"Get username from [class*='username'], content from [id^='message-content-'], timestamp from time element",
|
|
306
|
+
"Scroll up to load older messages",
|
|
307
|
+
"Wait 1s for history to load"
|
|
308
|
+
],
|
|
309
|
+
"guards": [
|
|
310
|
+
"Must be logged in",
|
|
311
|
+
"Must have read access to channel"
|
|
312
|
+
]
|
|
313
|
+
},
|
|
314
|
+
"complete_onboarding": {
|
|
315
|
+
"steps": [
|
|
316
|
+
"Join or navigate to a server with onboarding enabled",
|
|
317
|
+
"Click 'Start Onboarding' if prompted",
|
|
318
|
+
"Select 'Channels & Roles' to pick channel subscriptions",
|
|
319
|
+
"Click 'Browse Channels' to see all available channels",
|
|
320
|
+
"Click 'Customize' to set profile/preferences for this server",
|
|
321
|
+
"Click 'Next' to advance through onboarding steps",
|
|
322
|
+
"Click 'Finish' to complete onboarding",
|
|
323
|
+
"Server Guide appears in sidebar after onboarding"
|
|
324
|
+
],
|
|
325
|
+
"guards": [
|
|
326
|
+
"Must be logged in",
|
|
327
|
+
"Server must have onboarding configured"
|
|
328
|
+
],
|
|
329
|
+
"why": "Many large servers (100k+ members) use Discord's built-in onboarding flow. Completing it unlocks channels and roles. Elements are text-based buttons, use click_text or browser_human_click."
|
|
330
|
+
},
|
|
331
|
+
"configure_notifications": {
|
|
332
|
+
"steps": [
|
|
333
|
+
"Open channel or server where you want to change notifications",
|
|
334
|
+
"Click 'Notification Settings' button in header or server menu",
|
|
335
|
+
"Select notification level: 'Only @mentions' for quiet mode",
|
|
336
|
+
"Toggle 'Suppress @everyone and @here' to block mass pings",
|
|
337
|
+
"Toggle 'Suppress All Role @mentions' to block role pings",
|
|
338
|
+
"Click 'Done' to save"
|
|
339
|
+
],
|
|
340
|
+
"guards": [
|
|
341
|
+
"Must be logged in",
|
|
342
|
+
"Must be a member of the server"
|
|
343
|
+
],
|
|
344
|
+
"why": "Per-server notification control prevents spam. 'Only @mentions' + both suppress toggles = silent mode. Essential for servers with high traffic."
|
|
345
|
+
},
|
|
346
|
+
"browse_app_directory": {
|
|
347
|
+
"steps": [
|
|
348
|
+
"Navigate to a server where you have permissions",
|
|
349
|
+
"Click 'App Directory' in the server sidebar or integrations",
|
|
350
|
+
"Browse categories: 'Moderation and Tools', etc.",
|
|
351
|
+
"Click an app to view details",
|
|
352
|
+
"Click 'Add App' to install to your server"
|
|
353
|
+
],
|
|
354
|
+
"guards": [
|
|
355
|
+
"Must be logged in",
|
|
356
|
+
"Must have Manage Server permission to add apps"
|
|
357
|
+
],
|
|
358
|
+
"why": "App Directory is Discord's official bot marketplace. Bots like MEE6, carl-bot, Automod are found here. Adding requires server admin permissions."
|
|
359
|
+
},
|
|
360
|
+
"interact_with_voice_stage": {
|
|
361
|
+
"steps": [
|
|
362
|
+
"Navigate to a voice or stage channel in the server sidebar",
|
|
363
|
+
"Click 'Listen In' to join as audience (stage) or join voice",
|
|
364
|
+
"Voice channels show active participants",
|
|
365
|
+
"Stage channels have speaker/audience separation"
|
|
366
|
+
],
|
|
367
|
+
"guards": [
|
|
368
|
+
"Must be logged in",
|
|
369
|
+
"Must have Connect permission for voice channels"
|
|
370
|
+
],
|
|
371
|
+
"why": "Voice/stage channels are interactive. 'Listen In' is the safe entry — you join as audience without broadcasting."
|
|
372
|
+
},
|
|
373
|
+
"engage_with_announcements": {
|
|
374
|
+
"steps": [
|
|
375
|
+
"Navigate to an announcement channel (marked with megaphone icon)",
|
|
376
|
+
"Read announcement posts",
|
|
377
|
+
"Click 'Follow' to subscribe the announcement to another channel",
|
|
378
|
+
"Click 'React to Post' to add a reaction",
|
|
379
|
+
"Announcement channels are typically read-only for most members"
|
|
380
|
+
],
|
|
381
|
+
"guards": [
|
|
382
|
+
"Must be logged in",
|
|
383
|
+
"Follow requires Manage Webhooks permission in destination"
|
|
384
|
+
],
|
|
385
|
+
"why": "Announcement channels are one-way broadcast. 'Follow' cross-posts to your server. Reactions show engagement without needing send permission."
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
"errors": [
|
|
389
|
+
{
|
|
390
|
+
"error": "Login required",
|
|
391
|
+
"context": "Any action when not logged in",
|
|
392
|
+
"solution": "Log in manually first. Discord uses email/password, QR code, or phone.",
|
|
393
|
+
"severity": "high"
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
"error": "CAPTCHA on server join",
|
|
397
|
+
"context": "Some servers require CAPTCHA verification when joining",
|
|
398
|
+
"solution": "Cannot automate CAPTCHA. User must complete it manually.",
|
|
399
|
+
"severity": "high"
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
"error": "Server verification required",
|
|
403
|
+
"context": "Many servers require bot verification (Collab.Land, Wick, etc.) before accessing channels",
|
|
404
|
+
"solution": "Complete verification manually in the #verify channel. Most channels show as Locked until verified.",
|
|
405
|
+
"severity": "high"
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
"error": "Message action buttons only appear on hover",
|
|
409
|
+
"context": "Reply, React, Thread, More buttons are hidden until mouse hovers over message",
|
|
410
|
+
"solution": "Dispatch mouseover/mouseenter events on the message element via browser_js before clicking action buttons.",
|
|
411
|
+
"severity": "medium"
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
"error": "Channel is locked / no send permission",
|
|
415
|
+
"context": "Announcement channels, locked channels, or channels requiring roles",
|
|
416
|
+
"solution": "Check for presence of div[role='textbox']. If missing, the channel is read-only or locked.",
|
|
417
|
+
"severity": "medium"
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
"error": "Server discovery search doesn't submit on Enter",
|
|
421
|
+
"context": "Typing in discovery search input and pressing Enter may not trigger search",
|
|
422
|
+
"solution": "Type query and wait — Discord filters results in real-time. Or browse category tabs instead.",
|
|
423
|
+
"severity": "low"
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
"error": "DM requires friendship or mutual server",
|
|
427
|
+
"context": "Cannot DM users who have DMs closed unless friends or share a server",
|
|
428
|
+
"solution": "Send friend request first, or message in a mutual server channel.",
|
|
429
|
+
"severity": "medium"
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
"error": "Frontmost app switches to VS Code when approving tool calls",
|
|
433
|
+
"context": "AccessibilityAdapter attaches to frontmost app",
|
|
434
|
+
"solution": "Use CDP browser tools — they work regardless of which app is frontmost.",
|
|
435
|
+
"severity": "high"
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
"error": "Not found: Element not found matching criteria",
|
|
439
|
+
"context": "tool: ui_find, domain: native:com.hnc.Discord",
|
|
440
|
+
"solution": "No resolution yet — investigate and update this entry",
|
|
441
|
+
"severity": "medium"
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
"error": "Stuck on App Directory or embedded page — back/escape doesn't work",
|
|
445
|
+
"context": "App Directory and some embedded pages trap navigation. Escape, back arrows, server icon clicks may all fail.",
|
|
446
|
+
"solution": "Use Cmd+K (Quick Switcher) to jump to any channel by name. AppleScript: tell application 'System Events' to keystroke 'k' using command down, then type channel name and press Enter.",
|
|
447
|
+
"severity": "high"
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
"error": "Discord has multiple processes — wrong PID targeted",
|
|
451
|
+
"context": "Discord runs multiple OS processes. AX tools may attach to the wrong one.",
|
|
452
|
+
"solution": "Always use bundleId 'com.hnc.Discord' instead of PID. If commands go to wrong process, re-focus Discord via launch or focus tool with bundleId.",
|
|
453
|
+
"severity": "medium"
|
|
454
|
+
}
|
|
455
|
+
],
|
|
456
|
+
"policyNotes": {
|
|
457
|
+
"rate_limits": [
|
|
458
|
+
"Messages: ~5/5s per channel",
|
|
459
|
+
"Reactions: ~1/0.25s",
|
|
460
|
+
"DMs: ~10/10s",
|
|
461
|
+
"Server joins: ~100/day",
|
|
462
|
+
"Friend requests: ~5/hr for new accounts",
|
|
463
|
+
"Discord has strict rate limiting — 429 Too Many Requests"
|
|
464
|
+
],
|
|
465
|
+
"safety": [
|
|
466
|
+
"Never automate login",
|
|
467
|
+
"Discord actively detects automation — add 2-5s random delays",
|
|
468
|
+
"Use browser_stealth before interacting",
|
|
469
|
+
"Don't mass-DM or spam channels — leads to account ban",
|
|
470
|
+
"Respect server rules and channel permissions",
|
|
471
|
+
"Some servers use anti-bot verification (CAPTCHA, phone verification)",
|
|
472
|
+
"Use browser_fill_form with 40-80ms delays for typing"
|
|
473
|
+
],
|
|
474
|
+
"tool_preferences": [
|
|
475
|
+
"browser_fill_form — for message textbox, search, friend username input",
|
|
476
|
+
"browser_human_click — for channel navigation, server selection, button clicks",
|
|
477
|
+
"browser_js — for dispatching Enter key to send messages, hovering over messages for action buttons, extracting message data",
|
|
478
|
+
"browser_navigate — for direct navigation to servers/channels/invites",
|
|
479
|
+
"JS dispatch (mouseover) — for revealing message hover actions (reply, react)"
|
|
480
|
+
]
|
|
481
|
+
},
|
|
482
|
+
"steps": [
|
|
483
|
+
{
|
|
484
|
+
"action": "navigate",
|
|
485
|
+
"url": "https://discord.com/channels/@me",
|
|
486
|
+
"description": "Open Discord home (DMs)"
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
"action": "wait",
|
|
490
|
+
"ms": 2000,
|
|
491
|
+
"description": "Wait for Discord to load"
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
"action": "extract",
|
|
495
|
+
"target": "[data-list-item-id*='guildsnav']",
|
|
496
|
+
"format": "text",
|
|
497
|
+
"description": "Extract server list from sidebar"
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
"action": "screenshot",
|
|
501
|
+
"description": "Capture Discord state"
|
|
502
|
+
}
|
|
503
|
+
],
|
|
504
|
+
"shortcuts": {
|
|
505
|
+
"Apple": {
|
|
506
|
+
"AXMenu > Force Quit…": "Option+Cmd+⎋",
|
|
507
|
+
"AXMenu > Force Quit Discord": "Option+Shift+Cmd+⎋",
|
|
508
|
+
"AXMenu > Lock Screen": "Ctrl+Cmd+Q",
|
|
509
|
+
"AXMenu > Log Out khushi goyal…": "Shift+Cmd+Q",
|
|
510
|
+
"AXMenu > Log Out khushi goyal": "Option+Shift+Cmd+Q"
|
|
511
|
+
},
|
|
512
|
+
"Discord": {
|
|
513
|
+
"AXMenu > Settings…": "Cmd+,",
|
|
514
|
+
"AXMenu > Hide Discord": "Cmd+H",
|
|
515
|
+
"AXMenu > Hide Others": "Option+Cmd+H",
|
|
516
|
+
"AXMenu > Quit Discord": "Cmd+Q",
|
|
517
|
+
"AXMenu > Quit and Keep Windows": "Option+Cmd+Q",
|
|
518
|
+
"Quick Switcher (jump to any channel)": "Cmd+K",
|
|
519
|
+
"Search": "Cmd+F",
|
|
520
|
+
"Toggle Mute": "Cmd+Shift+M",
|
|
521
|
+
"Toggle Deafen": "Cmd+Shift+D",
|
|
522
|
+
"Create/Join Server": "Cmd+Shift+N"
|
|
523
|
+
},
|
|
524
|
+
"Edit": {
|
|
525
|
+
"AXMenu > Undo": "Cmd+Z",
|
|
526
|
+
"AXMenu > Redo": "Shift+Cmd+Z",
|
|
527
|
+
"AXMenu > Cut": "Cmd+X",
|
|
528
|
+
"AXMenu > Copy": "Cmd+C",
|
|
529
|
+
"AXMenu > Paste": "Cmd+V",
|
|
530
|
+
"AXMenu > Select All": "Cmd+A",
|
|
531
|
+
"AXMenu > Start Dictation…": "Cmd+🎤",
|
|
532
|
+
"AXMenu > Emoji & Symbols": "Cmd+🌐"
|
|
533
|
+
},
|
|
534
|
+
"View": {
|
|
535
|
+
"AXMenu > Reload": "Cmd+R",
|
|
536
|
+
"AXMenu > Toggle Full Screen": "Cmd+F"
|
|
537
|
+
},
|
|
538
|
+
"Window": {
|
|
539
|
+
"AXMenu > Fill": "Ctrl+Cmd+F",
|
|
540
|
+
"AXMenu > Center": "Ctrl+Cmd+C",
|
|
541
|
+
"AXMenu > Move & Resize > AXMenu > Return to Previous Size": "Ctrl+Cmd+R",
|
|
542
|
+
"AXMenu > Minimize": "Cmd+M",
|
|
543
|
+
"AXMenu > Minimize All": "Option+Cmd+M",
|
|
544
|
+
"AXMenu > Close Window": "Cmd+W",
|
|
545
|
+
"AXMenu > Close All": "Option+Cmd+W"
|
|
546
|
+
},
|
|
547
|
+
"Help": {}
|
|
548
|
+
}
|
|
549
|
+
}
|