Skip to content

Operations

All four operations are managed by bash scripts in the workspace. The agent receives a request via Discord, extracts parameters, calls the appropriate script, and reports the result.


Operation 1 — Clear Licenses

Status: ✅ 100% Complete | Verified: 2026-04-09

What it does: Signs out all inactive users from ReadyMode to free up licenses. Triggered when agents receive the "We're sorry..." license error.

Step Status Implementation detail
Login to ReadyMode ✅ Done readymode_login() in _lib.sh using native value setter
Navigate to License Usage ✅ Done Direct navigation to /+Team/ManageLicenses (one of the few routes that works directly)
Click Sign Out Inactive Users ✅ Done Click #sign-out-inactive-btn
OK popup + Logout ✅ Done dismiss_blocking_overlays() + readymode_logout()
Confirmation before executing ✅ Done Bot asks "Confirmas?" before triggering

Script: clear_licenses.sh

No outstanding gaps for this operation.


Operation 2 — Reset Leads

Status: 🔴 0% — Blocked (External) | Blocker owner: Charlie

What it does: Resets the leads queue for a specific agent.

The script reset_leads.sh exists but returns {"success": false, "unavailable": true} with exit code 2. When triggered, the agent responds that the operation is unavailable and suggests the manager handle it manually or call ReadyMode support.

Step Status Detail
Login to ReadyMode ✅ Done Shared readymode_login()
Click VIEW OFFICE MAP 🔴 Blocked Office Map is empty — only "St. 43 - Manager" visible, no agents
Select agent + click Reset Leads 🔴 Blocked Cannot map DOM selectors without agents visible in the map
Logout ✅ Done Shared readymode_logout()

Root cause: The ReadyMode Office Map for Arpa Growth has no agents assigned to it. Without agents visible in the map, the team cannot inspect the DOM to find the correct selectors for agent names and the Reset Leads button.

Action required: Charlie must assign at least 2–3 agents to the Office Map in ReadyMode. Once agents are visible, the team can inspect selectors and complete the script.

Estimated effort post-unblock: 1–2 days


Operation 3 — Create User

Status: ⚠️ 44% — 4 of 9 steps complete | Critical gap

What it does: Creates a new agent account in ReadyMode with full configuration. A user created by the bot currently cannot receive leads because no playlist is assigned — forcing the manager to manually complete setup.

Steps 1–4 (✅ Done) — Verified 2026-04-11

Step Status Implementation detail
Login ✅ Done readymode_login()
Click Users ✅ Done click a.dash_link with text "users"
Click green + button ✅ Done .uMgmtCreateBut > tr.uMgmtBulkUser
Name + password + SAVE ✅ Done Fills u_name, u_account, folder=Openers, ou=Users-Openers using native value setter. set_pass field required input event dispatch to activate oninput handler and promote xname to name

Steps 5–9 (🔴 Not implemented)

Step Status Blocker
Click Leads → Add a Playlist 🔴 Not implemented Playlist UI not found in DOM
Name the playlist 🔴 Not implemented Depends on step above
Drag-and-drop campaigns to playlist 🔴 Not implemented UI unknown + drag-and-drop complexity in headless
Drag-and-drop states to playlist 🔴 Not implemented Same blocker
Assign user to playlist + verify "1 member" 🔴 Not implemented Depends on all above

Blocker Analysis

Blocker 1 — Playlist UI not found in DOM

The team searched the following URL patterns: /+Team/Playlist, /+AI Leads/Playlist, /+Communication/Playlist, /+CCS Profile/Playlist. None exist. An HTML search for the word "playlist" in the DOM returned 0 matches. The playlist section exists somewhere in the ReadyMode UI but its location in Arpa Growth's specific instance is unknown.

Charlie must send screenshots showing: where "Add a Playlist" appears, where campaigns and states are dragged into groups, and where the user is assigned to the playlist.

Blocker 2 — Drag-and-drop in headless Chrome

Step 8 requires dragging campaigns and states into playlist groups. Drag-and-drop in Chrome headless via CDP requires simulating mousedown → mousemove → mouseup events using Input.dispatchMouseEvent. This is technically feasible but requires knowing the exact source and destination selectors, which depend on resolving Blocker 1 first.

Script: create_user.sh

Estimated effort post-unblock: 3–5 days (includes drag-and-drop implementation, edge cases, and end-to-end testing)


Operation 4 — Upload Leads

Status: ⚠️ ~55% — 6 of 11 sub-tasks complete | Verified: 2026-04-10 (basic flow only)

What it does: Uploads a CSV file of leads to a campaign in ReadyMode. The basic upload flow works end-to-end for CSVs with standard headers and an existing campaign.

Implemented ✅

Sub-task Status Detail
Receive CSV from Discord ✅ Done OpenClaw downloads to /home/agent/.openclaw/media/inbound/
POST CSV to ReadyMode ✅ Done fetch + FormData to /AI Leads/upload/index.php (bypasses file chooser in headless)
Auto-map standard headers ✅ Done first_name, last_name, phone, email, state map automatically
Select existing campaign ✅ Done select[name='set[campaignId]'] by campaign name
Click Done — Import Leads ✅ Done Click + parse "Successful: N Uploaded" from response
Reject duplicates (default) ✅ Done ReadyMode default behavior

Not Implemented 🔴

Sub-task Status Notes
Custom/non-standard CSV headers 🔴 Not implemented When headers don't match standard fields, ReadyMode shows a manual mapping modal — not handled
Create new campaign 🔴 Not implemented Only selects existing campaigns; no external blocker, ~0.5–1 day effort
Merge duplicates 🔴 Not implemented Requires selecting the merge option in the UI before importing; no blocker
Accept duplicates 🔴 Not implemented Same as merge — different UI option; no blocker
Move leads to campaign 🔴 Not implemented Requires searching the lead in ReadyMode and using the move function; ~1–2 day effort

Script: upload_leads.sh