hugpy-browser 0.1.0__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.
Files changed (63) hide show
  1. hugpy_browser-0.1.0/PKG-INFO +73 -0
  2. hugpy_browser-0.1.0/README.md +65 -0
  3. hugpy_browser-0.1.0/pyproject.toml +26 -0
  4. hugpy_browser-0.1.0/setup.cfg +4 -0
  5. hugpy_browser-0.1.0/src/hugpy_browser/__init__.py +57 -0
  6. hugpy_browser-0.1.0/src/hugpy_browser/assets/base-inactive.xml +185 -0
  7. hugpy_browser-0.1.0/src/hugpy_browser/assets/clone.xml +218 -0
  8. hugpy_browser-0.1.0/src/hugpy_browser/assets/hugpy-browser-lab.xml +155 -0
  9. hugpy_browser-0.1.0/src/hugpy_browser/assets/precision.html +73 -0
  10. hugpy_browser-0.1.0/src/hugpy_browser/assets/prep_guest.sh +91 -0
  11. hugpy_browser-0.1.0/src/hugpy_browser/bench/__init__.py +0 -0
  12. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/chat-1920x1080.json +409 -0
  13. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/chat-1920x1080.png +0 -0
  14. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/chat.html +73 -0
  15. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/dash-1920x1080.json +589 -0
  16. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/dash-1920x1080.png +0 -0
  17. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/dash.html +95 -0
  18. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/editor-1920x1080.json +439 -0
  19. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/editor-1920x1080.png +0 -0
  20. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/editor.html +82 -0
  21. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/shop-1920x1080.json +589 -0
  22. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/shop-1920x1080.png +0 -0
  23. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/shop.html +104 -0
  24. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/signin-1920x1080.json +349 -0
  25. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/signin-1920x1080.png +0 -0
  26. hugpy_browser-0.1.0/src/hugpy_browser/bench/data/signin.html +74 -0
  27. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/chat-1920x1080.json +449 -0
  28. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/chat-1920x1080.png +0 -0
  29. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/chat.html +73 -0
  30. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/dash-1920x1080.json +647 -0
  31. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/dash-1920x1080.png +0 -0
  32. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/dash.html +95 -0
  33. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/editor-1920x1080.json +482 -0
  34. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/editor-1920x1080.png +0 -0
  35. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/editor.html +82 -0
  36. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/shop-1920x1080.json +647 -0
  37. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/shop-1920x1080.png +0 -0
  38. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/shop.html +104 -0
  39. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/signin-1920x1080.json +383 -0
  40. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/signin-1920x1080.png +0 -0
  41. hugpy_browser-0.1.0/src/hugpy_browser/bench/data2/signin.html +74 -0
  42. hugpy_browser-0.1.0/src/hugpy_browser/bench/evalrun.py +150 -0
  43. hugpy_browser-0.1.0/src/hugpy_browser/bench/final_table.py +34 -0
  44. hugpy_browser-0.1.0/src/hugpy_browser/bench/make_bench.py +403 -0
  45. hugpy_browser-0.1.0/src/hugpy_browser/bench/offline.py +117 -0
  46. hugpy_browser-0.1.0/src/hugpy_browser/bench/pipelines.py +118 -0
  47. hugpy_browser-0.1.0/src/hugpy_browser/bench/rescore.py +36 -0
  48. hugpy_browser-0.1.0/src/hugpy_browser/bench/vlclient.py +77 -0
  49. hugpy_browser-0.1.0/src/hugpy_browser/cli.py +47 -0
  50. hugpy_browser-0.1.0/src/hugpy_browser/docs/final_numbers.md +18 -0
  51. hugpy_browser-0.1.0/src/hugpy_browser/docs/guide.md +389 -0
  52. hugpy_browser-0.1.0/src/hugpy_browser/docs/measure.md +94 -0
  53. hugpy_browser-0.1.0/src/hugpy_browser/e2e/__init__.py +0 -0
  54. hugpy_browser-0.1.0/src/hugpy_browser/e2e/cleanup_e2e.sh +13 -0
  55. hugpy_browser-0.1.0/src/hugpy_browser/e2e/e2e_desktop.py +291 -0
  56. hugpy_browser-0.1.0/src/hugpy_browser/e2e/e2e_vm.py +232 -0
  57. hugpy_browser-0.1.0/src/hugpy_browser/e2e/lab_prepare.sh +97 -0
  58. hugpy_browser-0.1.0/src/hugpy_browser.egg-info/PKG-INFO +73 -0
  59. hugpy_browser-0.1.0/src/hugpy_browser.egg-info/SOURCES.txt +61 -0
  60. hugpy_browser-0.1.0/src/hugpy_browser.egg-info/dependency_links.txt +1 -0
  61. hugpy_browser-0.1.0/src/hugpy_browser.egg-info/entry_points.txt +2 -0
  62. hugpy_browser-0.1.0/src/hugpy_browser.egg-info/requires.txt +1 -0
  63. hugpy_browser-0.1.0/src/hugpy_browser.egg-info/top_level.txt +1 -0
@@ -0,0 +1,73 @@
1
+ Metadata-Version: 2.4
2
+ Name: hugpy-browser
3
+ Version: 0.1.0
4
+ Summary: Screen-driven browser control for bots (no WebDriver): one package consolidating the browser-perfect engine front door, benchmark kit, lab-VM assets and the operator guide. The engine itself ships in abstract-toolserver (browser_* tools).
5
+ Requires-Python: >=3.10
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: abstract-toolserver>=0.0.70
8
+
9
+ # hugpy-browser
10
+
11
+ Screen-driven browser control for bots — **no Selenium, no WebDriver, no debugging
12
+ port**. The tools look at the screen and move the real pointer, so a site sees an
13
+ ordinary user's browser. Measured: pointer error **0 px** on VM and desktop;
14
+ description aims **11/12 on target, 1 px median error** (Qwen2.5-VL-7B).
15
+
16
+ This package is the **one place** for the browser-perfect work. The engine itself
17
+ (the `browser_*` tools: `browser_go/look/click/type/move/drag/scroll/wait/read/shot/
18
+ locate/surfaces/lab`) ships inside [`abstract-toolserver`](https://pypi.org/project/abstract-toolserver/)
19
+ (>= 0.0.70, a dependency of this package) and runs in any toolserver — on ae that is
20
+ the `7004_hugpy_toolserver` service. What this package adds around it:
21
+
22
+ | piece | where |
23
+ |---|---|
24
+ | engine re-exports | `hugpy_browser.browser / .aim / .surfaces / .labcheck / .vl` |
25
+ | operator guide | `hugpy-browser guide` (same text as toolserver `instructions/hugpy/hugpy-browser`) |
26
+ | measured numbers | `hugpy-browser numbers` (`docs/final_numbers.md`) |
27
+ | re-measurement kit | `hugpy_browser/bench/` — `evalrun.py`, `pipelines.py`, `vlclient.py`, `rescore.py`, `final_table.py`, and the 233-target synthetic set (`data/`, `data2/`) |
28
+ | end-to-end scripts | `hugpy_browser/e2e/` — `e2e_desktop.py`, `e2e_vm.py`, `lab_prepare.sh`, `cleanup_e2e.sh` |
29
+ | lab-VM assets | `hugpy_browser/assets/` — `precision.html`, `hugpy-browser-lab.xml`, `clone.xml`, `base-inactive.xml`, `prep_guest.sh` |
30
+
31
+ ## Install
32
+
33
+ ```
34
+ pip install hugpy-browser
35
+ ```
36
+
37
+ ## Quickstart (through a toolserver)
38
+
39
+ ```
40
+ browser_surfaces() # where can I drive?
41
+ browser_go(url="https://example.com", on="vm:<name>")
42
+ browser_look() # the screen as text items
43
+ browser_click(text="Sign in") # exact visible words
44
+ browser_type(text="me@example.com", into_text="Email")
45
+ browser_wait(text="Welcome", timeout=20)
46
+ ```
47
+
48
+ Aim four ways: `text=` (OCR, exact visible words), `target=` (vision-model
49
+ description, confirmed on a magnified crop), `cell="J2.D5"` (labelled grid, for a
50
+ bot that reads images itself), or `x=, y=`. Every click is verified: before/after
51
+ frames, diff regions, a verdict (`changed_at_click | changed_elsewhere | no_change`).
52
+
53
+ For a repeatable environment: `browser_lab(action="start")` boots an ephemeral
54
+ clone of the `hugpy-browser-lab` image (Firefox on a precision test page);
55
+ `browser_lab(action="check")` runs the 17-check self-test and reports the measured
56
+ pointer error. `hugpy-browser assets` prints the directory with the libvirt XML and
57
+ guest-prep script to rebuild that image anywhere.
58
+
59
+ ## CLI
60
+
61
+ ```
62
+ hugpy-browser where # the map: engine, service, lab, docs, backups
63
+ hugpy-browser guide # the full operator guide
64
+ hugpy-browser numbers # the measured benchmark results
65
+ hugpy-browser assets # path to precision.html + lab VM assets
66
+ ```
67
+
68
+ ## Re-measuring
69
+
70
+ See `docs/measure.md` and `bench/`: `evalrun.py` drives the aim pipelines over the
71
+ synthetic target set (`data/` 233 targets; `data2/` row/card targets); `vlclient.py`
72
+ points at any OpenAI-style vision endpoint (`VL_BASE`). Results of record are in
73
+ `docs/final_numbers.md`.
@@ -0,0 +1,65 @@
1
+ # hugpy-browser
2
+
3
+ Screen-driven browser control for bots — **no Selenium, no WebDriver, no debugging
4
+ port**. The tools look at the screen and move the real pointer, so a site sees an
5
+ ordinary user's browser. Measured: pointer error **0 px** on VM and desktop;
6
+ description aims **11/12 on target, 1 px median error** (Qwen2.5-VL-7B).
7
+
8
+ This package is the **one place** for the browser-perfect work. The engine itself
9
+ (the `browser_*` tools: `browser_go/look/click/type/move/drag/scroll/wait/read/shot/
10
+ locate/surfaces/lab`) ships inside [`abstract-toolserver`](https://pypi.org/project/abstract-toolserver/)
11
+ (>= 0.0.70, a dependency of this package) and runs in any toolserver — on ae that is
12
+ the `7004_hugpy_toolserver` service. What this package adds around it:
13
+
14
+ | piece | where |
15
+ |---|---|
16
+ | engine re-exports | `hugpy_browser.browser / .aim / .surfaces / .labcheck / .vl` |
17
+ | operator guide | `hugpy-browser guide` (same text as toolserver `instructions/hugpy/hugpy-browser`) |
18
+ | measured numbers | `hugpy-browser numbers` (`docs/final_numbers.md`) |
19
+ | re-measurement kit | `hugpy_browser/bench/` — `evalrun.py`, `pipelines.py`, `vlclient.py`, `rescore.py`, `final_table.py`, and the 233-target synthetic set (`data/`, `data2/`) |
20
+ | end-to-end scripts | `hugpy_browser/e2e/` — `e2e_desktop.py`, `e2e_vm.py`, `lab_prepare.sh`, `cleanup_e2e.sh` |
21
+ | lab-VM assets | `hugpy_browser/assets/` — `precision.html`, `hugpy-browser-lab.xml`, `clone.xml`, `base-inactive.xml`, `prep_guest.sh` |
22
+
23
+ ## Install
24
+
25
+ ```
26
+ pip install hugpy-browser
27
+ ```
28
+
29
+ ## Quickstart (through a toolserver)
30
+
31
+ ```
32
+ browser_surfaces() # where can I drive?
33
+ browser_go(url="https://example.com", on="vm:<name>")
34
+ browser_look() # the screen as text items
35
+ browser_click(text="Sign in") # exact visible words
36
+ browser_type(text="me@example.com", into_text="Email")
37
+ browser_wait(text="Welcome", timeout=20)
38
+ ```
39
+
40
+ Aim four ways: `text=` (OCR, exact visible words), `target=` (vision-model
41
+ description, confirmed on a magnified crop), `cell="J2.D5"` (labelled grid, for a
42
+ bot that reads images itself), or `x=, y=`. Every click is verified: before/after
43
+ frames, diff regions, a verdict (`changed_at_click | changed_elsewhere | no_change`).
44
+
45
+ For a repeatable environment: `browser_lab(action="start")` boots an ephemeral
46
+ clone of the `hugpy-browser-lab` image (Firefox on a precision test page);
47
+ `browser_lab(action="check")` runs the 17-check self-test and reports the measured
48
+ pointer error. `hugpy-browser assets` prints the directory with the libvirt XML and
49
+ guest-prep script to rebuild that image anywhere.
50
+
51
+ ## CLI
52
+
53
+ ```
54
+ hugpy-browser where # the map: engine, service, lab, docs, backups
55
+ hugpy-browser guide # the full operator guide
56
+ hugpy-browser numbers # the measured benchmark results
57
+ hugpy-browser assets # path to precision.html + lab VM assets
58
+ ```
59
+
60
+ ## Re-measuring
61
+
62
+ See `docs/measure.md` and `bench/`: `evalrun.py` drives the aim pipelines over the
63
+ synthetic target set (`data/` 233 targets; `data2/` row/card targets); `vlclient.py`
64
+ points at any OpenAI-style vision endpoint (`VL_BASE`). Results of record are in
65
+ `docs/final_numbers.md`.
@@ -0,0 +1,26 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "hugpy-browser"
7
+ version = "0.1.0"
8
+ description = "Screen-driven browser control for bots (no WebDriver): one package consolidating the browser-perfect engine front door, benchmark kit, lab-VM assets and the operator guide. The engine itself ships in abstract-toolserver (browser_* tools)."
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ dependencies = ["abstract-toolserver>=0.0.70"]
12
+
13
+ [project.scripts]
14
+ hugpy-browser = "hugpy_browser.cli:main"
15
+
16
+ [tool.setuptools.packages.find]
17
+ where = ["src"]
18
+
19
+ [tool.setuptools.package-data]
20
+ hugpy_browser = [
21
+ "docs/*.md",
22
+ "assets/*",
23
+ "bench/data/*",
24
+ "bench/data2/*",
25
+ "e2e/*.sh",
26
+ ]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,57 @@
1
+ """hugpy-browser — screen-driven browser control for bots, consolidated.
2
+
3
+ The ENGINE (the toolserver's ``browser_*`` tools: aim by text / vision target /
4
+ grid cell, verified clicks, surfaces, the lab) lives in ``abstract_toolserver``
5
+ and is served by the toolserver (port 7004 on ae). This package is the single
6
+ front door around it:
7
+
8
+ * lazy re-exports of the engine modules (``hugpy_browser.browser`` etc.),
9
+ * the operator guide and measured benchmark numbers (``docs/``),
10
+ * the re-measurement kit (``bench/``: evalrun, pipelines, vlclient, the
11
+ 233-target synthetic data set),
12
+ * the end-to-end scripts and lab-VM assets (``e2e/``, ``assets/``:
13
+ precision.html, hugpy-browser-lab libvirt XML, guest prep),
14
+ * a small CLI: ``hugpy-browser where|guide|numbers|assets``.
15
+
16
+ Install: ``pip install hugpy-browser`` (pulls abstract-toolserver >= 0.0.70).
17
+ """
18
+
19
+ from importlib import import_module, resources
20
+
21
+ __version__ = "0.1.0"
22
+
23
+ #: engine modules re-exported from abstract_toolserver (imported on first use,
24
+ #: so the docs/CLI work even where the engine's own deps are absent)
25
+ ENGINE = {
26
+ "browser": "abstract_toolserver.browser",
27
+ "aim": "abstract_toolserver.aim",
28
+ "surfaces": "abstract_toolserver.surfaces",
29
+ "labcheck": "abstract_toolserver.labcheck",
30
+ "vl": "abstract_toolserver.vl",
31
+ }
32
+
33
+
34
+ def __getattr__(name):
35
+ target = ENGINE.get(name)
36
+ if target is None:
37
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
38
+ return import_module(target)
39
+
40
+
41
+ def _doc(name):
42
+ return (resources.files(__name__) / "docs" / name).read_text(encoding="utf-8")
43
+
44
+
45
+ def guide():
46
+ """The full operator guide (also at toolserver instructions/hugpy/hugpy-browser)."""
47
+ return _doc("guide.md")
48
+
49
+
50
+ def numbers():
51
+ """The measured benchmark numbers (0.0.64 -> 0.0.70)."""
52
+ return _doc("final_numbers.md")
53
+
54
+
55
+ def asset_dir():
56
+ """Directory holding precision.html and the lab-VM libvirt assets."""
57
+ return str(resources.files(__name__) / "assets")
@@ -0,0 +1,185 @@
1
+ <domain type='kvm'>
2
+ <name>ubuntu-desktop</name>
3
+ <uuid>e2517c6e-3855-4f15-84d7-dd4573c94c69</uuid>
4
+ <metadata>
5
+ <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
6
+ <libosinfo:os id="http://ubuntu.com/ubuntu/22.04"/>
7
+ </libosinfo:libosinfo>
8
+ </metadata>
9
+ <memory unit='KiB'>33554432</memory>
10
+ <currentMemory unit='KiB'>33554432</currentMemory>
11
+ <vcpu placement='static'>8</vcpu>
12
+ <os>
13
+ <type arch='x86_64' machine='pc-q35-noble'>hvm</type>
14
+ </os>
15
+ <features>
16
+ <acpi/>
17
+ <apic/>
18
+ <vmport state='off'/>
19
+ </features>
20
+ <cpu mode='host-passthrough' check='none' migratable='on'/>
21
+ <clock offset='utc'>
22
+ <timer name='rtc' tickpolicy='catchup'/>
23
+ <timer name='pit' tickpolicy='delay'/>
24
+ <timer name='hpet' present='no'/>
25
+ </clock>
26
+ <on_poweroff>destroy</on_poweroff>
27
+ <on_reboot>restart</on_reboot>
28
+ <on_crash>destroy</on_crash>
29
+ <pm>
30
+ <suspend-to-mem enabled='no'/>
31
+ <suspend-to-disk enabled='no'/>
32
+ </pm>
33
+ <devices>
34
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
35
+ <disk type='file' device='disk'>
36
+ <driver name='qemu' type='qcow2' discard='unmap'/>
37
+ <source file='/mnt/nvmes/2T_samsung_990/990_general/vms/images/ubuntu-desktop.qcow2'/>
38
+ <target dev='vda' bus='virtio'/>
39
+ <boot order='1'/>
40
+ <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
41
+ </disk>
42
+ <disk type='file' device='cdrom'>
43
+ <driver name='qemu' type='raw'/>
44
+ <target dev='sda' bus='sata'/>
45
+ <readonly/>
46
+ <boot order='2'/>
47
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
48
+ </disk>
49
+ <controller type='usb' index='0' model='qemu-xhci' ports='15'>
50
+ <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
51
+ </controller>
52
+ <controller type='pci' index='0' model='pcie-root'/>
53
+ <controller type='pci' index='1' model='pcie-root-port'>
54
+ <model name='pcie-root-port'/>
55
+ <target chassis='1' port='0x10'/>
56
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
57
+ </controller>
58
+ <controller type='pci' index='2' model='pcie-root-port'>
59
+ <model name='pcie-root-port'/>
60
+ <target chassis='2' port='0x11'/>
61
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
62
+ </controller>
63
+ <controller type='pci' index='3' model='pcie-root-port'>
64
+ <model name='pcie-root-port'/>
65
+ <target chassis='3' port='0x12'/>
66
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
67
+ </controller>
68
+ <controller type='pci' index='4' model='pcie-root-port'>
69
+ <model name='pcie-root-port'/>
70
+ <target chassis='4' port='0x13'/>
71
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
72
+ </controller>
73
+ <controller type='pci' index='5' model='pcie-root-port'>
74
+ <model name='pcie-root-port'/>
75
+ <target chassis='5' port='0x14'/>
76
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
77
+ </controller>
78
+ <controller type='pci' index='6' model='pcie-root-port'>
79
+ <model name='pcie-root-port'/>
80
+ <target chassis='6' port='0x15'/>
81
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
82
+ </controller>
83
+ <controller type='pci' index='7' model='pcie-root-port'>
84
+ <model name='pcie-root-port'/>
85
+ <target chassis='7' port='0x16'/>
86
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x6'/>
87
+ </controller>
88
+ <controller type='pci' index='8' model='pcie-root-port'>
89
+ <model name='pcie-root-port'/>
90
+ <target chassis='8' port='0x17'/>
91
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x7'/>
92
+ </controller>
93
+ <controller type='pci' index='9' model='pcie-root-port'>
94
+ <model name='pcie-root-port'/>
95
+ <target chassis='9' port='0x18'/>
96
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/>
97
+ </controller>
98
+ <controller type='pci' index='10' model='pcie-root-port'>
99
+ <model name='pcie-root-port'/>
100
+ <target chassis='10' port='0x19'/>
101
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/>
102
+ </controller>
103
+ <controller type='pci' index='11' model='pcie-root-port'>
104
+ <model name='pcie-root-port'/>
105
+ <target chassis='11' port='0x1a'/>
106
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x2'/>
107
+ </controller>
108
+ <controller type='pci' index='12' model='pcie-root-port'>
109
+ <model name='pcie-root-port'/>
110
+ <target chassis='12' port='0x1b'/>
111
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x3'/>
112
+ </controller>
113
+ <controller type='pci' index='13' model='pcie-root-port'>
114
+ <model name='pcie-root-port'/>
115
+ <target chassis='13' port='0x1c'/>
116
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x4'/>
117
+ </controller>
118
+ <controller type='pci' index='14' model='pcie-root-port'>
119
+ <model name='pcie-root-port'/>
120
+ <target chassis='14' port='0x1d'/>
121
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x5'/>
122
+ </controller>
123
+ <controller type='sata' index='0'>
124
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
125
+ </controller>
126
+ <controller type='virtio-serial' index='0'>
127
+ <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
128
+ </controller>
129
+ <interface type='network'>
130
+ <mac address='52:54:00:da:4d:84'/>
131
+ <source network='default'/>
132
+ <model type='virtio'/>
133
+ <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
134
+ </interface>
135
+ <serial type='pty'>
136
+ <target type='isa-serial' port='0'>
137
+ <model name='isa-serial'/>
138
+ </target>
139
+ </serial>
140
+ <console type='pty'>
141
+ <target type='serial' port='0'/>
142
+ </console>
143
+ <channel type='unix'>
144
+ <target type='virtio' name='org.qemu.guest_agent.0'/>
145
+ <address type='virtio-serial' controller='0' bus='0' port='1'/>
146
+ </channel>
147
+ <channel type='spicevmc'>
148
+ <target type='virtio' name='com.redhat.spice.0'/>
149
+ <address type='virtio-serial' controller='0' bus='0' port='2'/>
150
+ </channel>
151
+ <input type='tablet' bus='usb'>
152
+ <address type='usb' bus='0' port='1'/>
153
+ </input>
154
+ <input type='mouse' bus='ps2'/>
155
+ <input type='keyboard' bus='ps2'/>
156
+ <graphics type='spice' autoport='yes' listen='0.0.0.0'>
157
+ <listen type='address' address='0.0.0.0'/>
158
+ <image compression='auto_glz'/>
159
+ <jpeg compression='auto'/>
160
+ <zlib compression='auto'/>
161
+ <playback compression='on'/>
162
+ <streaming mode='filter'/>
163
+ </graphics>
164
+ <audio id='1' type='spice'/>
165
+ <video>
166
+ <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
167
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
168
+ </video>
169
+ <redirdev bus='usb' type='spicevmc'>
170
+ <address type='usb' bus='0' port='2'/>
171
+ </redirdev>
172
+ <redirdev bus='usb' type='spicevmc'>
173
+ <address type='usb' bus='0' port='3'/>
174
+ </redirdev>
175
+ <watchdog model='itco' action='reset'/>
176
+ <memballoon model='virtio'>
177
+ <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
178
+ </memballoon>
179
+ <rng model='virtio'>
180
+ <backend model='random'>/dev/urandom</backend>
181
+ <address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
182
+ </rng>
183
+ </devices>
184
+ </domain>
185
+
@@ -0,0 +1,218 @@
1
+ <domain type='kvm' id='6'>
2
+ <name>ubuntu-desktop-eph-80bf20</name>
3
+ <uuid>0c6c6072-aa2e-4da8-8a38-04dba7db26cd</uuid>
4
+ <description>ephemeral test clone of ubuntu-desktop (abstract_toolserver)</description>
5
+ <metadata xmlns:ns0="http://libosinfo.org/xmlns/libvirt/domain/1.0" xmlns:tsvm="https://toolserver.hugpy.ai/xmlns/vm-ephemeral/1">
6
+ <ns0:libosinfo>
7
+ <ns0:os id="http://ubuntu.com/ubuntu/22.04"/>
8
+ </ns0:libosinfo>
9
+ <tsvm:ephemeral>{"base": "ubuntu-desktop", "by": "abstract_toolserver", "created": 1791311281, "eph_dir": "/mnt/nvmes/2T_samsung_990/990_general/vms/images/ephemeral", "files": ["/mnt/nvmes/2T_samsung_990/990_general/vms/images/ephemeral/ubuntu-desktop-eph-80bf20__vda.qcow2"], "golden": ["/mnt/nvmes/2T_samsung_990/990_general/vms/images/ephemeral/bases/ubuntu-desktop__vda.qcow2"]}</tsvm:ephemeral>
10
+ </metadata>
11
+ <memory unit='KiB'>4194304</memory>
12
+ <currentMemory unit='KiB'>4194304</currentMemory>
13
+ <vcpu placement='static'>4</vcpu>
14
+ <resource>
15
+ <partition>/machine</partition>
16
+ </resource>
17
+ <os>
18
+ <type arch='x86_64' machine='pc-q35-noble'>hvm</type>
19
+ </os>
20
+ <features>
21
+ <acpi/>
22
+ <apic/>
23
+ <vmport state='off'/>
24
+ </features>
25
+ <cpu mode='host-passthrough' check='none' migratable='on'/>
26
+ <clock offset='utc'>
27
+ <timer name='rtc' tickpolicy='catchup'/>
28
+ <timer name='pit' tickpolicy='delay'/>
29
+ <timer name='hpet' present='no'/>
30
+ </clock>
31
+ <on_poweroff>destroy</on_poweroff>
32
+ <on_reboot>restart</on_reboot>
33
+ <on_crash>destroy</on_crash>
34
+ <pm>
35
+ <suspend-to-mem enabled='no'/>
36
+ <suspend-to-disk enabled='no'/>
37
+ </pm>
38
+ <devices>
39
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
40
+ <disk type='file' device='disk'>
41
+ <driver name='qemu' type='qcow2' discard='unmap'/>
42
+ <source file='/mnt/nvmes/2T_samsung_990/990_general/vms/images/ephemeral/ubuntu-desktop-eph-80bf20__vda.qcow2' index='1'/>
43
+ <backingStore type='file' index='2'>
44
+ <format type='qcow2'/>
45
+ <source file='/mnt/nvmes/2T_samsung_990/990_general/vms/images/ephemeral/bases/ubuntu-desktop__vda.qcow2'/>
46
+ <backingStore/>
47
+ </backingStore>
48
+ <target dev='vda' bus='virtio'/>
49
+ <boot order='1'/>
50
+ <alias name='virtio-disk0'/>
51
+ <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
52
+ </disk>
53
+ <controller type='usb' index='0' model='qemu-xhci' ports='15'>
54
+ <alias name='usb'/>
55
+ <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
56
+ </controller>
57
+ <controller type='pci' index='0' model='pcie-root'>
58
+ <alias name='pcie.0'/>
59
+ </controller>
60
+ <controller type='pci' index='1' model='pcie-root-port'>
61
+ <model name='pcie-root-port'/>
62
+ <target chassis='1' port='0x10'/>
63
+ <alias name='pci.1'/>
64
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
65
+ </controller>
66
+ <controller type='pci' index='2' model='pcie-root-port'>
67
+ <model name='pcie-root-port'/>
68
+ <target chassis='2' port='0x11'/>
69
+ <alias name='pci.2'/>
70
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
71
+ </controller>
72
+ <controller type='pci' index='3' model='pcie-root-port'>
73
+ <model name='pcie-root-port'/>
74
+ <target chassis='3' port='0x12'/>
75
+ <alias name='pci.3'/>
76
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
77
+ </controller>
78
+ <controller type='pci' index='4' model='pcie-root-port'>
79
+ <model name='pcie-root-port'/>
80
+ <target chassis='4' port='0x13'/>
81
+ <alias name='pci.4'/>
82
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
83
+ </controller>
84
+ <controller type='pci' index='5' model='pcie-root-port'>
85
+ <model name='pcie-root-port'/>
86
+ <target chassis='5' port='0x14'/>
87
+ <alias name='pci.5'/>
88
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
89
+ </controller>
90
+ <controller type='pci' index='6' model='pcie-root-port'>
91
+ <model name='pcie-root-port'/>
92
+ <target chassis='6' port='0x15'/>
93
+ <alias name='pci.6'/>
94
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
95
+ </controller>
96
+ <controller type='pci' index='7' model='pcie-root-port'>
97
+ <model name='pcie-root-port'/>
98
+ <target chassis='7' port='0x16'/>
99
+ <alias name='pci.7'/>
100
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x6'/>
101
+ </controller>
102
+ <controller type='pci' index='8' model='pcie-root-port'>
103
+ <model name='pcie-root-port'/>
104
+ <target chassis='8' port='0x17'/>
105
+ <alias name='pci.8'/>
106
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x7'/>
107
+ </controller>
108
+ <controller type='pci' index='9' model='pcie-root-port'>
109
+ <model name='pcie-root-port'/>
110
+ <target chassis='9' port='0x18'/>
111
+ <alias name='pci.9'/>
112
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/>
113
+ </controller>
114
+ <controller type='pci' index='10' model='pcie-root-port'>
115
+ <model name='pcie-root-port'/>
116
+ <target chassis='10' port='0x19'/>
117
+ <alias name='pci.10'/>
118
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/>
119
+ </controller>
120
+ <controller type='pci' index='11' model='pcie-root-port'>
121
+ <model name='pcie-root-port'/>
122
+ <target chassis='11' port='0x1a'/>
123
+ <alias name='pci.11'/>
124
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x2'/>
125
+ </controller>
126
+ <controller type='pci' index='12' model='pcie-root-port'>
127
+ <model name='pcie-root-port'/>
128
+ <target chassis='12' port='0x1b'/>
129
+ <alias name='pci.12'/>
130
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x3'/>
131
+ </controller>
132
+ <controller type='pci' index='13' model='pcie-root-port'>
133
+ <model name='pcie-root-port'/>
134
+ <target chassis='13' port='0x1c'/>
135
+ <alias name='pci.13'/>
136
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x4'/>
137
+ </controller>
138
+ <controller type='pci' index='14' model='pcie-root-port'>
139
+ <model name='pcie-root-port'/>
140
+ <target chassis='14' port='0x1d'/>
141
+ <alias name='pci.14'/>
142
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x5'/>
143
+ </controller>
144
+ <controller type='sata' index='0'>
145
+ <alias name='ide'/>
146
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
147
+ </controller>
148
+ <controller type='virtio-serial' index='0'>
149
+ <alias name='virtio-serial0'/>
150
+ <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
151
+ </controller>
152
+ <serial type='pty'>
153
+ <source path='/dev/pts/4'/>
154
+ <target type='isa-serial' port='0'>
155
+ <model name='isa-serial'/>
156
+ </target>
157
+ <alias name='serial0'/>
158
+ </serial>
159
+ <console type='pty' tty='/dev/pts/4'>
160
+ <source path='/dev/pts/4'/>
161
+ <target type='serial' port='0'/>
162
+ <alias name='serial0'/>
163
+ </console>
164
+ <channel type='unix'>
165
+ <source mode='bind' path='/run/libvirt/qemu/channel/6-ubuntu-desktop-eph-8/org.qemu.guest_agent.0'/>
166
+ <target type='virtio' name='org.qemu.guest_agent.0' state='connected'/>
167
+ <alias name='channel0'/>
168
+ <address type='virtio-serial' controller='0' bus='0' port='1'/>
169
+ </channel>
170
+ <channel type='spicevmc'>
171
+ <target type='virtio' name='com.redhat.spice.0' state='connected'/>
172
+ <alias name='channel1'/>
173
+ <address type='virtio-serial' controller='0' bus='0' port='2'/>
174
+ </channel>
175
+ <input type='tablet' bus='usb'>
176
+ <alias name='input0'/>
177
+ <address type='usb' bus='0' port='1'/>
178
+ </input>
179
+ <input type='mouse' bus='ps2'>
180
+ <alias name='input1'/>
181
+ </input>
182
+ <input type='keyboard' bus='ps2'>
183
+ <alias name='input2'/>
184
+ </input>
185
+ <graphics type='spice' port='5903' autoport='yes' listen='127.0.0.1'>
186
+ <listen type='address' address='127.0.0.1'/>
187
+ </graphics>
188
+ <audio id='1' type='spice'/>
189
+ <video>
190
+ <model type='virtio' heads='1' primary='yes'>
191
+ <resolution x='1920' y='1080'/>
192
+ </model>
193
+ <alias name='video0'/>
194
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
195
+ </video>
196
+ <watchdog model='itco' action='reset'>
197
+ <alias name='watchdog0'/>
198
+ </watchdog>
199
+ <memballoon model='virtio'>
200
+ <alias name='balloon0'/>
201
+ <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
202
+ </memballoon>
203
+ <rng model='virtio'>
204
+ <backend model='random'>/dev/urandom</backend>
205
+ <alias name='rng0'/>
206
+ <address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
207
+ </rng>
208
+ </devices>
209
+ <seclabel type='dynamic' model='apparmor' relabel='yes'>
210
+ <label>libvirt-0c6c6072-aa2e-4da8-8a38-04dba7db26cd</label>
211
+ <imagelabel>libvirt-0c6c6072-aa2e-4da8-8a38-04dba7db26cd</imagelabel>
212
+ </seclabel>
213
+ <seclabel type='dynamic' model='dac' relabel='yes'>
214
+ <label>+64055:+994</label>
215
+ <imagelabel>+64055:+994</imagelabel>
216
+ </seclabel>
217
+ </domain>
218
+