Initial commit

This commit is contained in:
Dom
2026-03-05 00:20:23 +01:00
commit 8581029226
138 changed files with 35204 additions and 0 deletions

10
.idea/agent_v0.iml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.12 (agent_v0)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

7
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.12 (agent_v0)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (agent_v0)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/agent_v0.iml" filepath="$PROJECT_DIR$/.idea/agent_v0.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

59
.idea/workspace.xml generated Normal file
View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="6e7ca47c-fd5c-45bc-af97-1511df3ffa0f" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/.idea/agent_v0.iml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/profiles_settings.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 6
}</component>
<component name="ProjectId" id="35np2KNIlriXUSCmfa61F0G3M5G" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"ModuleVcsDetector.initialDetectionPerformed": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
"RunOnceActivity.git.unshallow": "true",
"git-widget-placeholder": "master",
"settings.editor.selected.configurable": "settings.sync"
}
}]]></component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-python-sdk-f2b7a9f6281b-6e1f45a539f7-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-253.29346.142" />
</set>
</attachedChunks>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="6e7ca47c-fd5c-45bc-af97-1511df3ffa0f" name="Changes" comment="" />
<created>1763755481384</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1763755481384</updated>
</task>
<servers />
</component>
</project>

7
__init__.py Normal file
View File

@@ -0,0 +1,7 @@
# __init__.py
"""
agent_v0 : petit agent de capture de sessions (clics + screenshots)
pour RPA 100% vision.
Version v0 : squelette minimal.
"""

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

15
agent_config.json Normal file
View File

@@ -0,0 +1,15 @@
{
"user_id": "demo_user",
"user_label": "Démo agent_v0",
"customer": "Clinique Demo",
"training_label": "Facturation_T2A_demo",
"notes": "Session réelle avec clics + screenshots + key combos.",
"mode": "enriched",
"screenshot_mode": "crop",
"screenshot_crop_width": 900,
"screenshot_crop_height": 700,
"capture_hover": true,
"hover_min_idle_ms": 700,
"capture_scroll": true,
"network_save_path": ""
}

38
agent_v0_tray.spec Normal file
View File

@@ -0,0 +1,38 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['main.py'],
pathex=['/home/dom/ai/agent_v0'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='agent_v0_tray',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)

39
build.sh Executable file
View File

@@ -0,0 +1,39 @@
#!/usr/bin/env bash
set -e
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$BASE_DIR"
echo "[agent_v0] Build depuis : $BASE_DIR"
# 1) Activer le venv
if [ ! -d ".venv" ]; then
echo "[agent_v0] Pas de .venv trouvé. Lance d'abord ./run.sh une fois pour le créer."
exit 1
fi
# shellcheck disable=SC1091
source .venv/bin/activate
echo "[agent_v0] Python : $(which python)"
# 2) Vérifier / installer pyinstaller
if ! command -v pyinstaller >/dev/null 2>&1; then
echo "[agent_v0] Installation de pyinstaller..."
pip install pyinstaller
fi
# 3) Nettoyage build précédent
rm -rf build dist *.spec
# 4) Build
echo "[agent_v0] Lancement de PyInstaller..."
pyinstaller \
--name agent_v0_tray \
--onefile \
--noconfirm \
--paths "$BASE_DIR" \
main.py
echo "[agent_v0] Build terminé."
echo "[agent_v0] Binaire disponible dans : $BASE_DIR/dist/agent_v0_tray"

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,320 @@
('/home/dom/ai/agent_v0/dist/agent_v0_tray',
True,
False,
False,
None,
None,
False,
False,
None,
True,
False,
None,
None,
None,
'/home/dom/ai/agent_v0/build/agent_v0_tray/agent_v0_tray.pkg',
[('pyi-contents-directory _internal', '', 'OPTION'),
('PYZ-00.pyz', '/home/dom/ai/agent_v0/build/agent_v0_tray/PYZ-00.pyz', 'PYZ'),
('struct',
'/home/dom/ai/agent_v0/build/agent_v0_tray/localpycs/struct.pyc',
'PYMODULE'),
('pyimod01_archive',
'/home/dom/ai/agent_v0/build/agent_v0_tray/localpycs/pyimod01_archive.pyc',
'PYMODULE'),
('pyimod02_importers',
'/home/dom/ai/agent_v0/build/agent_v0_tray/localpycs/pyimod02_importers.pyc',
'PYMODULE'),
('pyimod03_ctypes',
'/home/dom/ai/agent_v0/build/agent_v0_tray/localpycs/pyimod03_ctypes.pyc',
'PYMODULE'),
('pyiboot01_bootstrap',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py',
'PYSOURCE'),
('pyi_rth_inspect',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py',
'PYSOURCE'),
('pyi_rth_setuptools',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py',
'PYSOURCE'),
('pyi_rth_pkgutil',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py',
'PYSOURCE'),
('pyi_rth_multiprocessing',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py',
'PYSOURCE'),
('main', '/home/dom/ai/agent_v0/main.py', 'PYSOURCE'),
('libpython3.12.so.1.0',
'/lib/x86_64-linux-gnu/libpython3.12.so.1.0',
'BINARY'),
('libXfixes.so.3', '/lib/x86_64-linux-gnu/libXfixes.so.3', 'BINARY'),
('libXrandr.so.2', '/lib/x86_64-linux-gnu/libXrandr.so.2', 'BINARY'),
('libX11.so.6', '/lib/x86_64-linux-gnu/libX11.so.6', 'BINARY'),
('python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('charset_normalizer/md.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('evdev/_uinput.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/evdev/_uinput.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('evdev/_input.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/evdev/_input.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_imagingft.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_imagingft.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_imaging.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_imaging.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_webp.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_webp.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_imagingtk.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_imagingtk.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_avif.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_avif.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_imagingmath.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_imagingmath.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('libexpat.so.1', '/lib/x86_64-linux-gnu/libexpat.so.1', 'BINARY'),
('libz.so.1', '/lib/x86_64-linux-gnu/libz.so.1', 'BINARY'),
('libmd.so.0', '/lib/x86_64-linux-gnu/libmd.so.0', 'BINARY'),
('libXdmcp.so.6', '/lib/x86_64-linux-gnu/libXdmcp.so.6', 'BINARY'),
('libXau.so.6', '/lib/x86_64-linux-gnu/libXau.so.6', 'BINARY'),
('libbsd.so.0', '/lib/x86_64-linux-gnu/libbsd.so.0', 'BINARY'),
('libXrender.so.1', '/lib/x86_64-linux-gnu/libXrender.so.1', 'BINARY'),
('libXext.so.6', '/lib/x86_64-linux-gnu/libXext.so.6', 'BINARY'),
('libcrypto.so.3', '/lib/x86_64-linux-gnu/libcrypto.so.3', 'BINARY'),
('liblzma.so.5', '/lib/x86_64-linux-gnu/liblzma.so.5', 'BINARY'),
('libbz2.so.1.0', '/lib/x86_64-linux-gnu/libbz2.so.1.0', 'BINARY'),
('libssl.so.3', '/lib/x86_64-linux-gnu/libssl.so.3', 'BINARY'),
('libffi.so.8', '/lib/x86_64-linux-gnu/libffi.so.8', 'BINARY'),
('libreadline.so.8', '/lib/x86_64-linux-gnu/libreadline.so.8', 'BINARY'),
('libtinfo.so.6', '/lib/x86_64-linux-gnu/libtinfo.so.6', 'BINARY'),
('pillow.libs/libharfbuzz-525aa570.so.0.61210.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libharfbuzz-525aa570.so.0.61210.0',
'BINARY'),
('pillow.libs/libpng16-00127801.so.16.50.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libpng16-00127801.so.16.50.0',
'BINARY'),
('pillow.libs/libfreetype-5bb46249.so.6.20.4',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libfreetype-5bb46249.so.6.20.4',
'BINARY'),
('pillow.libs/libbrotlicommon-c55a5f7a.so.1.1.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libbrotlicommon-c55a5f7a.so.1.1.0',
'BINARY'),
('pillow.libs/libbrotlidec-2ced2f3a.so.1.1.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libbrotlidec-2ced2f3a.so.1.1.0',
'BINARY'),
('pillow.libs/libopenjp2-94e588ba.so.2.5.4',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libopenjp2-94e588ba.so.2.5.4',
'BINARY'),
('pillow.libs/libXau-154567c4.so.6.0.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libXau-154567c4.so.6.0.0',
'BINARY'),
('pillow.libs/libxcb-64009ff3.so.1.1.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libxcb-64009ff3.so.1.1.0',
'BINARY'),
('pillow.libs/libjpeg-a41b0190.so.62.4.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libjpeg-a41b0190.so.62.4.0',
'BINARY'),
('pillow.libs/liblzma-64b7ab39.so.5.8.1',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/liblzma-64b7ab39.so.5.8.1',
'BINARY'),
('pillow.libs/libzstd-761a17b6.so.1.5.7',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libzstd-761a17b6.so.1.5.7',
'BINARY'),
('pillow.libs/libtiff-295fd75c.so.6.2.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libtiff-295fd75c.so.6.2.0',
'BINARY'),
('pillow.libs/libwebpmux-7f11e5ce.so.3.1.2',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libwebpmux-7f11e5ce.so.3.1.2',
'BINARY'),
('pillow.libs/libsharpyuv-95d8a097.so.0.1.2',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libsharpyuv-95d8a097.so.0.1.2',
'BINARY'),
('pillow.libs/libwebp-d8b9687f.so.7.2.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libwebp-d8b9687f.so.7.2.0',
'BINARY'),
('pillow.libs/libwebpdemux-747f2b49.so.2.0.17',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libwebpdemux-747f2b49.so.2.0.17',
'BINARY'),
('libgcc_s.so.1', '/lib/x86_64-linux-gnu/libgcc_s.so.1', 'BINARY'),
('libstdc++.so.6', '/lib/x86_64-linux-gnu/libstdc++.so.6', 'BINARY'),
('pillow.libs/libavif-01e67780.so.16.3.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libavif-01e67780.so.16.3.0',
'BINARY'),
('pillow.libs/liblcms2-cc10e42f.so.2.0.17',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/liblcms2-cc10e42f.so.2.0.17',
'BINARY'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED',
'DATA'),
('setuptools/_vendor/jaraco/text/Lorem ipsum.txt',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco/text/Lorem '
'ipsum.txt',
'DATA'),
('certifi/py.typed',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/certifi/py.typed',
'DATA'),
('certifi/cacert.pem',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/certifi/cacert.pem',
'DATA'),
('base_library.zip',
'/home/dom/ai/agent_v0/build/agent_v0_tray/base_library.zip',
'DATA'),
('libharfbuzz-525aa570.so.0.61210.0',
'pillow.libs/libharfbuzz-525aa570.so.0.61210.0',
'SYMLINK'),
('libpng16-00127801.so.16.50.0',
'pillow.libs/libpng16-00127801.so.16.50.0',
'SYMLINK'),
('libfreetype-5bb46249.so.6.20.4',
'pillow.libs/libfreetype-5bb46249.so.6.20.4',
'SYMLINK'),
('libbrotlicommon-c55a5f7a.so.1.1.0',
'pillow.libs/libbrotlicommon-c55a5f7a.so.1.1.0',
'SYMLINK'),
('libbrotlidec-2ced2f3a.so.1.1.0',
'pillow.libs/libbrotlidec-2ced2f3a.so.1.1.0',
'SYMLINK'),
('libopenjp2-94e588ba.so.2.5.4',
'pillow.libs/libopenjp2-94e588ba.so.2.5.4',
'SYMLINK'),
('libXau-154567c4.so.6.0.0',
'pillow.libs/libXau-154567c4.so.6.0.0',
'SYMLINK'),
('libxcb-64009ff3.so.1.1.0',
'pillow.libs/libxcb-64009ff3.so.1.1.0',
'SYMLINK'),
('libjpeg-a41b0190.so.62.4.0',
'pillow.libs/libjpeg-a41b0190.so.62.4.0',
'SYMLINK'),
('liblzma-64b7ab39.so.5.8.1',
'pillow.libs/liblzma-64b7ab39.so.5.8.1',
'SYMLINK'),
('libzstd-761a17b6.so.1.5.7',
'pillow.libs/libzstd-761a17b6.so.1.5.7',
'SYMLINK'),
('libtiff-295fd75c.so.6.2.0',
'pillow.libs/libtiff-295fd75c.so.6.2.0',
'SYMLINK'),
('libwebpmux-7f11e5ce.so.3.1.2',
'pillow.libs/libwebpmux-7f11e5ce.so.3.1.2',
'SYMLINK'),
('libsharpyuv-95d8a097.so.0.1.2',
'pillow.libs/libsharpyuv-95d8a097.so.0.1.2',
'SYMLINK'),
('libwebp-d8b9687f.so.7.2.0',
'pillow.libs/libwebp-d8b9687f.so.7.2.0',
'SYMLINK'),
('libwebpdemux-747f2b49.so.2.0.17',
'pillow.libs/libwebpdemux-747f2b49.so.2.0.17',
'SYMLINK'),
('libavif-01e67780.so.16.3.0',
'pillow.libs/libavif-01e67780.so.16.3.0',
'SYMLINK'),
('liblcms2-cc10e42f.so.2.0.17',
'pillow.libs/liblcms2-cc10e42f.so.2.0.17',
'SYMLINK')],
[],
False,
False,
1763765324,
[('run',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PyInstaller/bootloader/Linux-64bit-intel/run',
'EXECUTABLE')],
'/lib/x86_64-linux-gnu/libpython3.12.so.1.0')

View File

@@ -0,0 +1,315 @@
('/home/dom/ai/agent_v0/build/agent_v0_tray/agent_v0_tray.pkg',
{'BINARY': True,
'DATA': True,
'EXECUTABLE': True,
'EXTENSION': True,
'PYMODULE': True,
'PYSOURCE': True,
'PYZ': False,
'SPLASH': True,
'SYMLINK': False},
[('pyi-contents-directory _internal', '', 'OPTION'),
('PYZ-00.pyz', '/home/dom/ai/agent_v0/build/agent_v0_tray/PYZ-00.pyz', 'PYZ'),
('struct',
'/home/dom/ai/agent_v0/build/agent_v0_tray/localpycs/struct.pyc',
'PYMODULE'),
('pyimod01_archive',
'/home/dom/ai/agent_v0/build/agent_v0_tray/localpycs/pyimod01_archive.pyc',
'PYMODULE'),
('pyimod02_importers',
'/home/dom/ai/agent_v0/build/agent_v0_tray/localpycs/pyimod02_importers.pyc',
'PYMODULE'),
('pyimod03_ctypes',
'/home/dom/ai/agent_v0/build/agent_v0_tray/localpycs/pyimod03_ctypes.pyc',
'PYMODULE'),
('pyiboot01_bootstrap',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py',
'PYSOURCE'),
('pyi_rth_inspect',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py',
'PYSOURCE'),
('pyi_rth_setuptools',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py',
'PYSOURCE'),
('pyi_rth_pkgutil',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py',
'PYSOURCE'),
('pyi_rth_multiprocessing',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py',
'PYSOURCE'),
('main', '/home/dom/ai/agent_v0/main.py', 'PYSOURCE'),
('libpython3.12.so.1.0',
'/lib/x86_64-linux-gnu/libpython3.12.so.1.0',
'BINARY'),
('libXfixes.so.3', '/lib/x86_64-linux-gnu/libXfixes.so.3', 'BINARY'),
('libXrandr.so.2', '/lib/x86_64-linux-gnu/libXrandr.so.2', 'BINARY'),
('libX11.so.6', '/lib/x86_64-linux-gnu/libX11.so.6', 'BINARY'),
('python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so',
'/usr/lib/python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('charset_normalizer/md.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('evdev/_uinput.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/evdev/_uinput.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('evdev/_input.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/evdev/_input.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_imagingft.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_imagingft.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_imaging.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_imaging.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_webp.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_webp.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_imagingtk.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_imagingtk.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_avif.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_avif.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('PIL/_imagingmath.cpython-312-x86_64-linux-gnu.so',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PIL/_imagingmath.cpython-312-x86_64-linux-gnu.so',
'EXTENSION'),
('libexpat.so.1', '/lib/x86_64-linux-gnu/libexpat.so.1', 'BINARY'),
('libz.so.1', '/lib/x86_64-linux-gnu/libz.so.1', 'BINARY'),
('libmd.so.0', '/lib/x86_64-linux-gnu/libmd.so.0', 'BINARY'),
('libXdmcp.so.6', '/lib/x86_64-linux-gnu/libXdmcp.so.6', 'BINARY'),
('libXau.so.6', '/lib/x86_64-linux-gnu/libXau.so.6', 'BINARY'),
('libbsd.so.0', '/lib/x86_64-linux-gnu/libbsd.so.0', 'BINARY'),
('libXrender.so.1', '/lib/x86_64-linux-gnu/libXrender.so.1', 'BINARY'),
('libXext.so.6', '/lib/x86_64-linux-gnu/libXext.so.6', 'BINARY'),
('libcrypto.so.3', '/lib/x86_64-linux-gnu/libcrypto.so.3', 'BINARY'),
('liblzma.so.5', '/lib/x86_64-linux-gnu/liblzma.so.5', 'BINARY'),
('libbz2.so.1.0', '/lib/x86_64-linux-gnu/libbz2.so.1.0', 'BINARY'),
('libssl.so.3', '/lib/x86_64-linux-gnu/libssl.so.3', 'BINARY'),
('libffi.so.8', '/lib/x86_64-linux-gnu/libffi.so.8', 'BINARY'),
('libreadline.so.8', '/lib/x86_64-linux-gnu/libreadline.so.8', 'BINARY'),
('libtinfo.so.6', '/lib/x86_64-linux-gnu/libtinfo.so.6', 'BINARY'),
('pillow.libs/libharfbuzz-525aa570.so.0.61210.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libharfbuzz-525aa570.so.0.61210.0',
'BINARY'),
('pillow.libs/libpng16-00127801.so.16.50.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libpng16-00127801.so.16.50.0',
'BINARY'),
('pillow.libs/libfreetype-5bb46249.so.6.20.4',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libfreetype-5bb46249.so.6.20.4',
'BINARY'),
('pillow.libs/libbrotlicommon-c55a5f7a.so.1.1.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libbrotlicommon-c55a5f7a.so.1.1.0',
'BINARY'),
('pillow.libs/libbrotlidec-2ced2f3a.so.1.1.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libbrotlidec-2ced2f3a.so.1.1.0',
'BINARY'),
('pillow.libs/libopenjp2-94e588ba.so.2.5.4',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libopenjp2-94e588ba.so.2.5.4',
'BINARY'),
('pillow.libs/libXau-154567c4.so.6.0.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libXau-154567c4.so.6.0.0',
'BINARY'),
('pillow.libs/libxcb-64009ff3.so.1.1.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libxcb-64009ff3.so.1.1.0',
'BINARY'),
('pillow.libs/libjpeg-a41b0190.so.62.4.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libjpeg-a41b0190.so.62.4.0',
'BINARY'),
('pillow.libs/liblzma-64b7ab39.so.5.8.1',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/liblzma-64b7ab39.so.5.8.1',
'BINARY'),
('pillow.libs/libzstd-761a17b6.so.1.5.7',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libzstd-761a17b6.so.1.5.7',
'BINARY'),
('pillow.libs/libtiff-295fd75c.so.6.2.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libtiff-295fd75c.so.6.2.0',
'BINARY'),
('pillow.libs/libwebpmux-7f11e5ce.so.3.1.2',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libwebpmux-7f11e5ce.so.3.1.2',
'BINARY'),
('pillow.libs/libsharpyuv-95d8a097.so.0.1.2',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libsharpyuv-95d8a097.so.0.1.2',
'BINARY'),
('pillow.libs/libwebp-d8b9687f.so.7.2.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libwebp-d8b9687f.so.7.2.0',
'BINARY'),
('pillow.libs/libwebpdemux-747f2b49.so.2.0.17',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libwebpdemux-747f2b49.so.2.0.17',
'BINARY'),
('libgcc_s.so.1', '/lib/x86_64-linux-gnu/libgcc_s.so.1', 'BINARY'),
('libstdc++.so.6', '/lib/x86_64-linux-gnu/libstdc++.so.6', 'BINARY'),
('pillow.libs/libavif-01e67780.so.16.3.0',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/libavif-01e67780.so.16.3.0',
'BINARY'),
('pillow.libs/liblcms2-cc10e42f.so.2.0.17',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pillow.libs/liblcms2-cc10e42f.so.2.0.17',
'BINARY'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED',
'DATA'),
('setuptools/_vendor/jaraco/text/Lorem ipsum.txt',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco/text/Lorem '
'ipsum.txt',
'DATA'),
('certifi/py.typed',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/certifi/py.typed',
'DATA'),
('certifi/cacert.pem',
'/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/certifi/cacert.pem',
'DATA'),
('base_library.zip',
'/home/dom/ai/agent_v0/build/agent_v0_tray/base_library.zip',
'DATA'),
('libharfbuzz-525aa570.so.0.61210.0',
'pillow.libs/libharfbuzz-525aa570.so.0.61210.0',
'SYMLINK'),
('libpng16-00127801.so.16.50.0',
'pillow.libs/libpng16-00127801.so.16.50.0',
'SYMLINK'),
('libfreetype-5bb46249.so.6.20.4',
'pillow.libs/libfreetype-5bb46249.so.6.20.4',
'SYMLINK'),
('libbrotlicommon-c55a5f7a.so.1.1.0',
'pillow.libs/libbrotlicommon-c55a5f7a.so.1.1.0',
'SYMLINK'),
('libbrotlidec-2ced2f3a.so.1.1.0',
'pillow.libs/libbrotlidec-2ced2f3a.so.1.1.0',
'SYMLINK'),
('libopenjp2-94e588ba.so.2.5.4',
'pillow.libs/libopenjp2-94e588ba.so.2.5.4',
'SYMLINK'),
('libXau-154567c4.so.6.0.0',
'pillow.libs/libXau-154567c4.so.6.0.0',
'SYMLINK'),
('libxcb-64009ff3.so.1.1.0',
'pillow.libs/libxcb-64009ff3.so.1.1.0',
'SYMLINK'),
('libjpeg-a41b0190.so.62.4.0',
'pillow.libs/libjpeg-a41b0190.so.62.4.0',
'SYMLINK'),
('liblzma-64b7ab39.so.5.8.1',
'pillow.libs/liblzma-64b7ab39.so.5.8.1',
'SYMLINK'),
('libzstd-761a17b6.so.1.5.7',
'pillow.libs/libzstd-761a17b6.so.1.5.7',
'SYMLINK'),
('libtiff-295fd75c.so.6.2.0',
'pillow.libs/libtiff-295fd75c.so.6.2.0',
'SYMLINK'),
('libwebpmux-7f11e5ce.so.3.1.2',
'pillow.libs/libwebpmux-7f11e5ce.so.3.1.2',
'SYMLINK'),
('libsharpyuv-95d8a097.so.0.1.2',
'pillow.libs/libsharpyuv-95d8a097.so.0.1.2',
'SYMLINK'),
('libwebp-d8b9687f.so.7.2.0',
'pillow.libs/libwebp-d8b9687f.so.7.2.0',
'SYMLINK'),
('libwebpdemux-747f2b49.so.2.0.17',
'pillow.libs/libwebpdemux-747f2b49.so.2.0.17',
'SYMLINK'),
('libavif-01e67780.so.16.3.0',
'pillow.libs/libavif-01e67780.so.16.3.0',
'SYMLINK'),
('liblcms2-cc10e42f.so.2.0.17',
'pillow.libs/liblcms2-cc10e42f.so.2.0.17',
'SYMLINK')],
'libpython3.12.so.1.0',
False,
False,
False,
[],
None,
None,
None)

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,88 @@
This file lists modules PyInstaller was not able to find. This does not
necessarily mean this module is required for running your program. Python and
Python 3rd-party packages include a lot of conditional or optional modules. For
example the module 'ntpath' only exists on Windows, whereas the module
'posixpath' only exists on Posix systems.
Types if import:
* top-level: imported at the top-level - look at these first
* conditional: imported within an if-statement
* delayed: imported within a function
* optional: imported within a try-except-statement
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
tracking down the missing module yourself. Thanks!
missing module named _winapi - imported by encodings (delayed, conditional, optional), shutil (conditional), subprocess (conditional), ntpath (optional), mimetypes (optional), multiprocessing.connection (optional), multiprocessing.spawn (delayed, conditional), multiprocessing.reduction (conditional), multiprocessing.shared_memory (conditional), multiprocessing.heap (conditional), multiprocessing.popen_spawn_win32 (top-level), asyncio.windows_events (top-level), asyncio.windows_utils (top-level)
missing module named msvcrt - imported by subprocess (optional), getpass (optional), multiprocessing.spawn (delayed, conditional), multiprocessing.popen_spawn_win32 (top-level), asyncio.windows_events (top-level), asyncio.windows_utils (top-level)
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
missing module named winreg - imported by importlib._bootstrap_external (conditional), platform (delayed, optional), mimetypes (optional), urllib.request (delayed, conditional, optional), requests.utils (delayed, conditional, optional), setuptools._distutils.compilers.C.msvc (top-level), setuptools.msvc (conditional)
missing module named nt - imported by shutil (conditional), importlib._bootstrap_external (conditional), os (delayed, conditional, optional), ntpath (optional), ctypes (delayed, conditional)
missing module named _scproxy - imported by urllib.request (conditional)
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named pyimod02_importers - imported by /home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py (delayed)
missing module named typing_extensions.Buffer - imported by setuptools._vendor.typing_extensions (top-level), setuptools._vendor.wheel.wheelfile (conditional)
missing module named typing_extensions.Literal - imported by setuptools._vendor.typing_extensions (top-level), setuptools.config._validate_pyproject.formats (conditional)
missing module named typing_extensions.Self - imported by setuptools._vendor.typing_extensions (top-level), setuptools.config.expand (conditional), setuptools.config.pyprojecttoml (conditional), setuptools.config._validate_pyproject.error_reporting (conditional)
missing module named typing_extensions.deprecated - imported by setuptools._vendor.typing_extensions (top-level), setuptools._distutils.sysconfig (conditional), setuptools._distutils.command.bdist (conditional)
missing module named typing_extensions.TypeAlias - imported by setuptools._vendor.typing_extensions (top-level), setuptools._distutils.compilers.C.base (conditional), setuptools._reqs (conditional), setuptools.warnings (conditional), setuptools._path (conditional), setuptools._distutils.dist (conditional), setuptools.config.setupcfg (conditional), setuptools.config._apply_pyprojecttoml (conditional), setuptools.dist (conditional), setuptools.command.bdist_egg (conditional), setuptools.compat.py311 (conditional)
missing module named typing_extensions.Unpack - imported by setuptools._vendor.typing_extensions (top-level), setuptools._distutils.util (conditional), setuptools._distutils.compilers.C.base (conditional), setuptools._distutils.cmd (conditional)
missing module named typing_extensions.TypeVarTuple - imported by setuptools._vendor.typing_extensions (top-level), setuptools._distutils.util (conditional), setuptools._distutils.compilers.C.base (conditional), setuptools._distutils.cmd (conditional)
missing module named jaraco - imported by setuptools._distutils.util (top-level), setuptools._vendor.jaraco.functools (top-level), setuptools._vendor.jaraco.context (top-level), setuptools._vendor.jaraco.text (top-level)
missing module named _overlapped - imported by asyncio.windows_events (top-level)
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
missing module named vms_lib - imported by platform (delayed, optional)
missing module named 'java.lang' - imported by platform (delayed, optional)
missing module named java - imported by platform (delayed)
missing module named _winreg - imported by platform (delayed, optional)
missing module named _wmi - imported by platform (optional)
missing module named usercustomize - imported by site (delayed, optional)
missing module named apport_python_hook - imported by sitecustomize (optional)
missing module named _typeshed - imported by setuptools._distutils.dist (conditional), setuptools.glob (conditional), setuptools.compat.py311 (conditional)
missing module named _manylinux - imported by packaging._manylinux (delayed, optional), setuptools._vendor.packaging._manylinux (delayed, optional), setuptools._vendor.wheel.vendored.packaging._manylinux (delayed, optional)
missing module named backports - imported by setuptools._vendor.jaraco.context (conditional)
missing module named importlib_resources - imported by setuptools._vendor.jaraco.text (optional)
missing module named trove_classifiers - imported by setuptools.config._validate_pyproject.formats (optional)
missing module named simplejson - imported by requests.compat (conditional, optional)
missing module named dummy_threading - imported by requests.cookies (optional)
missing module named zstandard - imported by urllib3.util.request (optional), urllib3.response (optional)
missing module named compression - imported by urllib3.util.request (optional), urllib3.response (optional)
missing module named 'h2.events' - imported by urllib3.http2.connection (top-level)
missing module named 'h2.connection' - imported by urllib3.http2.connection (top-level)
missing module named h2 - imported by urllib3.http2.connection (top-level)
missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional)
missing module named brotlicffi - imported by urllib3.util.request (optional), urllib3.response (optional)
missing module named socks - imported by urllib3.contrib.socks (optional)
missing module named cryptography - imported by urllib3.contrib.pyopenssl (top-level), requests (conditional, optional)
missing module named 'OpenSSL.crypto' - imported by urllib3.contrib.pyopenssl (delayed, conditional)
missing module named 'cryptography.x509' - imported by urllib3.contrib.pyopenssl (delayed, optional)
missing module named OpenSSL - imported by urllib3.contrib.pyopenssl (top-level)
missing module named chardet - imported by requests (optional)
missing module named 'pyodide.ffi' - imported by urllib3.contrib.emscripten.fetch (delayed, optional)
missing module named pyodide - imported by urllib3.contrib.emscripten.fetch (top-level)
missing module named js - imported by urllib3.contrib.emscripten.fetch (top-level)
runtime module named six.moves - imported by pystray._base (top-level), pystray._win32 (top-level), Xlib.threaded (top-level), pystray._xorg (top-level), pynput._util (top-level)
missing module named StringIO - imported by six (conditional)
missing module named AppKit - imported by pystray._darwin (top-level), pynput.mouse._darwin (top-level)
missing module named Quartz - imported by pynput._util.darwin (top-level), pynput.keyboard._darwin (top-level), pynput.mouse._darwin (top-level)
missing module named CoreFoundation - imported by pynput._util.darwin (top-level)
missing module named HIServices - imported by pynput._util.darwin (top-level)
missing module named objc - imported by pystray._darwin (top-level), pynput._util.darwin (top-level)
missing module named 'ctypes.macholib' - imported by ctypes.util (conditional)
missing module named _uuid - imported by uuid (optional)
missing module named numpy - imported by PIL._typing (conditional, optional)
missing module named olefile - imported by PIL.FpxImagePlugin (top-level), PIL.MicImagePlugin (top-level)
missing module named defusedxml - imported by PIL.Image (optional)
missing module named 'gi.repository' - imported by pystray._appindicator (top-level), pystray._util.gtk (top-level), pystray._util.notify_dbus (top-level), pystray._gtk (top-level)
missing module named gi - imported by pystray._appindicator (top-level), pystray._util.gtk (top-level), pystray._util.notify_dbus (top-level), pystray._gtk (top-level)
missing module named PyObjCTools - imported by pystray._darwin (top-level)
missing module named Foundation - imported by pystray._darwin (top-level)
missing module named win32evtlog - imported by logging.handlers (delayed, optional)
missing module named win32evtlogutil - imported by logging.handlers (delayed, optional)

File diff suppressed because it is too large Load Diff

34
config.py Normal file
View File

@@ -0,0 +1,34 @@
# config.py
"""
Configuration de base pour agent_v0.
"""
from __future__ import annotations
import os
from pathlib import Path
AGENT_VERSION = "0.1.0"
# Dossier racine du projet (là où se trouve ce fichier)
BASE_DIR = Path(__file__).resolve().parent
# Endpoint de ton serveur (placeholder pour l'instant)
SERVER_URL = "https://example.com/api/traces/upload"
# Durée max d'une session en secondes (ex: 30 minutes)
MAX_SESSION_DURATION_S = 30 * 60
# Dossier racine local où stocker les sessions (chemin ABSOLU)
SESSIONS_ROOT = str(BASE_DIR / "sessions")
# Dossier et fichier de logs
LOGS_DIR = BASE_DIR / "logs"
LOG_FILE = LOGS_DIR / "agent_v0.log"
# Faut-il quitter l'application après un Stop session ?
EXIT_AFTER_SESSION = True
# Création des dossiers si besoin
os.makedirs(SESSIONS_ROOT, exist_ok=True)
os.makedirs(LOGS_DIR, exist_ok=True)

BIN
dist/agent_v0_tray vendored Executable file

Binary file not shown.

140
event_captor.py Normal file
View File

@@ -0,0 +1,140 @@
# event_captor.py
"""
Hooks souris pour agent_v0.
v0+ :
- écoute des clics souris globaux
- écoute du scroll (molette)
- détecte les périodes d'immobilité (hover) > hover_min_idle_ms
"""
from __future__ import annotations
import threading
import time
from typing import Callable, Optional
from pynput import mouse
MouseClickCallback = Callable[[str, int, int], None]
MouseScrollCallback = Callable[[int, int, int, int], None] # x, y, dx, dy
MouseHoverCallback = Callable[[int, int, int], None] # x, y, idle_ms
class EventCaptor:
"""
Capture les événements souris globaux et les relaie à des callbacks.
"""
def __init__(
self,
on_mouse_click: MouseClickCallback,
on_scroll: Optional[MouseScrollCallback] = None,
on_hover: Optional[MouseHoverCallback] = None,
hover_min_idle_ms: int = 700,
) -> None:
"""
:param on_mouse_click: fonction appelée sur clic souris,
signature (button_str, x, y)
:param on_scroll: fonction appelée sur scroll (molette), ou None
signature (x, y, dx, dy)
:param on_hover: fonction appelée quand la souris est immobile
depuis hover_min_idle_ms, ou None
signature (x, y, idle_ms)
"""
self._on_mouse_click = on_mouse_click
self._on_scroll = on_scroll
self._on_hover = on_hover
self._hover_min_idle_ms = hover_min_idle_ms
self._listener: mouse.Listener | None = None
# Pour le suivi du déplacement souris (hover)
self._last_move_time: Optional[float] = None
self._last_move_pos: Optional[tuple[int, int]] = None
self._hover_thread: Optional[threading.Thread] = None
self._hover_thread_running: bool = False
def start(self) -> None:
"""Démarre l'écoute globale des événements souris."""
if self._listener is not None:
return
self._listener = mouse.Listener(
on_click=self._handle_click,
on_scroll=self._handle_scroll,
on_move=self._handle_move,
)
self._listener.start()
if self._on_hover is not None:
self._hover_thread_running = True
self._hover_thread = threading.Thread(
target=self._hover_loop, name="HoverDetector", daemon=True
)
self._hover_thread.start()
def stop(self) -> None:
"""Arrête l'écoute globale et le thread hover."""
if self._listener is not None:
self._listener.stop()
self._listener = None
self._hover_thread_running = False
self._hover_thread = None
self._last_move_time = None
self._last_move_pos = None
# --- internes ---
def _handle_click(self, x: int, y: int, button: mouse.Button, pressed: bool) -> None:
# On ne loggue que l'événement "pressed"
if not pressed:
return
button_str = getattr(button, "name", str(button))
self._on_mouse_click(button_str, x, y)
def _handle_scroll(self, x: int, y: int, dx: int, dy: int) -> None:
if self._on_scroll is not None:
self._on_scroll(x, y, dx, dy)
def _handle_move(self, x: int, y: int) -> None:
now = time.monotonic()
self._last_move_time = now
self._last_move_pos = (x, y)
def _hover_loop(self) -> None:
"""
Thread qui surveille l'immobilité de la souris.
Si la souris reste immobile plus de hover_min_idle_ms,
on déclenche un callback on_hover(x, y, idle_ms).
"""
last_hover_trigger_time: float | None = None
while self._hover_thread_running:
time.sleep(0.1)
if self._on_hover is None:
continue
if self._last_move_time is None or self._last_move_pos is None:
continue
now = time.monotonic()
idle_ms = int((now - self._last_move_time) * 1000)
if idle_ms < self._hover_min_idle_ms:
continue
# Éviter de déclencher en boucle pour la même "immobilité"
if last_hover_trigger_time is not None:
# Si on a déjà déclenché récemment, on attend un nouveau mouvement
if self._last_move_time <= last_hover_trigger_time:
continue
x, y = self._last_move_pos
self._on_hover(x, y, idle_ms)
last_hover_trigger_time = now

123
key_captor.py Normal file
View File

@@ -0,0 +1,123 @@
# key_captor.py
"""
Capture des combos clavier pour agent_v0.
v0 :
- écoute globale clavier via pynput
- maintient un set de touches "modificateurs" enfoncées (CTRL, ALT, SHIFT, CMD)
- quand une touche non-modif est pressée avec au moins un modif,
appelle un callback (keys: List[str]) du type ["CTRL", "F"]
"""
from __future__ import annotations
from typing import Callable, List, Set
from pynput import keyboard
KeyComboCallback = Callable[[List[str]], None]
MODIFIER_MAP = {
keyboard.Key.ctrl_l: "CTRL",
keyboard.Key.ctrl_r: "CTRL",
keyboard.Key.alt_l: "ALT",
keyboard.Key.alt_r: "ALT",
keyboard.Key.shift: "SHIFT",
keyboard.Key.shift_l: "SHIFT",
keyboard.Key.shift_r: "SHIFT",
keyboard.Key.cmd: "CMD",
keyboard.Key.cmd_l: "CMD",
keyboard.Key.cmd_r: "CMD",
}
class KeyCaptor:
"""
Capture les combos clavier globaux et les relaie à un callback.
"""
def __init__(self, on_key_combo: KeyComboCallback) -> None:
"""
:param on_key_combo: fonction appelée sur combo clavier,
signature (keys: List[str])
"""
self._on_key_combo = on_key_combo
self._listener: keyboard.Listener | None = None
self._mods_pressed: Set[str] = set()
def start(self) -> None:
"""Démarre l'écoute globale clavier."""
if self._listener is not None:
return
self._listener = keyboard.Listener(
on_press=self._handle_press,
on_release=self._handle_release,
)
self._listener.start()
def stop(self) -> None:
"""Arrête l'écoute globale clavier."""
if self._listener is not None:
self._listener.stop()
self._listener = None
self._mods_pressed.clear()
# --- callbacks internes ---
def _handle_press(self, key: keyboard.Key | keyboard.KeyCode) -> None:
# Gestion des mods
mod_name = MODIFIER_MAP.get(key)
if mod_name:
self._mods_pressed.add(mod_name)
return
# Ici : touche non-modif
if not self._mods_pressed:
# Pas de modif → on ignore (on ne log pas la frappe "normale")
return
# On construit la liste des touches
keys = sorted(self._mods_pressed)
# Nom de la touche principale
main_key = self._key_to_str(key)
if main_key is None:
return
keys.append(main_key)
# Appel du callback
try:
self._on_key_combo(keys)
except Exception:
# On évite de casser le listener en cas d'erreur dans le callback
pass
def _handle_release(self, key: keyboard.Key | keyboard.KeyCode) -> None:
# Retirer les modifs qui ne sont plus pressées
mod_name = MODIFIER_MAP.get(key)
if mod_name and mod_name in self._mods_pressed:
self._mods_pressed.discard(mod_name)
@staticmethod
def _key_to_str(key: keyboard.Key | keyboard.KeyCode) -> str | None:
# Touche "normale" (KeyCode avec .char)
if isinstance(key, keyboard.KeyCode):
if key.char:
return key.char.upper()
return None
# Quelques touches "spéciales" qu'on peut vouloir logguer
special_map = {
keyboard.Key.enter: "ENTER",
keyboard.Key.tab: "TAB",
keyboard.Key.esc: "ESC",
keyboard.Key.space: "SPACE",
}
if key in special_map:
return special_map[key]
# Sinon, on ignore
return None

50
logger_conf.py Normal file
View File

@@ -0,0 +1,50 @@
# logger_conf.py
"""
Configuration du logging pour agent_v0.
- Log vers console
- Log vers fichier rotatif logs/agent_v0.log
"""
from __future__ import annotations
import logging
from logging.handlers import RotatingFileHandler
from config import LOG_FILE
def setup_logging(level: int = logging.INFO) -> None:
"""
Configure le logging global de l'application.
À appeler une seule fois au démarrage (dans main.py).
"""
logger = logging.getLogger()
# Éviter de dupliquer les handlers si setup_logging est rappelé
if logger.handlers:
return
logger.setLevel(level)
formatter = logging.Formatter(
"[%(asctime)s] [%(levelname)s] %(name)s: %(message)s"
)
# Handler fichier rotatif
file_handler = RotatingFileHandler(
LOG_FILE,
maxBytes=5 * 1024 * 1024, # 5 Mo
backupCount=3,
encoding="utf-8",
)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# Handler console
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logging.getLogger(__name__).info("Logging initialisé. Fichier log = %s", LOG_FILE)

292
logs/agent_v0.log Normal file
View File

@@ -0,0 +1,292 @@
[2025-11-21 23:08:47,881] [INFO] logger_conf: Logging initialisé. Fichier log = /home/dom/ai/agent_v0/logs/agent_v0.log
[2025-11-21 23:08:47,884] [INFO] agent_v0.tray: Démarrage de TrayApp...
[2025-11-21 23:09:15,053] [INFO] agent_v0.tray: Démarrage d'une nouvelle session...
[2025-11-21 23:09:15,059] [INFO] agent_v0.tray: Nouvelle session : platform=linux, hostname=dom-X870-Riptide-WiFi, res=1920x1080
[2025-11-21 23:09:15,062] [INFO] agent_v0.tray: Session sess_20251121T230915_218b0d40 démarrée.
[2025-11-21 23:09:19,414] [INFO] agent_v0.tray: Clic left à (1644, 16) → screenshot=shot_0001, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:09:19,520] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:09:22,892] [INFO] agent_v0.tray: Clic left à (1643, 20) → screenshot=shot_0002, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:09:22,918] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:09:24,012] [INFO] agent_v0.tray: Clic left à (1134, 482) → screenshot=shot_0003, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:09:25,435] [INFO] agent_v0.tray: Clic left à (783, 558) → screenshot=shot_0004, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:09:26,076] [INFO] agent_v0.tray: Clic left à (801, 492) → screenshot=shot_0005, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:09:26,523] [INFO] agent_v0.tray: Clic left à (877, 367) → screenshot=shot_0006, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:09:26,867] [INFO] agent_v0.tray: Clic left à (877, 367) → screenshot=shot_0007, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:09:27,435] [INFO] agent_v0.tray: Clic left à (546, 582) → screenshot=shot_0008, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:09:28,000] [INFO] agent_v0.tray: Clic left à (317, 672) → screenshot=shot_0009, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:09,774] [INFO] logger_conf: Logging initialisé. Fichier log = /home/dom/ai/agent_v0/logs/agent_v0.log
[2025-11-21 23:10:09,776] [INFO] agent_v0.tray: Démarrage de TrayApp...
[2025-11-21 23:10:14,732] [INFO] agent_v0.tray: Démarrage d'une nouvelle session...
[2025-11-21 23:10:14,738] [INFO] agent_v0.tray: Nouvelle session : platform=linux, hostname=dom-X870-Riptide-WiFi, res=1920x1080
[2025-11-21 23:10:14,740] [INFO] agent_v0.tray: Session sess_20251121T231014_555329f7 démarrée.
[2025-11-21 23:10:16,864] [INFO] agent_v0.tray: Clic left à (1646, 16) → screenshot=shot_0001, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:17,220] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:10:18,879] [INFO] agent_v0.tray: Clic right à (1646, 17) → screenshot=shot_0002, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:21,310] [INFO] agent_v0.tray: Clic right à (1646, 17) → screenshot=shot_0003, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:21,909] [INFO] agent_v0.tray: Clic left à (1647, 18) → screenshot=shot_0004, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:22,013] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:10:22,501] [INFO] agent_v0.tray: Clic left à (1648, 19) → screenshot=shot_0005, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:22,589] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:10:24,454] [INFO] agent_v0.tray: Clic left à (26, 262) → screenshot=shot_0006, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:40,109] [INFO] agent_v0.tray: Clic left à (36, 392) → screenshot=shot_0007, window='ChatGPT - Geniusia_v2 - Google Chrome', app='chrome'
[2025-11-21 23:10:40,629] [INFO] agent_v0.tray: Clic left à (1103, 532) → screenshot=shot_0008, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:43,310] [INFO] agent_v0.tray: Combo clavier ['CTRL', 'F'] → screenshot=shot_0009, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:46,830] [INFO] agent_v0.tray: Combo clavier ['CTRL', 'F'] → screenshot=shot_0010, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:47,230] [INFO] agent_v0.tray: Combo clavier ['CTRL', 'F'] → screenshot=shot_0011, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:47,510] [INFO] agent_v0.tray: Combo clavier ['CTRL', 'F'] → screenshot=shot_0012, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:47,679] [INFO] agent_v0.tray: Combo clavier ['CTRL', 'F'] → screenshot=shot_0013, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:47,799] [INFO] agent_v0.tray: Combo clavier ['CTRL', 'F'] → screenshot=shot_0014, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:47,902] [INFO] agent_v0.tray: Combo clavier ['CTRL', 'F'] → screenshot=shot_0015, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:48,046] [INFO] agent_v0.tray: Combo clavier ['CTRL', 'F'] → screenshot=shot_0016, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:48,198] [INFO] agent_v0.tray: Combo clavier ['CTRL', 'F'] → screenshot=shot_0017, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:48,302] [INFO] agent_v0.tray: Combo clavier ['CTRL', 'F'] → screenshot=shot_0018, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:48,463] [INFO] agent_v0.tray: Combo clavier ['CTRL', 'F'] → screenshot=shot_0019, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:48,640] [INFO] agent_v0.tray: Combo clavier ['CTRL', 'F'] → screenshot=shot_0020, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:51,734] [INFO] agent_v0.tray: Clic left à (1639, 21) → screenshot=shot_0021, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:51,802] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:10:55,199] [INFO] agent_v0.tray: Clic left à (1640, 21) → screenshot=shot_0022, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:10:55,317] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:10:58,479] [INFO] agent_v0.tray: Clic left à (32, 265) → screenshot=shot_0023, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:11:00,629] [INFO] agent_v0.tray: Clic left à (978, 976) → screenshot=shot_0024, window='ChatGPT - Geniusia_v2 - Google Chrome', app='chrome'
[2025-11-21 23:11:32,886] [INFO] agent_v0.tray: Combo clavier ['SHIFT', '?'] → screenshot=shot_0025, window='ChatGPT - Geniusia_v2 - Google Chrome', app='chrome'
[2025-11-21 23:12:00,591] [INFO] agent_v0.tray: Clic left à (1648, 21) → screenshot=shot_0026, window='ChatGPT - Geniusia_v2 - Google Chrome', app='chrome'
[2025-11-21 23:12:00,715] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:12:01,270] [INFO] agent_v0.tray: Clic left à (1649, 21) → screenshot=shot_0027, window='ChatGPT - Geniusia_v2 - Google Chrome', app='chrome'
[2025-11-21 23:12:01,383] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:12:01,814] [INFO] agent_v0.tray: Clic right à (1649, 21) → screenshot=shot_0028, window='ChatGPT - Geniusia_v2 - Google Chrome', app='chrome'
[2025-11-21 23:12:02,485] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:12:02,485] [INFO] agent_v0.tray: Clic left à (1649, 21) → screenshot=shot_0029, window='ChatGPT - Geniusia_v2 - Google Chrome', app='chrome'
[2025-11-21 23:12:02,532] [INFO] agent_v0.tray: Clic left à (1649, 21) → screenshot=shot_0030, window='ChatGPT - Geniusia_v2 - Google Chrome', app='chrome'
[2025-11-21 23:12:02,610] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:12:02,974] [INFO] agent_v0.tray: Clic left à (1649, 22) → screenshot=shot_0031, window='ChatGPT - Geniusia_v2 - Google Chrome', app='chrome'
[2025-11-21 23:12:03,077] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:12:03,204] [INFO] agent_v0.tray: Clic left à (1649, 22) → screenshot=shot_0032, window='ChatGPT - Geniusia_v2 - Google Chrome', app='chrome'
[2025-11-21 23:12:03,295] [INFO] agent_v0.tray: Session déjà active, Start ignoré.
[2025-11-21 23:12:34,831] [INFO] agent_v0.tray: Clic left à (34, 139) → screenshot=shot_0033, window='ChatGPT - Geniusia_v2 - Google Chrome', app='chrome'
[2025-11-21 23:12:36,365] [INFO] agent_v0.tray: Clic left à (665, 831) → screenshot=shot_0034, window='sessions', app='nautilus'
[2025-11-21 23:12:40,509] [INFO] agent_v0.tray: Clic left à (669, 612) → screenshot=shot_0035, window='sessions', app='nautilus'
[2025-11-21 23:12:40,702] [INFO] agent_v0.tray: Clic left à (669, 612) → screenshot=shot_0036, window='sess_20251121T231014_555329f7', app='nautilus'
[2025-11-21 23:12:43,244] [INFO] agent_v0.tray: Clic left à (325, 50) → screenshot=shot_0037, window='sess_20251121T231014_555329f7', app='nautilus'
[2025-11-21 23:12:44,422] [INFO] agent_v0.tray: Clic left à (503, 568) → screenshot=shot_0038, window='sessions', app='nautilus'
[2025-11-21 23:12:44,833] [INFO] agent_v0.tray: Clic left à (503, 568) → screenshot=shot_0039, window='sessions', app='nautilus'
[2025-11-21 23:12:45,277] [INFO] agent_v0.tray: Clic left à (503, 568) → screenshot=shot_0040, window='sessions', app='nautilus'
[2025-11-21 23:12:45,677] [INFO] agent_v0.tray: Clic left à (503, 568) → screenshot=shot_0041, window='sess_20251121T230915_218b0d40', app='nautilus'
[2025-11-21 23:12:46,995] [INFO] agent_v0.tray: Clic left à (322, 54) → screenshot=shot_0042, window='sess_20251121T230915_218b0d40', app='nautilus'
[2025-11-21 23:12:53,358] [INFO] agent_v0.tray: Clic left à (33, 394) → screenshot=shot_0043, window='sessions', app='nautilus'
[2025-11-21 23:12:55,468] [ERROR] pystray._base: An error occurred in the main loop
Traceback (most recent call last):
File "/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pystray/_xorg.py", line 209, in _mainloop
for event in self._events():
File "/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/pystray/_xorg.py", line 486, in _events
event = self._display.next_event()
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/Xlib/display.py", line 187, in next_event
return self.display.next_event()
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/Xlib/protocol/display.py", line 217, in next_event
self.send_and_recv(event = True)
File "/home/dom/ai/agent_v0/.venv/lib/python3.12/site-packages/Xlib/protocol/display.py", line 561, in send_and_recv
rs, ws, es = select.select([self.socket], writeset, [], timeout)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyboardInterrupt
[2025-11-21 23:16:33,057] [INFO] logger_conf: Logging initialisé. Fichier log = /home/dom/ai/agent_v0/logs/agent_v0.log
[2025-11-21 23:16:33,060] [INFO] agent_v0.tray: Démarrage de TrayApp...
[2025-11-21 23:16:38,263] [INFO] agent_v0.tray: Toggle: démarrage d'une session.
[2025-11-21 23:16:38,269] [INFO] agent_v0.tray: Nouvelle session : platform=linux, hostname=dom-X870-Riptide-WiFi, res=1920x1080
[2025-11-21 23:16:38,272] [INFO] agent_v0.tray: Session sess_20251121T231638_47da95e6 démarrée.
[2025-11-21 23:16:44,972] [INFO] agent_v0.tray: Clic left à (45, 1054) → screenshot=shot_0001, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:16:46,713] [INFO] agent_v0.tray: Clic left à (952, 560) → screenshot=shot_0002, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:16:49,006] [INFO] agent_v0.tray: Clic left à (148, 444) → screenshot=shot_0003, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:16:49,885] [INFO] agent_v0.tray: Clic left à (364, 435) → screenshot=shot_0004, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:16:50,325] [INFO] agent_v0.tray: Clic left à (309, 442) → screenshot=shot_0005, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:16:50,804] [INFO] agent_v0.tray: Clic left à (432, 488) → screenshot=shot_0006, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:16:52,134] [INFO] agent_v0.tray: Clic left à (474, 109) → screenshot=shot_0007, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:16:53,701] [INFO] agent_v0.tray: Clic left à (36, 1060) → screenshot=shot_0008, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:16:56,041] [INFO] agent_v0.tray: Clic left à (1050, 71) → screenshot=shot_0009, window='unknown_window', app='unknown_app'
[2025-11-21 23:17:00,494] [INFO] agent_v0.tray: Clic left à (1012, 167) → screenshot=shot_0010, window='unknown_window', app='unknown_app'
[2025-11-21 23:17:02,567] [INFO] agent_v0.tray: Clic left à (831, 356) → screenshot=shot_0011, window='ONLYOFFICE', app='DesktopEditors'
[2025-11-21 23:17:07,921] [INFO] agent_v0.tray: Clic left à (1577, 195) → screenshot=shot_0012, window='*Document1.docx — ONLYOFFICE', app='DesktopEditors'
[2025-11-21 23:17:09,150] [INFO] agent_v0.tray: Clic left à (992, 610) → screenshot=shot_0013, window='unknown_window', app='DesktopEditors'
[2025-11-21 23:17:11,398] [INFO] agent_v0.tray: Clic left à (1644, 19) → screenshot=shot_0014, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:17:11,441] [INFO] agent_v0.tray: Toggle: arrêt de la session.
[2025-11-21 23:17:11,442] [INFO] agent_v0.tray: Session JSON sauvegardée : /home/dom/ai/agent_v0/sessions/sess_20251121T231638_47da95e6/sess_20251121T231638_47da95e6.json
[2025-11-21 23:17:11,495] [INFO] agent_v0.tray: ZIP de session créé : /home/dom/ai/agent_v0/sessions/sess_20251121T231638_47da95e6.zip
[2025-11-21 23:17:12,073] [WARNING] agent_v0.tray: Upload du ZIP échoué ou désactivé.
[2025-11-21 23:17:12,073] [INFO] agent_v0.tray: Session terminée. SESSIONS_ROOT = /home/dom/ai/agent_v0/sessions
[2025-11-21 23:22:46,023] [INFO] logger_conf: Logging initialisé. Fichier log = /home/dom/ai/agent_v0/logs/agent_v0.log
[2025-11-21 23:22:46,026] [INFO] agent_v0.tray: Démarrage de TrayApp...
[2025-11-21 23:22:49,762] [INFO] agent_v0.tray: Toggle: démarrage d'une session.
[2025-11-21 23:22:49,768] [INFO] agent_v0.tray: Nouvelle session : platform=linux, hostname=dom-X870-Riptide-WiFi, res=1920x1080
[2025-11-21 23:22:49,770] [INFO] agent_v0.tray: Session sess_20251121T232249_d776ec1a démarrée.
[2025-11-21 23:22:53,783] [INFO] agent_v0.tray: Clic left à (25, 1061) → screenshot=shot_0001, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:22:58,427] [INFO] agent_v0.tray: Clic left à (731, 700) → screenshot=shot_0002, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:23:00,659] [INFO] agent_v0.tray: Clic left à (1589, 366) → screenshot=shot_0003, window='Logiciels et mises à jour', app='software-proper'
[2025-11-21 23:23:03,428] [INFO] agent_v0.tray: Clic left à (45, 1038) → screenshot=shot_0004, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:23:05,299] [INFO] agent_v0.tray: Clic left à (937, 372) → screenshot=shot_0005, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:23:07,278] [INFO] agent_v0.tray: Clic left à (1828, 47) → screenshot=shot_0006, window='ceci est un test ceci (Brouillon) - Éditeur de texte', app='gnome-text-edit'
[2025-11-21 23:23:08,723] [INFO] agent_v0.tray: Clic left à (19, 1042) → screenshot=shot_0007, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:23:11,164] [INFO] agent_v0.tray: Clic left à (1100, 406) → screenshot=shot_0008, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:23:13,194] [INFO] agent_v0.tray: Clic left à (961, 106) → screenshot=shot_0009, window='Clocks', app='gnome-clocks'
[2025-11-21 23:23:14,781] [INFO] agent_v0.tray: Clic left à (33, 1049) → screenshot=shot_0010, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:23:15,707] [INFO] agent_v0.tray: Clic left à (919, 548) → screenshot=shot_0011, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:23:17,331] [INFO] agent_v0.tray: Clic left à (322, 440) → screenshot=shot_0012, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:23:17,772] [INFO] agent_v0.tray: Clic left à (383, 436) → screenshot=shot_0013, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:23:18,356] [INFO] agent_v0.tray: Clic left à (335, 444) → screenshot=shot_0014, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:23:18,995] [INFO] agent_v0.tray: Clic left à (446, 499) → screenshot=shot_0015, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:23:20,652] [INFO] agent_v0.tray: Clic left à (480, 108) → screenshot=shot_0016, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:23:21,954] [INFO] agent_v0.tray: Clic left à (31, 1049) → screenshot=shot_0017, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:23:24,444] [INFO] agent_v0.tray: Clic left à (974, 71) → screenshot=shot_0018, window='unknown_window', app='unknown_app'
[2025-11-21 23:23:28,581] [INFO] agent_v0.tray: Clic left à (977, 157) → screenshot=shot_0019, window='unknown_window', app='unknown_app'
[2025-11-21 23:23:30,164] [INFO] agent_v0.tray: Clic left à (914, 362) → screenshot=shot_0020, window='ONLYOFFICE', app='DesktopEditors'
[2025-11-21 23:23:30,835] [INFO] agent_v0.tray: Clic left à (881, 365) → screenshot=shot_0021, window='ONLYOFFICE', app='DesktopEditors'
[2025-11-21 23:23:35,691] [INFO] agent_v0.tray: Clic left à (1570, 201) → screenshot=shot_0022, window='*Document1.docx — ONLYOFFICE', app='DesktopEditors'
[2025-11-21 23:23:36,804] [INFO] agent_v0.tray: Clic left à (969, 607) → screenshot=shot_0023, window='unknown_window', app='DesktopEditors'
[2025-11-21 23:23:39,031] [INFO] agent_v0.tray: Clic left à (1820, 61) → screenshot=shot_0024, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:23:43,444] [INFO] agent_v0.tray: Clic left à (49, 254) → screenshot=shot_0025, window='agent_v0 uploader.py', app='pycharm'
[2025-11-21 23:23:47,316] [INFO] agent_v0.tray: Clic left à (1652, 18) → screenshot=shot_0026, window='ChatGPT - Geniusia_v2 - Google Chrome', app='chrome'
[2025-11-21 23:23:47,385] [INFO] agent_v0.tray: Toggle: arrêt de la session.
[2025-11-21 23:23:47,386] [INFO] agent_v0.tray: Session JSON sauvegardée : /home/dom/ai/agent_v0/sessions/sess_20251121T232249_d776ec1a/sess_20251121T232249_d776ec1a.json
[2025-11-21 23:23:47,482] [INFO] agent_v0.tray: ZIP de session créé : /home/dom/ai/agent_v0/sessions/sess_20251121T232249_d776ec1a.zip
[2025-11-21 23:23:47,482] [WARNING] agent_v0.tray: Upload du ZIP échoué ou désactivé.
[2025-11-21 23:23:47,482] [INFO] agent_v0.tray: Session terminée. SESSIONS_ROOT = /home/dom/ai/agent_v0/sessions
[2025-11-21 23:24:03,632] [INFO] agent_v0.tray: Toggle: démarrage d'une session.
[2025-11-21 23:24:03,633] [INFO] agent_v0.tray: Nouvelle session : platform=linux, hostname=dom-X870-Riptide-WiFi, res=1920x1080
[2025-11-21 23:24:03,636] [INFO] agent_v0.tray: Session sess_20251121T232403_d88202ff démarrée.
[2025-11-21 23:24:04,839] [INFO] agent_v0.tray: Clic left à (1648, 15) → screenshot=shot_0001, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:24:04,885] [INFO] agent_v0.tray: Toggle: arrêt de la session.
[2025-11-21 23:24:04,885] [INFO] agent_v0.tray: Session JSON sauvegardée : /home/dom/ai/agent_v0/sessions/sess_20251121T232403_d88202ff/sess_20251121T232403_d88202ff.json
[2025-11-21 23:24:04,891] [INFO] agent_v0.tray: ZIP de session créé : /home/dom/ai/agent_v0/sessions/sess_20251121T232403_d88202ff.zip
[2025-11-21 23:24:04,891] [WARNING] agent_v0.tray: Upload du ZIP échoué ou désactivé.
[2025-11-21 23:24:04,891] [INFO] agent_v0.tray: Session terminée. SESSIONS_ROOT = /home/dom/ai/agent_v0/sessions
[2025-11-21 23:24:42,774] [INFO] agent_v0.tray: Toggle: démarrage d'une session.
[2025-11-21 23:24:42,774] [INFO] agent_v0.tray: Nouvelle session : platform=linux, hostname=dom-X870-Riptide-WiFi, res=1920x1080
[2025-11-21 23:24:42,777] [INFO] agent_v0.tray: Session sess_20251121T232442_3a3b3275 démarrée.
[2025-11-21 23:24:43,921] [INFO] agent_v0.tray: Clic left à (1647, 21) → screenshot=shot_0001, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:24:43,983] [INFO] agent_v0.tray: Toggle: arrêt de la session.
[2025-11-21 23:24:43,984] [INFO] agent_v0.tray: Session JSON sauvegardée : /home/dom/ai/agent_v0/sessions/sess_20251121T232442_3a3b3275/sess_20251121T232442_3a3b3275.json
[2025-11-21 23:24:43,989] [INFO] agent_v0.tray: ZIP de session créé : /home/dom/ai/agent_v0/sessions/sess_20251121T232442_3a3b3275.zip
[2025-11-21 23:24:43,989] [WARNING] agent_v0.tray: Upload du ZIP échoué ou désactivé.
[2025-11-21 23:24:43,989] [INFO] agent_v0.tray: Session terminée. SESSIONS_ROOT = /home/dom/ai/agent_v0/sessions
[2025-11-21 23:26:12,849] [INFO] logger_conf: Logging initialisé. Fichier log = /home/dom/ai/agent_v0/logs/agent_v0.log
[2025-11-21 23:26:12,851] [INFO] agent_v0.tray: Démarrage de TrayApp...
[2025-11-21 23:26:14,713] [INFO] agent_v0.tray: Toggle: démarrage d'une session.
[2025-11-21 23:26:14,719] [INFO] agent_v0.tray: Nouvelle session : platform=linux, hostname=dom-X870-Riptide-WiFi, res=1920x1080
[2025-11-21 23:26:14,721] [INFO] agent_v0.tray: Session sess_20251121T232614_247cd560 démarrée.
[2025-11-21 23:26:18,029] [INFO] agent_v0.tray: Clic left à (19, 1043) → screenshot=shot_0001, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:26:18,905] [INFO] agent_v0.tray: Clic left à (908, 566) → screenshot=shot_0002, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:26:20,298] [INFO] agent_v0.tray: Clic left à (325, 440) → screenshot=shot_0003, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:26:20,752] [INFO] agent_v0.tray: Clic left à (321, 405) → screenshot=shot_0004, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:26:21,218] [INFO] agent_v0.tray: Clic left à (374, 391) → screenshot=shot_0005, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:26:21,905] [INFO] agent_v0.tray: Clic left à (229, 398) → screenshot=shot_0006, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:26:22,936] [INFO] agent_v0.tray: Clic left à (477, 527) → screenshot=shot_0007, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:26:24,777] [INFO] agent_v0.tray: Clic left à (481, 110) → screenshot=shot_0008, window='Calculatrice', app='gnome-calculato'
[2025-11-21 23:26:26,122] [INFO] agent_v0.tray: Clic left à (29, 1060) → screenshot=shot_0009, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:26:27,738] [INFO] agent_v0.tray: Clic left à (1104, 404) → screenshot=shot_0010, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:26:29,120] [INFO] agent_v0.tray: Clic left à (665, 536) → screenshot=shot_0011, window='Clocks', app='gnome-clocks'
[2025-11-21 23:26:30,953] [INFO] agent_v0.tray: Clic left à (573, 221) → screenshot=shot_0012, window='Ajouter une nouvelle horloge mondiale', app='gnome-clocks'
[2025-11-21 23:26:36,271] [INFO] agent_v0.tray: Clic left à (412, 181) → screenshot=shot_0013, window='Ajouter une nouvelle horloge mondiale', app='gnome-clocks'
[2025-11-21 23:26:37,305] [INFO] agent_v0.tray: Clic left à (966, 101) → screenshot=shot_0014, window='Clocks', app='gnome-clocks'
[2025-11-21 23:26:38,675] [INFO] agent_v0.tray: Clic left à (1814, 48) → screenshot=shot_0015, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:26:41,696] [INFO] agent_v0.tray: Clic left à (38, 392) → screenshot=shot_0016, window='agent_v0 config.py', app='pycharm'
[2025-11-21 23:26:43,604] [INFO] agent_v0.tray: Clic left à (1648, 15) → screenshot=shot_0017, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:26:43,641] [INFO] agent_v0.tray: Toggle: arrêt de la session.
[2025-11-21 23:26:43,642] [INFO] agent_v0.tray: Session JSON sauvegardée : /home/dom/ai/agent_v0/sessions/sess_20251121T232614_247cd560/sess_20251121T232614_247cd560.json
[2025-11-21 23:26:43,711] [INFO] agent_v0.tray: ZIP de session créé : /home/dom/ai/agent_v0/sessions/sess_20251121T232614_247cd560.zip
[2025-11-21 23:26:43,711] [WARNING] agent_v0.tray: Upload du ZIP échoué ou désactivé.
[2025-11-21 23:26:43,711] [INFO] agent_v0.tray: Session terminée. SESSIONS_ROOT = /home/dom/ai/agent_v0/sessions
[2025-11-21 23:33:33,808] [INFO] logger_conf: Logging initialisé. Fichier log = /home/dom/ai/agent_v0/logs/agent_v0.log
[2025-11-21 23:33:33,811] [INFO] agent_v0.tray: Démarrage de TrayApp...
[2025-11-21 23:33:37,486] [INFO] agent_v0.tray: Toggle: démarrage d'une session.
[2025-11-21 23:33:37,492] [INFO] agent_v0.tray: Nouvelle session : platform=linux, hostname=dom-X870-Riptide-WiFi, res=1920x1080
[2025-11-21 23:33:37,495] [INFO] agent_v0.tray: Session sess_20251121T233337_212e7034 démarrée.
[2025-11-21 23:33:39,978] [INFO] agent_v0.tray: Clic left à (406, 531) → screenshot=shot_0001, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:33:40,303] [INFO] agent_v0.tray: Clic left à (408, 587) → screenshot=shot_0002, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:33:40,568] [INFO] agent_v0.tray: Clic left à (482, 666) → screenshot=shot_0003, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:33:40,751] [INFO] agent_v0.tray: Clic left à (520, 677) → screenshot=shot_0004, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:33:40,967] [INFO] agent_v0.tray: Clic left à (528, 678) → screenshot=shot_0005, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:33:41,159] [INFO] agent_v0.tray: Clic left à (541, 679) → screenshot=shot_0006, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:33:41,304] [INFO] agent_v0.tray: Clic left à (542, 679) → screenshot=shot_0007, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:33:43,063] [INFO] agent_v0.tray: Clic left à (1645, 16) → screenshot=shot_0008, window='Terminal', app='gnome-terminal-'
[2025-11-21 23:33:43,138] [INFO] agent_v0.tray: Toggle: arrêt de la session.
[2025-11-21 23:33:43,139] [INFO] agent_v0.tray: Session JSON sauvegardée : /home/dom/ai/agent_v0/sessions/sess_20251121T233337_212e7034/sess_20251121T233337_212e7034.json
[2025-11-21 23:33:43,174] [INFO] agent_v0.tray: ZIP de session créé : /home/dom/ai/agent_v0/sessions/sess_20251121T233337_212e7034.zip
[2025-11-21 23:33:43,174] [WARNING] agent_v0.tray: Upload du ZIP échoué ou désactivé.
[2025-11-21 23:33:43,174] [INFO] agent_v0.tray: Session terminée. SESSIONS_ROOT = /home/dom/ai/agent_v0/sessions
[2025-11-21 23:33:43,174] [INFO] agent_v0.tray: EXIT_AFTER_SESSION=True → arrêt de l'application.
[2025-11-22 01:19:42,609] [INFO] logger_conf: Logging initialisé. Fichier log = /home/dom/ai/agent_v0/logs/agent_v0.log
[2025-11-22 01:19:42,609] [INFO] agent_v0.tray: Config chargée : {'user_id': 'demo_user', 'user_label': 'Démo agent_v0', 'customer': 'Clinique Demo', 'training_label': 'Facturation_T2A_demo', 'notes': 'Session réelle avec clics + screenshots + key combos.', 'mode': 'enriched', 'screenshot_mode': 'crop', 'screenshot_crop_width': 900, 'screenshot_crop_height': 700, 'capture_hover': True, 'hover_min_idle_ms': 700, 'capture_scroll': True, 'network_save_path': ''}
[2025-11-22 01:19:42,611] [INFO] agent_v0.tray: Démarrage de TrayApp...
[2025-11-22 01:19:46,045] [INFO] agent_v0.tray: Toggle: démarrage d'une session.
[2025-11-22 01:19:46,051] [INFO] agent_v0.tray: Nouvelle session : platform=linux, hostname=dom-X870-Riptide-WiFi, res=1920x1080, mode=enriched
[2025-11-22 01:19:46,054] [INFO] agent_v0.tray: Session sess_20251122T011946_bc151626 démarrée.
[2025-11-22 01:19:47,987] [INFO] agent_v0.tray: Clic right à (1747, 19) → screenshot=shot_0001, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:19:49,788] [INFO] agent_v0.tray: Clic left à (1747, 19) → screenshot=shot_0002, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:19:49,909] [INFO] agent_v0.tray: Toggle: arrêt de la session.
[2025-11-22 01:19:49,910] [INFO] agent_v0.tray: Session JSON sauvegardée : /home/dom/ai/agent_v0/sessions/sess_20251122T011946_bc151626/sess_20251122T011946_bc151626.json
[2025-11-22 01:19:49,912] [INFO] agent_v0.tray: ZIP de session créé : /home/dom/ai/agent_v0/sessions/sess_20251122T011946_bc151626.zip
[2025-11-22 01:19:49,912] [WARNING] agent_v0.tray: Upload du ZIP échoué ou désactivé.
[2025-11-22 01:19:49,912] [INFO] agent_v0.tray: Session terminée. SESSIONS_ROOT = /home/dom/ai/agent_v0/sessions
[2025-11-22 01:19:49,912] [INFO] agent_v0.tray: EXIT_AFTER_SESSION=True → arrêt de l'application.
[2025-11-22 01:20:02,988] [INFO] logger_conf: Logging initialisé. Fichier log = /home/dom/ai/agent_v0/logs/agent_v0.log
[2025-11-22 01:20:02,988] [INFO] agent_v0.tray: Config chargée : {'user_id': 'demo_user', 'user_label': 'Démo agent_v0', 'customer': 'Clinique Demo', 'training_label': 'Facturation_T2A_demo', 'notes': 'Session réelle avec clics + screenshots + key combos.', 'mode': 'enriched', 'screenshot_mode': 'crop', 'screenshot_crop_width': 900, 'screenshot_crop_height': 700, 'capture_hover': True, 'hover_min_idle_ms': 700, 'capture_scroll': True, 'network_save_path': ''}
[2025-11-22 01:20:02,990] [INFO] agent_v0.tray: Démarrage de TrayApp...
[2025-11-22 01:21:38,389] [INFO] agent_v0.tray: Toggle: démarrage d'une session.
[2025-11-22 01:21:38,395] [INFO] agent_v0.tray: Nouvelle session : platform=linux, hostname=dom-X870-Riptide-WiFi, res=1920x1080, mode=enriched
[2025-11-22 01:21:38,398] [INFO] agent_v0.tray: Session sess_20251122T012138_2cf74644 démarrée.
[2025-11-22 01:21:40,221] [INFO] agent_v0.tray: Hover à (1217, 607) idle=761ms → screenshot=shot_0001, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:21:42,526] [INFO] agent_v0.tray: Clic left à (1742, 18) → screenshot=shot_0002, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:21:42,599] [INFO] agent_v0.tray: Toggle: arrêt de la session.
[2025-11-22 01:21:42,600] [INFO] agent_v0.tray: Session JSON sauvegardée : /home/dom/ai/agent_v0/sessions/sess_20251122T012138_2cf74644/sess_20251122T012138_2cf74644.json
[2025-11-22 01:21:42,602] [INFO] agent_v0.tray: ZIP de session créé : /home/dom/ai/agent_v0/sessions/sess_20251122T012138_2cf74644.zip
[2025-11-22 01:21:42,602] [WARNING] agent_v0.tray: Upload du ZIP échoué ou désactivé.
[2025-11-22 01:21:42,602] [INFO] agent_v0.tray: Session terminée. SESSIONS_ROOT = /home/dom/ai/agent_v0/sessions
[2025-11-22 01:21:42,602] [INFO] agent_v0.tray: EXIT_AFTER_SESSION=True → arrêt de l'application.
[2025-11-22 01:22:49,761] [INFO] logger_conf: Logging initialisé. Fichier log = /home/dom/ai/agent_v0/logs/agent_v0.log
[2025-11-22 01:22:49,761] [INFO] agent_v0.tray: Config chargée : {'user_id': 'demo_user', 'user_label': 'Démo agent_v0', 'customer': 'Clinique Demo', 'training_label': 'Facturation_T2A_demo', 'notes': 'Session réelle avec clics + screenshots + key combos.', 'mode': 'enriched', 'screenshot_mode': 'crop', 'screenshot_crop_width': 900, 'screenshot_crop_height': 700, 'capture_hover': True, 'hover_min_idle_ms': 700, 'capture_scroll': True, 'network_save_path': ''}
[2025-11-22 01:22:49,763] [INFO] agent_v0.tray: Démarrage de TrayApp...
[2025-11-22 01:22:55,183] [INFO] agent_v0.tray: Toggle: démarrage d'une session.
[2025-11-22 01:22:55,189] [INFO] agent_v0.tray: Nouvelle session : platform=linux, hostname=dom-X870-Riptide-WiFi, res=1920x1080, mode=enriched
[2025-11-22 01:22:55,191] [INFO] agent_v0.tray: Session sess_20251122T012255_a6ff491a démarrée.
[2025-11-22 01:22:58,358] [INFO] agent_v0.tray: Clic left à (38, 1045) → screenshot=shot_0001, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:22:59,964] [INFO] agent_v0.tray: Clic left à (1116, 77) → screenshot=shot_0002, window='unknown_window', app='unknown_app'
[2025-11-22 01:23:01,008] [INFO] agent_v0.tray: Hover à (1117, 77) idle=763ms → screenshot=shot_0003, window='unknown_window', app='unknown_app'
[2025-11-22 01:23:03,865] [INFO] agent_v0.tray: Clic left à (964, 237) → screenshot=shot_0004, window='unknown_window', app='unknown_app'
[2025-11-22 01:23:04,732] [INFO] agent_v0.tray: Hover à (964, 236) idle=731ms → screenshot=shot_0005, window='ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:05,954] [INFO] agent_v0.tray: Hover à (862, 216) idle=710ms → screenshot=shot_0006, window='ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:06,683] [INFO] agent_v0.tray: Clic left à (862, 216) → screenshot=shot_0007, window='ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:10,195] [INFO] agent_v0.tray: Clic left à (45, 402) → screenshot=shot_0008, window='Document1.docx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:10,779] [INFO] agent_v0.tray: Hover à (45, 402) idle=702ms → screenshot=shot_0009, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:23:18,927] [INFO] agent_v0.tray: Clic left à (29, 583) → screenshot=shot_0010, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:23:19,405] [INFO] agent_v0.tray: Hover à (29, 583) idle=762ms → screenshot=shot_0011, window='Document1.docx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:21,379] [INFO] agent_v0.tray: Clic left à (102, 96) → screenshot=shot_0012, window='Document1.docx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:22,690] [INFO] agent_v0.tray: Clic left à (163, 584) → screenshot=shot_0013, window='Document1.docx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:23,588] [INFO] agent_v0.tray: Clic left à (977, 241) → screenshot=shot_0014, window='ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:25,199] [INFO] agent_v0.tray: Clic left à (133, 103) → screenshot=shot_0015, window='*Livre1.xlsx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:25,428] [INFO] agent_v0.tray: Hover à (133, 103) idle=722ms → screenshot=shot_0016, window='*Livre1.xlsx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:26,459] [INFO] agent_v0.tray: Clic left à (192, 615) → screenshot=shot_0017, window='*Livre1.xlsx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:29,693] [INFO] agent_v0.tray: Clic left à (1039, 221) → screenshot=shot_0018, window='ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:31,285] [INFO] agent_v0.tray: Clic left à (102, 98) → screenshot=shot_0019, window='*Livre2.xlsx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:32,371] [INFO] agent_v0.tray: Clic left à (154, 614) → screenshot=shot_0020, window='*Livre2.xlsx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:33,059] [INFO] agent_v0.tray: Clic left à (1037, 246) → screenshot=shot_0021, window='ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:34,274] [INFO] agent_v0.tray: Clic left à (145, 102) → screenshot=shot_0022, window='*Livre3.xlsx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:35,620] [INFO] agent_v0.tray: Clic left à (154, 606) → screenshot=shot_0023, window='*Livre3.xlsx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:36,564] [INFO] agent_v0.tray: Clic left à (768, 254) → screenshot=shot_0024, window='ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:37,789] [INFO] agent_v0.tray: Clic left à (117, 99) → screenshot=shot_0025, window='Document2.docx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:38,700] [INFO] agent_v0.tray: Clic left à (149, 583) → screenshot=shot_0026, window='Document2.docx — ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:42,994] [INFO] agent_v0.tray: Clic left à (1912, 40) → screenshot=shot_0027, window='ONLYOFFICE', app='DesktopEditors'
[2025-11-22 01:23:45,976] [INFO] agent_v0.tray: Clic left à (30, 1043) → screenshot=shot_0028, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:23:46,586] [INFO] agent_v0.tray: Clic left à (30, 1043) → screenshot=shot_0029, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:23:46,659] [INFO] agent_v0.tray: Hover à (30, 1043) idle=785ms → screenshot=shot_0030, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:23:47,839] [INFO] agent_v0.tray: Clic left à (30, 1043) → screenshot=shot_0031, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:23:48,362] [INFO] agent_v0.tray: Clic left à (30, 1043) → screenshot=shot_0032, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:23:49,975] [INFO] agent_v0.tray: Clic left à (30, 1043) → screenshot=shot_0033, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:23:50,756] [INFO] agent_v0.tray: Clic left à (30, 1043) → screenshot=shot_0034, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:23:57,893] [INFO] agent_v0.tray: Hover à (24, 542) idle=700ms → screenshot=shot_0035, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:24:03,100] [INFO] agent_v0.tray: Clic left à (1740, 15) → screenshot=shot_0036, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:24:03,114] [INFO] agent_v0.tray: Hover à (1740, 15) idle=752ms → screenshot=shot_0037, window='Terminal', app='gnome-terminal-'
[2025-11-22 01:24:03,152] [INFO] agent_v0.tray: Toggle: arrêt de la session.
[2025-11-22 01:24:03,153] [INFO] agent_v0.tray: Session JSON sauvegardée : /home/dom/ai/agent_v0/sessions/sess_20251122T012255_a6ff491a/sess_20251122T012255_a6ff491a.json
[2025-11-22 01:24:03,194] [INFO] agent_v0.tray: ZIP de session créé : /home/dom/ai/agent_v0/sessions/sess_20251122T012255_a6ff491a.zip
[2025-11-22 01:24:03,194] [WARNING] agent_v0.tray: Upload du ZIP échoué ou désactivé.
[2025-11-22 01:24:03,194] [INFO] agent_v0.tray: Session terminée. SESSIONS_ROOT = /home/dom/ai/agent_v0/sessions
[2025-11-22 01:24:03,194] [INFO] agent_v0.tray: EXIT_AFTER_SESSION=True → arrêt de l'application.

24
main.py Normal file
View File

@@ -0,0 +1,24 @@
# main.py
"""
Point d'entrée agent_v0.
v0 (tray) :
- initialise le logging
- lance TrayApp (icône dans la zone de notification)
- gestion Start/Stop/Queit via menu tray
"""
from __future__ import annotations
from logger_conf import setup_logging
from tray_ui import TrayApp
def main() -> None:
setup_logging()
app = TrayApp()
app.run()
if __name__ == "__main__":
main()

238
raw_session.py Normal file
View File

@@ -0,0 +1,238 @@
# raw_session.py
"""
Modèle RawSession v1 pour l'agent_v0.
Ce module définit la structure des données RawSession et
la sérialisation en JSON au format rawsession_v1.
"""
from __future__ import annotations
import json
import os
import time
import uuid
from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional
from config import AGENT_VERSION, SESSIONS_ROOT
@dataclass
class ScreenshotMeta:
screenshot_id: str
relative_path: str
captured_at: str
@dataclass
class Event:
t: float
type: str
window: Dict[str, Any]
screenshot_id: Optional[str] = None
# champs optionnels selon type
button: Optional[str] = None
pos: Optional[List[int]] = None
keys: Optional[List[str]] = None
idle_ms: Optional[int] = None
scroll_delta: Optional[List[int]] = None # [dx, dy] pour la molette
@dataclass
class RawSession:
schema_version: str
session_id: str
agent_version: str
environment: Dict[str, Any]
user: Dict[str, Any]
context: Dict[str, Any]
started_at: str
ended_at: Optional[str] = None
events: List[Event] = field(default_factory=list)
screenshots: List[ScreenshotMeta] = field(default_factory=list)
_start_time_monotonic: float = field(default_factory=time.monotonic, repr=False)
@classmethod
def create(
cls,
user_id: str,
user_label: str = "",
customer: str = "",
training_label: str = "",
notes: str = "",
platform: str = "unknown",
hostname: str = "unknown",
screen_resolution: Optional[List[int]] = None,
display_scale: float = 1.0,
) -> "RawSession":
"""Fabrique une nouvelle session avec les champs de base remplis."""
session_id = f"sess_{time.strftime('%Y%m%dT%H%M%S')}_{uuid.uuid4().hex[:8]}"
started_at = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
environment = {
"platform": platform,
"hostname": hostname,
"screen": {
"primary_resolution": screen_resolution or [0, 0],
"display_scale": display_scale,
},
}
user = {
"id": user_id,
"label": user_label or user_id,
}
context = {
"customer": customer,
"training_label": training_label,
"notes": notes,
}
return cls(
schema_version="rawsession_v1",
session_id=session_id,
agent_version=AGENT_VERSION,
environment=environment,
user=user,
context=context,
started_at=started_at,
)
# --- API temps relatif ---
def now_relative(self) -> float:
"""Temps relatif (en secondes) depuis le début de la session."""
return time.monotonic() - self._start_time_monotonic
# --- API screenshots ---
def add_screenshot(
self,
screenshot_id: str,
relative_path: str,
captured_at: Optional[str] = None,
) -> None:
"""Enregistre les métadonnées d'un screenshot."""
captured_at = captured_at or time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
self.screenshots.append(
ScreenshotMeta(
screenshot_id=screenshot_id,
relative_path=relative_path,
captured_at=captured_at,
)
)
# --- API événements ---
def add_mouse_click_event(
self,
button: str,
pos: List[int],
window_title: str,
app_name: str,
screenshot_id: Optional[str],
) -> None:
self.events.append(
Event(
t=self.now_relative(),
type="mouse_click",
button=button,
pos=pos,
window={"title": window_title, "app_name": app_name},
screenshot_id=screenshot_id,
)
)
def add_key_combo_event(
self,
keys: List[str],
window_title: str,
app_name: str,
screenshot_id: Optional[str],
) -> None:
self.events.append(
Event(
t=self.now_relative(),
type="key_combo",
keys=keys,
window={"title": window_title, "app_name": app_name},
screenshot_id=screenshot_id,
)
)
def add_hover_idle_event(
self,
pos: List[int],
idle_ms: int,
window_title: str,
app_name: str,
screenshot_id: Optional[str],
) -> None:
self.events.append(
Event(
t=self.now_relative(),
type="hover_idle",
pos=pos,
idle_ms=idle_ms,
window={"title": window_title, "app_name": app_name},
screenshot_id=screenshot_id,
)
)
def add_scroll_event(
self,
pos: List[int],
delta: List[int],
window_title: str,
app_name: str,
screenshot_id: Optional[str],
) -> None:
"""delta = [dx, dy]"""
self.events.append(
Event(
t=self.now_relative(),
type="scroll",
pos=pos,
scroll_delta=delta,
window={"title": window_title, "app_name": app_name},
screenshot_id=screenshot_id,
)
)
def close(self) -> None:
"""Marque la fin de la session."""
self.ended_at = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
# --- Sérialisation ---
def to_dict(self) -> Dict[str, Any]:
return {
"schema_version": self.schema_version,
"session_id": self.session_id,
"agent_version": self.agent_version,
"environment": self.environment,
"user": self.user,
"context": self.context,
"started_at": self.started_at,
"ended_at": self.ended_at,
"events": [e.__dict__ for e in self.events],
"screenshots": [s.__dict__ for s in self.screenshots],
}
def save_json(self, base_dir: Optional[str] = None) -> str:
"""
Sauvegarde le JSON rawsession_v1 dans un sous-dossier de SESSIONS_ROOT.
Retourne le chemin du fichier JSON.
"""
base_dir = base_dir or SESSIONS_ROOT
session_dir = os.path.join(base_dir, self.session_id)
os.makedirs(session_dir, exist_ok=True)
json_path = os.path.join(session_dir, f"{self.session_id}.json")
with open(json_path, "w", encoding="utf-8") as f:
json.dump(self.to_dict(), f, ensure_ascii=False, indent=2)
return json_path

7
requirements.txt Normal file
View File

@@ -0,0 +1,7 @@
mss>=9.0.1
pynput>=1.7.7
requests>=2.31.0
pystray>=0.19.5
Pillow>=10.0.0
fastapi>=0.115.0 ; optional pour serveur plus tard (tu peux lenlever ici si tu veux)
uvicorn[standard]>=0.30.0 ; idem

45
run.sh Executable file
View File

@@ -0,0 +1,45 @@
#!/usr/bin/env bash
set -e
# Dossier du script
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$BASE_DIR"
echo "[agent_v0] Dossier de travail : $BASE_DIR"
# 1) Création du venv si nécessaire
if [ ! -d ".venv" ]; then
echo "[agent_v0] Création de l'environnement virtuel (.venv)..."
python3 -m venv .venv
else
echo "[agent_v0] Environnement virtuel déjà présent (.venv)."
fi
# 2) Activation du venv
# shellcheck disable=SC1091
source .venv/bin/activate
echo "[agent_v0] Python utilisé : $(which python)"
echo "[agent_v0] Version : $(python --version)"
# 3) Création de requirements.txt si absent
if [ ! -f "requirements.txt" ]; then
echo "[agent_v0] Création de requirements.txt..."
cat > requirements.txt << 'EOF'
mss>=9.0.1
pynput>=1.7.7
EOF
else
echo "[agent_v0] requirements.txt déjà présent."
fi
# 4) Upgrade pip + install deps
echo "[agent_v0] Mise à jour de pip..."
pip install --upgrade pip
echo "[agent_v0] Installation des dépendances depuis requirements.txt..."
pip install -r requirements.txt
# 5) Lancer l'agent
echo "[agent_v0] Lancement de main.py..."
python main.py

110
screen_capturer.py Normal file
View File

@@ -0,0 +1,110 @@
# screen_capturer.py
"""
Capture d'écran pour agent_v0.
v0+ :
- capture de l'écran principal en PNG
- mode "full" : écran complet
- mode "crop" : zone centrée autour d'une position (curseur)
- stockage dans sessions/<session_id>/shots/shot_XXXX.png
"""
from __future__ import annotations
import os
import time
from typing import Tuple, Optional
from mss import mss
from mss.tools import to_png
from config import SESSIONS_ROOT
from raw_session import RawSession
class ScreenCapturer:
"""
Gère la capture d'écran pour une session donnée.
"""
def __init__(
self,
session: RawSession,
base_dir: str = SESSIONS_ROOT,
screenshot_mode: str = "full", # "full" | "crop"
crop_width: int = 800,
crop_height: int = 600,
) -> None:
self.session = session
self.base_dir = base_dir
self._counter = 0
self.screenshot_mode = screenshot_mode
self.crop_width = crop_width
self.crop_height = crop_height
# Résolution écran pour clamp la zone de crop
self.screen_width, self.screen_height = self.detect_primary_resolution()
def _get_session_shots_dir(self) -> str:
session_dir = os.path.join(self.base_dir, self.session.session_id)
shots_dir = os.path.join(session_dir, "shots")
os.makedirs(shots_dir, exist_ok=True)
return shots_dir
def capture(self, focus_pos: Optional[Tuple[int, int]] = None) -> Tuple[str, str]:
"""
Capture l'écran :
- si screenshot_mode == "crop" et focus_pos fourni -> zone centrée autour de focus_pos
- sinon -> plein écran
Retourne (screenshot_id, relative_path)
"""
self._counter += 1
screenshot_id = f"shot_{self._counter:04d}"
shots_dir = self._get_session_shots_dir()
filename = f"{screenshot_id}.png"
file_path = os.path.join(shots_dir, filename)
relative_path = os.path.join("shots", filename)
with mss() as sct:
if self.screenshot_mode == "crop" and focus_pos is not None:
cx, cy = focus_pos
w = min(self.crop_width, self.screen_width)
h = min(self.crop_height, self.screen_height)
left = max(0, cx - w // 2)
top = max(0, cy - h // 2)
if left + w > self.screen_width:
left = self.screen_width - w
if top + h > self.screen_height:
top = self.screen_height - h
region = {"left": int(left), "top": int(top), "width": int(w), "height": int(h)}
img = sct.grab(region)
else:
monitor = sct.monitors[0] # écran principal complet
img = sct.grab(monitor)
with open(file_path, "wb") as f:
f.write(to_png(img.rgb, img.size))
captured_at = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
self.session.add_screenshot(
screenshot_id=screenshot_id,
relative_path=relative_path,
captured_at=captured_at,
)
return screenshot_id, relative_path
@staticmethod
def detect_primary_resolution() -> Tuple[int, int]:
"""
Renvoie (width, height) de l'écran principal.
Utile pour remplir RawSession.environment.screen.primary_resolution.
"""
with mss() as sct:
mon = sct.monitors[0]
return mon["width"], mon["height"]

Binary file not shown.

View File

@@ -0,0 +1,75 @@
{
"schema_version": "rawsession_v1",
"session_id": "sess_20251122T011946_bc151626",
"agent_version": "0.1.0",
"environment": {
"platform": "linux",
"hostname": "dom-X870-Riptide-WiFi",
"screen": {
"primary_resolution": [
1920,
1080
],
"display_scale": 1.0
}
},
"user": {
"id": "demo_user",
"label": "Démo agent_v0"
},
"context": {
"customer": "Clinique Demo",
"training_label": "Facturation_T2A_demo",
"notes": "Session réelle avec clics + screenshots + key combos."
},
"started_at": "2025-11-22T00:19:46Z",
"ended_at": "2025-11-22T00:19:49Z",
"events": [
{
"t": 1.935852091992274,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0001",
"button": "right",
"pos": [
1747,
19
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 3.7367831929877866,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0002",
"button": "left",
"pos": [
1747,
19
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
}
],
"screenshots": [
{
"screenshot_id": "shot_0001",
"relative_path": "shots/shot_0001.png",
"captured_at": "2025-11-22T00:19:47Z"
},
{
"screenshot_id": "shot_0002",
"relative_path": "shots/shot_0002.png",
"captured_at": "2025-11-22T00:19:49Z"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View File

@@ -0,0 +1,75 @@
{
"schema_version": "rawsession_v1",
"session_id": "sess_20251122T012138_2cf74644",
"agent_version": "0.1.0",
"environment": {
"platform": "linux",
"hostname": "dom-X870-Riptide-WiFi",
"screen": {
"primary_resolution": [
1920,
1080
],
"display_scale": 1.0
}
},
"user": {
"id": "demo_user",
"label": "Démo agent_v0"
},
"context": {
"customer": "Clinique Demo",
"training_label": "Facturation_T2A_demo",
"notes": "Session réelle avec clics + screenshots + key combos."
},
"started_at": "2025-11-22T00:21:38Z",
"ended_at": "2025-11-22T00:21:42Z",
"events": [
{
"t": 1.8258709929941688,
"type": "hover_idle",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0001",
"button": null,
"pos": [
1217,
607
],
"keys": null,
"idle_ms": 761,
"scroll_delta": null
},
{
"t": 4.130582028999925,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0002",
"button": "left",
"pos": [
1742,
18
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
}
],
"screenshots": [
{
"screenshot_id": "shot_0001",
"relative_path": "shots/shot_0001.png",
"captured_at": "2025-11-22T00:21:40Z"
},
{
"screenshot_id": "shot_0002",
"relative_path": "shots/shot_0002.png",
"captured_at": "2025-11-22T00:21:42Z"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

View File

@@ -0,0 +1,75 @@
{
"schema_version": "rawsession_v1",
"session_id": "sess_20251122T012138_2cf74644",
"agent_version": "0.1.0",
"environment": {
"platform": "linux",
"hostname": "dom-X870-Riptide-WiFi",
"screen": {
"primary_resolution": [
1920,
1080
],
"display_scale": 1.0
}
},
"user": {
"id": "demo_user",
"label": "Démo agent_v0"
},
"context": {
"customer": "Clinique Demo",
"training_label": "Facturation_T2A_demo",
"notes": "Session réelle avec clics + screenshots + key combos."
},
"started_at": "2025-11-22T00:21:38Z",
"ended_at": "2025-11-22T00:21:42Z",
"events": [
{
"t": 1.8258709929941688,
"type": "hover_idle",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0001",
"button": null,
"pos": [
1217,
607
],
"keys": null,
"idle_ms": 761,
"scroll_delta": null
},
{
"t": 4.130582028999925,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0002",
"button": "left",
"pos": [
1742,
18
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
}
],
"screenshots": [
{
"screenshot_id": "shot_0001",
"relative_path": "shots/shot_0001.png",
"captured_at": "2025-11-22T00:21:40Z"
},
{
"screenshot_id": "shot_0002",
"relative_path": "shots/shot_0002.png",
"captured_at": "2025-11-22T00:21:42Z"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@@ -0,0 +1,845 @@
{
"schema_version": "rawsession_v1",
"session_id": "sess_20251122T012255_a6ff491a",
"agent_version": "0.1.0",
"environment": {
"platform": "linux",
"hostname": "dom-X870-Riptide-WiFi",
"screen": {
"primary_resolution": [
1920,
1080
],
"display_scale": 1.0
}
},
"user": {
"id": "demo_user",
"label": "Démo agent_v0"
},
"context": {
"customer": "Clinique Demo",
"training_label": "Facturation_T2A_demo",
"notes": "Session réelle avec clics + screenshots + key combos."
},
"started_at": "2025-11-22T00:22:55Z",
"ended_at": "2025-11-22T00:24:03Z",
"events": [
{
"t": 3.1684997830016073,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0001",
"button": "left",
"pos": [
38,
1045
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 4.774834978976287,
"type": "mouse_click",
"window": {
"title": "unknown_window",
"app_name": "unknown_app"
},
"screenshot_id": "shot_0002",
"button": "left",
"pos": [
1116,
77
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 5.81886474500061,
"type": "hover_idle",
"window": {
"title": "unknown_window",
"app_name": "unknown_app"
},
"screenshot_id": "shot_0003",
"button": null,
"pos": [
1117,
77
],
"keys": null,
"idle_ms": 763,
"scroll_delta": null
},
{
"t": 8.675787344982382,
"type": "mouse_click",
"window": {
"title": "unknown_window",
"app_name": "unknown_app"
},
"screenshot_id": "shot_0004",
"button": "left",
"pos": [
964,
237
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 9.542181272991002,
"type": "hover_idle",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0005",
"button": null,
"pos": [
964,
236
],
"keys": null,
"idle_ms": 731,
"scroll_delta": null
},
{
"t": 10.76403674899484,
"type": "hover_idle",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0006",
"button": null,
"pos": [
862,
216
],
"keys": null,
"idle_ms": 710,
"scroll_delta": null
},
{
"t": 11.493462079990422,
"type": "mouse_click",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0007",
"button": "left",
"pos": [
862,
216
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 15.005104206997203,
"type": "mouse_click",
"window": {
"title": "Document1.docx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0008",
"button": "left",
"pos": [
45,
402
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 15.589322414976778,
"type": "hover_idle",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0009",
"button": null,
"pos": [
45,
402
],
"keys": null,
"idle_ms": 702,
"scroll_delta": null
},
{
"t": 23.73784916198929,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0010",
"button": "left",
"pos": [
29,
583
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 24.215254560986068,
"type": "hover_idle",
"window": {
"title": "Document1.docx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0011",
"button": null,
"pos": [
29,
583
],
"keys": null,
"idle_ms": 762,
"scroll_delta": null
},
{
"t": 26.18911038598162,
"type": "mouse_click",
"window": {
"title": "Document1.docx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0012",
"button": "left",
"pos": [
102,
96
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 27.50064410699997,
"type": "mouse_click",
"window": {
"title": "Document1.docx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0013",
"button": "left",
"pos": [
163,
584
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 28.398130443994887,
"type": "mouse_click",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0014",
"button": "left",
"pos": [
977,
241
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 30.00983267198899,
"type": "mouse_click",
"window": {
"title": "*Livre1.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0015",
"button": "left",
"pos": [
133,
103
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 30.23801764898235,
"type": "hover_idle",
"window": {
"title": "*Livre1.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0016",
"button": null,
"pos": [
133,
103
],
"keys": null,
"idle_ms": 722,
"scroll_delta": null
},
{
"t": 31.26953744099592,
"type": "mouse_click",
"window": {
"title": "*Livre1.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0017",
"button": "left",
"pos": [
192,
615
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 34.50322362600127,
"type": "mouse_click",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0018",
"button": "left",
"pos": [
1039,
221
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 36.09574069298105,
"type": "mouse_click",
"window": {
"title": "*Livre2.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0019",
"button": "left",
"pos": [
102,
98
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 37.18136298598256,
"type": "mouse_click",
"window": {
"title": "*Livre2.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0020",
"button": "left",
"pos": [
154,
614
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 37.86934186797589,
"type": "mouse_click",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0021",
"button": "left",
"pos": [
1037,
246
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 39.08423037099419,
"type": "mouse_click",
"window": {
"title": "*Livre3.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0022",
"button": "left",
"pos": [
145,
102
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 40.43024777297978,
"type": "mouse_click",
"window": {
"title": "*Livre3.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0023",
"button": "left",
"pos": [
154,
606
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 41.37494612898445,
"type": "mouse_click",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0024",
"button": "left",
"pos": [
768,
254
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 42.59985544998199,
"type": "mouse_click",
"window": {
"title": "Document2.docx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0025",
"button": "left",
"pos": [
117,
99
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 43.510244062985294,
"type": "mouse_click",
"window": {
"title": "Document2.docx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0026",
"button": "left",
"pos": [
149,
583
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 47.80467690699152,
"type": "mouse_click",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0027",
"button": "left",
"pos": [
1912,
40
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 50.78682437099633,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0028",
"button": "left",
"pos": [
30,
1043
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 51.39684452000074,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0029",
"button": "left",
"pos": [
30,
1043
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 51.46999536099611,
"type": "hover_idle",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0030",
"button": null,
"pos": [
30,
1043
],
"keys": null,
"idle_ms": 785,
"scroll_delta": null
},
{
"t": 52.649815398996,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0031",
"button": "left",
"pos": [
30,
1043
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 53.1728307849844,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0032",
"button": "left",
"pos": [
30,
1043
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 54.78535495797405,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0033",
"button": "left",
"pos": [
30,
1043
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 55.56673585899989,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0034",
"button": "left",
"pos": [
30,
1043
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 62.703069973998936,
"type": "hover_idle",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0035",
"button": null,
"pos": [
24,
542
],
"keys": null,
"idle_ms": 700,
"scroll_delta": null
},
{
"t": 67.91067471899441,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0036",
"button": "left",
"pos": [
1740,
15
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 67.92472465799074,
"type": "hover_idle",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0037",
"button": null,
"pos": [
1740,
15
],
"keys": null,
"idle_ms": 752,
"scroll_delta": null
}
],
"screenshots": [
{
"screenshot_id": "shot_0001",
"relative_path": "shots/shot_0001.png",
"captured_at": "2025-11-22T00:22:58Z"
},
{
"screenshot_id": "shot_0002",
"relative_path": "shots/shot_0002.png",
"captured_at": "2025-11-22T00:22:59Z"
},
{
"screenshot_id": "shot_0003",
"relative_path": "shots/shot_0003.png",
"captured_at": "2025-11-22T00:23:01Z"
},
{
"screenshot_id": "shot_0004",
"relative_path": "shots/shot_0004.png",
"captured_at": "2025-11-22T00:23:03Z"
},
{
"screenshot_id": "shot_0005",
"relative_path": "shots/shot_0005.png",
"captured_at": "2025-11-22T00:23:04Z"
},
{
"screenshot_id": "shot_0006",
"relative_path": "shots/shot_0006.png",
"captured_at": "2025-11-22T00:23:05Z"
},
{
"screenshot_id": "shot_0007",
"relative_path": "shots/shot_0007.png",
"captured_at": "2025-11-22T00:23:06Z"
},
{
"screenshot_id": "shot_0008",
"relative_path": "shots/shot_0008.png",
"captured_at": "2025-11-22T00:23:10Z"
},
{
"screenshot_id": "shot_0009",
"relative_path": "shots/shot_0009.png",
"captured_at": "2025-11-22T00:23:10Z"
},
{
"screenshot_id": "shot_0010",
"relative_path": "shots/shot_0010.png",
"captured_at": "2025-11-22T00:23:18Z"
},
{
"screenshot_id": "shot_0011",
"relative_path": "shots/shot_0011.png",
"captured_at": "2025-11-22T00:23:19Z"
},
{
"screenshot_id": "shot_0012",
"relative_path": "shots/shot_0012.png",
"captured_at": "2025-11-22T00:23:21Z"
},
{
"screenshot_id": "shot_0013",
"relative_path": "shots/shot_0013.png",
"captured_at": "2025-11-22T00:23:22Z"
},
{
"screenshot_id": "shot_0014",
"relative_path": "shots/shot_0014.png",
"captured_at": "2025-11-22T00:23:23Z"
},
{
"screenshot_id": "shot_0015",
"relative_path": "shots/shot_0015.png",
"captured_at": "2025-11-22T00:23:25Z"
},
{
"screenshot_id": "shot_0016",
"relative_path": "shots/shot_0016.png",
"captured_at": "2025-11-22T00:23:25Z"
},
{
"screenshot_id": "shot_0017",
"relative_path": "shots/shot_0017.png",
"captured_at": "2025-11-22T00:23:26Z"
},
{
"screenshot_id": "shot_0018",
"relative_path": "shots/shot_0018.png",
"captured_at": "2025-11-22T00:23:29Z"
},
{
"screenshot_id": "shot_0019",
"relative_path": "shots/shot_0019.png",
"captured_at": "2025-11-22T00:23:31Z"
},
{
"screenshot_id": "shot_0020",
"relative_path": "shots/shot_0020.png",
"captured_at": "2025-11-22T00:23:32Z"
},
{
"screenshot_id": "shot_0021",
"relative_path": "shots/shot_0021.png",
"captured_at": "2025-11-22T00:23:33Z"
},
{
"screenshot_id": "shot_0022",
"relative_path": "shots/shot_0022.png",
"captured_at": "2025-11-22T00:23:34Z"
},
{
"screenshot_id": "shot_0023",
"relative_path": "shots/shot_0023.png",
"captured_at": "2025-11-22T00:23:35Z"
},
{
"screenshot_id": "shot_0024",
"relative_path": "shots/shot_0024.png",
"captured_at": "2025-11-22T00:23:36Z"
},
{
"screenshot_id": "shot_0025",
"relative_path": "shots/shot_0025.png",
"captured_at": "2025-11-22T00:23:37Z"
},
{
"screenshot_id": "shot_0026",
"relative_path": "shots/shot_0026.png",
"captured_at": "2025-11-22T00:23:38Z"
},
{
"screenshot_id": "shot_0027",
"relative_path": "shots/shot_0027.png",
"captured_at": "2025-11-22T00:23:42Z"
},
{
"screenshot_id": "shot_0028",
"relative_path": "shots/shot_0028.png",
"captured_at": "2025-11-22T00:23:45Z"
},
{
"screenshot_id": "shot_0029",
"relative_path": "shots/shot_0029.png",
"captured_at": "2025-11-22T00:23:46Z"
},
{
"screenshot_id": "shot_0030",
"relative_path": "shots/shot_0030.png",
"captured_at": "2025-11-22T00:23:46Z"
},
{
"screenshot_id": "shot_0031",
"relative_path": "shots/shot_0031.png",
"captured_at": "2025-11-22T00:23:47Z"
},
{
"screenshot_id": "shot_0032",
"relative_path": "shots/shot_0032.png",
"captured_at": "2025-11-22T00:23:48Z"
},
{
"screenshot_id": "shot_0033",
"relative_path": "shots/shot_0033.png",
"captured_at": "2025-11-22T00:23:49Z"
},
{
"screenshot_id": "shot_0034",
"relative_path": "shots/shot_0034.png",
"captured_at": "2025-11-22T00:23:50Z"
},
{
"screenshot_id": "shot_0035",
"relative_path": "shots/shot_0035.png",
"captured_at": "2025-11-22T00:23:57Z"
},
{
"screenshot_id": "shot_0036",
"relative_path": "shots/shot_0036.png",
"captured_at": "2025-11-22T00:24:03Z"
},
{
"screenshot_id": "shot_0037",
"relative_path": "shots/shot_0037.png",
"captured_at": "2025-11-22T00:24:03Z"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

View File

@@ -0,0 +1,845 @@
{
"schema_version": "rawsession_v1",
"session_id": "sess_20251122T012255_a6ff491a",
"agent_version": "0.1.0",
"environment": {
"platform": "linux",
"hostname": "dom-X870-Riptide-WiFi",
"screen": {
"primary_resolution": [
1920,
1080
],
"display_scale": 1.0
}
},
"user": {
"id": "demo_user",
"label": "Démo agent_v0"
},
"context": {
"customer": "Clinique Demo",
"training_label": "Facturation_T2A_demo",
"notes": "Session réelle avec clics + screenshots + key combos."
},
"started_at": "2025-11-22T00:22:55Z",
"ended_at": "2025-11-22T00:24:03Z",
"events": [
{
"t": 3.1684997830016073,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0001",
"button": "left",
"pos": [
38,
1045
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 4.774834978976287,
"type": "mouse_click",
"window": {
"title": "unknown_window",
"app_name": "unknown_app"
},
"screenshot_id": "shot_0002",
"button": "left",
"pos": [
1116,
77
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 5.81886474500061,
"type": "hover_idle",
"window": {
"title": "unknown_window",
"app_name": "unknown_app"
},
"screenshot_id": "shot_0003",
"button": null,
"pos": [
1117,
77
],
"keys": null,
"idle_ms": 763,
"scroll_delta": null
},
{
"t": 8.675787344982382,
"type": "mouse_click",
"window": {
"title": "unknown_window",
"app_name": "unknown_app"
},
"screenshot_id": "shot_0004",
"button": "left",
"pos": [
964,
237
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 9.542181272991002,
"type": "hover_idle",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0005",
"button": null,
"pos": [
964,
236
],
"keys": null,
"idle_ms": 731,
"scroll_delta": null
},
{
"t": 10.76403674899484,
"type": "hover_idle",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0006",
"button": null,
"pos": [
862,
216
],
"keys": null,
"idle_ms": 710,
"scroll_delta": null
},
{
"t": 11.493462079990422,
"type": "mouse_click",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0007",
"button": "left",
"pos": [
862,
216
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 15.005104206997203,
"type": "mouse_click",
"window": {
"title": "Document1.docx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0008",
"button": "left",
"pos": [
45,
402
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 15.589322414976778,
"type": "hover_idle",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0009",
"button": null,
"pos": [
45,
402
],
"keys": null,
"idle_ms": 702,
"scroll_delta": null
},
{
"t": 23.73784916198929,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0010",
"button": "left",
"pos": [
29,
583
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 24.215254560986068,
"type": "hover_idle",
"window": {
"title": "Document1.docx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0011",
"button": null,
"pos": [
29,
583
],
"keys": null,
"idle_ms": 762,
"scroll_delta": null
},
{
"t": 26.18911038598162,
"type": "mouse_click",
"window": {
"title": "Document1.docx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0012",
"button": "left",
"pos": [
102,
96
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 27.50064410699997,
"type": "mouse_click",
"window": {
"title": "Document1.docx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0013",
"button": "left",
"pos": [
163,
584
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 28.398130443994887,
"type": "mouse_click",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0014",
"button": "left",
"pos": [
977,
241
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 30.00983267198899,
"type": "mouse_click",
"window": {
"title": "*Livre1.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0015",
"button": "left",
"pos": [
133,
103
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 30.23801764898235,
"type": "hover_idle",
"window": {
"title": "*Livre1.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0016",
"button": null,
"pos": [
133,
103
],
"keys": null,
"idle_ms": 722,
"scroll_delta": null
},
{
"t": 31.26953744099592,
"type": "mouse_click",
"window": {
"title": "*Livre1.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0017",
"button": "left",
"pos": [
192,
615
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 34.50322362600127,
"type": "mouse_click",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0018",
"button": "left",
"pos": [
1039,
221
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 36.09574069298105,
"type": "mouse_click",
"window": {
"title": "*Livre2.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0019",
"button": "left",
"pos": [
102,
98
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 37.18136298598256,
"type": "mouse_click",
"window": {
"title": "*Livre2.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0020",
"button": "left",
"pos": [
154,
614
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 37.86934186797589,
"type": "mouse_click",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0021",
"button": "left",
"pos": [
1037,
246
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 39.08423037099419,
"type": "mouse_click",
"window": {
"title": "*Livre3.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0022",
"button": "left",
"pos": [
145,
102
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 40.43024777297978,
"type": "mouse_click",
"window": {
"title": "*Livre3.xlsx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0023",
"button": "left",
"pos": [
154,
606
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 41.37494612898445,
"type": "mouse_click",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0024",
"button": "left",
"pos": [
768,
254
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 42.59985544998199,
"type": "mouse_click",
"window": {
"title": "Document2.docx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0025",
"button": "left",
"pos": [
117,
99
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 43.510244062985294,
"type": "mouse_click",
"window": {
"title": "Document2.docx — ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0026",
"button": "left",
"pos": [
149,
583
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 47.80467690699152,
"type": "mouse_click",
"window": {
"title": "ONLYOFFICE",
"app_name": "DesktopEditors"
},
"screenshot_id": "shot_0027",
"button": "left",
"pos": [
1912,
40
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 50.78682437099633,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0028",
"button": "left",
"pos": [
30,
1043
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 51.39684452000074,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0029",
"button": "left",
"pos": [
30,
1043
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 51.46999536099611,
"type": "hover_idle",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0030",
"button": null,
"pos": [
30,
1043
],
"keys": null,
"idle_ms": 785,
"scroll_delta": null
},
{
"t": 52.649815398996,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0031",
"button": "left",
"pos": [
30,
1043
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 53.1728307849844,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0032",
"button": "left",
"pos": [
30,
1043
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 54.78535495797405,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0033",
"button": "left",
"pos": [
30,
1043
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 55.56673585899989,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0034",
"button": "left",
"pos": [
30,
1043
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 62.703069973998936,
"type": "hover_idle",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0035",
"button": null,
"pos": [
24,
542
],
"keys": null,
"idle_ms": 700,
"scroll_delta": null
},
{
"t": 67.91067471899441,
"type": "mouse_click",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0036",
"button": "left",
"pos": [
1740,
15
],
"keys": null,
"idle_ms": null,
"scroll_delta": null
},
{
"t": 67.92472465799074,
"type": "hover_idle",
"window": {
"title": "Terminal",
"app_name": "gnome-terminal-"
},
"screenshot_id": "shot_0037",
"button": null,
"pos": [
1740,
15
],
"keys": null,
"idle_ms": 752,
"scroll_delta": null
}
],
"screenshots": [
{
"screenshot_id": "shot_0001",
"relative_path": "shots/shot_0001.png",
"captured_at": "2025-11-22T00:22:58Z"
},
{
"screenshot_id": "shot_0002",
"relative_path": "shots/shot_0002.png",
"captured_at": "2025-11-22T00:22:59Z"
},
{
"screenshot_id": "shot_0003",
"relative_path": "shots/shot_0003.png",
"captured_at": "2025-11-22T00:23:01Z"
},
{
"screenshot_id": "shot_0004",
"relative_path": "shots/shot_0004.png",
"captured_at": "2025-11-22T00:23:03Z"
},
{
"screenshot_id": "shot_0005",
"relative_path": "shots/shot_0005.png",
"captured_at": "2025-11-22T00:23:04Z"
},
{
"screenshot_id": "shot_0006",
"relative_path": "shots/shot_0006.png",
"captured_at": "2025-11-22T00:23:05Z"
},
{
"screenshot_id": "shot_0007",
"relative_path": "shots/shot_0007.png",
"captured_at": "2025-11-22T00:23:06Z"
},
{
"screenshot_id": "shot_0008",
"relative_path": "shots/shot_0008.png",
"captured_at": "2025-11-22T00:23:10Z"
},
{
"screenshot_id": "shot_0009",
"relative_path": "shots/shot_0009.png",
"captured_at": "2025-11-22T00:23:10Z"
},
{
"screenshot_id": "shot_0010",
"relative_path": "shots/shot_0010.png",
"captured_at": "2025-11-22T00:23:18Z"
},
{
"screenshot_id": "shot_0011",
"relative_path": "shots/shot_0011.png",
"captured_at": "2025-11-22T00:23:19Z"
},
{
"screenshot_id": "shot_0012",
"relative_path": "shots/shot_0012.png",
"captured_at": "2025-11-22T00:23:21Z"
},
{
"screenshot_id": "shot_0013",
"relative_path": "shots/shot_0013.png",
"captured_at": "2025-11-22T00:23:22Z"
},
{
"screenshot_id": "shot_0014",
"relative_path": "shots/shot_0014.png",
"captured_at": "2025-11-22T00:23:23Z"
},
{
"screenshot_id": "shot_0015",
"relative_path": "shots/shot_0015.png",
"captured_at": "2025-11-22T00:23:25Z"
},
{
"screenshot_id": "shot_0016",
"relative_path": "shots/shot_0016.png",
"captured_at": "2025-11-22T00:23:25Z"
},
{
"screenshot_id": "shot_0017",
"relative_path": "shots/shot_0017.png",
"captured_at": "2025-11-22T00:23:26Z"
},
{
"screenshot_id": "shot_0018",
"relative_path": "shots/shot_0018.png",
"captured_at": "2025-11-22T00:23:29Z"
},
{
"screenshot_id": "shot_0019",
"relative_path": "shots/shot_0019.png",
"captured_at": "2025-11-22T00:23:31Z"
},
{
"screenshot_id": "shot_0020",
"relative_path": "shots/shot_0020.png",
"captured_at": "2025-11-22T00:23:32Z"
},
{
"screenshot_id": "shot_0021",
"relative_path": "shots/shot_0021.png",
"captured_at": "2025-11-22T00:23:33Z"
},
{
"screenshot_id": "shot_0022",
"relative_path": "shots/shot_0022.png",
"captured_at": "2025-11-22T00:23:34Z"
},
{
"screenshot_id": "shot_0023",
"relative_path": "shots/shot_0023.png",
"captured_at": "2025-11-22T00:23:35Z"
},
{
"screenshot_id": "shot_0024",
"relative_path": "shots/shot_0024.png",
"captured_at": "2025-11-22T00:23:36Z"
},
{
"screenshot_id": "shot_0025",
"relative_path": "shots/shot_0025.png",
"captured_at": "2025-11-22T00:23:37Z"
},
{
"screenshot_id": "shot_0026",
"relative_path": "shots/shot_0026.png",
"captured_at": "2025-11-22T00:23:38Z"
},
{
"screenshot_id": "shot_0027",
"relative_path": "shots/shot_0027.png",
"captured_at": "2025-11-22T00:23:42Z"
},
{
"screenshot_id": "shot_0028",
"relative_path": "shots/shot_0028.png",
"captured_at": "2025-11-22T00:23:45Z"
},
{
"screenshot_id": "shot_0029",
"relative_path": "shots/shot_0029.png",
"captured_at": "2025-11-22T00:23:46Z"
},
{
"screenshot_id": "shot_0030",
"relative_path": "shots/shot_0030.png",
"captured_at": "2025-11-22T00:23:46Z"
},
{
"screenshot_id": "shot_0031",
"relative_path": "shots/shot_0031.png",
"captured_at": "2025-11-22T00:23:47Z"
},
{
"screenshot_id": "shot_0032",
"relative_path": "shots/shot_0032.png",
"captured_at": "2025-11-22T00:23:48Z"
},
{
"screenshot_id": "shot_0033",
"relative_path": "shots/shot_0033.png",
"captured_at": "2025-11-22T00:23:49Z"
},
{
"screenshot_id": "shot_0034",
"relative_path": "shots/shot_0034.png",
"captured_at": "2025-11-22T00:23:50Z"
},
{
"screenshot_id": "shot_0035",
"relative_path": "shots/shot_0035.png",
"captured_at": "2025-11-22T00:23:57Z"
},
{
"screenshot_id": "shot_0036",
"relative_path": "shots/shot_0036.png",
"captured_at": "2025-11-22T00:24:03Z"
},
{
"screenshot_id": "shot_0037",
"relative_path": "shots/shot_0037.png",
"captured_at": "2025-11-22T00:24:03Z"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Some files were not shown because too many files have changed in this diff Show More