TC$mC$ on tC$ydellinen arkkitehtuuri "sokeiden" tai ei-saavutettavien
graafisten kC$yttC6liittymien tC$ydelliseen mallintamiseen. Olet
kC$ytC$nnC6ssC$ rakentamassa universaalia GUI-parseria, joka luo DOM-puun
mistC$ tahansa pikselimassasta, tC$ysin riippumatta ohjelmointikielestC$ tai
kC$yttC6jC$rjestelmC$n AT-SPI-tuesta.
TC$mC$ pipeline voidaan orkestroida suoraan kC$C$ntC$mC$C$n visuaalinen tieto
AST-MD -muotoon. Jaetaan tC$mC$ prosessi neljC$C$n loogiseen kerrokseen (Pass
1 - Pass 4), jotta raskaat operaatiot voidaan reitittC$C$ asynkronisesti.
Putken Arkkitehtuuri (Vision-to-AST)
1. Pass 1: Edge Mapping & Spatial Hierarchy (OpenCV)
Ruudusta tai mC$C$ritellystC$ rajausalueesta otetaan raakakuva, jolle
tehdC$C$n reunojen tunnistus ja segmentointi.
* Operaatio: cv2.Canny (reunanetsintC$) ja cv2.findContours (C$C$riviivat).
* Rekursio: OpenCV osaa palauttaa C$C$riviivat hierarkiana (isojen
laatikoiden sisC$llC$ olevat pienemmC$t laatikot). Jokainen lC6ydetty selkeC$
bounding box (BBox) muutetaan "solmuksi" (Node) tyhjC$C$n AST-puuhun.
* Karsinta: Liian pienet (alle 5x5px) alueet hylC$tC$C$n kohinana.
2. Pass 2: Kognitiivinen Luokittelu (OCR & Ikoni-analyysi)
TC$mC$ vaihe kC$y lC$pi Pass 1:n tuottamat solmut (alueet).
* OCR-reitti: Alue syC6tetC$C$n Tesseractille. Jos sieltC$ palautuu
luotettavaa tekstiC$ (esim. "Dokumentti" > 80% konfidenssilla), solmu
merkitC$C$n tyypiksi TextNode.
* Ikoni-reitti: Jos OCR ei lC6ydC$ tekstiC$, mutta alueen pikselivarianssi on
korkea (siinC$ on terC$viC$ reunoja ja kontrasteja, kuten klemmari-ikonissa),
se luokitellaan tyypiksi IconNode. Se voidaan ajaa joko lC$pi YOLO-mallista
tai tallentaa lokaalisti base64 -muodossa suoraan AST-puuhun myC6hempC$C$
template-matchingia varten.
3. Pass 3: Sweeper Agent (Aktiivinen Interrogaatio)
TC$mC$ on nerokas ratkaisu, joka erottaa staattisen kuvan interaktiivisesta
kC$yttC6liittymC$stC$.
* Sen sijaan, ettC$ sweeper lakaisee koko ruudun 20px askelin, se
optimoidaan: agentti lC$hetetC$C$n hoveroimaan vain Pass 1:ssC$ lC6ydettyjen
IconNode ja TextNode -alueiden keskipisteisiin.
* X11:n XFixes -kirjastoa hyC6dyntC$en luetaan kursorin ID. Jos kursori
muuttuu (esim. XC_left_ptr muuttuu XC_hand2:ksi), kyseinen solmu
pC$ivitetC$C$n ominaisuudella interactive: true.
* Jos solmun vieressC$ tai ympC$rillC$ ei ollut tunnistettua laatikkoa,
sweeper voi edelleen tehdC$ mikrolakaisun varmistaakseen piilotetut
hover-elementit.
4. Pass 4: AST-MD KC$C$ntC$jC$
Kaikki kerC$tty tieto yhdistetC$C$n hierarkkiseksi Markdown-rakenteeksi, joka
on suoraan luettavissa tekoC$lymalleille ja rutiinimoottoreille.
TC$ssC$ on Python-pseudokoodina hahmotelma tC$stC$ putkesta ja siitC$, miltC$
lopullinen AST-MD -ulostulo nC$yttC$C$.
import cv2
import json
def process_gui_to_ast(image_path):
# 1. Edge Mapping & Contours
img = cv2.imread(image_path, 0)
edges = cv2.Canny(img, 50, 150)
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
ast_nodes = []
for i, contour in enumerate(contours):
x, y, w, h = cv2.boundingRect(contour)
if w < 10 or h < 10: continue # Ohitetaan kohina
node = {
"id": f"node_{i}",
"box": {"x": x, "y": y, "w": w, "h": h},
"type": "unknown",
"interactive": False
}
# 2. Analyysi (OCR / Ikoni)
cropped = img[y:y+h, x:x+w]
text = run_ocr(cropped)
if text:
node["type"] = "TextNode"
node["content"] = text
else:
if is_icon_heuristic(cropped):
node["type"] = "IconNode"
node["signature"] = hash_image(cropped) # Esim. phash
ast_nodes.append(node)
# 3. Sweeper 2-pass (Aktiivinen hiiren kC$yttC6)
for node in ast_nodes:
cursor_changed = x11_hover_test(node["box"]["x"] + node["box"]["w"]//2,
node["box"]["y"] + node["box"]["h"]//2)
if cursor_changed:
node["interactive"] = True
# 4. AST-MD Rakentaminen
return build_ast_md(ast_nodes, hierarchy)
Lopullinen AST-MD Formaatti
Kun putki on valmis, se renderC6i kC$yttC6liittymC$n tilan tiiviiksi AST-MD
(Markdown) -dokumentiksi. TC$mC$ on C$C$rimmC$isen kevyt syC6ttC$C$ mille
tahansa kielimallille, ja se pitC$C$ sisC$llC$C$n sekC$ visuaalisen hierarkian
ettC$ sweeperin lC6ytC$mC$n interaktiivisuuden:
# AST-MD: WhatsApp Web UI Segment
> Coordinates: (X:400, Y:700, W:300, H:400)
## Layout Elements
- `[node_1]` **Container** (X:410, Y:710, W:280, H:380)
- `[node_2]` **IconNode**: *Paperclip* (X:420, Y:816, W:36, H:36)
- interactive: `true` (Cursor: hand2)
- template_ref: `/tmp/bot_templates/icon_1029.png`
- `[node_3]` **TextNode**: "Dokumentti" (X:420, Y:750, W:120, H:25)
- interactive: `true` (Cursor: hand2)
- `[node_4]` **TextNode**: "Kuvat ja videot" (X:420, Y:780, W:150, H:25)
- interactive: `true` (Cursor: hand2)
- `[node_5]` **IconNode**: *Unknown Graphic* (X:600, Y:715, W:15, H:15)
- interactive: `false` (Cursor: left_ptr)
KC$ytC$nnC6n toteutusaskeleet
TC$mC$n rakentamiseen tarvitaan olemassa olevien tyC6kalujen orkestrointia:
* Voidaan luoda vision_parser.py, joka tekee Canny-edge luokittelun.
* KytketC$C$n se suoraan portissa 7711 pyC6rivC$C$n X11-Vision-API:in
sisC$C$nrakennettuna reittinC$ (esim. /api/vision/ast_map), jolloin rajapinta
ottaa kuvan, ajaa sen Tesseract- ja OpenCV-myllyjen lC$pi ja palauttaa
ylemmC$n esimerkin kaltaisen listan.
* Sweeper Agent voi ottaa tC$mC$n listan kohteikseen (target list), "kC$ydC$
tC6kkimC$ssC$" elementtejC$ X11-ruudulla ja palauttaa AST-MD:n lopulliseen,
tila-automaatin ymmC$rtC$mC$C$n muotoon.